2015-06-20 26 views
0

我試圖創建觸發器TrgDisAmountPRODUCT表中讀取PROD_NAMEPRICE並計算SALES表的DISCOUNTAMOUNT對於插入的SERIALPCODE值每一個新行。如何在插入第三個表之前使用觸發器從兩個表中獲取日期?

這些表的信息

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_RATE使用功能GetDiscount

我已經創建GetDiscount功能從表DISCOUNT得到DISCOUNT_RATE

這是我的嘗試:

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 
+0

什麼是你的代碼的問題,使用的?它會產生錯誤嗎?它做錯了什麼嗎? –

+0

當我運行該塊它告訴我錯誤說:PLS-00049:壞綁定變量'OLD.PRODUCT'@GordonLinoff – user125150

+0

正確這些錯誤是 - 1.Remove:OLD 2.正確調用您的函數,並3.刪除INSERT INTO子句。對於插入觸發器之前,INSERT語句不是必需的,當條件匹配時,會自動插入一行。下面的代碼片段@ user125150 –

回答

1

當您插入觸發之前創建一個,你只需要設置: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。但是,這是您的問題中的算術,並且您不提供任何示例數據來建議任何其他方法。

+0

我如何從其他表中獲取數據?請參閱問題中的更新部分,SQL語句及其結果@GordonLinoff – user125150

+0

@ user125150。 。 。該查詢正確使用'SELECT'從其他表中獲取數據。 –

0

你可以嘗試改變,你在呼喚你的函數的方式。

正如戈登提到,:老不應該在這種情況下

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); 

enter image description here

+0

請查看問題中的更新部分@ mahendar-mahi – user125150

+0

@ user125150您是否嘗試過這種方式? –

相關問題