在pl/sql中執行動態sql
阿新 • • 發佈:2019-02-04
動態sql就是把sql寫在一個字串裡,在儲存過程中解析字串執行sql。這種動態sql很多時候會在別的語言裡寫,再連線資料庫進行操作,這樣的確方便很多,例如在java中使用JDBC。但是如果涉及到sql變化很多次,直接在儲存過程中寫動態sql會比在java中寫好,畢竟java每次執行sql都要連線資料庫,這也是要時間的。
我現在知道在PL/SQL中有兩種方法執行動態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語句只能寫在儲存過程中。