2016-04-10 63 views
0

我遇到以下觸發器問題。Oracle觸發器未讀取

這是我的程序計數訪問一個頁面:

create or replace procedure VisitSport(idN in number) 
is 
v1 number := idN; 
vc number; 
begin 
    select s.VISITAS into vc from Sports s where s.IDSPORTS=v1; 
    update Sports set VISITAS = vc +1 where IDSPORTS=v1; 
end; 

這走的是得分

create or replace PROCEDURE RankingSports(vnumber in number, vid in number) 
is 
v1 number := vnumber; 
v2 number := vid; 
v3 number; 
begin 
select CNT into v3 from SPORTS where IDSPORTS = v2; 
update SPORTS set CNT= v3+v1 where IDSPORTS = v2; 
end; 

這是我的觸發器,使操作來計算排名

create or replace trigger trg_RankingSp 
after insert or update on Sports 
for each row 
begin 
    update SPORTS set RANKING = visitas/cuenta; 
end; 

這是我在觸發器執行時得到的錯誤。

觸發器(或在此 語句中引用一個用戶定義的功能PLSQL)試圖看(或修改)的表中的,通過該發射它的語句被修改中間呈 。 *操作:重寫觸發器(或函數),使其不讀取該表。

+0

SPORTS表中的CNT列實際上被稱爲CUENTA – Anthony

+0

您可以給出'Sports'表的樣本數據,以及插入或更新後的期望值,顯示一些示例。 – Utsav

+0

基本答案是「您無法運行觸發器來更新觸發器所基於的表格。」這被稱爲變異表錯誤。通過使用「:new.ranking:=:new.visitas /:new.cuenta」來發布答案的人是正確的,他也是正確的,你必須在分配之前做if語句,因爲如果cuenta爲零,你將會有一個0/null的問題。 –

回答

1

我的猜測是,您只想爲插入或更新的行計算ranking值。假設這是正確的,那麼您只需更新:new pseudorecord而不是運行update

create or replace trigger trg_RankingSp 
    after insert or update on Sports 
    for each row 
begin 
    :new.RANKING := :new.visitas/:new.cuenta; 
end; 

現在,如果有可能cuenta有值爲0,你要處理,要防止被零除錯誤。

從數據模型的角度來看,存儲像這樣的計算值很少有意義。在視圖中進行計算通常會更有意義,或者可能會創建一個自動計算的虛擬列。