我是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
部分。
答案 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_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;