WMS_U_MERGE_PALLET_RECORD 记录表
有3条语句
QTY  10    类型 入库
QTY  10    类型 入库
QTY  10    类型 入库在记录表中  我已经查询出  3条语句  
第一条是起初是 0    期末 是10 
第二条是起初是 10   期末 是20 
第三条是起初是 20   期末 是30如果是入库就加    是出库  就减 起初就是上一次记录的期末数量,,速度求解  

解决方案 »

  1.   


    --分析函数来做就可以了
    WITH tab AS(
    SELECT 1 id,'数量' qty, 10 num ,'类型' TYPE, '入库' flag FROM dual UNION ALL 
    SELECT 2,'数量', 10, '类型', '入库' FROM dual UNION ALL 
    SELECT 3,'数量', 10, '类型', '入库' FROM dual UNION ALL 
    SELECT 4,'数量', 20, '类型', '出库' FROM dual UNION ALL 
    SELECT 5,'数量', 50, '类型', '入库' FROM dual 
    )
    --以上是测试数据
    SELECT id,(期末-Decode(flag,'入库',num,'出库',-num)) 期初,flag,num,期末 FROM(
       SELECT a.*,sum(Decode(flag,'入库',num,'出库',-num))over(ORDER BY id) 期末 FROM tab a

    ID 期初 FLAG  NUM  期末
    --------------------------
    1  0    入库  10   10
    2  10   入库  10   20
    3  20   入库  10   30
    4  30   出库  20   10
    5  10   入库  50   60
      

  2.   

    CREATE TABLE R
    (
      pno    VARCHAR2(20), --产品编号
      s_qty  NUMBER, --期初数量
      e_qty  NUMBER, --期末数量
      opdate DATE    --入出库日期
    );CREATE OR REPLACE PROCEDURE p_inout(i_pno    VARCHAR2, --产品编号
                                        i_qty    NUMBER, --数量
                                        i_optype VARCHAR2) --出入库操作(0:入库,1:出库)
     AS
      v_opdate DATE;
      v_eqty   NUMBER;
    BEGIN
      BEGIN
        --取得最近出入库记录
        SELECT MAX(opdate) INTO v_opdate FROM r WHERE r.pno = i_pno;
        --取得最近期末数量
        SELECT e_qty
          INTO v_eqty
          FROM r
         WHERE r.opdate = v_opdate
           AND r.pno = i_pno
           FOR UPDATE;
        IF i_optype = 0 THEN
          --入库
          INSERT INTO r
            (pno, s_qty, e_qty, opdate)
          VALUES
            (i_pno, v_eqty, v_eqty + i_qty, SYSDATE);
        ELSE
          --出库
          IF v_eqty > i_qty THEN
            INSERT INTO r
              (pno, s_qty, e_qty, opdate)
            VALUES
              (i_pno, v_eqty, v_eqty - i_qty, SYSDATE);
          ELSE
            --出库数量不够
            RAISE_APPLICATION_ERROR(-20001, 'not enough!');
          END IF;
        END IF;
        COMMIT;
      EXCEPTION
        --第一次入库
        WHEN NO_DATA_FOUND THEN
          IF i_optype = 0 THEN
            INSERT INTO r
              (pno, s_qty, e_qty, opdate)
            VALUES
              (i_pno, 0, i_qty, SYSDATE);
          ELSE
            --没有入库记录
            RAISE_APPLICATION_ERROR(-20001, 'not enough!');
          END IF;
          COMMIT;
        WHEN OTHERS THEN
          ROLLBACK;
      END;
    EXCEPTION
      WHEN OTHERS THEN
        ROLLBACK;
    END;
    SQL> exec p_inout('001',10,0);PL/SQL 过程已成功完成。
    --测试
    SQL> exec p_inout('001',10,0);PL/SQL 过程已成功完成。SQL> exec p_inout('001',10,0);PL/SQL 过程已成功完成。SQL> select * from r;PNO                       S_QTY      E_QTY OPDATE
    -------------------- ---------- ---------- -------------------
    001                          10         20 2010-12-24 14:13:07
    001                           0         10 2010-12-24 14:13:07SQL>