WMS_U_MERGE_PALLET_RECORD 记录表
有3条语句
QTY 10 类型 入库
QTY 10 类型 入库
QTY 10 类型 入库在记录表中 我已经查询出 3条语句
第一条是起初是 0 期末 是10
第二条是起初是 10 期末 是20
第三条是起初是 20 期末 是30如果是入库就加 是出库 就减 起初就是上一次记录的期末数量,,速度求解
有3条语句
QTY 10 类型 入库
QTY 10 类型 入库
QTY 10 类型 入库在记录表中 我已经查询出 3条语句
第一条是起初是 0 期末 是10
第二条是起初是 10 期末 是20
第三条是起初是 20 期末 是30如果是入库就加 是出库 就减 起初就是上一次记录的期末数量,,速度求解
--分析函数来做就可以了
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
(
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>