日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

完全版 ESQL/C資料三( 三 )


PROCEDURE create_dept
(new_dname IN CHAR(14),
new_loc IN CHAR(13),
new_deptno OUT NUMBER(2)) IS
BEGIN
SELECT deptno_seq.NEXTVAL INTO new_deptno FROM dual;
INSERT INTO dept VALUES (new_deptno, new_dname, new_loc);
END create_dept;
其中的IN/OUT,表示參數(shù)模式 。IN是傳遞參數(shù)值到過(guò)程,而OUT是從過(guò)程傳遞參數(shù)值到調(diào)用者 。
但是,如果使用這些擴(kuò)展的功能,也會(huì)造成同其他數(shù)據(jù)庫(kù)廠商的嵌入SQL的不兼容 。
4.3 動(dòng)態(tài)SQL語(yǔ)句
4.3.1 ORACLE動(dòng)態(tài)SQL語(yǔ)句的一些特點(diǎn)
ORACLE DBMS進(jìn)入市場(chǎng)的時(shí)間早于DB2,其動(dòng)態(tài)SQL支持是以IBM的system/R原型為基礎(chǔ)的 。因此,ORACLE支持的動(dòng)態(tài)SQL與IBM的DB2標(biāo)準(zhǔn)有不同 。雖然ORACLE和DB2在很大程度上是兼容的,但是在使用參數(shù)標(biāo)志、SQLDA格式及支持?jǐn)?shù)據(jù)類型轉(zhuǎn)換等方面都有差異 。
DB2中不允許在PREPARE的動(dòng)態(tài)語(yǔ)句中引用宿主變量,而是用問(wèn)號(hào)來(lái)標(biāo)志語(yǔ)句中的參數(shù),然后用EXECUTE或OPEN語(yǔ)句來(lái)規(guī)定參數(shù)值 。ORACLE允許用戶用宿主變量規(guī)定動(dòng)態(tài)語(yǔ)句中的參數(shù) 。
而且,ORACLE支持的DESCRIBE語(yǔ)句同DB2有一些區(qū)別 。如:
從已經(jīng)PREPARE后的動(dòng)態(tài)查詢語(yǔ)句中獲得對(duì)查詢結(jié)果列的信息的語(yǔ)句為:
EXEC SQL DESCRIBE SELECT LIST FOR qrystmt INTO qry_sqlda;
等價(jià)于DB2的:
EXEC SQL DESCRIBE qrystmt INTO qry_sqlda;
從已經(jīng)PREPARE后的動(dòng)態(tài)查詢語(yǔ)句中獲得對(duì)查詢參數(shù)的說(shuō)明的語(yǔ)句為:
EXEC SQL DESCRIBE BIND LIST FOR qrystmt INTO qry_sqlda;
該ORACLE語(yǔ)句沒(méi)有對(duì)應(yīng)的DB2語(yǔ)句 。用戶只能按照當(dāng)前需要的參數(shù)和SQLDA的結(jié)構(gòu)對(duì)SQLDA賦值 。然后再在OPEN語(yǔ)句或EXECUTE語(yǔ)句中使用SQLDA結(jié)構(gòu) 。
4.3.2 使用動(dòng)態(tài)SQL的四種方法
使用動(dòng)態(tài)SQL,共分成四種方法:方法 支持的SQL語(yǔ)句1 該語(yǔ)句不包含宿主變量,該語(yǔ)句不是查詢語(yǔ)句
2 該語(yǔ)句包含輸入宿主變量 ,該語(yǔ)句不是查詢語(yǔ)句
3 包含已知數(shù)目的輸入宿主變量或列的查詢
4 包含未知數(shù)目的輸入宿主變量或列的查詢
l方法1:使用EXECUTE IMMEDIATE命令實(shí)現(xiàn),具體語(yǔ)法為:
EXEC SQL EXECUTE IMMEDIATE { :host_string | string_literal };
其中,host_variable和string是存放完整T-SQL語(yǔ)句 。
請(qǐng)看下面這個(gè)例子 。這個(gè)例子的作用是執(zhí)行用戶隨意輸入的合法的SQL語(yǔ)句 。
char dyn_stmt[132];
...
for (;;)
{
printf("Enter SQL statement: ");
gets(dyn_stmt);
if (*dyn_stmt == "")
break;
/* dyn_stmt now contains the text of a SQL statement */
EXEC SQL EXECUTE IMMEDIATE :dyn_stmt;
}
...
EXECUTE IMMEDIATE命令的作用是:分析該語(yǔ)句的語(yǔ)法,然后執(zhí)行該語(yǔ)句 。方法1適合于僅僅執(zhí)行一次的語(yǔ)句 。
l方法2:方法支持的語(yǔ)句可以包含輸入宿主變量 。這個(gè)語(yǔ)句首先做PREPARE操作,然后通過(guò)EXECUTE執(zhí)行 。PREPARE語(yǔ)句的語(yǔ)法為:
EXEC SQL PREPARE statement_name FROM { :host_string | string_literal };
該語(yǔ)句接收含有SQL語(yǔ)句串的宿主變量,并把該語(yǔ)句送到ORACLE 。ORACLE編譯語(yǔ)句并生成執(zhí)行計(jì)劃 。在語(yǔ)句串中包含一個(gè)“?”表明參數(shù),當(dāng)執(zhí)行語(yǔ)句時(shí),ORACLE需要參數(shù)來(lái)替代這些“?” 。PREPRARE執(zhí)行的結(jié)果是,DBMS用語(yǔ)句名標(biāo)志準(zhǔn)備后的語(yǔ)句 。在執(zhí)行SQL語(yǔ)句時(shí),EXECUTE語(yǔ)句后面是這個(gè)語(yǔ)句名 。EXECUTE語(yǔ)句的語(yǔ)法為:
EXECUTE 語(yǔ)句名 USING 宿主變量 | DESCRIPTOR 描述符名
它的作用是,請(qǐng)求ORACLE執(zhí)行PREPARE語(yǔ)句準(zhǔn)備好的語(yǔ)句 。當(dāng)要執(zhí)行的動(dòng)態(tài)語(yǔ)句中包含一個(gè)或多個(gè)參數(shù)標(biāo)志時(shí),在EXECUTE語(yǔ)句必須為每一個(gè)參數(shù)提供值 。這樣的話,EXECUTE語(yǔ)句用宿主變量值逐一代替準(zhǔn)備語(yǔ)句中的參數(shù)標(biāo)志(“?”或其他占位符),從而,為動(dòng)態(tài)執(zhí)行語(yǔ)句提供了輸入值 。
使用主變量提供值,USING子句中的主變量數(shù)必須同動(dòng)態(tài)語(yǔ)句中的參數(shù)標(biāo)志數(shù)一致,而且每一個(gè)主變量的數(shù)據(jù)類型必須同相應(yīng)參數(shù)所需的數(shù)據(jù)類型相一致 。各主變量也可以有一個(gè)伴隨主變量的指示符變量 。當(dāng)處理EXECUTE語(yǔ)句時(shí),如果指示符變量包含一個(gè)負(fù)值,就把NULL值賦予相應(yīng)的參數(shù)標(biāo)志 。除了使用主變量為參數(shù)提供值,也可以通過(guò)SQLDA提供值 。

推薦閱讀