25

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

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.

2 Answers 2

24

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;

UPDATE in response to the comment

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;
7
  • Almost exact to my answer. i'll delete mine. Commented Sep 21, 2012 at 9:19
  • sorry, I should'v made it more clear. execute logic 1, doesn't matter if it fails, execute logic 2 Commented Sep 21, 2012 at 9:33
  • take a look at the second approach Commented Sep 21, 2012 at 9:46
  • I've assumed that some pl/sq code might be after the second instruction that have to be executed even if the second instruction fails. Commented Sep 21, 2012 at 10:04
  • 1
    It works OK even if the procedure is a part of the package. The only thing you need to do is delete first BEGIN in the package body specification. Commented Sep 21, 2012 at 10:47
1

PROCEDURE ( ) IS

BEGIN

-- Logical Unit1 BEGIN ... EXCEPTION WHEN OTHERS THEN ... END;

-- Logical Unit2 BEGIN ... EXCEPTION WHEN OTHERS THEN ... END;

-- Final Exception Block EXCEPTION WHEN OTHERS THEN ...

END ;

Not the answer you're looking for? Browse other questions tagged or ask your own question.