14

カーソルを使用した次のストアドプロシージャがあります。カーソルがレコードを返すかどうかに応じて、何らかの処理を行う必要があります。

しかし、カーソルがレコードを返すかどうかを確認する方法がわかりません。

CREATE OR REPLACE PROCEDURE SP_EMPLOYEE_LOOKUP_BY_EMP_ID
(
      IN_USER_ID IN NUMBER, 
      IN_EMPLOYEE_ID NUMBER,
      IN_HC_AS_ON_DATE VARCHAR2,
      emp_cursor OUT SYS_REFCURSOR
) 
IS 

 CURSOR employees IS 
    SELECT  * FROM EMPLOYEE e; 

BEGIN    

if(record exist ) then 

 FOR employee IN employees
  LOOP  

        // do something  

  END LOOP; 
else if employees is empty then 
     // do something else 

END;
4

5 に答える 5

21

カーソルを開かずにレコードが返されるかどうかを確認することはできません。
ここを参照)
したがって、レコードがあるかどうかを確認するためだけに高速クエリを実行することができます(たとえば、カウントを使用)。

または、次のように実行できます。

CREATE OR REPLACE PROCEDURE SP_EMPLOYEE_LOOKUP_BY_EMP_ID
(
      IN_USER_ID IN NUMBER, 
      IN_EMPLOYEE_ID NUMBER,
      IN_HC_AS_ON_DATE VARCHAR2,
      emp_cursor OUT SYS_REFCURSOR
) 
IS 

 is_found_rec boolean := false;    

 CURSOR employees IS 
    SELECT  * FROM EMPLOYEE e; 

BEGIN    

 FOR employee IN employees
  LOOP  

    is_found_rec := true;

        // do something  

  END LOOP; 

 if not is_found_rec then 
     // do something else 
 end if;

END;
于 2012-05-30T11:14:12.380 に答える
12

でしかできないと思いますFETCH。使用してみてください

if myCursor%found then
// some body
end if;

しかし、誰かが別の方法を知っているなら、私を訂正してください。

于 2012-05-30T10:10:16.743 に答える
3

私はこのように好きです:

DECLARE

    CURSOR my_cur
    IS
    SELECT 'a' AS a FROM DUAL WHERE 1=1;

    my_rec my_cur%rowtype;

BEGIN
    OPEN my_cur;
    LOOP

        FETCH my_cur INTO my_rec;

        IF my_cur%NOTFOUND
        THEN
            IF my_cur%ROWCOUNT=0
            THEN
                -- do stuff when cursor empty
                DBMS_OUTPUT.PUT_LINE('NOTFOUND,RC=0' || '_' || my_cur%ROWCOUNT || '_' || my_rec.a);
            END IF;
            EXIT;
        ELSE
                -- do stuff when cursor not empty
            DBMS_OUTPUT.PUT_LINE('FOUND,RC>0' || '_' || my_cur%ROWCOUNT || '_' || my_rec.a);
        END IF;

    END LOOP;
    CLOSE MY_CUR;
END;

カーソルが1=1(空ではない)の場合の出力:

FOUND,RC>0_1_a

カーソルが1=0(空)の場合の出力:

NOTFOUND,RC=0_0_
于 2017-10-19T15:59:10.723 に答える
0

カーソルを構成する同じ選択クエリを使用して、カーソルが変数に返すカウントを選択するのが好きです。次に、変数を評価して、次に何をするかを決定できます。たとえば、次のようなカーソルがあります。

CURSOR c_example IS 
    SELECT field1
        ,field2
        ,field3
    FROM table1 a
    WHERE a.field1 LIKE '%something%';

カーソルを開いて処理を行う前に、変数にカーソル結果カウントを選択します。

SELECT count(*)
INTO v_exampleCount
FROM table1 a
WHERE a.field1 LIKE '%something%';

ここで、カーソルを開く前に、次のような操作を行います。

IF exampleCount>0 THEN

    FOR example IN c_example
    LOOP
        ....
    END LOOP;  --end example loop

    ....

END IF;  --end example if
于 2019-10-02T19:18:47.887 に答える
0

341/5000 1つの解決策は、リバースロジックを使用することです。たとえば、次のことを尋ねることはできません。

IF my_record IS NULL THEN
   do something;
END IF;

また

IF my_record.my_attibute IS NULL THEN
   do something;
END IF;

代わりに、次のように尋ねることができます。

IF my_record.my_attibute IS NOT NULL THEN
   go on processing;
ELSE
   do something;
END IF;
于 2020-09-03T14:35:35.877 に答える