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

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


EXEC SQL DELETE FROM emp
WHERE deptno = :dept_number;
4.1.4 游標
用嵌入式SQL語句查詢數(shù)據(jù)分成兩類情況 。一類是單行結(jié)果,一類是多行結(jié)果 。對于單行結(jié)果,可以使用SELECT INTO語句;對于多行結(jié)果,你必須使用游標來完成 。游標是一個與SELECT語句相關(guān)聯(lián)的符號名,它使用戶可逐行訪問由ORACLE返回的結(jié)果集 。使用游標,應該包含以下四個步驟 。
1)、定義游標
使用DECLARE語句完成 。如:
EXEC SQL DECLARE emp_cursor CURSOR FOR
SELECT ename FROM emp WHERE deptno = :dept_number;
值得注意的是,不能在同一個文件中定義兩個相同名字的游標 。游標的作用范圍是全局的 。
2)、打開游標
使用OPEN語句完成 。如:
EXEC SQL OPEN emp_cursor;
3)、取一行值
使用FETCH語句完成 。如:
EXEC SQL FETCH emp_cursor INTO :emp_name;
4)、關(guān)閉游標
使用CLOSE語句完成 。它完成的功能是:釋放資源,如占用內(nèi)存,鎖等 。如:EXEC SQL CLOSE emp_cursor;
5)、使用游標修改數(shù)據(jù)
我們可以使用CURRENT OF子句來完成修改數(shù)據(jù) 。如:
EXEC SQL DECLARE emp_cursor CURSOR FOR
SELECT ename, sal FROM emp WHERE job = "CLERK"
FOR UPDATE OF sal;
...
EXEC SQL OPEN emp_cursor;
EXEC SQL WHENEVER NOT FOUND GOTO ...
for (;;) {
EXEC SQL FETCH emp_cursor INTO :emp_name, :salary;
...
EXEC SQL UPDATE emp SET sal = :new_salary
WHERE CURRENT OF emp_cursor;
}
值得注意的是,在使用CURRENT OF子句來完成修改數(shù)據(jù)時,在OPEN時會對數(shù)據(jù)加上排它鎖 。這個鎖直到有COMMIT或ROLLBACK語句時才釋放 。
以下是使用游標修改數(shù)據(jù)的一個完整例子:
...
/* 定義游標 */
EXEC SQL DECLARE emp_cursor CURSOR FOR
SELECT ename, job
FROM emp
WHERE empno = :emp_number
FOR UPDATE OF job;
/* 打開游標 */
EXEC SQL OPEN emp_cursor;
/* break if the last row was already fetched */
EXEC SQL WHENEVER NOT FOUND DO break;
/* 循環(huán)取值*/
for (;;)
{
EXEC SQL FETCH emp_cursor INTO :emp_name, :job_title;
/* 更新當前游標所在的行的數(shù)據(jù)*/
EXEC SQL UPDATE emp
SET job = :new_job_title
WHERE CURRENT OF emp_cursor;
}
...
/* 關(guān)閉游標 */
EXEC SQL CLOSE emp_cursor;
EXEC SQL COMMIT WORK RELEASE;
...下面這個例子完整演示了靜態(tài)游標的使用方法 。這個例子的作用是,獲得部門編號,通過游標來顯示這個部門中的所有雇員信息 。#include
/* 聲明宿主變量 */
char userid[12] = "SCOTT/TIGER";
char emp_name[10];
int emp_number;
int dept_number;
char temp[32];
void sql_error();
/*包含SQLCA */
#include
main()
{ emp_number = 7499;
/* 處理錯誤*/
EXEC SQL WHENEVER SQLERROR do sql_error("Oracle error");
/* 連接到Oracle數(shù)據(jù)庫*/
EXEC SQL CONNECT :userid;
printf("Connected.n");
/* 聲明游標 */
EXEC SQL DECLARE emp_cursor CURSOR FOR
SELECT ename FROM emp WHERE deptno = :dept_number;
printf("Department number? ");
gets(temp);
dept_number = atoi(temp);
/* 打開游標*/
EXEC SQL OPEN emp_cursor;
printf("Employee Namen");
printf("-------------n");
/* 循環(huán)處理每一行數(shù)據(jù),如果無數(shù)據(jù),則退出*/
EXEC SQL WHENEVER NOT FOUND DO break;
while (1)
{
EXEC SQL FETCH emp_cursor INTO :emp_name;
printf("%sn", emp_name);
}
EXEC SQL CLOSE emp_cursor;
EXEC SQL COMMIT WORK RELEASE;
exit(0);
}
/錯誤處理程序*/
void sql_error(msg)
char *msg;
{
char buf[500];
int buflen, msglen;
EXEC SQL WHENEVER SQLERROR CONTINUE;
EXEC SQL ROLLBACK WORK RELEASE;
buflen = sizeof (buf);
sqlglm(buf, &buflen, &msglen);
printf("%sn", msg);
printf("%*.sn", msglen, buf);
exit(1);
}
4.2 嵌入PL/SQL
嵌入PL/SQL和嵌入SQL不同 。嵌入PL/SQL提供了很多嵌入SQL不具有的優(yōu)點,如:更好的性能、更靈活的表達方式 。能夠自己定義過程和函數(shù) 。如:

推薦閱讀