【问题标题】:PL/SQL - How to create a conditional cursor?PL/SQL - 如何创建条件游标?
【发布时间】:2010-10-19 13:53:35
【问题描述】:
我需要一个条件光标,比如:
- 如果存在一行(使用 WHEN EXISTS 或类似的东西),那么我的光标是:
- CURSOR varCursor IS SELECT 1 a FROM DUAL;
- 其他
- CURSOR varCursor IS SELECT 2 a FROM DUAL;
但是看,我不想改变一个列结果,我想改变整个光标。
下面我举一个更大的例子。
谢谢!
见:
SET serveroutput ON SIZE 900000;
DECLARE
CURSOR varCursor IS SELECT 1 a FROM DUAL;
-- CURSOR varCursor IS SELECT 2 a FROM DUAL;
BEGIN
FOR varRow IN varCursor LOOP
dbms_output.put_line('row: ' || varRow.a);
END LOOP;
dbms_output.put_line('Done.');
END;
【问题讨论】:
标签:
oracle
plsql
database-cursor
【解决方案1】:
除非将它放入一个查询中(如 Tony 建议的那样),因为您想要一个游标结果,您可以这样做(这会将游标切换到您需要的逻辑 --> 一种游标解决方案)
DECLARE
PROCEDURE CURSORCHOICE(ITEM IN NUMBER) IS
L_REFCUR SYS_REFCURSOR;
returnNum number;
BEGIN
IF NVL(ITEM,0) > 0 THEN
OPEN L_REFCUR FOR
SELECT ITEM * level FROM DUAL
CONNECT BY LEVEL < ITEM ;
ELSE
OPEN L_REFCUR FOR
SELECT ITEM - LEVEL FROM DUAL
connect by level < -1 * ITEM ;
END IF;
dbms_output.put_line('Results to item ' || item);
loop
fetch l_refcur into returnNum;
exit when l_refcur%notfound;
dbms_output.put_line(returnNum);
end loop;
CLOSE L_REFCUR;
END ;
BEGIN
CURSORCHOICE(5);
CURSORCHOICE(-5);
end ;
/
Results to item 5
5
10
15
20
Results to item -5
-6
-7
-8
-9
【解决方案2】:
从字面上看,你可以这样做:
CURSOR varCursor IS SELECT 1 a FROM DUAL WHERE EXISTS (...)
UNION
SELECT 2 a FROM DUAL WHERE NOT EXISTS (...);
但是,拥有 2 个光标并打开合适的光标会更简单,也可能更有效。