#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 Запись записей журнала является единственным допустимым использованием для АВТОНОМНОЙ ТРАНЗАКЦИИ.