【问题标题】:How to store sysdate value in a variable in triggers in oracle?如何将sysdate值存储在oracle触发器中的变量中?
【发布时间】:2013-11-08 03:11:05
【问题描述】:

我有一个触发器,如下所示:

create or replace
TRIGGER impt_downloadproc
before delete ON A
declare
storedate nvarchar2(80);
storetime nvarchar2(80);
sequel string(2000);
BEGIN
storedate := to_char(sysdate,'YYYYMMDD');
storetime :=  to_char(sysdate,'HH24MISS');
sequel:='create table B_'||storedate||'_'||storetime||' as select * from ipcsdd_download_process';
execute immediate sequel;
END;

我在触发器中尝试做的是:在某人/某事从 A 表中删除记录之前, 创建备份表 B_yyyymmdd_hhmmss 并将记录备份到该表中。

但我在 :storedate := to_char(sysdate,'YYYYMMDD'); 我不明白这是什么问题。

【问题讨论】:

  • 我刚收到消息:ORA-06512: at "GOU.IMPT_DOWNLOADPROC", line 9 ORA-04088: error during execution of trigger 'GOU.IMPT_DOWNLOADPROC'
  • 我预计会出现不同的错误 - 您无法在触发器中提交,您需要使用自主事务(这通常不是一个好主意)here is an example
  • 是的,非常感谢它的工作:)
  • 那么让我添加它作为答案
  • 这是一个非常糟糕的主意。除了从触发器做 DDL 的问题外,如果有多个会话都试图同时删除,只有一个会成功,其余的会失败,因为它们会尝试创建同名的表。您最好拥有一个“备份”表,并将已删除的行插入其中。而不是到处都有数百个小备份表,每个都有原始表内容的完整副本。

标签: oracle triggers dynamic-sql


【解决方案1】:

我预计会出现不同的错误 - 您不能在触发器中提交。 如果你真的想要,那么你需要使用自治事务(这通常不是一个好主意)

因此,您的代码应如下所示:

create or replace
TRIGGER impt_downloadproc
before delete ON A
declare
pragma   autonomous_transaction; -- see this line
storedate nvarchar2(80);
storetime nvarchar2(80);
sequel string(2000);
BEGIN
storedate := to_char(sysdate,'YYYYMMDD');
storetime :=  to_char(sysdate,'HH24MISS');
sequel:='create table B_'||storedate||'_'||storetime||' as select * from ipcsdd_download_process';
execute immediate sequel;
END;

here is an example

【讨论】:

  • 有什么替代方法? @杰弗里坎普
猜你喜欢
  • 2010-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-01
  • 2011-05-13
  • 1970-01-01
  • 1970-01-01
  • 2019-10-11
相关资源
最近更新 更多