SQL標(biāo)準(zhǔn)從SQL92開始提供對動(dòng)態(tài)SQL的支持。引入動(dòng)態(tài)SQL的原因,是由于" />

国产成人精品无码青草_亚洲国产美女精品久久久久∴_欧美人与鲁交大毛片免费_国产果冻豆传媒麻婆精东

18143453325 在線咨詢 在線咨詢
18143453325 在線咨詢
所在位置: 首頁 > 營銷資訊 > 信息時(shí)代 > 動(dòng)態(tài)SQL(數(shù)據(jù)庫)

動(dòng)態(tài)SQL(數(shù)據(jù)庫)

時(shí)間:2022-12-19 10:30:02 | 來源:信息時(shí)代

時(shí)間:2022-12-19 10:30:02 來源:信息時(shí)代

    動(dòng)態(tài)SQL : SQL標(biāo)準(zhǔn)提供的一種語句運(yùn)行機(jī)制,它允許在SQL客戶模塊或嵌入式宿主程序的執(zhí)行過程中執(zhí)行動(dòng)態(tài)生成SQL語句。
SQL標(biāo)準(zhǔn)從SQL92開始提供對動(dòng)態(tài)SQL的支持。引入動(dòng)態(tài)SQL的原因,是由于靜態(tài)SQL語句不能提供足夠的編程靈活性。在數(shù)據(jù)庫應(yīng)用開發(fā)中,雖然很多情況下可以把即將執(zhí)行的SQL語句編碼到SQL客戶模塊定義中,或編碼到使用嵌入語法的編譯單元中,但也有一些情況,寫程序時(shí)SQL語句是未知的,需要通過動(dòng)態(tài)SQL機(jī)制在程序執(zhí)行時(shí)產(chǎn)生SQL語句。例如,要編寫一個(gè)能隨時(shí)接受用戶從鍵盤輸入的SQL語句的應(yīng)用程序,而用戶可能鍵入什么樣的語句內(nèi)容在編程時(shí)是不可預(yù)知的。根據(jù)上述特征,SQL語句可分為靜態(tài)SQL語句和動(dòng)態(tài)SQL語句。所謂靜態(tài)SQL語句,是指除其引用的變量值為未知的外,語句的形式和操作對象等在編譯時(shí)都已經(jīng)確定的SQL語句: 而動(dòng)態(tài)SQL語句是指在程序編譯時(shí)尚未確定,其中有些部分需要在程序的執(zhí)行過程中臨時(shí)生成的SQL語句。
SQL標(biāo)準(zhǔn)提供的語句動(dòng)態(tài)執(zhí)行方式有兩種。一種是立即執(zhí)行; 一種是先準(zhǔn)備后執(zhí)行。
立即執(zhí)行由立即執(zhí)行語句實(shí)現(xiàn)。該語句的語法為: “EXECUTE IMMEDIATE SQL語句變量”。其中,“SQL語句變量”是一個(gè)字符串類型的變量,該變量的值就是要執(zhí)行的SQL語句的文本。如:
EXEC SQL EXECUTE IMMEDIATE:sql_str;
執(zhí)行該語句時(shí),SQL服務(wù)器會(huì)對宿主變量sql_str包含的字符串進(jìn)行解析并執(zhí)行它所表示的SQL語句。如果sql_str的值為字符串“INSERT INTO T VALUES (0)”,則該語句的執(zhí)行等效于: “EXEC SQL INSERT INTO T VALUES (0);”。并非所有的SQL語句都可以立即執(zhí)行,當(dāng)語句為查詢語句或包含動(dòng)態(tài)參數(shù)說明時(shí),就必須使用先準(zhǔn)備后執(zhí)行的方式。此外,當(dāng)同一條動(dòng)態(tài)SQL語句在程序中需要被多次執(zhí)行時(shí),先準(zhǔn)備后執(zhí)行方式的效率更高。先準(zhǔn)備后執(zhí)行方式比立即執(zhí)行方式的功能更強(qiáng)大,同時(shí)語法也更復(fù)雜。在這種方式下,動(dòng)態(tài)SQL語句先通過準(zhǔn)備語句進(jìn)行準(zhǔn)備,然后通過執(zhí)行語句執(zhí)行一次或多次,當(dāng)不再需要執(zhí)行該語句時(shí),可以通過回收準(zhǔn)備語句釋放。
SQL語句中可能會(huì)使用參數(shù),在動(dòng)態(tài)執(zhí)行的SQL語句中,這些參數(shù)被稱為動(dòng)態(tài)參數(shù)。動(dòng)態(tài)參數(shù)在SQL語句中表現(xiàn)為問號“?”的形式。在有些情況下,產(chǎn)生動(dòng)態(tài)執(zhí)行的SQL語句的應(yīng)用程序詳細(xì)地知道該語句使用的動(dòng)態(tài)參數(shù)所要求的特征(如數(shù)據(jù)類型、長度、精度、標(biāo)度等等); 類似地,該應(yīng)用程序也可能詳細(xì)地知道執(zhí)行該語句的返回值的特征。然而,在另一些情況下,這些信息是不可知的,只能由執(zhí)行的準(zhǔn)備語句的上下文得到。
為了給應(yīng)用程序提供必要的信息,SQL標(biāo)準(zhǔn)支持應(yīng)用程序通過描述語句要求SQL服務(wù)器描述準(zhǔn)備語句。一個(gè)語句的描述信息標(biāo)識(shí)了輸入動(dòng)態(tài)參數(shù)個(gè)數(shù)和它們的數(shù)據(jù)類型信息,或者輸出參數(shù)的個(gè)數(shù)或返回值和它們的數(shù)據(jù)類型信息。這些描述信息被放在SQL描述符區(qū)中。SQL描述符區(qū)由一個(gè)或多個(gè)條目描述符區(qū),以及包括這些條目描述符區(qū)個(gè)數(shù)計(jì)數(shù)的首部構(gòu)成。SQL描述符區(qū)可通過分配描述符語句、回收描述符語句、設(shè)置描述符語句和獲取描述符語句來分配和維護(hù)。
動(dòng)態(tài)執(zhí)行的SQL語句中最復(fù)雜的是動(dòng)態(tài)選擇語句。對于動(dòng)態(tài)選擇語句,SQL標(biāo)準(zhǔn)提供兩種處理方式: 動(dòng)態(tài)單行選擇語句和動(dòng)態(tài)游標(biāo)方式。前者只在可以確定查詢結(jié)果不超過一行的情況下使用,一般情況下則是通過動(dòng)態(tài)聲明游標(biāo)語句或分配游標(biāo)語句將其與一個(gè)游標(biāo)相關(guān)聯(lián)。標(biāo)準(zhǔn)還提供一系列對動(dòng)態(tài)游標(biāo)的操縱語句。動(dòng)態(tài)打開語句打開游標(biāo)并將動(dòng)態(tài)參數(shù)與該游標(biāo)綁定。動(dòng)態(tài)獲取語句把打開的游標(biāo)定位到特定行,并獲取該行中列的值。動(dòng)態(tài)關(guān)閉語句關(guān)閉由動(dòng)態(tài)打開語句打開的游標(biāo)?!皠?dòng)態(tài)刪除語句: 定位”用動(dòng)態(tài)游標(biāo)來刪除行?!皠?dòng)態(tài)更新語句:定位”用動(dòng)態(tài)游標(biāo)來更新行。當(dāng)語句精確格式直到執(zhí)行時(shí)才可知時(shí),“可準(zhǔn)備動(dòng)態(tài)刪除語句: 定位”用動(dòng)態(tài)游標(biāo)來刪除行。當(dāng)語句精確格式直到執(zhí)行時(shí)才可知時(shí),“可準(zhǔn)備動(dòng)態(tài)更新語句: 定位”用動(dòng)態(tài)游標(biāo)來更新行。
下面是一個(gè)動(dòng)態(tài)SQL查詢的程序示例,例中有一個(gè)字符型的動(dòng)態(tài)輸入?yún)?shù),但輸出參數(shù)的個(gè)數(shù)和數(shù)據(jù)類型不定。
EXEC BEGIN DECLARE SECTION;
int i,col_num,col_type;
char sql_str[100];
EXEC SQL END DECLARE SECTION;
……
strcpy(sql_str,
"SELECT*FROM tab_1 WHERE col_1=?");
EXEC SQL PREPARE sql_stmt FROM :sql_str;
EXEC SQL DECLARE c1 CURSOR FOR sql_stmt;
EXEC SQL ALLOCATE DESCRIPTOR des_1;
/*描述動(dòng)態(tài)輸入?yún)?shù)的信息*/
EXEC SQL DESCRIBE INPUT sql_stmt
USING DESCRIPTOR des_1;
/*給描述符賦值*/
EXEC SQL SET DESCRIPTOR des_1 VALUE 1
TYPE=1,INDICATOR=0,
DATA='A00001',LENGTH=6;
EXEC SQL OPEN c1
USING DESCRIPTOR des_1;
/*描述動(dòng)態(tài)輸出參數(shù)的信息*/
EXEC SQL DESCRIBE OUTPUT sql_stmt
USING DESCRIPTOR des_1;
for(;;){
EXEC SQL FETCH c1
USING DESCRIPTOR des_1;
if(!strncmp(SQLSTATE,”02000”,5)) break;
EXEC SQL GET DESCRIPTOR des_1
:col num=COUNT;
for(i=1;i〈col_num;i++){
EXEC SQL GET DESCRIPTOR des_1
:i:col_type=TYPE;
/*根據(jù)返回值的數(shù)據(jù)類型進(jìn)行處理*/
switch(col_type){
case 1: ……
case 2: ……
……
}
}
}
EXEC SQL CLOSE c1;
EXEC SQL DEALLOCATE PREPARE sql_stmt;
EXEC SQL DEALLOCATE DESCRIPTOR des_1;

74
73
25
news

版權(quán)所有? 億企邦 1997-2022 保留一切法律許可權(quán)利。

為了最佳展示效果,本站不支持IE9及以下版本的瀏覽器,建議您使用谷歌Chrome瀏覽器。 點(diǎn)擊下載Chrome瀏覽器
關(guān)閉