1. 程式人生 > >在pl/sql中執行動態sql

在pl/sql中執行動態sql

       動態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語句只能寫在儲存過程中。