2

私はOracle PLSQLを初めて使用します。どんな助けでも大歓迎です。

SOで同様の質問が見つかりませんでした(基本的すぎるかもしれませんか?)

TOAD、Oracle 11Gからコードを実行しています

SET SERVEROUTPUT ON
DECLARE 
var titres%ROWTYPE; 
BEGIN
    select reference, sicovam into
    var.reference, var.sicovam 
    from titres 
    where reference = '1234';
    if sql%notfound then 
        dbms_output.put_line('NOT FOUND');
    else 
        dbms_output.put_line(var.reference || '    ' ||  var.sicovam);
    end if;
END;

WhereClause が 1 行のデータを抽出できる場合は、そのelse部分を実行します。

Where句が行を抽出できない場合、次のエラーが表示されます。

ORA-01403: no data found
ORA-06512: at line 4

誰かが私を正しい方向に向けることができますか? ありがとう

基本的な例外処理コードを使用してみました

When others then 
null;
end;

次に、別の奇妙な結果が得られます。句が1行のデータを抽出できる場合、その部分または部分はWhere実行されません。elseif

4

2 に答える 2

4

pl / sqlブロック内のクエリが行を返さない場合、NO_DATA_FOUND例外がすぐに発生し、ブロックの実行が停止します。したがって、if sql%notfound then条件が評価されることはありません。その例外をキャッチしてそれに応じて応答するには、EXCEPTIONセクションが必要です。

SET SERVEROUTPUT ON
DECLARE 
  var titres%ROWTYPE; 
BEGIN
    -- In this case you have to be sure that the query returns only one row
    -- otherwise the exception ORA-01422 will be raised
    select reference, sicovam into
      var.reference, var.sicovam 
     from titres 
    where reference = '1234';  

    dbms_output.put_line(var.reference || '    ' ||  var.sicovam);

EXCEPTION
  WHEN NO_DATA_FOUND 
  THEN dbms_output.put_line('NOT FOUND');    
END;
于 2013-01-08T09:51:32.090 に答える
2

例外をselect into使用する必要がありNO_DATA_FOUNDますTOO_MANY_ROWS

SET SERVEROUTPUT ON
DECLARE 
var titres%ROWTYPE; 
BEGIN
    select reference, sicovam into
    var.reference, var.sicovam 
    from titres 
    where reference = '1234';

    dbms_output.put_line(var.reference || '    ' ||  var.sicovam);

exception
  when no_data_found
  then
    dbms_output.put_line('NOT FOUND');
  when too_many_rows
  then
    dbms_output.put_line('2+ ROWS found');

END;
于 2013-01-08T09:51:56.293 に答える