4

次のような条件付きカーソルが必要です。

  • 行が存在する場合 ( 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;
4

2 に答える 2

11

1 つのカーソル結果が必要なため (Tony が推奨するように) 1 つのクエリに入れることを禁止します。そのようにすることができます (これにより、カーソルが必要なロジックに切り替わります --> 1 つのカーソル ソリューション)

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
于 2010-10-19T14:16:16.330 に答える
7

文字通り、これを行うことができます:

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

ただし、2 つのカーソルを持ち、適切な方を開く方が簡単で、おそらくより効率的です。

于 2010-10-19T13:59:27.790 に答える