我对SQL特别是PL / SQL相当新,我掌握了基础知识,但我想要做的事情超出了我的想象。这是较大系统的一小部分,但我将重点关注3个表Sale_Head,Sale_Line和Product。这项工作是在Orcale SQL开发人员中完成的。
http://imgur.com/OrfhM0g,i4pMnTx - 销售表 http://imgur.com/OrfhM0g,i4pMnTx#1 - 产品表 (我是一个新手,所以我没有足够的代表直接发布图像)
我试图建立一些处理待售销售的程序。销售在Sale_Head中具有状态,可以是p(待定),s(已发货),i(进行中),x(已取消)或b(后退订单)。程序需要找到具有待处理状态的销售(我的代码中已经有了这么远),然后检查产品库存水平是否高于足以完成销售的最低水平。如果满足所有这些条件,等待销售成为我(正在进行中),如果库存不足,它将延期交货(b)。我对如何解决这个问题有了一个总体的想法,但是当我不得不使用来自sale_line的外国人引用产品表时,我感到困惑。
--create or replace procedure Process_Products is
--begin
select Sale_Head.Sale_Num , Sale_Line.Product_Code as
from Sale_Head
inner join Sale_Line on
Sale_Head.Sale_Num = Sale_Line.SALE_NUM
where Sale_head.Status = 'P';
--if Sale_Line.Product_Code = Product.Product_Code >
--end;
这将返回具有待处理状态的订单的产品代码,但现在我需要检查产品表中的库存水平并进行调整。
答案 0 :(得分:0)
如果我错了,请纠正我,但如果您说"对于处于待定状态的销售,如果有足够的库存来完成订单,请将状态更改为i(正在进行中),否则库存不足存在,所以将状态更改为b(延期交货)",然后以下内容应该有所帮助:
-- This is a useful query to display what you need - debugging, use in cursor, etc
SELECT sh.Sale_Num, sl.Product_Code, sl.Quantity as QtyToBuy,
p.Stock_Count, p.Minimum_Level,
(Case When sl.Quantity <= p.Minimum_Level Then 'i'
Else 'b' end) as NewStatus
FROM Sale_Head sh
INNER JOIN Sale_Line sl
ON sh.Sale_Num = sl.SALE_NUM
INNER JOIN Product p
ON sl.Product_Code
WHERE Sale_head.Status = 'P';
如果符合您的要求,可以在一个查询中更新状态代码:
--This query will actully do the update (if view is updatable)
UPDATE
(
SELECT sh.Status, (Case When sl.Quantity <= p.Minimum_Level Then 'i'
Else 'b' end) as NewStatus
FROM Sale_Head sh
INNER JOIN Sale_Line sl
ON sh.Sale_Num = sl.SALE_NUM
INNER JOIN Product p
ON sl.Product_Code
WHERE sh.Status = 'P'
) a
SET a.Status = a.NewStatus;
如果上述视图不可更新,请尝试以下语法:
--Otherwise try this syntax
UPDATE Sale_Head sh1 Set Sale_Head.Status =
SELECT (Case When sl.Quantity <= p.Minimum_Level Then 'i'
Else 'b' end) as NewStatus
FROM Sale_Head sh
INNER JOIN Sale_Line sl
ON sh.Sale_Num = sl.SALE_NUM
INNER JOIN Product p
ON sl.Product_Code
WHERE sh1.Sale_Num = sh.Sale_Num
)
WHERE Sale_Head.Status = 'P';