Подтвердить что ты не робот

Попробуйте Catch Like Exception Handling in Pl/Sql

В процедуре я хочу сделать логический блок 1, не имеет значения, не сработает ли он, выполнить логический блок 2

это похоже на типичный сценарий try-catch. но как я могу это сделать в 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;

поскольку вы можете увидеть, что второй блок исключений вызывает проблему.

4b9b3361

Ответ 1

Включите второй блок EXCEPTION в BEGIN..END. Попробуйте этот путь

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 в ответ на комментарий

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;

Ответ 2

ПРОЦЕДУРА (    )  IS

НАЧАТЬ

- Логический модуль1  НАЧАТЬ    ...  ИСКЛЮЧЕНИЕ       КОГДА ДРУГИЕ       ТОГДА...  END;

- Логический блок2  НАЧАТЬ    ...  ИСКЛЮЧЕНИЕ       КОГДА ДРУГИЕ       ТОГДА...  КОНЕЦ;

- Заключительный блок исключений  ИСКЛЮЧЕНИЕ       КОГДА ДРУГИЕ       ТОГДА...

END;