Имам следната функция, която извиквам от друга процедура в рамките на същия 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, без да посочвам размер?
Благодаря