EXECUTE IMMEDIATE代替了以前Oracle
i中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_output
put_line(l_cnt);
end;
動態調用例程
例程中用到的綁定變量參數必須指定參數類型
黓認為IN類型
其它類型必須顯式指定
declare
l_routin varchar
(
) :=
gen
get_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_output
put_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