我正在尝试创建更新触发器,但我不断碰到“变异表”错误。主要想法是具有用户评级的销售和购买数据库。 基本上我想,每次更新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的条目? 提前谢谢!
答案 0 :(得分: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;
/