在隐式游标上使用sql%notfound

时间:2013-01-08 09:42:33

标签: oracle plsql

我是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;

如果Where子句可以提取一行数据,那么它将运行else部分

如果Where子句无法提取任何行,则会显示错误:

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

有人能指出我正确的方向吗?感谢

我尝试过使用基本的异常处理代码

When others then 
null;
end;

然后我得到另一个奇怪的结果: 如果Where子句可以提取一行数据,那么它将不会运行else部分或if部分。

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:2)

select into您需要使用例外NO_DATA_FOUNDTOO_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;