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

Oracle 即使其中一条select语句失败,如何在procedure中执行所有SQL语句

ASKTOM 2020-01-22
329

问题描述

嗨,汤姆,

即使其中一条select语句失败,也可以在过程中执行所有select语句吗?我的意思是,如果其中一个select语句失败,只有
语句不应显示输出,但如果语句的其余部分没有错误,则过程中的其余语句应按预期工作。

CREATE OR REPLACE PROCEDURE bad_proc
IS
  x INT;
BEGIN
  SELECT 1 INTO x FROM dual;
  dbms_output.put_line(x);
  SELECT 2 INTO x FROM dual;
  dbms_output.put_line(x);
  SELECT 4/0 INTO x FROM dual;
  dbms_output.put_line(x);
  SELECT 5 INTO x FROM dual;
  dbms_output.put_line(x);
  SELECT 6 INTO x FROM dual;
  dbms_output.put_line(x);
EXCEPTION
WHENzero_divide THEN
  dbms_output.put_line('HELP - I DIED HERE=>'||dbms_utility.format_error_backtrace );
END;
/
   
 set serveroutput on;
 exec BAD_PROC;


Actual OutPUT

PL/SQL procedure successfully completed.

1
2
HELP - I DIED HERE=>ORA-06512: at "HR.BAD_PROC", line 9


Expected Output :

PL/SQL procedure successfully completed.

1
2
HELP - I DIED HERE=>ORA-06512: at "HR.BAD_PROC", line 9

5
6


问候,
N

专家解答

将每个SQL语句包装在自己的begin...例外...端块:

CREATE OR REPLACE PROCEDURE bad_proc
IS
x INT;
BEGIN
  begin 
    SELECT 1 INTO x FROM dual;
    dbms_output.put_line(x);
  EXCEPTION
    WHEN zero_divide THEN
    dbms_output.put_line('HELP - I DIED HERE=>'||dbms_utility.format_error_backtrace );
  end;
  begin
    SELECT 2 INTO x FROM dual;
    dbms_output.put_line(x);
    EXCEPTION
    WHEN zero_divide THEN
    dbms_output.put_line('HELP - I DIED HERE=>'||dbms_utility.format_error_backtrace );
  end;
  begin
    SELECT 4/0 INTO x FROM dual;
    dbms_output.put_line(x);
    EXCEPTION
    WHEN zero_divide THEN
    dbms_output.put_line('HELP - I DIED HERE=>'||dbms_utility.format_error_backtrace );
  end;
  begin
    SELECT 5 INTO x FROM dual;
    dbms_output.put_line(x);
    EXCEPTION
    WHEN zero_divide THEN
    dbms_output.put_line('HELP - I DIED HERE=>'||dbms_utility.format_error_backtrace );
  end;
  begin  
    SELECT 6 INTO x FROM dual;
    dbms_output.put_line(x);
    EXCEPTION
    WHEN zero_divide THEN
    dbms_output.put_line('HELP - I DIED HERE=>'||dbms_utility.format_error_backtrace );
  end;
END;
/

set serveroutput on;
exec BAD_PROC;

1
2
HELP - I DIED HERE=>ORA-06512: at "CHRIS.BAD_PROC", line 20

5
6


PL/SQL procedure successfully completed.

文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论