PL / SQL - Как создать условный курсор? - PullRequest
3 голосов
/ 19 октября 2010

Мне нужен условный курсор , например:

  • Если существует строка (используется КОГДА СУЩЕСТВУЕТ или что-то подобное), то мойкурсор:
    • CURSOR varCursor ВЫБРАЕТСЯ 1 a ОТ ДВОЙНОГО;
  • Иное
    • CURSOR varCursor ВЫБРАЕТ 2 a ИЗ ДВОЙНОГО;

Но посмотрите, я не хочу изменять результат столбца, я хочу изменить весь курсор.

Ниже приведен пример большего размера.

Спасибо!


См .:

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;

Ответы [ 2 ]

11 голосов
/ 19 октября 2010

Запрещается помещать его в один запрос (как рекомендует Тони), поскольку вы хотите получить один курсорный результат, вы можете сделать это как таковой (это переключит курсор на нужную вам логику -> решение с одним курсором)

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 голосов
/ 19 октября 2010

Буквально, вы можете сделать это:

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

Однако было бы проще и, возможно, эффективнее иметь 2 курсора и открывать в зависимости от того, что подходит.

...