我在Oracle的DB 12.2上。
我想要编写一个过程来截断一个表,然后将输出结果保存到另一个表中,就像这样:
CREATE OR REPLACE PROCEDURE truncate_my_table_and_save_result
IS
variable_output varchar;
BEGIN
TRUNCATE TABLE EMPLOYEES;
variable_output := SQL%RESULT;
insert into log_table (result_column) VALUES (variable_output);
end;
/当然,variable_output :=SQL%RESULT;不是有效的语法代码,那么我应该使用什么来代替呢?
更新:这里的要点是,如果在截断时发生错误(例如,ORA-00054资源NOWAIT ),我真的希望捕获它。
发布于 2019-09-23 20:36:19
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;
/但那是一个很大的笨拙。更普遍的是,我们希望out日志消息保持不变,而不管调用它们的程序发生了什么,但又不会干扰实际的事务。
因此,可接受的最低日志记录实现为:
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;
/但实际上,您应该考虑下载Tyler Muth's Logger,它是最接近于Oracle标准日志记录包的。
https://stackoverflow.com/questions/58062400
复制相似问题