日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

动态SQL和PL/SQL的EXECUTE选项分析

發(fā)布時間:2025/3/15 数据库 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 动态SQL和PL/SQL的EXECUTE选项分析 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

EXECUTE IMMEDIATE代替了以前Oracle8i中DBMS_SQL package包.它解析并馬上執(zhí)行動態(tài)的SQL語句或非運行時創(chuàng)建的PL/SQL塊.動態(tài)創(chuàng)建和執(zhí)行SQL語句性能超前,EXECUTE IMMEDIATE的目標(biāo)在于減小企業(yè)費用并獲得較高的性能,較之以前它相當(dāng)容易編碼.盡管DBMS_SQL仍然可用,但是推薦使用EXECUTE IMMEDIATE,因為它獲的收益在包之上。?

使用技巧?
1. EXECUTE IMMEDIATE將不會提交一個DML事務(wù)執(zhí)行,應(yīng)該顯式提交。 如果通過EXECUTE IMMEDIATE處理DML命令,那么在完成以前需要顯式提交或者作為EXECUTE IMMEDIATE自己的一部分. 如果通過EXECUTE IMMEDIATE處理DDL命令,它提交所有以前改變的數(shù)據(jù)。?

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

3. 當(dāng)執(zhí)行SQL語句時,不要用分號,當(dāng)執(zhí)行PL/SQL塊時,在其尾部用分號。?

4. 在Oracle手冊中,未詳細(xì)覆蓋這些功能。下面的例子展示了所有用到Execute immediate的可能方面.希望能給你帶來方便。?

5. 對于Forms開發(fā)者,當(dāng)在PL/SQL 8.0.6.3.版本中,Forms 6i不能使用此功能。 EXECUTE IMMEDIATE用法例子 1. 在PL/SQL運行DDL語句     ?

BEGIN
?? ?EXECUTE IMMEDIATE 'set role all';
END;


2. 給動態(tài)語句傳值(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. 從動態(tài)語句檢索值(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. 動態(tài)調(diào)用例程.例程中用到的綁定變量參數(shù)必須指定參數(shù)類型.黓認(rèn)為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語句填充臨時表,用臨時表進(jìn)行進(jìn)一步的處理,也可以用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;


對于處理動態(tài)語句,EXECUTE IMMEDIATE比以前可能用到的更容易并且更高效.當(dāng)意圖執(zhí)行動態(tài)語句時,適當(dāng)?shù)靥幚懋惓8又匾?應(yīng)該關(guān)注于捕獲所有可能的異常。

總結(jié)

以上是生活随笔為你收集整理的动态SQL和PL/SQL的EXECUTE选项分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。