EXECUTE IMMEDIATE用法小解

2022-03-11 21:18:18 字數 2806 閱讀 5802

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 比以前可能用到的更容易並且更高效.

當意圖執行動態語句時,適當地處理異常更加重要.應該關注於捕獲所有可能的異常.

EXECUTE IMMEDIATE用法小解

execute immediate 代替了以前oracle8i中dbms sql package包.它解析並馬上執行動態的sql語句或非執行時建立的pl sql塊.動態建立和執行sql語句效能超前,execute immediate的目標在於減小企業費用並獲得較高的效能,較之以前它相當容易編碼.儘管...

EXECUTE IMMEDIATE用法小解

execute immediate 代替了以前oracle8i中dbms sql package包.它解析並馬上執行動態的sql語句或非執行時建立的pl sql塊.動態建立和執行sql語句效能超前,execute immediate的目標在於減小企業費用並獲得較高的效能,較之以前它相當容易編碼.儘管...

EXECUTE IMMEDIATE用法小解

execute immediate 代替了以前oracle8i中dbms sql package包.它解析並馬上執行動態的sql語句或非執行時建立的pl sql塊.動態建立和執行sql語句效能超前,execute immediate的目標在於減小企業費用並獲得較高的效能,較之以前它相當容易編碼.儘管...