2012-09-21 18 views
12

Trong một thủ tục, tôi muốn làm đơn vị logic 1, không quan trọng nếu nó không thành công, thực hiện đơn vị luận lý 2Try Catch Giống như Xử lý ngoại lệ trong PL/SQL

này có vẻ giống như một kịch bản try-catch điển hình. nhưng làm thế nào tôi có thể làm điều đó trong 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; 

vì bạn có thể thấy khối Ngoại lệ thứ hai gây ra sự cố.

Trả lời

16

Kèm theo số EXCEPTION thứ hai trong khối BEGIN..END. Hãy thử cách này

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; 

CẬP NHẬT để đáp ứng với những nhận xét

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; 
+0

Gần như chính xác câu trả lời của tôi. tôi sẽ xóa của tôi. –

+0

xin lỗi, tôi nên làm điều đó rõ ràng hơn. thực hiện logic 1, không quan trọng nếu nó không thành công, thực hiện logic 2 –

+0

hãy xem cách tiếp cận thứ hai –

1

THỦ TỤC ( ) LÀ

BEGIN

- logic Unit1 BEGIN ... EXCEPTION KHI NÀO KHÁC THEN ... END;

- logic Unit2 BEGIN ... EXCEPTION KHI KHÁC THEN ... END;

- Chung kết Exception Khối EXCEPTION KHI KHÁC THEN ...

END;