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

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


請看下面這個例子 。這個例子的作用是刪除用戶指定的雇員信息 。
...
int emp_number INTEGER;
char delete_stmt[120], search_cond[40]
...
strcpy(delete_stmt, "DELETE FROM EMP WHERE EMPNO = :n AND ");
printf("Complete the following statement"s search condition--n");
printf("%sn", delete_stmt);
gets(search_cond);
strcat(delete_stmt, search_cond);

EXEC SQL PREPARE sql_stmt FROM :delete_stmt;
for (;;)
{printf("Enter employee number: ");
gets(temp);
emp_number = atoi(temp);
if (emp_number == 0)
break;
EXEC SQL EXECUTE sql_stmt USING :emp_number;
}
l方法三:是指查詢的列數(shù)或輸入宿主變量數(shù)在預(yù)編譯時已經(jīng)確定,但是數(shù)據(jù)庫中的對象,如表、列名等信息未確定 。這些對象名不能是宿主變量 。這時,必須通過以下語句來完成:
PREPARE statement_name FROM { :host_string | string_literal };
DECLARE cursor_name CURSOR FOR statement_name;
OPEN cursor_name [USING host_variable_list];
FETCH cursor_name INTO host_variable_list;
CLOSE cursor_name;
如:下面這個例子演示用方法3完成動態(tài)查詢:
char select_stmt[132] =
"SELECT MGR, JOB FROM EMP WHERE SAL < :salary";
EXEC SQL PREPARE sql_stmt FROM :select_stmt;
EXEC SQL DECLARE emp_cursor CURSOR FOR sql_stmt;
EXEC SQL OPEN emp_cursor USING :salary;
EXEC SQL FETCH emp_cursor INTO :mgr_number, :job_title;
EXEC SQL CLOSE emp_cursor;
l方法四:在預(yù)編譯時,查詢的列數(shù)或者宿主變量的個數(shù)不能確定,因為不知道具體的返回個數(shù),所以不能使用輸出宿主變量 。這是因為你不知道應(yīng)該定義多少個宿主變量 。這時,就需要SQLDA結(jié)構(gòu)和DESCRIBE命令 。SQLDA包含了動態(tài)查詢的列描述信息 。對于輸入宿主變量,也可以使用SQLDA來完成不確定的參數(shù)說明 。要完成方法四,必須通過以下語句來完成:
EXEC SQL PREPARE statement_name FROM { :host_string | string_literal };
EXEC SQL DECLARE cursor_name CURSOR FOR statement_name;
EXEC SQL DESCRIBE BIND VARIABLES FOR statement_name
INTO bind_descriptor_name;
EXEC SQL OPEN cursor_name
[USING DESCRIPTOR bind_descriptor_name];
EXEC SQL DESCRIBE [SELECT LIST FOR] statement_name
INTO select_descriptor_name;
EXEC SQL FETCH cursor_name USING DESCRIPTOR select_descriptor_name;
EXEC SQL CLOSE cursor_name;
在上述語句中,DESCRIBE SELECT LIST的作用是將PREPARE后的動態(tài)查詢語句的列名、數(shù)據(jù)類型、長度等信息保存在SQLDA中 。DESCRIBE BIND VARIABLES的作用是,檢查PREPARE后的動態(tài)查詢語句的每個占位符的名字、數(shù)據(jù)類型、長度等信息 。并將它存放在SQLDA中,然后,使用SQLDA提示用戶數(shù)據(jù)參數(shù)值 。
值得注意的是,方法之間可以混合使用 。如:在一個查詢中,列的個數(shù)確定,但是查詢中的占位符不確定,這時,你可以結(jié)合方法3和方法4,即使用方法3的FETCH語句和方法4的OPEN語句,如:EXEC SQL FETCH emp_cursor INTO host_variable_list; 反之,如果查詢中占位符的個數(shù)確定,而列數(shù)不確定,則你可以使用方法3的OPEN語句,如:EXEC SQL OPEN cursor_name [USING host_variable_list];
這里,我們講解的是嵌入SQL,對于嵌入PL/SQL,有一些區(qū)別 。簡單來說,主要有兩點(diǎn):
l預(yù)編譯器將PL/SQL塊中的所有宿主變量都作為輸入宿主變量 。
l不能對PL/SQL塊使用FETCH命令 。
l占位符不用聲明,可以是任何名字 。如:
INSERT INTO emp (empno, deptno) VALUES (:e, :d)
DELETE FROM dept WHERE deptno = :num OR loc = :loc
其中的e、d、num和loc就是占位符 。
4.3.3 SQLDA
SQLDA存放了輸出數(shù)據(jù)的信息,或存放了輸入數(shù)據(jù)的信息 。可以使用SQLSQLDAAlloc(runtime_context, size, name_length, ind_name_length)來分配空間 。
SQLDA結(jié)構(gòu)的定義存放在sqlda.h文件中 。它的內(nèi)容為:
struct SQLDA
{
long N; /* Descriptor size in number of entrIEs */

推薦閱讀