在后续程序中使用查询结果

时间:2014-08-16 00:37:47

标签: sql plsql oracle-sqldeveloper

我对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;

这将返回具有待处理状态的订单的产品代码,但现在我需要检查产品表中的库存水平并进行调整。

1 个答案:

答案 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';