一、

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

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供给数量写入另一个新表的更多相关文章

  1. 数据库SQL Server2012笔记(四)——多表查询、子查询、分页查询、用查询结果创建新表和外连接

    1.多表查询 1)笛卡尔集: select  *  from  表名1,表名2 select  *  from  表名1.表名2  where   表名1.字段名=表名2.字段名 注: 若有两张表有同 ...

  2. 新建表需要原表的数据,mysql 如何把查询到的结果插入到新表中

    项目运用情景:新建表需要原表的数据 1. 如果两张张表(导出表和目标表)的字段一致,并且希望插入全部数据,可以用这种方法: INSERT INTO  目标表  SELECT  * FROM  来源表 ...

  3. Django框架(九)—— 单表增删改查,在Python脚本中调用Django环境

    目录 单表增删改查,在Python脚本中调用Django环境 一.数据库连接配置 二.orm创建表和字段 三.单表增删改查 1.增加数据 2.删除数据 3.修改数据 4.查询数据 四.在Python脚 ...

  4. sql 如何把查询得到的结果如何放入一个新表中

    如何把这个查询到的结果放到一张新表中? 2014-03-13 15:26   提问者采纳   表已经存在:insert into 表名 (列名1... 列名n) select 列名1....列名n f ...

  5. SQL Server 2017 SELECT…INTO 创建的新表指定到文件组

    原文:SQL Server 2017 SELECT-INTO 创建的新表指定到文件组 SELECT-INTO 在 SQL Server 中也是常见的一个功能,过去用此方法创建的新表只能存储到默认的文件 ...

  6. 送H-1B 及其他I-129 申请别忘用新表

    (梁勇律师事务所,lianglaw.com专稿)移民局从2010年11月23日 更新了申请H-1B 及其他非移民工作签证I-129 表,从2010年12月23日以后收到的I-129表都必须是2010年 ...

  7. Oracle 函数 “申请通过后,将该表中循环遍历到的所有内容插到另一个表中”

    create or replace function mcode_apply_insert_material(p_mca_no VARCHAR2, p_action VARCHAR2, p_wf_no ...

  8. Oracle新表使用序列(sequence)作为插入值,初始值不是第一个,oraclesequence

    Oracle新表使用序列(sequence)作为插入值,初始值不是第一个,oraclesequence 使用oracle11g插入数据时遇到这样一个问题: 1 --创建测试表-- 2 CREATE T ...

  9. 2017"百度之星"程序设计大赛 - 资格赛【1001 Floyd求最小环 1002 歪解(并查集),1003 完全背包 1004 01背包 1005 打表找规律+卡特兰数】

    度度熊保护村庄 Accepts: 13 Submissions: 488 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/3276 ...

随机推荐

  1. OOD与OOP的思想的感悟

    Walking on water and developing software from a specification are easy if both are frozen) -Edward V ...

  2. java 网络编程UDP

    获得主机名 和 ip 的操作 简单示例 发送 接收 发送:键盘录入获得数据 接收:接收端持续接收数据 配合多线程可以完成一个聊天的功能.

  3. android studio 更新 Gradle错误解决方法(Gradle sync failed)

    android studio 更新 Gradle错误解决方法   Android Studio每次更新版本都会更新Gradle这个插件,但由于长城的问题每次更新都是失败,又是停止在Refreshing ...

  4. sql 查询年龄

    SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- ...

  5. bzoj1833 数字计数

    Description 给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次. Input 输入文件中仅包含一行两个整数a.b,含义如上所述. Output 输出文 ...

  6. Spring中的后置处理器BeanPostProcessor讲解

    Spring中提供了很多PostProcessor供开发者进行拓展,例如:BeanPostProcessor.BeanFactoryPostProcessor.BeanValidationPostPr ...

  7. SpringMVC 获取请求参数

    1.获取Request response对象 在SpringMVC的注解开发中,可以选择性的接收Request和Response对象来使用 2.获取request对象请求参数 a.通过request对 ...

  8. cpu监控之二:dstat

    首先我们使用dstat命令来查看下我们的CPU情况,他能够实时的输出我们的信息, dstat 2 10(每2秒采集一次共采集10次) [test@test pos-gateway]$ dstat Yo ...

  9. ASP.NET Web Pages:C# 和 VB 实例

    ylbtech-.Net-ASP.NET Web Pages:C# 和 VB 实例 1.返回顶部 1. ASP.NET Web Pages - C# 和 VB 实例 通过 C# 和 Visual Ba ...

  10. ssh-keygen的使用方法(无密码访问)

    一.概述 1.就是为了让两个linux机器之间使用ssh不需要用户名和密码.采用了数字签名RSA或者DSA来完成这个操作 2.模型分析 假设 A (192.168.20.59)为客户机器,B(192. ...