Нет флага успеха в SQL или PL / SQL.Если это не удается, это вызывает исключение.
Таким образом, вы можете сделать это (очевидно, в зависимости от того, какой именно текст вы хотите записать) ....
CREATE OR REPLACE PROCEDURE truncate_my_table_and_save_result
IS
variable_output varchar;
BEGIN
-- Note we cannot write DDL in PL/SQL. Hence the dynamic SQL.
execute immediate 'TRUNCATE TABLE EMPLOYEES';
insert into log_table (result_column) VALUES ('Success!');
exception
when others then
/* I really want to catch an error if it occurs at TRUNCATE
(ORA-00054 resource NOWAIT for example) */
insert into log_table (result_column) VALUES (SQLERRM);
end;
/
Если честно, я думаю, что этот поток представляет собой плохую практику.Он поглощает исключение, поэтому вызывающая программа не может узнать, что оператор не выполнен.Но если мы выдадим исключение, вставка будет откатана, поэтому нам нужно зафиксировать вставку:
…
exception
when others then
insert into log_table (result_column) VALUES (SQLERRM);
commit;
raise;
end;
/
Но это большая проблема.В более общем смысле мы хотим, чтобы сообщения журнала сохранялись, несмотря на то, что происходит с программой, которая их вызывает, но без вмешательства в фактическую транзакцию.
Таким образом, минимально приемлемая реализация ведения журнала была бы:
create or replace procedure log_message (p_message_text in varchar2) is
pragma autonomous_transaction:
begin
insert into log_table (result_column) values (p_message_text);
commit;
end log_message;
/
Но на самом деле вам следует рассмотреть возможность загрузки Logler Тайлера Мута , который ближе всего подходит к стандарту Oracleпакет регистрации.