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 ...
随机推荐
- css属性所对应js属性
document.getElementById("xx").style.xxx中的所有属性是什么,css对应js: 盒子标签和属性对照 CSS语法(不区分大小写) JavaScri ...
- java study1
java安装 java优势-跨平台:一次编写,到处运行. jdk开发工具包,提供了开发人员需要的开发工具.jdk中包含了jre jre java的运行环境,负责程序的运行,jre中,包含程序运行时需要 ...
- MySQL 特殊参数
###开发规范 开发规范:关键字大写,库名字小写,要有字符集 CREATE DATABSE oldboy CHARSET utf8; ###建议采用第一种 CREATE DATABSE oldb ...
- [UE4]acotor放置4*4列表
// Number of blocks const int32 NumBlocks = Size * Size; // Loop to spawn each block ; BlockIndex< ...
- Petapoco 查询 语法
查询语句 Sql sql = Sql.Builder; sql.Select("spb_MailAddress.*") .From("spb_MailAddress&qu ...
- 《opencv学习》 之 几何变换
图像平移: 1.不改变图像大小 2.改变图像大小 编程按照目标图像的角度去编写 不改变大小的平移 1 void imageTranslation1(Mat& src, Mat& dst ...
- filter vs servlet
主要从如下四个方面介绍他们之间的区别: 1.概念. 2.生命周期. 3.职责. 4.执行过程. 一.概念 ...
- 开启saltstack的web界面
saltstack官方有提供一个web界面叫halite,halite是用cherrypy web框架开发的,连接后端的saltstack api,web界面虽然简单点,但功能还算齐全,今天就来开启s ...
- bootstrap3中select2的默认值和下拉框的禁用
最近做项目用到了select2插件,需求中需要给下拉框设置默认值之后,禁用下拉框,我开始的写法是这样的 <script type="text/javascript"> ...
- spring mvc 解决json 不能转换的问题
在要转的实体上加一个 @JsonIgnoreProperties(value = { "hibernateLazyInitializer", "handler" ...