我有以下函数,我从同一个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对于我试图存储在变量中的某些字符串来说不够大。我不明白的是,当错误发生时,它不会被上面显示的两个异常条款中的任何一个捕获。而是在正在调用此函数的过程的异常块上捕获错误。
我知道它没有被函数中的异常子句捕获的原因是两个异常子句都应该将错误条件记录到文件中,但它们不是。
这有什么理由吗?不应该由“其他人”和“其他人”抓住例外情况。异常块?
另外,有什么办法可以在不指定大小的情况下声明v_where_clause变量吗?
由于
答案 0 :(得分:4)
调用过程的异常块是否发出回滚?如果是这样,它将回滚您的日志记录以及其他所有内容。解决这个问题的方法是使用PRAGMA AUTONOMOUS_TRANSACTION
定义的过程,这将允许您的日志记录在当前事务之外发生。