我正在尝试创建一个触发器TrgDisAmount
,以便从PROD_NAME
表中读取PRICE
和PRODUCT
,并为每个插入了DISCOUNT
和AMOUNT
值的新行计算SALES
表的SERIAL
和PCODE
。
这些是表格信息
Table SALES (SERIAL, PCODE, PROD_NAME, PRICE, DISCOUNT, AMOUNT)
Table PRODUCT (PCODE, PROD_NAME, PROD_CAT, PRICE)
Table DISCOUNT (PROD_CAT, DISCOUNT_RATE)
注意:
SERIAL
和PCODE
的值,其余列应仅由触发器TrgDisAmount
输入DISCOUNT_RATE
获取GetDiscount
。 我已经创建了
GetDiscount
函数来从表DISCOUNT_RATE
中获取DISCOUNT
。这是我的尝试:
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
最佳答案
创建插入前触发器时,只需设置: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。但是,这是您问题中的算法,您没有提供示例数据来建议任何其他方法。
关于sql - 在插入第三个表之前,如何使用触发器从两个表中获取日期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30953917/