0

我正在尝试创建一个更新触发器,但我一直遇到“变异表”错误。主要思想是一个带有用户评分的买卖数据库。基本上我想,每次更新 PRODUTOS 表上的评级时,重新计算卖家的评级。我正在尝试以下触发器(及其版本),但它无处可寻..

CREATE OR REPLACE TRIGGER actualiza_rating_vend
AFTER UPDATE OF RATING_VENDEDOR
ON PRODUTOS
REFERENCING OLD AS OLD NEW AS NEW
FOR EACH ROW
DECLARE
    CURSOR prod IS
        SELECT ID_USER,RATING_VENDEDOR, ID_COMPRADOR, RATING_COMPRADOR
        FROM   PRODUTOS
        WHERE  PRODUTOS.ID_USER = :NEW.ID_USER
        OR     PRODUTOS.ID_COMPRADOR = :NEW.ID_USER;
     contador NUMBER;
     soma     NUMBER;
     res      NUMBER;
     linha    prod%ROWTYPE;
     username  varchar2(255);
     BEGIN
     res := 0;
     contador := 0;
     fetch prod into linha;  
     username := :NEW.ID_USER;
         while prod%found loop
          if(linha.ID_user = username)
          then
            soma := soma + linha.RATING_VENDEDOR;
          else
            soma := soma + linha.RATING_COMPRADOR;
          end if;
          contador := contador + 1;       
          fetch prod into linha;
        end loop;
    close prod;
         res := soma / contador;
         update USERS set USERS.RATING = res where USERS.ID_USER = username;
  end;

有人可以给我一个提示,我怎样才能只选择 ID_USER 值等于更新条目的 ID_USER 的条目?..提前致谢!

4

1 回答 1

0

如果表中的评级USERS是最新的,您只需添加最新更改的评级:

CREATE OR REPLACE TRIGGER actualiza_rating_vend
  AFTER UPDATE ON produtos FOR EACH ROW
BEGIN
   UPDATE users 
      SET user_rating = user_rating + :new.rating_vendedor - :old.rating_vendedor
    WHERE id_user = :new.id_user;

   UPDATE users 
      SET user_rating = user_rating + :new.rating_comprador - :old.rating_comprador
   WHERE id_user = :new.id_comprador;

END actualiza_rating_vend;

/

于 2012-12-17T15:48:35.037 回答