Блок исключений в ‘функции’ pl / sql, не улавливающий условие ошибки

#sql #oracle #plsql #oracle10g

#sql #Oracle #plsql #oracle10g

Вопрос:

У меня есть следующая функция, которую я вызываю из другой процедуры в том же пакете pl / sql.

 Function lf_get_query(p_table in varchar2) return varchar2
Is
    v_where_clause  varchar2(500);
Begin
    Case upper(p_table)
        When 'TABLEA'   then                    
            v_where_clause := ' Where trunc(x.purchase_dtm) < ' || '''' || trunc(v_check_Date) || ''''; 
        When 'TABLEB'   then                    
            v_where_clause := ' Where trunc(x.purchase_dtm) < ' || '''' || trunc(v_check_Date) || ''''
                                || ' And product_type='ABC'
                                || ' And customer_type='XXX'
                                || ' And contract_type='YYY';   
        Else
            raise ex_unknown_table_type;                    
    End case;           
    return v_where_clause;
Exception
    When ex_unknown_table_type then
        [[Log to file that table is urecognised. ]]
        raise;
    When others then
        [[Log to file that table is urecognised and include sqlerrm ]]
        raise;
End;
  

Когда я вызываю функцию, она генерирует следующую ошибку:

 ORA-06502: PL/SQL: numeric or value error: character string buffer too small
  

Ошибка генерируется из-за того, что переменная v_where_clause недостаточно велика для некоторых строк, которые я пытаюсь сохранить в переменной. Чего я не понимаю, так это того, что когда возникает ошибка, она не улавливается ни одним из двух пунктов исключения, показанных выше. Вместо этого ошибка улавливается в блоке исключений для процедуры, которая вызывает эту функцию.

Причина, по которой я знаю, что это не улавливается исключительными пунктами в функции, заключается в том, что оба исключительных пункта должны записывать условие ошибки в файл, но это не так.

Есть ли какая-либо причина для этого? Не должно ли исключение перехватываться блоком исключений ‘WHEN OTHERS’?

Кроме того, есть ли какой-либо способ объявить переменную v_where_clause без указания размера?

Спасибо

Комментарии:

1. Укажите вашей переменной VARCHAR2 очень большой размер, т.е. 32767, и Oracle автоматически предоставит ей достаточно места для хранения, чтобы покрыть то, что вы в нее вложили. он не будет выделять 32767 байт произвольно.

Ответ №1:

Выдает ли блок исключений вызывающей процедуры откат? Если это так, это приведет к откату вашего ведения журнала вместе со всем остальным. Способ обойти это — использовать процедуру, определенную с помощью PRAGMA AUTONOMOUS_TRANSACTION , которая позволит вести журнал за пределами текущей транзакции.

Комментарии:

1. О, я такой глупый. Записи журнала, которые были зарегистрированы в таблице, откатывались. Спасибо!!!!!!!!

2. Случается со всеми нами хотя бы раз 😉

3. 1 Запись записей журнала является единственным допустимым использованием для АВТОНОМНОЙ ТРАНЗАКЦИИ.