熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

動態SQL和PL/SQL的EXECUTE IMMEDIATE選項

2013-11-13 16:14:27  來源: Oracle 

  EXECUTE IMMEDIATE代替了以前Oraclei中DBMS_SQL package包它解析並馬上執行動態的SQL語句或非運行時創建的PL/SQL塊動態創建和執行SQL語句性能超前EXECUTE IMMEDIATE的目標在於減小企業費用並獲得較高的性能較之以前它相當容易編碼盡管DBMS_SQL仍然可用但是推薦使用EXECUTE IMMEDIATE因為它獲的收益在包之上
  
  使用技巧
  
   EXECUTE IMMEDIATE將不會提交一個DML事務執行應該顯式提交
  如果通過EXECUTE IMMEDIATE處理DML命令那麼在完成以前需要顯式提交或者作為EXECUTE IMMEDIATE自己的一部分 如果通過EXECUTE IMMEDIATE處理DDL命令它提交所有以前改變的數據
  
   不支持返回多行的查詢這種交互將用臨時表來存儲記錄(參照例子如下)或者用REF cursors
  
   當執行SQL語句時不要用分號當執行PL/SQL塊時在其尾部用分號
  
   在Oracle手冊中未詳細覆蓋這些功能下面的例子展示了所有用到Execute immediate的可能方面希望能給你帶來方便
  
   對於Forms開發者當在PL/SQL 版本中Forms i不能使用此功能
  
  EXECUTE IMMEDIATE用法例子
  
   在PL/SQL運行DDL語句
  
   begin
   execute immediate set role all;
   end;
  
   給動態語句傳值(USING 子句)
  
   declare
   l_depnam varchar() := testing;
   l_loc  varchar() := Dubai;
   begin
   execute immediate insert into dept values (: : :)
    using l_depnam l_loc;
   commit;
   end;
  
   從動態語句檢索值(INTO子句)
  
   declare
   l_cnt  varchar();
   begin
   execute immediate select count() from emp
    into l_cnt;
   dbms_outputput_line(l_cnt);
   end;
  
   動態調用例程例程中用到的綁定變量參數必須指定參數類型黓認為IN類型其它類型必須顯式指定
  
   declare
   l_routin  varchar() := genget_rowcnt;
   l_tblnam  varchar() := emp;
   l_cnt   number;
   l_status  varchar();
   begin
   execute immediate begin || l_routin || (: : :); end;
    using in l_tblnam out l_cnt in out l_status;
  
   if l_status != OK then
     dbms_outputput_line(error);
   end if;
   end;
  
   將返回值傳遞到PL/SQL記錄類型;同樣也可用%rowtype變量
  
   declare
   type empdtlrec is record (empno number()
                ename varchar()
                deptno number());
   empdtl empdtlrec;
   begin
   execute immediate select empno ename deptno ||
            from emp where empno =
    into empdtl;
   end;
  
   傳遞並檢索值INTO子句用在USING子句前
  
   declare
   l_dept  pls_integer := ;
   l_nam   varchar();
   l_loc   varchar();
   begin
   execute immediate select dname loc from dept where deptno = :
    into l_nam l_loc
    using l_dept ;
   end;
  
   多行查詢選項對此選項用insert語句填充臨時表用臨時表進行進一步的處理也可以用REF cursors糾正此缺憾
  
   declare
   l_sal  pls_integer := ;
   begin
   execute immediate insert into temp(empno ename) ||
                 select empno ename from emp ||
                 where sal > :
    using l_sal;
   commit;
   end;
  
  對於處理動態語句EXECUTE IMMEDIATE比以前可能用到的更容易並且更高效當意圖執行動態語句時適當地處理異常更加重要應該關注於捕獲所有可能的異常
From:http://tw.wingwit.com/Article/program/Oracle/201311/18008.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.