转: oracle 存储过程 执行动态 实现sql
http://jingyan.baidu.com/article/5d6edee2fbb9f999eadeecb9.html
http://jingyan.baidu.com/article/363872ecca722b6e4ba16f18.html
######sample 1
oracle存储过程中如何使用动态sql
- 原创
- |
- 浏览:5889
- |
- 更新:2017-06-07 21:33
在做oracle开发工作的小伙伴们经常为写存储过程而烦恼,然而只要掌握了其语法知识就能写一个复杂的存储过程,其实存储过程就是用一些dml语言拼写起来的sql语句块,很简单,但是也会在存储过程中使用动态sql,那么动态sql是怎么回事呢?那么现在给大家分享一些工作中的经验。
方法/步骤
-
动态sql,顾名思义就是动态执行的sql,也就是说在没执行之前是动态的拼接的,为了简单操作,我们利用pl/sql的测试窗口来做示例
点击左上角的矩形图片
-
点击之后打开测试窗口一栏
-
这时就可以在右侧编辑动态sql了,由上图可知右侧是典型的begin---end块也是存储过程中使用的基础语法格式。其中declare是声明变量用的。在begin下面可以初始化游标、变量。现在要实现一个查询动态sql就可以:
-
由以上图可以看到:v_select_sql就是一个动态sql,为了实现一个完整的查新语句,用了‘||’来拼接完成的,前段是select 后段是where 条件。那么我们可以现在来测试一下,真正要执行的v_select_sql是个什么样,测试一下
-
看到了:就是一个简单的我们平时写的正常查询语句。那么我们如何去执行它呢?
使用execute immediate v_select_sql;这样就可以执行查询了。
-
究竟为什么要使用动态sql呢?
首先,它减少了编译错误。如果上述表frtm_rule在数据库中不存在,那么,在编译的过程中仍然不会报错。现在我把表名改了,可以测试一下仍然可以编译成功
-
仍然显示已执行。
其次,就是可以动态的拼接sql,减少了代码的重复性,能够在判断条件下重复使用sql代码。
END
##########sample 2
接着往下说关于oracle动态sql语句方面的东西。
1,依然是基础篇,面向初学者,这里并不会涉及到很高深的东西,
2,请注重基础知识。
注意事项
-
以上为开发者适用!
##########sample 3 目的 根据一张表的一个字段值day 几月几日,更新同一样的表的另外2个字段,week_day 周几,duty_hours 工作小时
declare
v_date VARCHAR2(20);
v_week_day number;
v_duty_hours number;
cursor v_cur is select to_char(day-1, 'D') week_day,day from dbmgr.tb_date;
begin
FOR v_rec in v_cur LOOP
/* DBMS_OUTPUT.PUT_LINE(v_rec.db_name||' db_name');
*/
DBMS_OUTPUT.ENABLE(buffer_size => null);
v_date := v_rec.day;
v_week_day := v_rec.week_day;
DBMS_OUTPUT.PUT_LINE(v_date||' day ');
update dbmgr.tb_date set week_day=v_week_day where day=v_date ;
if v_week_day < 6 then
update dbmgr.tb_date set duty_hours=8 where day=v_date;
end if;
end loop;
end;