0

テーブルからTrgDisAmount読み取りPROD_NAME、およびの値で挿入された新しい行ごとにテーブルのおよびを計算するトリガーを作成しようとしています。PRICEPRODUCTDISCOUNTAMOUNTSALESSERIALPCODE

これらはテーブル情報です

Table SALES (SERIAL, PCODE, PROD_NAME, PRICE, DISCOUNT, AMOUNT)

Table PRODUCT (PCODE, PROD_NAME, PROD_CAT, PRICE)

Table DISCOUNT (PROD_CAT, DISCOUNT_RATE)

ノート:

  1. SERIALおよびのみの値を入力しますPCODE。残りの列は、トリガーによってTrgDisAmountのみ入力する必要があります
  2. DISCOUNT_RATEusing Function を取得しGetDiscountます。

tableGetDiscountから取得する関数を既に作成しています。DISCOUNT_RATEDISCOUNT

これは私の試みです:

create or replace trigger TrgDisAmount
  before insert on SALES for each row
begin
  if :new.PCODE = :old.PRODUCT.PCODE then

    :new.PROD_NAME := :old.PRODUCT.PROD_NAME;
    :new.PRICE := :old.PRODUCT.PRICE;
    :new.DISCOUNT := :old.product.PRICE / (GetDiscount(:old.PRODUCT.PROD_CAT));
    :new.AMOUNT := :new.PRICE - :new.DISCOUNT;
  end if;

  insert into SALES columns (PROD_NAME, PRICE, DISCOUNT, AMOUNT) 
  values (:new.PROD_NAME, :new.PRICE, :new.DISCOUNT, :new.AMOUNT);
end;
/

そのブロックを実行すると、次のエラーが表示されます。

PLS-00049: bad bind variable 'OLD.PRODUCT'

Table_Name.Column_name特定の列に到達するために使用します。それを行うことは合法ですか?


サンプル出力は次のようになります。

SQL> insert into sales values (1,'MB-101',null, null, null, null);

Result in SALES table:
   SERIAL : 1,
   PCODE : MB-101,
   PROD_NAME : IPHONE 6+,
   PRICE : 250 ,
   DISCOUNT : 25,
   AMOUNT : 225
4

2 に答える 2

1

before insertトリガーを作成する場合は、:new値を設定するだけです。実際にはテーブルに挿入しません。それが処理の次のステップです。

また、insertトリガーでは、:newではなく、値のみを参照してください:old。値がありません:old。これは、発生している特定のエラーです。

次に、クエリを実行して、他のテーブルから関連情報を取得する必要があります。結果は次のようになります。

create or replace trigger TrgDisAmount
before insert on SALES
for each row
begin
    select p.price / d.discount into :new.discount
    from product p join
         discount d
         on p.prod_cat = d.prod_cat
    where :new.pcode = p.pcode;
    :new.AMOUNT := :new.PRICE - :new.DISCOUNT;
end;

割引を定義するための算術は非常に疑わしいようです。この方法を使用すると、10% の割引は 1.11 として表されます。ただし、これは質問の算術であり、他の方法を提案するサンプルデータは提供していません。

于 2015-06-20T12:26:17.503 に答える
0

関数を呼び出す方法を変更してみてください。

ゴードンが述べたように、この場合は :old を使用しないでください

CREATE or replace trigger TrgDisAmount 
Before insert 
on SALES 
for each row 

DECLARE
v_prod_cat varchar2(20);

BEGIN 

select PROD_NAME into :NEW.PROD_NAME
from PRODUCT 
where PRODUCT.PCODE = :NEW.PCODE;  

select  PRICE into :NEW.PRICE 
from PRODUCT 
where PRODUCT.PCODE = :NEW.PCODE; 

select  PROD_CAT into v_prod_cat from discount where  PROD_CAT 
in( select PROD_CAT from PRODUCT where  PCODE = :NEW.PCODE); 

select  GetDiscount(v_prod_cat) into :NEW.discount from dual;

 :new.AMOUNT := :new.PRICE - :new.DISCOUNT;

END;
/

Trigger created.   
SQL> show err;                                                        
 No errors.

insert into sales  values(701,1,NULL,NULL,NULL,NULL);

ここに画像の説明を入力

于 2015-06-20T19:48:03.593 に答える