Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
oracle中是否有数据字典对象来记录触发器的事务详细信息?_Oracle_Triggers - Fatal编程技术网

oracle中是否有数据字典对象来记录触发器的事务详细信息?

oracle中是否有数据字典对象来记录触发器的事务详细信息?,oracle,triggers,Oracle,Triggers,我创建了触发器测试触发器,如下所示: CREATE TRIGGER TEST_TRIG AFTER INSERT ON TEST_TABLE FOR EACH ROW DECLARE PRAGMA AUTONOMOUS_TRANSACTION; BEGIN TEST_PROC(); END; 程序测试程序代码: create or replace PROCEDURE TEST_PROC AS BEGIN EXECUTE IMMEDIATE 'truncate t

我创建了触发器测试触发器,如下所示:

CREATE TRIGGER TEST_TRIG
   AFTER INSERT ON TEST_TABLE
   FOR EACH ROW
 DECLARE
   PRAGMA AUTONOMOUS_TRANSACTION;
 BEGIN
   TEST_PROC();
 END;
程序测试程序代码:

create or replace
PROCEDURE TEST_PROC 
AS
BEGIN
EXECUTE IMMEDIATE 'truncate table TEST_FINAL';
  INSERT INTO TEST_FINAL select * from TEST_TABLE;
  commit;
END;

最初,我禁用了TRIGGER TEST_TRIG,并将一条记录插入到TEST_表中,然后手动执行过程TEST_PROC

输出:我能够从TEST_FINAL中获取插入到TEST_表中的相同记录


我从两个表中刷新了这些记录,并启用了触发器测试触发器

现在,当我在TEST_表中插入并提交记录时,我在TEST_FINAL表中没有找到该记录。。。我还没有收到任何错误消息


所以我想知道触发器是否被触发了?

我认为您还没有完全理解自治事务的含义。实际上,这意味着受pragma约束的代码在单独的会话中运行。因此,由于Oracle的读取一致性隔离级别,自治事务无法看到主事务生成的任何数据更改

因此,如果启动时TEST_表为空,则触发器将不会在TEST_FINAL中插入任何行,而不管您现在插入了多少行

所以:不要把两张桌子都冲水。在TEST_表中插入一些行并提交。最终测试将仍然为空。在TEST_表中插入更多行,然后,lo!第一组行将出现在TEST_FINAL中

显然这不是你想要的结果。所以你需要重新审视你的逻辑。每次截断TEST_FINAL都是没有意义的,当然不是每一行。那太糟糕了!就性能而言。同样,出于同样的原因,用INSERT填充目标表也没有意义。。。选择

放弃截断意味着不需要pragma,一切都变得简单

如果要保留受影响行的历史记录,请改为使用以下内容:

CREATE TRIGGER TEST_TRIG
   AFTER INSERT ON TEST_TABLE
   FOR EACH ROW
BEGIN
    insert into test_final (col1, col2)
    values (:new.col1, :new.col2);
END;

您需要更改确切的代码以满足您的确切要求

既然这只是一个测试,为什么不在测试过程中添加一个dbms_输出。put_line(“fired!”)呢?@tbone:我做了一些更改并测试了。。。。我被解雇了。。。但我仍然感到困惑的是,y数据并没有插入到TEST_FINAL表中!!???您是否打开了服务器输出?你在哪里运行这些测试?(什么ide?toad,sql开发者,sqlplus?)在sqldeveloper中。。。在我没有设置服务器输出之前。。。现在我成功了&获得了启动时的输出!但我仍然无法在测试结果表中看到任何数据。。。Y为什么每次在
TEST\u表中插入一行时都要截断
TEST\u FINAL
?那没有道理。