Обработка исключений PL / SQL - функция, возвращенная без значения

oracle plsql exception-handling

672 просмотра

2 ответа

В Oracle 12.1 у меня есть достаточно простая подпрограмма PL / SQL. Выводом является одно значение, либо список имен через запятую, либо строка «NO_DATA». Другие выходы не разрешены. Для ввода есть одно значение, название компании. Если я жестко закодирую название компании и запускаю оператор SQL (а не функцию) из окна SQL, он работает нормально, поэтому я знаю, что SQL допустим. Проблема связана с обработкой исключений. Если у меня НЕТ ОБРАБОТКИ ИСКЛЮЧЕНИЙ ВСЕГО, и я передаю правильное имя функции, это дает мне правильный вывод. Мне нужно иметь возможность обрабатывать ситуацию, когда данные не найдены, поэтому я добавляю простую обработку исключений. Это где я получаю свою проблему. При наличии кода обработки исключений, если я передаю неверное значение (так называемое название компании, которое не найдено), я получаю 'NO_DATA', как и должен был. Если я перехожу в хорошем значении, Я получаю ошибку PL / SQL ORA-06503: PL / SQL: функция возвращена без значения. Вот мой код.

   create or replace FUNCTION authorized_email(nn1 in varchar2)
   RETURN varchar2
   IS  
   thisName varchar2(4000);
   Output varchar2(4000);

-- this routine build the list of comma seperated authorized users   

BEGIN

 SELECT NN_Name,      
        nvl(replace(Upper(LISTAGG( Name, ',' ) WITHIN GROUP ( ORDER BY Name )), '@XYZ.COM', NULL), 'NO_DATA') AS Names
       into thisName, Output
FROM   (
  SELECT DISTINCT(NN_NAME),
         Name
  FROM   LINE_ITEMS
  UNPIVOT( name FOR typ IN ( 
        FMW_MGR_L3_EMAIL,
        FMW_MGR_L4_EMAIL,
        FMW_MGR_L5_EMAIL,
        FMW_MGR_L6_EMAIL,
        FMW_MGR_L7_EMAIL,
        FMW_EMAIL,
        HYBRID_MGR_L3_EMAIL,
        HYBRID_MGR_L4_EMAIL,
        HYBRID_MGR_L5_EMAIL,
        HYBRID_MGR_L6_EMAIL,
        HYBRID_MGR_L7_EMAIL,
        HYBRID_REP,
        TECH_MGR_L3_EMAIL,
        TECH_MGR_L4_EMAIL,
        TECH_MGR_L5_EMAIL,
        TECH_MGR_L6_EMAIL,
        TECH_MGR_L7_EMAIL,
        TECH_EMAIL) 
    ) )
where NN_NAME = nn1
GROUP BY NN_NAME;

EXCEPTION
  WHEN no_data_found then    
    Output := 'NO_DATA';

return Output;


END;

Что-то не так с моим кодом EXCEPTION HANDLING, но я не могу определить, что это такое. Любая помощь приветствуется!

Автор: user1009073 Источник Размещён: 08.11.2019 11:27

Ответы (2)


2 плюса

Решение

До исключения вы не возвращаете никакого значения.

Затем вы должны добавить

return Output;

Заявления ниже EXCEPTION

Output := 'NO_DATA';
return Output;

выполняются только при срабатывании NO_DATA_FOUND.

Итак, ваш код должен быть

BEGIN
        SELECT NN_Name,      
                nvl(replace(Upper(LISTAGG( Name, ',' ) WITHIN GROUP ( ORDER BY Name )), '@XYZ.COM', NULL), 'NO_DATA') AS Names
               into thisName, Output
        FROM   (
          --skipped) 
            ) )
        where NN_NAME = nn1
        GROUP BY NN_NAME;
       return Output;   --     <---   code added
    EXCEPTION
      WHEN no_data_found then    
        Output := 'NO_DATA';
        return Output;
    END;
Автор: Luc M Размещён: 20.08.2016 02:47

4 плюса

Ваша путаница здесь:

EXCEPTION
  WHEN no_data_found then    
    Output := 'NO_DATA';

return Output;

Предложение WHENне прекращается, пока не достигнет другого WHENили и END. Таким образом, ваша return Output;часть обработчика исключений, а не часть основной части кода. (То, как вы отступили в коде, может создать впечатление, что оператор return находится за пределами обработчика исключений, но компилятору это не важно, только определенный синтаксис.)

Я бы предложил немного другое исправление, чем в другом ответе, чтобы избежать множественных операторов возврата. Вы можете вложить блоки BEGIN / END для выполнения желаемого потока:

BEGIN
  BEGIN
    ... SQL statement here...
  EXCEPTION
    WHEN no_data_found then    
      Output := 'NO_DATA';
  END;

  return Output;
END;
Автор: Dave Costa Размещён: 20.08.2016 02:57
Вопросы из категории :
32x32