暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle PLSQL中的错误处理

ASKTOM 2020-01-18
373

问题描述



我有几个问题在面试中问我一个

问题1:
如果我们有多个dml语句的过程,其中一个dml语句失败,那么我们如何才能找出哪个语句在生产中失败。即使其中一个dml失败,我们如何才能成功执行过程。

问题2:

如果我们要插入一百万行,以及如何找出Oracle正在插入的行数据。

问候
N

专家解答

1) 当plsql块失败时,总是会告诉您故障发生在哪一行,例如

SQL> create or replace procedure bad_proc is
  2    x int;
  3  begin
  4    select 1 into x from dual;
  5
  6    select 2 into x from dual;
  7
  8    select 3 into x from dual;
  9
 10    select 4/0 into x from dual;
 11
 12    select 5 into x from dual;
 13
 14    select 6 into x from dual;
 15  end;
 16  /

Procedure created.

SQL>
SQL>
SQL> exec bad_proc
BEGIN bad_proc; END;

*
ERROR at line 1:
ORA-01476: divisor is equal to zero
ORA-06512: at "MCDONAC.BAD_PROC", line 10
ORA-06512: at line 1


如果您有一个异常处理程序,则也可以使用UTL_CALL_STACK和DBMS_UTILITY来获取此信息,例如

SQL> create or replace procedure bad_proc is
  2    x int;
  3  begin
  4    select 1 into x from dual;
  5
  6    select 2 into x from dual;
  7
  8    select 3 into x from dual;
  9
 10    select 4/0 into x from dual;
 11
 12    select 5 into x from dual;
 13
 14    select 6 into x from dual;
 15  exception
 16    when zero_divide then
 17       dbms_output.put_line('HELP - I DIED HERE=>'||dbms_utility.format_error_backtrace );
 18  end;
 19  /

Procedure created.

SQL>
SQL> set serverout on
SQL> exec bad_proc
HELP - I DIED HERE=>ORA-06512: at "MCDONAC.BAD_PROC", line 10


PL/SQL procedure successfully completed.



这里有一些关于处理PLSQL中的错误的更多信息

http://stevenfeuersteinonplsql.blogspot.com/2016/03/nine-good-to-knows-about-plsql-error.html

2) 如果要插入数百万行,那么理想情况下,您是通过单个INSERT-SELECT来执行此操作,因为这将是最有效的。在这种情况下,您通常可以监视v $ session_longops以查看进度。

这里的一些例子

https://asktom.oracle.com/pls/asktom/asktom.search?tag=vsession-longops-200011

如果您有正在执行插入的 * 代码 *,则可以使用DBMS_APPLICATION_INFO来处理代码,该代码可以从其他会话进行监视。在这个网站上搜索DBMS_APPLICATION_INFO,寻找许多这样做的例子。
文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论