手機版
你好,游客 登錄 注冊
背景:
閱讀新聞

Oracle中Execute Immediate用法

[日期:2019-12-24] 來源:Linux社區  作者:Linux [字體: ]

Execute Immediate代替了以前Oracle8i中DBMS_SQL package包。它解析并馬上執行動態的SQL語句或非運行時創建的PL/SQL塊.動態創建和執行SQL語句性能超前,Execute Immediate的目標在于減小企業費用并獲得較高的性能,較之以前它相當容易編碼。盡管DBMS_SQL仍然可用,但是推薦使用Execute Immediate,因為它獲的收益在包之上。

-- 使用技巧

1、Execute Immediate將不會提交一個DML事務執行,應該顯式提交,如果通過Execute Immediate處理DML命令,那么在完成以前需要顯式提交或者作為Execute Immediate自己的一部分。如果通過Execute Immediate 處理DDL命令,它提交所有以前改變的數據。

2、不支持返回多行的查詢,這種交互將用臨時表來存儲記錄(參照例子如下)或者用REF cursors。

3、當執行SQL語句時,不要用分號,當執行PL/SQL塊時,在其尾部用分號。

4、在Oracle手冊中,未詳細覆蓋這些功能。

下面的例子展示了所有用到Execute Immediate的可能方面。

5、對于Forms開發者,當在PL/SQL 8.0.6.3.版本中,Forms 6i不能使用此功能.

Execute Immediate -- 用法例子

1. 在PL/SQL運行DDL語句

begin
  execute immediate 'set role all';
end;

2. 給動態語句傳值(USING 子句)

declare
  l_depnam varchar2(20) := 'testing';
  l_loc    varchar2(10) := 'Dubai';
  begin
  execute immediate 'insert into dept values  (:1, :2, :3)'
    using 50, l_depnam, l_loc;
  commit;
end;

3. 從動態語句檢索值(INTO子句)

declare
  l_cnt    varchar2(20);
begin
  execute immediate 'select count(1) from emp'
    into l_cnt;
  dbms_output.put_line(l_cnt);
end;

4. 動態調用例程.例程中用到的綁定變量參數必須指定參數類型.黓認為IN類型,其它類型必須顯式指定

declare
  l_routin    varchar2(100) := 'gen2161.get_rowcnt';
  l_tblnam    varchar2(20) := 'emp';
  l_cnt      number;
  l_status    varchar2(200);
begin
  execute immediate 'begin ' || l_routin || '(:2, :3, :4); end;'
    using in l_tblnam, out l_cnt, in out l_status;

  if l_status != 'OK' then
      dbms_output.put_line('error');
  end if;
end;

5. 將返回值傳遞到PL/SQL記錄類型;同樣也可用%rowtype變量

declare
  type empdtlrec is record (empno  number(4),
                            ename  varchar2(20),
                            deptno  number(2));
  empdtl empdtlrec;
begin
  execute immediate 'select empno, ename, deptno ' ||
                    'from emp where empno = 7934'
    into empdtl;
end;

6. 傳遞并檢索值.INTO子句用在USING子句前

declare
  l_dept    pls_integer := 20;
  l_nam      varchar2(20);
  l_loc      varchar2(20);
begin
  execute immediate 'select dname, loc from dept where deptno = :1'
    into l_nam, l_loc
    using l_dept ;
end;

7. 多行查詢選項.對此選項用insert語句填充臨時表,用臨時表進行進一步的處理,也可以用REF cursors糾正此缺憾.

declare
  l_sal    pls_integer := 2000;
begin
  execute immediate 'insert into temp(empno, ename) ' ||
                    '          select empno, ename from emp ' ||
                    '          where  sal > :1'
    using l_sal;
  commit;
end;

對于處理動態語句,、Execute Immediate 比以前可能用到的更容易并且更高效。當意圖執行動態語句時,適當地處理異常更加重要。應該關注于捕獲所有可能的異常。

更多Oracle相關信息見Oracle 專題頁面 http://www.okbuvi.live/topicnews.aspx?tid=12

Linux公社的RSS地址http://www.okbuvi.live/rssFeed.aspx

本文永久更新鏈接地址http://www.okbuvi.live/Linux/2019-12/161807.htm

linux
相關資訊       Execute Immediate 
本文評論   查看全部評論 (0)
表情: 表情 姓名: 字數

       

評論聲明
  • 尊重網上道德,遵守中華人民共和國的各項有關法律法規
  • 承擔一切因您的行為而直接或間接導致的民事或刑事法律責任
  • 本站管理人員有權保留或刪除其管轄留言中的任意內容
  • 本站有權在網站內轉載或引用您的評論
  • 參與本評論即表明您已經閱讀并接受上述條款
海口彩票论坛