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

完全版 ESQL/C資料三


第四節(jié) ORACLE數(shù)據(jù)庫(kù)的嵌入SQL語言
4.1 基本的SQL語句
4.1.1宿主變量和指示符
1)、聲明方法
同其他數(shù)據(jù)庫(kù)管理器一樣,ORACLE使用宿主變量傳遞數(shù)據(jù)庫(kù)中的數(shù)據(jù)和狀態(tài)信息到應(yīng)用程序,應(yīng)用程序也通過宿主變量傳遞數(shù)據(jù)到ORACLE數(shù)據(jù)庫(kù) 。根據(jù)上面兩種功能,宿主變量分為輸出宿主變量和輸入宿主變量 。在SELECT INTO和FETCH語句之后的宿主變量稱作“輸出宿主變量”,這是因?yàn)閺臄?shù)據(jù)庫(kù)傳遞列數(shù)據(jù)到應(yīng)用程序 。除了SELECT INTO和FETCH語句外的其他SQL語句中的宿主變量,稱為“輸入宿主變量” 。這是因?yàn)閺膽?yīng)用程序向數(shù)據(jù)庫(kù)輸入值 。如:INSERT、UPDATE等語句 。請(qǐng)看下面這個(gè)例子:
int emp_number;
char temp[20];
VARCHAR emp_name[20];
/* get values for input host variables */
printf("Employee number? ");
gets(temp);
emp_number = atoi(temp);
printf("Employee name? ");
gets(emp_name.arr);
emp_name.len = strlen(emp_name.arr);
EXEC SQL INSERT INTO EMP (EMPNO, ENAME)
VALUES (:emp_number, :emp_name);
在上面這個(gè)例子中,其中的emp_number和emp_name就是宿主變量 。值得注意的是,它同其他數(shù)據(jù)庫(kù)的區(qū)別是,定義宿主變量可以不需要BEGIN DECLARE SECTION和END DECLARE SECTION 。
2)、指示符變量
大多數(shù)程序設(shè)計(jì)語言(如C)都不支持NULL 。所以對(duì)NULL的處理,一定要在SQL中完成 。我們可以使用主機(jī)指示符變量來解決這個(gè)問題 。在嵌入式SQL語句中,主變量和指示符變量共同規(guī)定一個(gè)單獨(dú)的SQL類型值 。指示符變量是一個(gè)2字節(jié)的整數(shù) 。
針對(duì)輸入宿主變量和輸出宿主變量,指示變量共有下面幾種情況:
同輸入宿主變量一起使用時(shí):
-1 Oracle將null賦值給列,即宿主變量應(yīng)該假設(shè)為NULL 。
>=0 Oracle將宿主變量的實(shí)際值賦值給列 。
同輸出宿主變量一起使用時(shí):
-1 表示該列的輸出值為NULL 。
0 Oracle已經(jīng)將列的值賦給了宿主變量 。列值未做截?cái)?。
>0 Oracle將列的值截?cái)啵①x給了宿主變量 。指示變量中存放了這個(gè)列的實(shí)際長(zhǎng)度 。
-2 Oracle將列的值截?cái)?,并賦給了宿主變量 。但是這個(gè)列的實(shí)際長(zhǎng)度不能確定 。
從數(shù)據(jù)庫(kù)中查詢數(shù)據(jù)時(shí),可以使用指示符變量來測(cè)試NULL:
EXEC SQL SELECT ename, sal
INTO :emp_name, :salary
FROM emp
WHERE :commission INDICATOR :ind_comm IS NULL ...
注意,不能使用關(guān)系操作符來比較NULL,這是因?yàn)镹ULL和任何操作都為false 。如:
EXEC SQL SELECT ename, sal
INTO :emp_name, :salary
FROM emp
WHERE comm = :commission
如果comm列的某些行存在NULL,則該SELECT語句不能返回正確的結(jié)果 。應(yīng)該使用下面這個(gè)語句完成:
EXEC SQL SELECT ename, sal
INTO :emp_name, :salary
FROM emp
WHERE (comm = :commission) OR ((comm IS NULL) AND
(:commission INDICATOR :ind_comm IS NULL));
4.1.2 查詢
如果是單行查詢,則應(yīng)該使用SELECT INTO語句 。如果是多行查詢,應(yīng)該使用游標(biāo)或宿主變量數(shù)組 。如:?jiǎn)涡胁樵兊囊粋€(gè)例子:
EXEC SQL SELECT ename, job, sal2000
INTO :emp_name, :job_title, :salary
FROM emp
WHERE empno = :emp_number;
在嵌入SQL語句中,也可以使用子查詢 。如:
EXEC SQL INSERT INTO emp2 (empno, ename, sal, deptno)
SELECT empno, ename, sal, deptno FROM emp
WHERE job = :job_title;
4.1.3 修改數(shù)據(jù)
1)、插入數(shù)據(jù)
使用INSERT語句插入數(shù)據(jù) 。其語法同ANSI SQL語法類似 。如:
EXEC SQL INSERT INTO emp (empno, ename, sal, deptno)
VALUES (:emp_number, :emp_name, :salary, :dept_number);
2)、更新數(shù)據(jù)
使用UPDATE語句更新數(shù)據(jù) 。其語法同ANSI SQL語法類似 。如:
EXEC SQL UPDATE emp
SET sal = :salary, comm = :commission
WHERE empno = :emp_number;
3)、刪除數(shù)據(jù)
使用DELETE語句刪除數(shù)據(jù) 。其語法同ANSI SQL語法類似 。如:

推薦閱讀