求解决方案(oracle查询)

yanchunlm 2011-05-20 02:26:32
一组这样的数据:
进货:(数据库中的数据)
品种 日期 编号 金额 单价 批数
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的货)

先进货的就先出货 根据日期来判断 没出完的就下次接着出货

...全文
76 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
tangren 2011-05-20
  • 打赏
  • 举报
回复
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 50000

SQL> select * from out_store;

PTY OUTDATE NO MONEY
--- ---------- ---- ----------
pvc 2011-05-25 6969 50000
pvc 2011-05-26 6969 80000

SQL>
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 o

PTY 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
摩羯伙夫 2011-05-20
  • 打赏
  • 举报
回复
加张库存表,或者在进货表里增加一字段出库数量或库存数量。
lz要得效果就是库存的先进先出吧。
jym2002 2011-05-20
  • 打赏
  • 举报
回复
2011.5.20的货已经出完了 你没库存表 ,下次查询的时候怎么知道这次应该出哪天的货了?难不成把历次出货的-依次进货的得出 这次应该出哪次货了?
这设计的也太。。。

17,140

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧