Oracle游标使用大全(中)

文章作者 100test 发表时间 2007:03:14 13:39:55
来源 100Test.Com百考试题网


从游标提取数据
从游标得到一行数据使用FETCH命令。每一次提取数据后,游标都指向结果集的下一行。语法如下:
FETCH cursor_name INTO variable[,variable,...]
对于SELECT定义的游标的每一列,FETCH变量列表都应该有一个变量与之相对应,变量的类型也要相同。

例:
SET SERVERIUTPUT ON
DECLARE
v_ename EMP.ENAME%TYPE.
v_salary EMP.SALARY%TYPE.
CURSOR c_emp IS SELECT ename,salary FROM emp.
BEGIN
OPEN c_emp.
FETCH c_emp INTO v_ename,v_salary.
DBMS_OUTPUT.PUT_LINE(Salary of Employee|| v_ename ||is|| v_salary).
FETCH c_emp INTO v_ename,v_salary.
DBMS_OUTPUT.PUT_LINE(Salary of Employee|| v_ename ||is|| v_salary).
FETCH c_emp INTO v_ename,v_salary.
DBMS_OUTPUT.PUT_LINE(Salary of Employee|| v_ename ||is|| v_salary).
CLOSE c_emp.
END

这段代码无疑是非常麻烦的,如果有多行返回结果,可以使用循环并用游标属性为结束循环的条件,以这种方式提取数据,程序的可读性和简洁性都大为提高,下面我们使用循环重新写上面的程序:
SET SERVERIUTPUT ON
DECLARE
v_ename EMP.ENAME%TYPE.
v_salary EMP.SALARY%TYPE.
CURSOR c_emp IS SELECT ename,salary FROM emp.
BEGIN
OPEN c_emp.
LOOP
FETCH c_emp INTO v_ename,v_salary.
EXIT WHEN c_emp%NOTFOUND.
DBMS_OUTPUT.PUT_LINE(Salary of Employee|| v_ename ||is|| v_salary).
END

记录变量
定义一个记录变量使用TYPE命令和%ROWTYPE,关于%ROWsTYPE的更多信息请参阅相关资料。
记录变量用于从游标中提取数据行,当游标选择很多列的时候,那么使用记录比为每列声明一个变量要方便得多。
当在表上使用%ROWTYPE并将从游标中取出的值放入记录中时,如果要选择表中所有列,那么在SELECT子句中使用*比将所有列名列出来要得多。

例:
SET SERVERIUTPUT ON
DECLARE
R_emp EMP%ROWTYPE.
CURSOR c_emp IS SELECT * FROM emp.
BEGIN
OPEN c_emp.
LOOP
FETCH c_emp INTO r_emp.
EXIT WHEN c_emp%NOTFOUND.
DBMS_OUT.PUT.PUT_LINE(Salary of Employee||r_emp.ename||is|| r_emp.salary).
END LOOP.
CLOSE c_emp.
END.

%ROWTYPE也可以用游标名来定义,这样的话就必须要首先声明游标:

SET SERVERIUTPUT ON
DECLARE
CURSOR c_emp IS SELECT ename,salary FROM emp.
R_emp c_emp%ROWTYPE.
BEGIN
OPEN c_emp.
LOOP
FETCH c_emp INTO r_emp.
EXIT WHEN c_emp%NOTFOUND.
DBMS_OUT.PUT.PUT_LINE(Salary of Employee||r_emp.ename||is|| r_emp.salary).
END LOOP.
CLOSE c_emp.
END.


相关文章


2006年之官方消息:Oracle8i认证即将退休
Oracle公司考虑开发属于自己的Linux
Oracle用RMAN和DBMS_JOB包实现自动存储
用可传输表空间实现Oracle跨平台移植
Oracle游标使用大全(中)
Oracle身份管理套件帮助企业进行安全管理
Oracle游标使用大全(下)
Oracle数据库管理系统发布11i安全补丁
Oracle中建立索引并强制优化器使用
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛