2010-10-19 16 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個遊標和開放適當的指令。