使用光标FOR循环处理查询结果集
光标FOR循环允许你运行一个SELECT语句,然后立即循环结果集中的所有行。光标FOR循环可以使用隐式光标和显式光标。
如果只在光标FOR循环中使用SELEEC语句,则可以在光标FOR循环的内部指定SELECT语句,这种形式的光标FOR循环使用隐式光标,被称为隐式光标FOR循环语句。因为隐式光标对于语句来讲是内部的,所以不能使用命名SQL来引用它。
如果在相同的PL/SQL块中多次使用SELECT语句,则需要为它定义显式光标并在光标FOR循环语句中指定该光标。这种形式的光标FOR循环称为显式光标FOR循环语句。
光标FOR循环语句隐式地声明了循环变量,为光标返回类型的%ROWTYPE记录类型的变量。该记录对于循环是内部的,并只在循环执行期间存在。当有没有行被获取的时候,光标FOR循环关闭光标。当循环中的语句将控制权转移到循环外部或PL/SQL产生异常时,光标也被关闭。
--隐式光标FOR循环 BEGIN FOR item IN ( SELECT last_name, job_id FROM employees WHERE job_id LIKE '%CLERK%' AND manager_id > 120 ORDER BY last_name) LOOP DBMS_OUTPUT.PUT_LINE('Name = ' || item.last_name || ', Job = ' || item.job_id); END LOOP; END;
|
--显式光标FOR循环 DECLARE CURSOR c1 IS SELECT last_name, job_id FROM employees WHERE job_id LIKE '%CLERK%' AND manager_id > 120 ORDER BY last_name; BEGIN FOR item IN c1 LOOP DBMS_OUTPUT.PUT_LINE('Name = ' || item.last_name || ', Job = ' || item.job_id); END LOOP; END; |
--给显式光标FOR循环传递参数,即带参光标 DECLARE CURSOR c1 (job VARCHAR2, max_wage NUMBER) IS SELECT * FROM employees WHERE job_id = job AND salary > max_wage; BEGIN --打开带参光标 FOR person IN c1('ST_CLERK', 3000) LOOP DBMS_OUTPUT.PUT_LINE ( 'Name = ' || person.last_name || ', salary = ' || person.salary || ', Job Id = ' || person.job_id); END LOOP; END;
|
--隐式光标FOR循环引用计算的列(需要为计算的列指定别名) BEGIN FOR item IN (SELECT first_name || ' ' || last_name AS full_name, salary * 10 AS dream_salary FROM employees WHERE ROWNUM <= 5 ORDER BY dream_salary DESC, last_name ASC) LOOP DBMS_OUTPUT.PUT_LINE(item.full_name || ' 期望的薪水 ' || item.dream_salary); END LOOP; END;
|
注意:在光标FOR循环中的语句如果产生异常,则在异常处理代码运行之前光标已经关闭,因此显式光标的属性在异常处理中不可用。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/17013648/viewspace-1122762/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/17013648/viewspace-1122762/