我很抱歉这个混乱的标题,但找不到另一种方式来问它。
假设我想写一个程序add_salesline
。我输入了带参数的所有字段,subtotal
除外。小计(只是销售线的价格)需要根据其他表格中的字段计算,例如表productprice
中的products
,表pricereduction
中的promotion
等。(基于属性)。
我该怎么做?我一直试图解决这个问题好一周,而且它只是不起作用......
答案 0 :(得分:0)
据推测,传递给程序add_salesline()
的参数之一是productid
,或其他任何参数。因此,您可以使用它来选择products.productprice
,promotion.pricereduction
以及执行计算所需的任何其他内容。
编写存储过程的目的是将多个调用关联到一个程序单元中。所以add_salesline()
可能看起来像这样(很多警告,因为你的问题在细节上非常清楚):
create or replace procedure add_salesline(
p_orderno in salesline.orderno%type
, p_salesqty in salesline.salesqty%type
, p_productid in products.productid%type
)
is
new_rec salesline%rowtype;
begin
new_rec.orderno := p_orderno;
new_rec.salesqty := p_salesqty;
new_rec.productid := p_productid;
select p_salesqty * (p.productprice * nvl(pp.pricereduction, 1))
into new_rec.subtotal
from products p
left outer join promotion pp
on pp.productid = p.productid
where p.productid = p_productid
;
insert into salesline
value new_rec;
end;
此代码假定pricereduction
是一个费率。如果该值是绝对折扣,则公式将不同(p.productprice - nvl(pp.pricereduction, 0))
。或者,如果它是重置价格:coalesce(pp.pricereduction, p.productprice)
。