如何得到
PL/SQL
中执行时报错的
SQL
的位
置行号
一、引言
在进行
PL/SQL
开发的时候经常会写以下代码,
declare
n1 varchar(10);
n2 varchar(10);
n3 varchar(10);
begin
select name into n1 from test_tab1 where id = 2;
select name into n2 from test_tab2 where id = 2;
select name into n3 from test_tab3 where id = 2;
EXCEPTION
WHEN OTHERS THEN
rollback;
insert error_info_table values(‘Proc Name’,substr(sqlerrm,1,200));
commit;
end;
当
select into
或其他类型语句出现错误的时候,利用
exception
截获住,把错误记
录到
error
table
里,以便查找错误信息,但是这样做在查找问题的时候仍然有些麻烦,我
们必须一个一个
select
语句去执行,看看错误到底发生在那条语句。
二、故障现象
有些时候我们可能会用以下方法来解决这个问题
1.
每条语句都加一组
begin
„
exception
„
end
。
2.
在每条语句后都加一个标记变量,最后把改标记变量也存入
error table
。
很明显,这
2
中方法都会增加代码编写的工作量和复杂度。
那么是否有方法能得到,发生错误的代码行号呢?
三、处理过程
在
10gR1
及之前,只能不去截获
exception,
让错误发生,从错误信息中得到错误发生
的位置,当然这肯定是不能接受的。
从
10gR2
后,我们可以利用
package DBMS_UTILITY.format_error_backtrace
来的到
发生错误语句的行号。
请看以下例子:
SQL> declare
2 n1 varchar(10);
3 n2 varchar(10);
4 n3 varchar(10);
5 begin
6 select name into n1 from test_tab1 where id = 2;
7 select name into n2 from test_tab2 where id = 2;
8 select name into n3 from test_tab3 where id = 2;
9 EXCEPTION
10 WHEN OTHERS THEN
11 DBMS_OUTPUT.PUT_LINE(substr(sqlerrm,1,200));