2010-10-19 38 views
3

我需要有一个条件光标,如:PL/SQL - 如何创建一个条件游标?

  • 如果行存在(使用WHEN EXISTS或像这样),那么我的光标:
    • CURSOR varCursor的是选择1 FROM DUAL;
  • 否则
    • CURSOR varCursor IS SELECT 2 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; 

回答

11

禁止把它变成一个查询(托尼建议),因为你想要一个游标结果,你可以做这样(这将光标切换到您需要的逻辑 - >一个光标溶液)

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 
7

从字面上看,你可以这样做:

CURSOR varCursor IS SELECT 1 a FROM DUAL WHERE EXISTS (...) 
        UNION 
        SELECT 2 a FROM DUAL WHERE NOT EXISTS (...); 

但是,它会更简单,也许更有效的有2个游标和开放适当的指令。