1

私は、弱いエンティティを表すこのテーブルを持っています。これは、注文されたアイテムを紹介するための典型的なテーブルです:

これを行うために、トリガーで最後の列 (iva を含まない製品の合計価格) を更新する必要があります。

だから、私はこれを思いつきましたが、新しい価値観と古い価値観を扱うことになると、私は完全に間違っています.

create or replace
trigger t_replaceTotal
after insert or update of id_prod,qtd_if,prec_total_if on item_fornecimento
for each row 

declare
iva produto.iva_prod%type;
idProd  produto.id_prod%type;
r_old item_fornecimento.prec_total_if%type:=null;
r_new item_fornecimento.prec_total_if%type:=null;

begin
  select iva_prod,id_prod into iva,idprod from produto p where p.id_prod = id_prod; 
  r_old:= :old.prec_total_if;
  r_new:= :new.prec_total_if;
  update item_fornecimento item set prec_total_if = r_old * (1+(iva/100)) where item.id_prod = idprod;
end;

誰かがこのコードの書き直しを手伝ってくれませんか? 次のエラーが表示されます: ORA-01422: 正確なフェッチで、要求された行数よりも多くが返されます ORA-06512: "FUSION.T_REPLACETOTAL" の行 8

4

2 に答える 2

4

問題は、列(id_prod)をそれ自体に一致させているため、テーブルからすべての行をフェッチしようとしていることです。:new.id_prodまたは:old.id_prodを使用したいと思います。

select .... from produto p where p.id_prod = id_prod; 

次に、これをBEFORE INSERT / UPDATEトリガーにして、UPDATEステートメントを次のように置き換えます。

 :new.prec_total_if := r_old * (1+(iva/100));

そうしないと、テーブルの変更エラーが混乱することになります。

于 2010-01-21T00:53:27.983 に答える
0

このエラーは、結果を変数に保存するクエリが複数の結果を返していることを示しています。そのため、変数に何を保存したいのかわかりません。

以下を実行してみてください。

select iva_prod,id_prod from produto p where p.id_prod = id_prod;

に保存できない複数の結果が得られるに違いありませんiva,idprod

于 2010-01-20T23:28:14.463 に答える