0
SQL - Cursor if no records not working

CREATE OR REPLACE procedure verify_data
IS
cursor c1 is 
select 
  e.name 
from 
  table3 e 
where 
  id IN (select id from table1)
  and id in (select id from table2);
BEGIN
if c1%notfound then
DBMS_OUTPUT.PUT_LINE('no records found');
end if;

FOR eData in c1
   LOOP

      DBMS_OUTPUT.PUT_LINE(eData.name);
   END LOOP;

END;
/

レコードがあれば私の結果が出力されます。ただし、レコードが見つからない場合は、何も表示されません。selectステートメントにレコードがない場合に、出力「レコードが見つかりません」を表示するために実行できる例外処理や処理はありますか。

アップデート:

後に追加しました

ループを終了

EXCEPTION
WHEN NO_DATA_FOUND THEN 
DBMS_OUTPUT.PUT_LINE('no records found');

ENDの前。

SQL> verify_data();を実行します。

PL/SQLプロシージャが正常に完了しました。

また表示されません。

4

4 に答える 4

0

終了前; 次のコードを追加します WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('no records found');

于 2012-11-26T05:31:32.170 に答える
0

このコードを試してください:

CREATE OR REPLACE procedure verify_data
IS
no_result exception;
cursor c1 is 
select 
e.name 
from 
table3 e 
where 
id IN (select id from table1)
and id in (select id from table2);
BEGIN
FOR eData in c1
LOOP
  DBMS_OUTPUT.PUT_LINE(eData.name);
  if c1%notfound then
   raise no_result;
  end if;
END LOOP;
EXCEPTION
WHEN no_result THEN 
DBMS_OUTPUT.PUT_LINE('no records found');
END; 
/
于 2012-11-26T10:18:27.043 に答える
0

以下の手順を確認してください

  CREATE OR REPLACE procedure verify_data
    IS
    cursor c1 is 
    select 
      e.name 
    from 
      table3 e 
    where 
      id IN (select id from table1)
      and id in (select id from table2);
    BEGIN
    loop
    FETCH c1 INTO eData;
    EXIT WHEN c1%NOTFOUND;
    DBMS_OUTPUT.PUT_LINE(eData.name);
    end loop;
    exception 
    when no_data_found then
        dbms_output.put_line('*** Exc: no data');

    END;
    /
于 2012-11-26T10:01:36.420 に答える
0

カーソル/ループでNO_DATA_FOUNDを処理することはできません

以下の例を試してください

CREATE OR REPLACE PROCEDURE verify_data
IS
CURSOR c1 is 
SELECT 
  e.name 
FROM 
  table3 e 
WHERE 
  id IN (SELECT ID FROM table1)
  AND id in (SELECT ID FROM table2);

eData   table3.name%TYPE ; 

no_data EXCEPTION ;
BEGIN
OPEN c1 ;
LOOP
FETCH c1 INTO eData;

IF c1%NOTFOUND THEN
  RAISE no_data ;
ELSE
 DBMS_OUTPUT.PUT_LINE(eData);
 EXIT ;
END IF;
END LOOP ;
CLOSE c1;
EXCEPTION 
WHEN no_data THEN
    DBMS_OUTPUT.PUT_LINE('*** Exc: no data');

END;
于 2012-11-26T10:48:28.920 に答える