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.