一组这样的数据:
进货:(数据库中的数据)
品种 日期      编号 金额  单价  批数 
pvc  2011.5.20  6969 10万  2000  10 
pvc  2011.5.21  6969 5万   1000  10 出货:
数据库中的数据:
品种 日期      编号 金额
pvc  2011.5.25  6969  5万  
pvc  2011.5.26  6969  8万 根据上面2组数据,
需要用存储过程或者是函数,查询出下面的结果
品种 日期      编号 金额  单价  批数
pvc  2011.5.25  6969  5万  2000  5 (说明:出2011.5.20的货)
pvc  2011.5.26  6969  5万  2000  5  (出2011.5.20的货)
pvc  2011.5.26  6969  3万  1000  6   (2011.5.20的货已经出完了,接着出2011.5.21的货)先进货的就先出货 根据日期来判断 没出完的就下次接着出货 

解决方案 »

  1.   

    SQL> --入库表增加一列remain,入库时初始化与入库金额相等
    SQL> select * from in_store;PTY INDATE     NO        MONEY  UNITPRICE    BATCHNO     REMAIN
    --- ---------- ---- ---------- ---------- ---------- ----------
    pvc 2011-05-20 6969     100000       2000         10     100000
    pvc 2011-05-21 6969      50000       1000         10      50000SQL> select * from out_store;PTY OUTDATE    NO        MONEY
    --- ---------- ---- ----------
    pvc 2011-05-25 6969      50000
    pvc 2011-05-26 6969      80000SQL> 
    SQL> --创建临时表
    SQL> create global temporary table OUT_STORE_TMP
      2  (
      3    ptype     CHAR(3),
      4    outdate   DATE,
      5    no        CHAR(4),
      6    money     NUMBER,
      7    unitprice NUMBER,
      8    batchno   NUMBER
      9  )
     10  on commit preserve rows;表已创建。SQL> 
    SQL> --创建存储过程
    SQL> CREATE OR REPLACE PROCEDURE p_out_store(o OUT SYS_REFCURSOR) IS
      2    v_money NUMBER;
      3    CURSOR c1 IS
      4      SELECT * FROM out_store o ORDER BY o.outdate;
      5    CURSOR c2 IS
      6      SELECT * FROM in_store i WHERE remain > 0 ORDER BY i.indate FOR UPDATE;
      7  BEGIN
      8    DELETE FROM out_store_tmp;
      9    FOR i1 IN c1 LOOP
     10      v_money := i1.money;
     11      FOR i2 IN c2 LOOP
     12        IF i1.ptype = i2.ptype AND i1.no = i2.no AND v_money > 0 THEN
     13          IF v_money > i2.remain THEN
     14            --插入出库临时表
     15            INSERT INTO out_store_tmp
     16              (ptype, outdate, no, money, unitprice, batchno)
     17            VALUES
     18              (i1.ptype, i1.outdate, i1.no, i2.remain, i2.unitprice,
     19               i2.batchno);
     20            --更新库存
     21            UPDATE in_store a SET a.remain = 0 WHERE CURRENT OF c2;
     22            v_money := v_money - i2.remain;
     23          ELSE
     24            INSERT INTO out_store_tmp
     25              (ptype, outdate, no, money, unitprice, batchno)
     26            VALUES
     27              (i1.ptype, i1.outdate, i1.no, v_money, i2.unitprice, i2.batchno);
     28            UPDATE in_store a
     29               SET a.remain = a.remain - v_money
     30             WHERE CURRENT OF c2;
     31            v_money := 0;
     32            EXIT;
     33          END IF;
     34        END IF;
     35      END LOOP;
     36      COMMIT;
     37    END LOOP;
     38    OPEN o FOR
     39      SELECT * FROM out_store_tmp;
     40  END;
     41  /过程已创建。SQL> 
    SQL> var o refcursor
    SQL> 
    SQL> --执行存储过程
    SQL> exec p_out_store(:o);PL/SQL 过程已成功完成。SQL> 
    SQL> print oPTY OUTDATE    NO        MONEY  UNITPRICE    BATCHNO
    --- ---------- ---- ---------- ---------- ----------
    pvc 2011-05-25 6969      50000       2000         10
    pvc 2011-05-26 6969      50000       2000         10
    pvc 2011-05-26 6969      30000       1000         10