2013-11-30 2 views
0

Я просмотрел код plsql, написанный кем-то еще, я понял, что он использует команды возврата в блоке исключений, я уже читал в java-программировании, это не очень хорошая практика, я также проверяю пример исключения из plsql и вижу, что возврат не используется , так кто-нибудь может подтвердить, что это недействительно?действительно возвращает команду invalid в обработке исключений plsql?

EXCEPTION WHEN OTHERS THEN 
    create_log ( p_caller_user, 'E', '4', NULL 
       , 'INTEREST_CALCULATION_TOOLS', 'CALCULATE_INTEREST' 
       , V_SPY_COUNTER 
       , 'UNEXPECTED ERROR DURING FUNCTION EXECUTION, ACC NO : ' 
        || ',' || SQLERRM() 
        || p_account_id, SQLCODE(), SYSDATE); 
    RETURN -2; 
+1

Что руководство сказать по этому вопросу? –

+0

@a_horse_with_no_name В руководстве ничего не написано об этой теме. – Jack

+1

Функции PLSQL возвращают значение, число или какой-либо другой тип объекта. RETURN -2; работает в функции, которая возвращает числовой тип данных из функции. Процедуры этого не делают, они не возвращают какую-то ценность. Две вещи, которые нужно запомнить - PLSQL является старым и основан на концепциях программирования ADA; PLSQL не является Java. Возврат внутри блока исключений возможен изнутри в функции plsql. То, о чем вы думаете, это статическая «сложность» кода - она ​​увеличивается с множественными доходами. На самом деле это не относится к PLSQL. –

ответ

0

Ваш пример вне контекста, поэтому невозможно сказать, есть ли какие-то проблемы или нет. Фрагмент кода, вероятно, корректно сообщает об ошибке в контексте (create_log -procedure) даже в этом случае в обработчике исключений others (что может быть признаком проблем и, согласно Tom Kyte it's for sure).

В целом я не вижу проблем, возвращающихся из функции PL/SQL, но не others обработчик исключений.

Oracle PL/SQL документации ничего не говорит о предмете:

Я использую следующий шаблон обычно возвращать значения по умолчанию, когда дополнительное значение не найдено:

create or replace function f1 return dual.dummy%type is 
    v_dummy dual.dummy%type; 
begin 
    select dummy into v_dummy from dual where dummy = 'Y'; 

    return v_dummy; 
exception 
    when no_data_found then 
    return 'Z'; 
end; 
/

(Обратите внимание, что я обрабатывать только хорошо известные случаи ошибок, когда я знаю, как ситуация должна быть обработана.)

Я нахожу альтернативный способ ненужным многословным, хотя он будет радовать возвратные один раз пуристов:

create or replace function f2 return dual.dummy%type is 
    v_dummy dual.dummy%type; 
begin 
    begin 
    select dummy into v_dummy from dual where dummy = 'Y'; 
    exception 
    when no_data_found then 
     v_dummy := 'Z'; 
    end; 

    return v_dummy; 
end; 
/

Компиляция функции со всеми предупреждениями включены взамен только следующие неродственные предупреждения:

Warning: PLW-06015: parameter PLSQL_DEBUG is deprecated; use PLSQL_OPTIMIZE_LEVEL = 1 
Warning(1,1): PLW-05018: unit F1 omitted optional AUTHID clause; default value DEFINER used 
0

Хотя он не может давать какие-либо ошибки, что это совсем не хорошая практика кодирования, чтобы сделать это ... Пожалуйста, обратитесь http://docs.oracle.com/cd/B10500_01/appdev.920/a96624/08_subs.htm

Это четко указывает, «Исполняемый часть содержит заявления, которые размещены между ключевыми словами BEGIN и EXCEPTION (или END). В исполняемой части функции должно появляться одно или несколько операторов RETURN. Часть обработки исключений содержит обработчики исключений, которые помещаются между ключевыми словами EXCEPTION и END. "

Итак, хотя это пока не дает никаких проблем, вы не должны этого делать. Надеюсь, это поможет.

Смежные вопросы