2012-12-17 21 views
0

我試圖創建更新觸發器,但我一直在「變異表」錯誤上碰撞。主要想法是銷售&購買數據庫與用戶評級。 基本上我想,每次PRODUTOS表上的評分都會更新,重新計算賣家的評分。 我想下面的觸發器(和它的版本),但它沒有成氣候..在更新觸發器獲取更新條目的ID - 突變表錯誤

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

您在文說說'DEALS'表你題。但是你的觸發器沒有引用該表。我假設觸發器是正確的,並且問題的文本是錯誤的,但如果您能澄清這一點,這將有所幫助。 –

+0

另外,RATING_VENDEDOR表上的'UPDATE'是來自'PRODUTOS'還是'USERS'上的另一個觸發器(或另一個觸發器調用的代碼)上的'UPDATE'? –

+0

@JustinCave抱歉,我寫了Deals,因爲'produtos'是一個葡萄牙語單詞,它可能很奇怪(但我做得更糟,哈哈)我編輯了正確的表名。不,更新RATING_VENDEDOR不是來自另一個觸發器,它是一個直接的sql更新命令..again,對不起 –

回答

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; 

/

+0

這樣我只更新PRODUTOS上的rating_vendedor而不是USERS表上的值..也許我沒有正確解釋我自己:每個用戶都有一個評級值,它來自他出售的物品的平均評級。所以,當他收到新評級時,我必須重新計算該平均「全球」評級。 –

+0

我不會重新計算每次更新的平均值,但要利用平均值=總和/計數。上面的觸發器總結了收視率,您只需添加一個計數列,並且您的平均值不需要重新計算。 –