Oracle数据库触发器问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle数据库触发器问题相关的知识,希望对你有一定的参考价值。

有Oracle数据库有两个一样表结构的表A,B,现在想写触发器实现当把多条数据同时导入表A时先清空原来表A里面的所有数据,并把新导入的数据同步到表B中去。
现在我的触发器是这样写的
create or replace trigger A_trigger
before insert on A for each row
begin
insert into
B(id,num,name)VALUES(:new.id,:new.num,:new.name);
delete from A;
end ;
得出的结果是能把数据成功同步到B表中去,但是A表中只有导入的多数据中最后面的一条数据,这个要怎么改进才行?求教各位大神!谢谢
现在主要的问题是A导入多条数据时只剩下最后一条数据,这不是我想要的结果,我想要的是导入多条数据时表A里面的数据删除,新导入的全部保留。

你怎么界定哪些是新导入的呢?因为你说每次导入都把旧数据删除,你这次导入数据之后,对于下一次导入,你上一次的就是旧数据,所以应该删除也是没错的。
然后你这样写因为你的delete from a;是写在触发器里面,每导入一次 都会触发一次,所以A表每次都只会保留一条数据。
我有个建议就是把每天最新一天的数据当做新数据,这样你在触发器删除的时候可以加个日期判断,如果是当天的数据 就不删除,delete from a where date<>'今天日期'
参考技术A 先导入B表,然后完全删除A表,再把B表符合条件的数据导入A 参考技术B 对呀,逻辑上就是这样的结果,插入几条就会删几次,只保留最后一条数据。这就像一个循环,想让它只执行一次删除可以声明变量作为条件本回答被提问者采纳

ORACLE PL/SQL 触发器的编程问题

【中文标题】ORACLE PL/SQL 触发器的编程问题【英文标题】:ORACLE PL/SQL Programming problems with trigger 【发布时间】:2016-04-22 23:12:52 【问题描述】:

您好,我在运行使用 ORACLE PL/SQL 编程创建的触发器时遇到问题。基本上,每当插入一个在数据库中不存在的位置时,我都必须在 FEATURES 表中插入一个新元组。这是触发器 -

CREATE OR REPLACE TRIGGER sightTrigger
  AFTER INSERT
  ON SIGHTINGS
  FOR EACH ROW
DECLARE
  x INTEGER;
BEGIN
  SELECT COUNT(*)INTO x
    FROM FEATURES
    WHERE FEATURES.location = :NEW.location;

  IF(x=0) THEN
    RAISE APPLICATION ERROR(-20001, 'Warning: Insert into the SIGHTINGS    ...');

    INSERT INTO FEATUERS(LOCATION,CLASS,LATITUDE<LONGITUDE,MAP,ELEV)
      VALUES(:NEW.location, 'UNKNOWN', null, null, null, null);
  END IF;
END sightTrigger;

它编译得很好,但我运行了一个简单的查询来测试它 -

INSERT INTO SIGHTINGS VALUES ('Douglas dustymaiden', 'Person A', 'Piute', TO_DATE('17­Feb­07', 'DD­MON­YY'));

它给了我一个错误,叫做 - “ORA-20001:警告:插入 SIGHTINGS...”(我想要的) “ORA-06512:在第 7 行” "ORA-04088: 执行触发器时出错"

然后当我测试它时,没有插入到 FEATURES 表中。请帮忙。

【问题讨论】:

【参考方案1】:

根据raise_application_error 上的文档:

调用时,raise_application_error 结束子程序并返回用户定义的错误号和消息给应用程序。错误号和消息可以像任何 Oracle 错误一样被捕获。

所以,首先执行另一个插入,然后引发错误。但是,如果您在触发器中引发未处理的错误,这将回滚整个事务以及对其进行的任何数据修改,并且触发器将出错。您可能需要考虑以不同的方式向用户返回消息。

【讨论】:

在引发错误的顶部移动插入部分后仍然出现错误 错误信息是分类的还是你只是希望我使用我的读心技巧? 同样的错误,ORA-06512: at line 9 and ORA-04088: error during execution of trigger. 好的!我使用了 dbms_output.put_line 而不是引发错误。非常感谢! 你可以在raise(begin, commit)之前创建一个内部事务,但是你需要知道外部事务是否执行回滚,内部插入不要被删除

以上是关于Oracle数据库触发器问题的主要内容,如果未能解决你的问题,请参考以下文章

oracle 数据库的触发器

Oracle数据库如何解决ORA-04091触发器/函数不能读它的问题

Oracle表的更新触发器问题,更新本表的字段。

Oracle数据库中有关触发器问题

Oracle:搜索所有存储的过程/触发器/其他数据库代码?

使用此触发器 oracle 数据库更改表