ORACLE 对一个表进行循环查数,再根据MO供给数量写入另一个新表
一、

加工处理后要变成如下效果

create table test1 (sonum varchar2(10),lineid varchar2(10),qty int ,qty2 int ,remarks varchar2(10));
create table test2(moid varchar2(10),qty int ,sonum varchar2(10),lineid varchar2(10),qty2 int,remarks varchar2(10))
create table test3(sonum varchar2(10),lineid varchar2(10),moid varchar2(10),qty int ) insert into test1 values('SO1','10','500','','')
insert into test1 values('SO1','10','1000','','')
insert into test1 values('SO1','10','1500','','')
insert into test1 values('SO2','10','10','','')
insert into test2 values('mo1','4000','SO1','10','4000','')
insert into test2 values('mo1','200','SO2','10','2000','')
CREATE OR REPLACE PROCEDURE test123 (EXITCODE OUT NUMBER)
is V_so VARCHAR2 (10);
V_lineid VARCHAR2 (10);
V_mo VARCHAR2 (10); BEGIN FOR L_RECORD IN (select * from test1) LOOP --注意此处还需要增加判断是否有数据写入三个变量,不然会报错,此处略
select moid,sonum,lineid
INTO V_mo, V_so, V_lineid
from test2 where sonum=L_RECORD.sonum and lineid=L_RECORD.lineid and rownum=1; --写入数据到新表时,需考虑test2 MO表中的数量是否能否满足test1供给,此处略
insert into test3 values (V_so,V_lineid,V_mo,L_RECORD.qty); END LOOP
二、

create table test1 (sonum varchar2(10),lineid varchar2(10),qty int ,qty2 int ,remarks varchar2(10),planid varchar2(10));
create table test2(moid varchar2(10),qty int ,sonum varchar2(10),lineid varchar2(10),qty2 int,remarks varchar2(10))
create table test3(sonum varchar2(10),lineid varchar2(10),moid varchar2(10),qty int ) insert into test1 values('SO1','','','','','');
insert into test1 values('SO1','','','','','');
insert into test1 values('SO2','','','','','');
insert into test2 values('mo1','','SO1','','','');
insert into test2 values('mo2','','SO1','','','');
insert into test2 values('mo3','','SO1','','','');
insert into test2 values('mo4','','SO1','','','');
insert into test2 values('mo5','','SO2','','','');
CREATE OR REPLACE PROCEDURE STG.test321 (EXITCODE OUT NUMBER)
is PROCEDURE LoopAddData(TSONUM VARCHAR2,TLINEID VARCHAR2,TQTY INT ,TQTY2 INT,TPLANID VARCHAR2)
as
V_so VARCHAR2 (10);
V_lineid VARCHAR2 (10);
V_mo VARCHAR2 (10);
V_qty int;
V_qty2 int; --供给数量
V_qtymid int; ---循环时需重新查询最新需求数量
begin --注意此处还需要增加判断是否有数据写入三个变量,不然会报错
SELECT moid,sonum,lineid ,qty,qty2
INTO V_mo, V_so, V_lineid ,V_qty,V_qty2
FROM test2 where sonum=TSONUM and lineid=TLINEID and rownum=1; IF TQTY2<=V_qty2 -- 需求数量小于供给数量
THEN
INSERT INTO TEST3 values (V_so,V_lineid,V_mo,TQTY2);
UPDATE TEST1 SET qty2=0 where SONUM=TSONUM AND LINEID=TLINEID AND PLANID=TPLANID;
UPDATE TEST2 SET QTY2=QTY2-TQTY2 where SONUM=TSONUM AND LINEID=TLINEID AND MOID=V_mo;
commit; ELSE
--当余下的需求数量大于供给数量时,再次循环
SELECT QTY2 INTO V_qtymid from test1 where SONUM=TSONUM AND LINEID=TLINEID AND PLANID=TPLANID;
LoopAddData(TSONUM,TLINEID,TQTY,V_qtymid,TPLANID);
END IF;
end; BEGIN FOR L_RECORD IN (select SONUM,LINEID,QTY,QTY2,PLANID from test1) LOOP LoopAddData(L_RECORD.SONUM,L_RECORD.LINEID,L_RECORD.QTY,L_RECORD.QTY2,L_RECORD.PLANID);
--注意此处还需要增加判断是否有数据写入三个变量,不然会报错
--select moid,sonum,lineid
-- INTO V_mo, V_so, V_lineid
--from test2 where sonum=L_RECORD.sonum and lineid=L_RECORD.lineid and rownum=1; --insert into test3 values (V_so,V_lineid,V_mo,L_RECORD.qty); END LOOP; END;
/
ORACLE 对一个表进行循环查数,再根据MO供给数量写入另一个新表的更多相关文章
- 数据库SQL Server2012笔记(四)——多表查询、子查询、分页查询、用查询结果创建新表和外连接
1.多表查询 1)笛卡尔集: select * from 表名1,表名2 select * from 表名1.表名2 where 表名1.字段名=表名2.字段名 注: 若有两张表有同 ...
- 新建表需要原表的数据,mysql 如何把查询到的结果插入到新表中
项目运用情景:新建表需要原表的数据 1. 如果两张张表(导出表和目标表)的字段一致,并且希望插入全部数据,可以用这种方法: INSERT INTO 目标表 SELECT * FROM 来源表 ...
- Django框架(九)—— 单表增删改查,在Python脚本中调用Django环境
目录 单表增删改查,在Python脚本中调用Django环境 一.数据库连接配置 二.orm创建表和字段 三.单表增删改查 1.增加数据 2.删除数据 3.修改数据 4.查询数据 四.在Python脚 ...
- sql 如何把查询得到的结果如何放入一个新表中
如何把这个查询到的结果放到一张新表中? 2014-03-13 15:26 提问者采纳 表已经存在:insert into 表名 (列名1... 列名n) select 列名1....列名n f ...
- SQL Server 2017 SELECT…INTO 创建的新表指定到文件组
原文:SQL Server 2017 SELECT-INTO 创建的新表指定到文件组 SELECT-INTO 在 SQL Server 中也是常见的一个功能,过去用此方法创建的新表只能存储到默认的文件 ...
- 送H-1B 及其他I-129 申请别忘用新表
(梁勇律师事务所,lianglaw.com专稿)移民局从2010年11月23日 更新了申请H-1B 及其他非移民工作签证I-129 表,从2010年12月23日以后收到的I-129表都必须是2010年 ...
- Oracle 函数 “申请通过后,将该表中循环遍历到的所有内容插到另一个表中”
create or replace function mcode_apply_insert_material(p_mca_no VARCHAR2, p_action VARCHAR2, p_wf_no ...
- Oracle新表使用序列(sequence)作为插入值,初始值不是第一个,oraclesequence
Oracle新表使用序列(sequence)作为插入值,初始值不是第一个,oraclesequence 使用oracle11g插入数据时遇到这样一个问题: 1 --创建测试表-- 2 CREATE T ...
- 2017"百度之星"程序设计大赛 - 资格赛【1001 Floyd求最小环 1002 歪解(并查集),1003 完全背包 1004 01背包 1005 打表找规律+卡特兰数】
度度熊保护村庄 Accepts: 13 Submissions: 488 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/3276 ...
随机推荐
- java IO包的其他类
DataInputStream 与 DataOutputStream 记事本默认会查编码表,可能会显示成这样 读取 ByteArrayInputStream 与 ByteArrayOutputStre ...
- python 可视化 散点图。柱状图、等高线
matplolib.org可查到更多画图方法等 散点图 import matplotlib.pyplot as plt import numpy as np #n个点 n = 1024 #平均值是0, ...
- python 文本或句子切割,并保留分隔符
网上找了好久,都没有理想的解决方法.主要思想,利用正则表达式re.split() 分割,同时利用re.findall() 查找分隔符,而后将二者链接即可. # coding: utf- import ...
- 压缩归档tar命令
归档有两个命令,一个是tar命令,一个是cpio 归档不删除原文件 tar命令语法: tar cvf aa.tar file1 file2 file3 file4 file5 # tar cvf bb ...
- 使用eclipse在linux下开发C/C++
一直在Linux下开发,苦于没有IDE,一般都是自己编写Makefile,然后在windows下用文本编辑器ftp打开文件编辑,然后在linux下完成编译.调试代码也只能是命令行用gdb进行调试,相当 ...
- git 上传本地代码到github 服务器
git init git add . (所有文件用 点表示) git commit -m "注释语句" git remote add origin https://github.c ...
- python中__name__的使用
这几天开始学习Python,遇到一些问题,也解决了一些问题. 其中if __name__ == '__main__':这句估计很多和我一样的初学者都是不求甚解.这里作一下解释: 1:__name__是 ...
- [Python] numpy.random.rand
numpy.random.rand numpy.random.rand(d0, d1, ..., dn) Random values in a given shape. Create an array ...
- laravel5.4安装的报错
laravel5.4安装的报错 [InvalidArgumentException] Could not find package laravle/installer at any version f ...
- 理解无偏估计(unbiased estimation)
判断一个估计量“好坏”,至少可以从以下三个方面来考虑: 无偏估计 有效性 一致性 参考内容: 如何理解无偏估计量?https://www.matongxue.com/madocs/808.html 衡 ...