資源描述:
《動(dòng)態(tài)sql與綁定變量》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫(kù)。
1、動(dòng)態(tài)SQL與綁定變量動(dòng)態(tài)SQL與綁定變量(初稿轉(zhuǎn)載)http://space.itpub.net/12474069/viewspace-6211571什么是動(dòng)態(tài)SQL(DynamicSQL)動(dòng)態(tài)SQL使你在運(yùn)行時(shí),以字符串的形式構(gòu)造SQL語(yǔ)句。這些語(yǔ)句包含在PL/SQL塊中,并且常常包含占位符來(lái)使用綁定變量。這一點(diǎn)于靜態(tài)SQL是不同的。靜態(tài)SQL在編譯時(shí)就固定了。由于在編譯時(shí)SQL的全文還不確定,所以你可使用動(dòng)態(tài)SQL構(gòu)建靈活的,多用途的應(yīng)用程序??梢栽赑L/SQL,Pro*C/C++,andJava這幾種不同的開(kāi)發(fā)環(huán)境中使用動(dòng)態(tài)SQL。舉一個(gè)使用動(dòng)態(tài)
2、SQL的例子,比如在一個(gè)數(shù)據(jù)倉(cāng)庫(kù)的環(huán)境中,在運(yùn)行時(shí)才知道表的名字。這些表是以年月來(lái)明明的,例如:inv_01_2003,inv_04_2003,inv_07_2003,inv_10_2003,inv_01_2004,等等。你可以在報(bào)表程序中運(yùn)行時(shí)定義這些表的名字?!≡倥e另外一個(gè)例子,你現(xiàn)在要運(yùn)行一個(gè)復(fù)雜的查詢,并且排序字段是要由用戶來(lái)選擇。為了不因?yàn)榕判蝽樞虻母淖兌帉懜嗟牟樵冋Z(yǔ)句,你可以使用一個(gè)包含定義的排序子句的動(dòng)態(tài)SQL.2為什么要使用動(dòng)態(tài)SQL靜態(tài)SQL和動(dòng)態(tài)SQL都有各自的優(yōu)缺點(diǎn)靜態(tài)SQL的優(yōu)點(diǎn)是:編譯成功就表示訪問(wèn)的數(shù)據(jù)庫(kù)對(duì)象有效并且有權(quán)
3、限來(lái)訪問(wèn)數(shù)據(jù)庫(kù)的對(duì)象。靜態(tài)SQL的性能一般要好于動(dòng)態(tài)SQL盡管如此,靜態(tài)SQL也有他的局限,而這些局限動(dòng)態(tài)SQL卻能克服。下面列舉了這些局限 不知道PL/SQL中語(yǔ)句的全文。這些語(yǔ)句也許依賴于傳入?yún)?shù),或者需要程序進(jìn)行處理而得到?!?zhí)行DDL語(yǔ)句或者其他靜態(tài)SQL不支持的語(yǔ)句需要一個(gè)應(yīng)對(duì)不同的數(shù)據(jù)定義,而不需要重新編譯的程序。動(dòng)態(tài)SQL比靜態(tài)SQL更加靈活,因?yàn)樗梢詷?gòu)造出面對(duì)不同環(huán)境都可重用的代碼。作為一般的準(zhǔn)則,你應(yīng)該在靜態(tài)SQL不能達(dá)到目標(biāo),或者使用靜態(tài)SQL比較繁雜的時(shí)候使用動(dòng)態(tài)SQL。下面列舉出使用動(dòng)態(tài)SQL的典型情況。在PL/SQL中運(yùn)行D
4、atadefinitionlanguage(DDL)和Sessioncontrollanguage(SCL)運(yùn)行動(dòng)態(tài)查詢參照在編譯時(shí)不存在的對(duì)象為了更佳的性能3避免寫動(dòng)態(tài)SQL使用DECODE,CASE構(gòu)造半動(dòng)態(tài)SQL上圖是淘寶網(wǎng)中手機(jī)選項(xiàng)。經(jīng)常有這樣的需求。如果輸入手機(jī)型號(hào)那么就用手機(jī)型號(hào)篩選,如果沒(méi)有輸入那么就不用篩選了。常規(guī)解決辦法動(dòng)態(tài)SQL查詢Adeclarec1SYS_REFCURSOR;i_phone_namevarchar2(20);i_phone_typevarchar2(20)
5、;i_phone_servicevarchar(20);v_sqlvarchar2(2000);rphone_info%rowtype;begini_phone_name:='''SYS''';v_sql:='select*fromphone_infowhere1=1';ifi_phone_nameisnotnullthenv_sql:=v_sql
6、
7、'andWNER='
8、
9、i_phone_name;endif;ifi_phone_typeisnotnullthenv_sql:=v_sql
10、
11、'andOBJECT_NAME='
12、
13、i_phone_typ
14、e;endif;ifi_phone_serviceisnotnullthenv_sql:=v_sql
15、
16、'andOBJECT_ID='
17、
18、i_phone_service;endif;v_sql:=v_sql
19、
20、'andrownum<20';dbms_output.put_line(v_sql);openc1forv_sql;fetchc1intor;while(c1%found)loopnull;dbms_output.put_line('OBJECT_NAME='
21、
22、r.OBJECT_NAME);fetchc1intor;endloop;closec
23、1;end;輸出結(jié)果select*fromphone_infowhere1=1andrownum<20OBJECT_NAME=ICOL$OBJECT_NAME=I_USER1OBJECT_NAME=CON$OBJECT_NAME=UNDO$OBJECT_NAME=C_COBJ#OBJECT_NAME=I_OBJ#OBJECT_NAME=PROXY_ROLE_DATA$OBJECT_NAME=I_IND1OBJECT_NAME=I_CDEF2OBJECT_N
24、AME=I_PROXY_ROLE_DATA$_1OBJECT_NAME=FILE$OBJECT