问题描述
嘿
我有几个问题在面试中问我一个
问题1:
如果我们有多个dml语句的过程,其中一个dml语句失败,那么我们如何才能找出哪个语句在生产中失败。即使其中一个dml失败,我们如何才能成功执行过程。
问题2:
如果我们要插入一百万行,以及如何找出Oracle正在插入的行数据。
问候
N
我有几个问题在面试中问我一个
问题1:
如果我们有多个dml语句的过程,其中一个dml语句失败,那么我们如何才能找出哪个语句在生产中失败。即使其中一个dml失败,我们如何才能成功执行过程。
问题2:
如果我们要插入一百万行,以及如何找出Oracle正在插入的行数据。
问候
N
专家解答
1) 当plsql块失败时,总是会告诉您故障发生在哪一行,例如
如果您有一个异常处理程序,则也可以使用UTL_CALL_STACK和DBMS_UTILITY来获取此信息,例如
这里有一些关于处理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,寻找许多这样做的例子。
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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




