查询1:
create or replace procedure toUp(code in number)
is sname staff_master.staff_name%type;
recnotfound exception;
begin
select staff_name into sname from staff_master where staff_code=code;
if sname is NULL then
raise recnotfound;
else
update staff_master set staff_name=upper(staff_name) where staff_code=code;
end if;
exception
when recnotfound then dbms_output.put_line('Record not found');
end;
查询2:
declare
commsn emp.comm%type;
no_comm exception;
begin
select comm into commsn from emp where empno=7369;
if commsn is NULL then
raise no_comm;
else
dbms_output.put_line('Comm is '||commsn);
end if;
exception
when no_comm then dbms_output.put_line('Commsn for emp doesnt exist');
end;
这里在查询1中我正在检查sname是否为null。但是,当我将无效代码作为参数传递给过程时... sname应为NULL,因此异常'recnotfound'必须被引发..但是它显示以下错误:
SQL> exec toUp(7369);
BEGIN toUp(7369); END;
*
ERROR at line 1:
ORA-01403: no data found
ORA-06512: at "LAB06TRG15.TOUP", line 6
ORA-06512: at line 1
但是当我对查询2执行相同操作时,它按预期工作。 我想这与varchar2如何检查null有关。我这样做了吗?
我修改了代码如下:
create or replace procedure toUp(code in number)
is
sname staff_master.staff_name%type;
recnotfound exception;
begin
select staff_name into sname from staff_master where staff_code=code;
if sname is NULL then
dbms_output.put_line('a');
raise recnotfound;
else
dbms_output.put_line('b');
--update staff_master set staff_name=upper(staff_name) where staff_code=code;
end if;
exception
when recnotfound then dbms_output.put_line('Record not found');
when no_data_found then raise recnotfound;
end;
我明白了:
BEGIN toUp(7369); END;
*
ERROR at line 1:
ORA-06510: PL/SQL: unhandled user-defined exception
ORA-06512: at "LAB06TRG15.TOUP", line 16
ORA-01403: no data found
ORA-06512: at line 1
我该如何解决这个问题?
P.S。我想这样做只使用Exception ..它是一个赋值的一部分..
答案 0 :(得分:3)
如果查询没有返回任何行,则会引发“ORA-01403:找不到数据”错误。我认为,您的期望是执行将继续,但不会为变量赋值 - 事实并非如此。
如果您要做的是检查是否存在记录,请使用:
select count(*)
into row_found
from ...
where ...
and rownum = 1;
保证在row_found变量中返回值为0或1的单行。
关于编辑,您不会在异常处理块中处理引发用户定义的异常。用BEGIN-END-EXCEPTION包裹SELECT。
begin
begin
select ..
exception when NO_DATA_FOUND then raise recnotfound;
end;
if sname is NULL then
dbms_output.put_line('a');
raise recnotfound;
end if;
exception
when recnotfound then dbms_output.put_line('Record not found');
end;
我不清楚你在这里想做什么。 sname是否会从查询中返回null?
答案 1 :(得分:0)
实际上,甚至在您的IF声明之前就会发生异常。如果SELECT INTO语句未返回行,则抛出ORA-01403。您可能希望在这种情况下将NULL值赋给变量,但事实并非如此,而是抛出异常。
您必须在存储过程中添加异常处理才能克服它。有关如何执行此操作的文档可以在here
找到抱歉,现在没有ORACLE,所以我无法检查它,但它应该是这样的:
...
select staff_name into sname from staff_master where staff_code=code;
exception
when NO_DATA_FOUND then ...handle no data...;
when TOO_MANY_ROWS then ...handle too many data rows...;
...
答案 2 :(得分:0)
只要SELECT查询没有返回任何记录,就会引发异常。 代码将仅在那里进入例外,并且不会继续,这是您的期望。
请改为尝试:
create or replace procedure toUp(code in number)
is sname staff_master.staff_name%type;err_count number;
recnotfound exception;
begin
select count(*) into err_count from staff_master where staff_code=code;
if count > 0 then
select staff_name into sname from staff_master where staff_code=code;
else
raise recnotfound;
不确定语法是否完全正确,但我希望你得到漂移
答案 3 :(得分:0)
这是针对您的查询创建的示例过程。 请相应修改并尝试它应该工作。感谢
create or replace procedure av_stack_test(sr_no_var in number)
as
nme avrajit.name%type;
no_rec exception;
num_count number;
begin
select count(*) into num_count from avrajit
where sr_no=sr_no_var;
if num_count>0 then
select name into nme from avrajit
where sr_no=sr_no_var;
update avrajit
set name=nme
where sr_no=sr_no_var;
else
raise no_rec;
end if;
dbms_output.put_line(sr_no_var);
exception
when no_rec then
dbms_output.put_line('No rec found');
when others then
dbms_output.put_line('Some other exception');
end;