EXECUTE IMMEDIATE鐢ㄦ硶灏忚В
EXECUTE IMMEDIATE 浠f浛浜嗕互鍓峅racle8i涓璂BMS_SQL package鍖.
瀹冭В鏋愬苟椹笂鎵ц鍔ㄦ佺殑SQL璇彞鎴栭潪杩愯鏃跺垱寤虹殑PL/SQL鍧.鍔ㄦ佸垱寤哄拰鎵цSQL璇彞鎬ц兘瓒呭墠锛孍XECUTE IMMEDIATE鐨勭洰鏍囧湪浜庡噺灏忎紒涓氳垂鐢ㄥ苟鑾峰緱杈冮珮鐨勬ц兘锛岃緝涔嬩互鍓嶅畠鐩稿綋瀹规槗缂栫爜.灏界DBMS_SQL浠嶇劧鍙敤锛屼絾鏄帹鑽愪娇鐢‥XECUTE IMMEDIATE,鍥犱负瀹冭幏鐨勬敹鐩婂湪鍖呬箣涓娿
– 浣跨敤鎶宸
1. EXECUTE IMMEDIATE灏嗕笉浼氭彁浜や竴涓狣ML浜嬪姟鎵ц锛屽簲璇ユ樉寮忔彁浜
濡傛灉閫氳繃EXECUTE IMMEDIATE澶勭悊DML鍛戒护锛
閭d箞鍦ㄥ畬鎴愪互鍓嶉渶瑕佹樉寮忔彁浜ゆ垨鑰呬綔涓篍XECUTE IMMEDIATE鑷繁鐨勪竴閮ㄥ垎.
濡傛灉閫氳繃EXECUTE IMMEDIATE澶勭悊DDL鍛戒护,瀹冩彁浜ゆ墍鏈変互鍓嶆敼鍙樼殑鏁版嵁
2. 涓嶆敮鎸佽繑鍥炲琛岀殑鏌ヨ,杩欑浜や簰灏嗙敤涓存椂琛ㄦ潵瀛樺偍璁板綍(鍙傜収渚嬪瓙濡備笅)鎴栬呯敤REF cursors.
3. 褰撴墽琛孲QL璇彞鏃讹紝涓嶈鐢ㄥ垎鍙凤紝褰撴墽琛孭L/SQL鍧楁椂锛屽湪鍏跺熬閮ㄧ敤鍒嗗彿.
4. 鍦∣racle鎵嬪唽涓紝鏈缁嗚鐩栬繖浜涘姛鑳姐
涓嬮潰鐨勪緥瀛愬睍绀轰簡鎵鏈夌敤鍒癊xecute immediate鐨勫彲鑳芥柟闈.甯屾湜鑳界粰浣犲甫鏉ユ柟渚.
5. 瀵逛簬Forms寮鍙戣,褰撳湪PL/SQL 8.0.6.3.鐗堟湰涓紝Forms 6i涓嶈兘浣跨敤姝ゅ姛鑳.
EXECUTE IMMEDIATE — 鐢ㄦ硶渚嬪瓙
1. 鍦≒L/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. 鍔ㄦ佽皟鐢ㄤ緥绋.渚嬬▼涓敤鍒扮殑缁戝畾鍙橀噺鍙傛暟蹇呴』鎸囧畾鍙傛暟绫诲瀷.
榛撹涓篒N绫诲瀷,鍏跺畠绫诲瀷蹇呴』鏄惧紡鎸囧畾
-
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. 澶氳鏌ヨ閫夐」.瀵规閫夐」鐢╥nsert璇彞濉厖涓存椂琛紝
鐢ㄤ复鏃惰〃杩涜杩涗竴姝ョ殑澶勭悊,涔熷彲浠ョ敤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 姣斾互鍓嶅彲鑳界敤鍒扮殑鏇村鏄撳苟涓旀洿楂樻晥.
褰撴剰鍥炬墽琛屽姩鎬佽鍙ユ椂锛岄傚綋鍦板鐞嗗紓甯告洿鍔犻噸瑕.搴旇鍏虫敞浜庢崟鑾锋墍鏈夊彲鑳界殑寮傚父.
Leave a Reply