功能不会返回我期待的内容

时间:2011-08-19 21:28:46

标签: oracle plsql

在我的下面的函数中,我试图理解为什么它只返回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;

2 个答案:

答案 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值。