2016-04-10 11 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 trigger trg_RankingSp 
after insert or update on Sports 
for each row 
begin 
    update SPORTS set RANKING = visitas/cuenta; 
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; 

を取っています

これは、トリガーが実行されたときに発生するエラーです。

トリガ(又は でこの文を参照するユーザ定義PLSQL関数)を見て(または変更)するためにそれを焼成文によって変更された中央に たテーブルを試みました。 *処置:トリガー(または関数)を書き換えて、その表を読み取らないようにしてください。

+0

SPORTSテーブルのCNT列は、実際にはCUENTA – Anthony

+0

と呼ばれます。「スポーツ」テーブルのサンプルデータを提供できますか、挿入や更新後に何が期待されますか? – Utsav

+0

基本的な答えは「トリガーを実行して、トリガーの基になっているテーブルを更新することはできません」です。これを突然変異表エラーと呼びます。 ":new.ranking:=:new.visitas /:new.cuenta"を使って、構文を使って正しい答えを投稿した人物です。また、cuentaがゼロのため、代入の前にifステートメントを実行しなければならないということも正しいです、あなたは0/nullの問題で除算を持つでしょう。 –

答えて

1

私は、rankingの値を挿入または更新する行だけ計算したいと思うことです。それが正しいと仮定すると、updateを実行するのではなく、:new疑似コードを更新するだけです。今

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の値を持つことが可能であるならば、あなたは0による除算エラーを防ぐために、それを処理したいと思います。

データモデルの観点からは、このような計算値を格納することはほとんどありません。一般的には、ビュー内で計算を実行するか、潜在的には自動的に計算される仮想列を作成する方が理にかなっています。