2010-10-19 5 views
3

je dois avoir un curseur conditionnel, comme:PL/SQL - Comment créer un curseur conditionnel?

  • Si une ligne existe (à l'aide QUAND EXISTE ou quelque chose comme ça), alors mon curseur est:
    • CURSEUR varCursor IS SELECT 1 a DU DUAL;
  • Else
    • CURSEUR varCursor IS SELECT 2 FROM DUAL;

Mais regardez, je ne veux pas changer un résultat de la colonne, je veux changer le curseur entier.

Ci-dessous je mets un plus grand exemple.

Merci!


Voir:

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; 

Répondre

11

interdiction de le mettre dans une requête (comme Tony recommande) puisque vous voulez un résultat de curseur, vous pouvez le faire en tant que tel (ce passe le curseur sur la logique dont vous avez besoin -> une solution de curseur)

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

Littéralement, vous pouvez faire ceci:

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

Cependant, il serait plus simple et peut-être plus efficace d'avoir 2 curseurs et ouverts selon le cas.

Questions connexes