gpt4 book ai didi

sql - 甲骨文 SQL : Why is my function outputting null?

转载 作者:行者123 更新时间:2023-12-04 23:47:14 24 4
gpt4 key购买 nike

CREATE OR REPLACE FUNCTION get_status_by_member_id
(p_member_id NUMBER)
RETURN CHAR
AS
v_status CHAR(1);
BEGIN
select status
into v_status
from members
where member_id = p_member_id;
if v_status is null then
return v_status || 'N';
else
return v_status;
end if;
END get_status_by_member_id;

最佳答案

您的问题有时是由 Oracle 的一个恼人的怪癖引起的。也就是说,如果在 SQL 中调用 PL/SQL 函数并出现错误,则返回 null,而不是其他任何内容。

如果我创建一个非常简单的表...

create table a ( b number, c varchar2(1) );
insert into a values (1,'Y');

... 和两个功能。一种没有异常处理

create or replace function tmp_ben_fn (PId number) return char is
l_status varchar2(1);
begin

select c
into l_status
from a
where b = PId;

return coalesce(l_status, 'N');

end;
/

还有一个具有异常处理功能。

create or replace function tmp_ben_fn2 (PId number) return char is
l_status varchar2(1);
begin

select c
into l_status
from a
where b = PId;

return coalesce(l_status, 'N');

exception when no_data_found then
return 'A';

end;
/

然后,我们使用这两个函数来选择数据。请记住,我们只有一行,所以我们只希望返回 YN:

SQL> -- Expected output Y
SQL> select tmp_ben_fn(1) from dual;

TMP_BEN_FN2(1)
-------------------------------------------------

Y

SQL> -- Expected output, Error no_data_found
SQL> -- as row 2 does not exist.
SQL> select tmp_ben_fn(2) from dual;

TMP_BEN_FN(2)
-------------------------------------------------



SQL> -- Expected output, the same as tmp_ben_fn
SQL> select tmp_ben_fn2(2) from dual;

TMP_BEN_FN2(2)
-------------------------------------------------

A

SQL>

正如您在没有错误处理的函数中看到的那样,当发生 no_data_found 异常时,将返回 null。当我们捕获异常时,我们会得到预期的 A

我怀疑您尝试选择的 member_id 不存在。

作为一般规则:始终注意何时可能发生异常,select into... 是一个特别令人担忧的示例,它有机会选择太多行和没有行。如果您的表在 member_id 上是唯一的,那么您应该如下更改您的函数:

CREATE OR REPLACE FUNCTION get_status_by_member_id (p_member_id NUMBER) 
RETURN CHAR IS
v_status CHAR(1);
BEGIN
select status
into v_status
from members
where member_id = p_member_id;

return v_status;

-- If the member_id does not exist
-- return N
exception when no_data_found then
return 'N';
END get_status_by_member_id;

关于sql - 甲骨文 SQL : Why is my function outputting null?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11956215/

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