您的位置:首页 > 数据库

在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),例子如下:

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语句只能写在存储过程中。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐