首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将SQL语句的结果保存到变量中?

如何将SQL语句的结果保存到变量中?
EN

Stack Overflow用户
提问于 2019-09-23 20:25:24
回答 1查看 59关注 0票数 0

我在Oracle的DB 12.2上。

我想要编写一个过程来截断一个表,然后将输出结果保存到另一个表中,就像这样:

代码语言:javascript
复制
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 ),我真的希望捕获它。

EN

回答 1

Stack Overflow用户

发布于 2019-09-23 20:36:19

SQL或PL/SQL中没有成功标志。如果它不成功,它会抛出一个异常。

所以你可以这样做(显然取决于你想要记录的实际文本)……

代码语言:javascript
复制
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;
/

老实说,我认为这个流程代表了糟糕的实践。它接受异常,所以调用程序没有办法知道语句失败了。但是如果我们引发一个异常,插入将被回滚,所以我们需要提交插入:

代码语言:javascript
复制
    …
exception
  when others then
    insert into log_table (result_column) VALUES (SQLERRM);
    commit;
    raise;

end;
/

但那是一个很大的笨拙。更普遍的是,我们希望out日志消息保持不变,而不管调用它们的程序发生了什么,但又不会干扰实际的事务。

因此,可接受的最低日志记录实现为:

代码语言:javascript
复制
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标准日志记录包的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58062400

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档