ORACLE PL / SQL检查字符串是否为NULL

时间:2013-12-10 11:40:25

标签: sql oracle plsql

查询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 ..它是一个赋值的一部分..

4 个答案:

答案 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;