在 Pl/Sql 中尝试像异常处理一样捕获 [英] Try Catch Like Exception Handling In Pl/Sql

查看:18
本文介绍了在 Pl/Sql 中尝试像异常处理一样捕获的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在一个程序中,我想做逻辑单元1,失败也没关系,执行逻辑单元2

In a procedure, I want to do logic unit 1, doesn't matter if it fails, execute logic unit 2

这似乎是一个典型的 try-catch 场景.但是我如何在 pl/sql 中做到这一点?

this seems like a typical try-catch scenario. but how can I do it in pl/sql?

create or replace
PACKAGE BUILD_PKG
AS
PROCEDURE reset_seq_and_truncate_tbl(
    p_seq_name   IN VARCHAR2,
    p_table_name IN VARCHAR2 );
END BUILD_PKG;
/
create or replace
PACKAGE BODY  BUILD_PKG
AS
BEGIN
PROCEDURE reset_seq_and_truncate_tbl(
    p_seq_name   IN VARCHAR2,
    p_table_name IN VARCHAR2 )
 IS
   l_val NUMBER;
 BEGIN
   BEGIN
     EXECUTE immediate 'truncate table ' || p_table_name;
   EXCEPTION 
        WHEN OTHERS 
        THEN dbms_output.put_line(SQLCODE);
   END;

   BEGIN
     EXECUTE immediate 'alter sequence ' || p_seq_name || ' increment by 1 minvalue 0';
   EXCEPTION 
        WHEN OTHERS 
        THEN dbms_output.put_line(SQLCODE);
   END; 
 END reset_seq_and_truncate_tbl;

END BUILD_PKG;

如您所见,第二个异常块导致了问题.

as you can see the second Exception block cause the problem.

推荐答案

将第二个 EXCEPTION 括在 BEGIN..END 块中.试试这个方法

Enclose the second EXCEPTION in BEGIN..END block. Try this way

PROCEDURE reset_seq_and_truncate_tbl(
    p_seq_name   IN VARCHAR2,
    p_table_name IN VARCHAR2 )
 IS
   l_val NUMBER;
 BEGIN
   EXECUTE immediate 'truncate table ' || p_table_name;
 EXCEPTION 
      WHEN OTHERS 
      THEN
      BEGIN
        dbms_output.put_line(SQLCODE);
        EXECUTE immediate 'alter sequence ' || p_seq_name || ' increment by 1 minvalue 0';
       --this would cause compilation error
       EXCEPTION 
            WHEN OTHERS 
            THEN dbms_output.put_line(SQLCODE);
     END; 
 END reset_seq_and_truncate_tbl;

根据评论更新

PROCEDURE reset_seq_and_truncate_tbl(
    p_seq_name   IN VARCHAR2,
    p_table_name IN VARCHAR2 )
 IS
   l_val NUMBER;
 BEGIN
   BEGIN
     EXECUTE immediate 'truncate table ' || p_table_name;
   EXCEPTION 
        WHEN OTHERS 
        THEN dbms_output.put_line(SQLCODE);
   END;

   BEGIN
     EXECUTE immediate 'alter sequence ' || p_seq_name || ' increment by 1 minvalue 0';
   EXCEPTION 
        WHEN OTHERS 
        THEN dbms_output.put_line(SQLCODE);
   END; 
 END reset_seq_and_truncate_tbl;

这篇关于在 Pl/Sql 中尝试像异常处理一样捕获的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆