触发器中找不到数据

时间:2011-10-05 12:24:13

标签: sql oracle

我的触发器有问题。它返回“没有找到数据”,我不知道如何解决它。你能救我吗?

create or replace
TRIGGER nb_action
    AFTER INSERT ON Message
  FOR EACH ROW
DECLARE
    vAuteur integer;
  PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
    SELECT id_auteur INTO vAuteur FROM Message where id_message = :new.id_message;
  UPDATE Utilisateur SET nb_action=nb_action+1 where id_utilisateur=vAuteur;
END ;

2 个答案:

答案 0 :(得分:5)

不要在普通代码中使用自治事务。自动事务非常合适的唯一时间是您希望将数据写入日志表而不管底层操作是否提交的情况。例如,如果要记录错误,回滚事务并引发异常,则可能不希望回滚日志消息。你绝对不应该使用自治事务来解决变异表异常,我认为这是你在这里使用自治事务的原因,因为对Message表的查询会引发变异表异常,如果它不是在自主交易中。

幸运的是,在这种情况下,不需要查询定义了触发器的表,也不需要使用自治事务。简单地

create or replace trigger nb_action
  AFTER INSERT ON Message
  FOR EACH ROW
BEGIN
  UPDATE Utilisateur 
     SET nb_action=nb_action+1 
   where id_utilisateur=:new.id_auteur;
END ;

答案 1 :(得分:1)

由于您在该触发器中有PRAGMA AUTONOMOUS_TRANSACTION;,这意味着它无法看到刚插入的行,因为它位于另一个尚未提交的事务中,因此您的SELECT不会返回任何数据。 ..

create or replace
TRIGGER nb_action
    AFTER INSERT ON Message
  FOR EACH ROW
DECLARE
  PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
  UPDATE Utilisateur SET nb_action=nb_action+1 where id_utilisateur=:new.id_auteur;
END ;