Oracle 函数没有返回我期望的结果

Oracle 函数没有返回我期望的结果,oracle,plsql,Oracle,Plsql,在下面的函数中,我试图理解为什么只有当我传入0135666时,它才会返回BLAH,然后传入的任何其他内容都返回null值。我的期望是,无论传入了什么,它都会返回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 var

在下面的函数中,我试图理解为什么只有当我传入0135666时,它才会返回BLAH,然后传入的任何其他内容都返回null值。我的期望是,无论传入了什么,它都会返回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;

我假设这是因为如果SELECT INTO没有在str_mgrgin_out中返回一个值,它将抛出一个异常,因此str_mgrgin_out:='BLAH';这一行永远不会被执行

我想错误应该是ORA-01403

尝试在末尾添加异常处理程序,如下所示:

Exception
    When Others Then
         str_mgrgin_out := 'BLAH';
您可能还需要用开始…结束来围绕它,因此它将是:

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;

我假设这是因为如果SELECT INTO没有在str_mgrgin_out中返回一个值,它将抛出一个异常,因此str_mgrgin_out:='BLAH';这一行永远不会被执行

我想错误应该是ORA-01403

尝试在末尾添加异常处理程序,如下所示:

Exception
    When Others Then
         str_mgrgin_out := 'BLAH';
您可能还需要用开始…结束来围绕它,因此它将是:

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;

select匹配零行,并引发“未找到数据”PL/SQL异常

但是,找不到任何数据都不会被识别为SQL错误,只是结果集的结尾


因此,在SELECT中使用时,将返回空值。

SELECT匹配零行,并引发NOU DATA FOUND PL/SQL异常

但是,找不到任何数据都不会被识别为SQL错误,只是结果集的结尾


因此,在SELECT中使用时,将返回一个空值。

谢谢,这确实为我的总体目标指明了正确的方向。谢谢,这确实为我的总体目标指明了正确的方向。