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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

ORACLE动态SQL语句

發布時間:2023/12/31 数据库 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ORACLE动态SQL语句 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

問題的提出

我們經常需要運行可變化的SQL語句,這種通常稱為動態SQL,在ORACLE中執行動態的SQL語句,需要了解ORACLE的動態SQL語句的相關規定。
SQL動態語句是由程序或者存儲過程生成的SQL語句,這種語句的特點是,不能簡單的去運行。因為它不是標準的,其中含有變化的成分,因此ORACLE提供了一個執行動態SQL語句的模式:
EXECUTE IMMEDIATE
這句話的含義是立即執行,而不先去進行語法檢查,在執行過程中可能會發生邏輯錯誤,則通過錯誤中斷進行處理。

一種動態SQL的方法

/***DBMS_OUTPUT.PUT_LINE(uSQL);p_Money_TJCALL p_Money_TJ();測試在SQL*PLUS下進行VAR r refcursor;Exec p_Money_TJ(:r);print r; ***/ CREATE OR REPLACE PROCEDURE p_Money_TJ(p_cur out sys_refcursor) AS-- 變量定義Cursor CC IS SELECT FTYPE FROM APP_MONEY GROUP BY FTYPE; uSQL VARCHAR2(32600); BEGINuSQL := 'BEGIN OPEN :p_cur for ';uSQL := uSQL || 'SELECT FMID 會員賬號,F_GETXM(FMID) 會員姓名';FOR C IN CC LOOPuSQL := uSQL || ',SUM(CASE WHEN FTYPE = '''||C.FTYPE||''' THEN FMONEY END) '||C.FTYPE;END LOOP;uSQL := uSQL || ' FROM APP_MONEY GROUP BY FMID';uSQL := uSQL || '; END;';EXECUTE IMMEDIATE uSQL USING p_cur; END;

使用動態游標

1、聲明動態游標

TYPE cc_type IS REF CURSOR;

2、聲明游標變量

my_cursor cc_type;

3、使用游標

n_deptno:=20; uSQL := 'SELECT empno,ename FROM emp WHERE deptno = '||n_deptno; OPEN my_cursor FOR uSQL; LOOP FETCH my_cursor INTO n_empno,v_ename;EXIT WHEN my_cursor%NOTFOUND;--用n_empno,v_ename做其它處理--.... END LOOP; CLOSE my_cursor;

4、小結
動態游標可以勝任大多數動態SQL的需求了,使用簡潔方便。

使用 EXECUTE IMMEDIATE

最早大家都使用DBMS_SQL包,但是太太麻煩了,最終都放棄了。但是自從有了EXECUTE IMMEDIATE之后,但要注意以下幾點:
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語句

beginexecute immediate 'set role all'; end;

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

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

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

declarel_cnt varchar2(20); beginexecute immediate 'select count(1) from emp'into l_cnt;dbms_output.put_line(l_cnt); end;

4. 動態調用例程

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

declarel_routin varchar2(100) := 'gen2161.get_rowcnt';l_tblnam varchar2(20) := 'emp';l_cnt number;l_status varchar2(200); beginexecute immediate 'begin ' || l_routin || '(:2, :3, :4); end;'using in l_tblnam, out l_cnt, in out l_status;if l_status != 'OK' thendbms_output.put_line('error');end if; end;

5. 將返回值傳遞到PL/SQL記錄類型

同樣也可用%rowtype變量

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

6. 傳遞并檢索值

INTO子句用在USING子句前

declarel_dept pls_integer := 20;l_nam varchar2(20);l_loc varchar2(20); beginexecute immediate 'select dname, loc from dept where deptno = :1'into l_nam, l_locusing l_dept ; end;

7. 多行查詢選項

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

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

對于處理動態語句,EXECUTE IMMEDIATE比以前可能用到的更容易并且更高效.當意圖執行動態語句時,適當地處理異常更加重要.應該關注于捕獲所有可能的異常.
Oracle 動態SQL
Oracle 動態SQL有兩種寫法:用 DBMS_SQL 或 execute immediate,建議使用后者。試驗步驟如下:

1. DDL 和 DML

/*** DDL ***/ begin EXECUTE IMMEDIATE 'drop table temp_1'; EXECUTE IMMEDIATE 'create table temp_1(name varchar2(8))'; end; /*** DML ***/ declare v_1 varchar2(8); v_2 varchar2(10); str varchar2(50); begin v_1:='測試人員'; v_2:='北京'; str := 'INSERT INTO test (name ,address) VALUES (:1, :2)'; EXECUTE IMMEDIATE str USING v_1, v_2; commit; end;

2. 返回單條結果

declare str varchar2(500); c_1 varchar2(10); r_1 test%rowtype; begin c_1:='測試人員'; str:='select * from test where name=:c WHERE ROWNUM=1'; execute immediate str into r_1 using c_1; DBMS_OUTPUT.PUT_LINE(R_1.NAME||R_1.ADDRESS); end ;

3. 返回結果集

CREATE OR REPLACE package pkg_test as /* 定義ref cursor類型 不加return類型,為弱類型,允許動態sql查詢, 否則為強類型,無法使用動態sql查詢; */ type myrctype is ref cursor; --函數申明 function get(intID number) return myrctype; end pkg_test; / CREATE OR REPLACE package body pkg_test as --函數體 function get(intID number) return myrctype is rc myrctype; --定義ref cursor變量 sqlstr varchar2(500); begin if intID=0 then --靜態測試,直接用select語句直接返回結果 open rc for select id,name,sex,address,postcode,birthday from student; else --動態sql賦值,用:w_id來申明該變量從外部獲得 sqlstr := 'select id,name,sex,address,postcode,birthday from student where id=:w_id'; --動態測試,用sqlstr字符串返回結果,用using關鍵詞傳遞參數 open rc for sqlstr using intid; end if; return rc; end get; end pkg_test;

總結

以上是生活随笔為你收集整理的ORACLE动态SQL语句的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 三级视频久久 | 一本大道av伊人久久综合 | 国产黄色免费大片 | 波多野42部无码喷潮在线 | 欧美国产综合视频 | 91视频免费看 | 国产一区二区三区欧美 | 二区三区免费 | 国产精品高潮呻吟久久av野狼 | 91麻豆精品国产 | 女尊高h男高潮呻吟 | 亚洲制服另类 | 天天躁日日躁狠狠很躁 | 日韩欧美国产激情 | 亚洲欧美高清视频 | 亚洲视频精品在线观看 | 一区精品视频在线观看 | 涩涩综合 | 打屁股调教视频 | 精品人人人| 国产无码久久精品 | 免费av一级片| 隣の若妻さん波多野结衣 | 不卡av一区| 99久久精品国产亚洲 | 涩涩视频在线看 | 欧美sm凌虐视频网站 | 都市激情亚洲一区 | 国产熟女高潮视频 | 黄色一级片在线播放 | 在线免费观看一区二区三区 | 久久免费视频精品 | 欧美性猛交bbbbb精品 | 久久第一页 | 欧美精品成人一区二区三区四区 | 国产精品成人在线 | 姝姝窝人体www聚色窝 | 最新毛片网站 | 农村寡妇一区二区三区 | 欧美一级片免费观看 | 老熟妇高潮一区二区高清视频 | 国产一区二区日韩 | 自拍偷拍色综合 | 自拍偷拍福利 | 激情综合一区二区三区 | 国产欧美日韩精品一区二区三区 | av香蕉 | 日本精品一区视频 | 色香色香欲天天天影视综合网 | 在线欧美激情 | 五月婷婷丁香六月 | 日本国产在线观看 | 蜜桃一区二区 | 高清视频一区二区三区 | 另类专区亚洲 | 精品欧美日韩 | 国产美女精品人人做人人爽 | 天天看毛片 | 爱情岛论坛亚洲品质自拍 | 欧美丰满熟妇bbbbbb百度 | 伊人影院中文字幕 | 欧美日韩在线不卡 | 九九天堂 | 麻豆网站在线播放 | 尤物在线视频 | 国产chinese中国hdxxxx | 久久神马影院 | 久久久久久亚洲中文字幕无码 | 免费成人进口网站 | 精品一区精品二区 | 国产精品无码久久久久久电影 | 99久久久久久久 | 久久久久草 | 18做爰免费视频网站 | 免费人成自慰网站 | 国产精品久久久久久在线观看 | 日韩一区二区免费播放 | 污网站在线观看免费 | 一区久久久 | 亚洲玖玖玖| 色悠悠国产| 久久婷婷精品 | 少妇欧美激情一区二区三区 | 97精品国产97久久久久久免费 | 亚洲精品国产福利 | a毛片在线观看 | 日本免费色| 色臀 | 亚洲人妻一区二区三区 | 久久久久噜噜噜亚洲熟女综合 | 日本免费一区二区三区四区五六区 | 成人免费看片在线观看 | 亚洲s码欧洲m码国产av | 中国老妇性视频 | 丰满人妻一区二区三区免费视频 | 二级毛片在线观看 | 蜜桃av中文字幕 | 亚洲第一av | 这里只有精品免费视频 |