Reputation: 5624
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.
Upvotes: 26
Views: 105011
Reputation: 76
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 ;
Upvotes: 1
Reputation: 27251
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;
Upvotes: 25