在我的下面的函数中,我试图理解为什么它只返回BLAH如果我传入01356666然后传入其他任何其他值的空值。我的期望是它将返回BLAH,无论我重置后传入了什么我执行SELECT INTO后的str_mgrin_out。我一直在Oracle 10g中测试它。
CREATE OR REPLACE FUNCTION GET_MANAGERGIN2 (str_empgin_in IN varchar2)
RETURN varchar2
AS
str_mgrgin_out varchar2(10);
BEGIN
SELECT 'FOO' INTO str_mgrgin_out FROM dual WHERE str_empgin_in = '01356666';
str_mgrgin_out := 'BLAH';
RETURN str_mgrgin_out;
END GET_MANAGERGIN2;
/
-- Returns null but expecting BLAH
SELECT GET_MANAGERGIN2('00356666') FROM dual;
-- Returns BLAH
SELECT GET_MANAGERGIN2('01356666') FROM dual;
答案 0 :(得分:2)
我认为这是因为如果SELECT INTO
没有向str_mgrgin_out
返回一个值,它将抛出异常,因此str_mgrgin_out := 'BLAH';
行永远不会被执行。
我认为错误是ORA-01403
。
尝试在最后添加一个异常处理程序:
Exception
When Others Then
str_mgrgin_out := 'BLAH';
你可能需要用BEGIN...END
包围它,所以它会是:
CREATE OR REPLACE FUNCTION GET_MANAGERGIN2 (str_empgin_in IN varchar2)
RETURN varchar2
AS
str_mgrgin_out varchar2(10);
BEGIN
BEGIN
SELECT 'FOO' INTO str_mgrgin_out FROM dual WHERE str_empgin_in = '01356666';
str_mgrgin_out := 'BLAH';
Exception
When Others THen
str_mgrgin_out := 'BLAH';
END;
RETURN str_mgrgin_out;
END GET_MANAGERGIN2;
答案 1 :(得分:2)
select匹配零行,引发NO_DATA_FOUND PL / SQL异常。
但是,NO_DATA_FOUND不会被识别为SQL错误,而只是结果集的结尾。
因此,当在SELECT中使用时,返回null值。