在pl/sql中执行动态sql
2014-12-18 09:08
197 查看
动态sql就是把sql写在一个字符串里,在存储过程中解析字符串执行sql。这种动态sql很多时候会在别的语言里写,再连接数据库进行操作,这样的确方便很多,例如在java中使用JDBC。但是如果涉及到sql变化很多次,直接在存储过程中写动态sql会比在java中写好,毕竟java每次执行sql都要连接数据库,这也是要时间的。
我现在知道在PL/SQL中有两种方法执行动态sql:
第一种是使用游标(SYS_REFCURSOR),例子如下:
另一种是使用execute immediate,这个指令在oracle 9i之后才有,老版本不用这个指令,注意一点execute immediate 在使用select语句的时候只可以使用在返回一行的sql中,如果要返回多行,请使用游标。execute immediate用起来比游标方便一点,例子如下:
最后说一点注意:
在pl/sql的函数中不能调用DDL语句,要使用DDL语句只能写在存储过程中。
我现在知道在PL/SQL中有两种方法执行动态sql:
第一种是使用游标(SYS_REFCURSOR),例子如下:
DECLARE query_sql varchar2(100 ); queryresult varchar2(50 ); bizcursor SYS_REFCURSOR; type my_record is record( servid NUMBER(16), custid NUMBER(16)); my_rec my_record; BEGIN query_sql:= 'select servid,custid from sys_servst where rownum<10' ; OPEN bizcursor FOR query_sql; loop fetch bizcursor into my_rec; --判读是否提取到值,没取到值就退出 --取到值c_job%notfound 是false --取不到值c_job%notfound 是true exit when bizcursor%notfound; dbms_output.put_line(my_rec.servid|| ' ' ||my_rec.custid); end loop ; --关闭游标 close bizcursor; END;
另一种是使用execute immediate,这个指令在oracle 9i之后才有,老版本不用这个指令,注意一点execute immediate 在使用select语句的时候只可以使用在返回一行的sql中,如果要返回多行,请使用游标。execute immediate用起来比游标方便一点,例子如下:
--执行动态sql declare v_sql varchar2(100) := 'drop table test_' ||'YF'; begin execute immediate v_sql; end; --execute immediate 还可以用在存储过程的赋值中: declare l_cnt varchar2(20); begin execute immediate 'select count(1) from emp' into l_cnt; dbms_output.put_line(l_cnt); end;
最后说一点注意:
在pl/sql的函数中不能调用DDL语句,要使用DDL语句只能写在存储过程中。
相关文章推荐
- PL\SQL 动态执行表不可访问,本会话的自动统计被禁止,无法断点调试 的解决方法
- PL/SQL执行动态SQL(二)
- PL\SQL 动态执行表不可访问,本会话的自动统计被禁止,无法断点调试 的解决方法
- PL\SQL 打开时出现"动态执行表不可访问,本会话的自动统计被禁止"
- PL\SQL 打开时出现"动态执行表不可访问,本会话的自动统计被禁止"错误解决
- pl/sql执行动态sql
- PL\SQL 打开时出现"动态执行表不可访问,本会话的自动统计被禁止"错误解决
- PL\SQL 打开时出现"动态执行表不可访问,本会话的自动统计被禁止
- PL\SQL 打开时出现"动态执行表不可访问,本会话的自动统计被禁止"错误解决
- PL\SQL 打开时出现"动态执行表不可访问,本会话的自动统计被禁止"错误解决
- PL/SQL执行动态SQL
- pl/sql执行动态sql
- 【PL/SQL Developer】动态执行表不可访问,本会话的自动统计被禁止
- PL\SQL 打开时出现"动态执行表不可访问,本会话的自动统计被禁止"
- PL\SQL 打开时出现"动态执行表不可访问,本会话的自动统计被禁止"
- Oracle EBS - SQL&PL/SQL: 动态执行DDL
- PL\SQL 打开时出现"动态执行表不可访问,本会话的自动统计被禁止"
- PL\SQL 打开时出现"动态执行表不可访问,本会话的自动统计被禁止"错误解决
- 关于Oracle 的定时执行作业问题(动态PL/SQL)
- PL\SQL 打开时出现"动态执行表不可访问,本会话的自动统计被禁止"