gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 13:40:52 24 4
gpt4 key购买 nike

查询 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 是否为空。但是,当我将无效代码作为参数传递给过程时。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

我该如何解决?

附言我只想使用 Exception 来做到这一点。它是作业的一部分。

最佳答案

如果查询未返回任何行,则会引发“ORA-01403:未找到数据”错误。我认为,您的期望是执行将继续,但不会为变量分配任何值——事实并非如此。

如果您想做的是检查记录是否存在,那么使用:

select count(*)
into row_found
from ...
where ...
and rownum = 1;

这保证将值为 0 或 1 的单行返回到 row_found 变量中。

关于您的编辑,您没有在异常处理 block 中处理用户定义异常的引发。用 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?

关于sql - ORACLE PL/SQL 检查字符串是否为NULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20493512/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com