Функция не возвращает то, что я ожидаю - PullRequest
1 голос
/ 20 августа 2011

В моей функции ниже я пытаюсь понять, почему он возвращает BLAH, только если я передал 01356666, а затем пустое значение для чего-либо еще переданного. Я ожидал, что он вернет BLAH независимо от того, что было передано с момента сброса str_mgrin_out после того, как я делаю SELECT INTO. Я тестировал это в 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 ]

2 голосов
/ 20 августа 2011

Выбор соответствует нулевым строкам, с исключением NO_DATA_FOUND PL / SQL исключения.

Однако NO_DATA_FOUND не распознается как ошибка SQL, это просто конец набора результатов.

Поэтому при использовании в SELECT возвращается нулевое значение.

2 голосов
/ 20 августа 2011

Я бы предположил, что это потому, что если SELECT INTO не возвращает ровно одно значение в str_mgrgin_out, оно выдаст исключение, поэтому строка str_mgrgin_out := 'BLAH'; никогда не будет выполнена.Я думаю, что ошибка будет ORA-01403.

Попробуйте добавить обработчик исключений в конце:будет:

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...