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 ...
随机推荐
- wxWidgets:动态EVENT绑定
我们已经看到如何使用静态EVENT TABLE来处理EVENT:但这种方式不够灵活.下面我们来看看如何在Event和处理函数间实现动态Bind. 仍然以那个简陋的Frame作为例子. 首先删除所有的静 ...
- sql编程中流程控制 IF ……THEN……ELSEIF……THEN………END IF
写mysql存储过程应注意的几点: 1.声明变量(declare)时要注意字符集,用变量存储表字段时,表字段与变量的字符编码要一致. 2.mysql的字符合并不能用‘+’号,必须用concat函数. ...
- 032:基于Consul和MGR的MySQL高可用架构
目录 一.Consul 1.Consul简介 2.准备环境 3.Consul 安装 4.Consul配置文件 5.Consul 服务检查脚本 6.Consul启动 二.MGR搭建 1.MGR配置 2. ...
- tf.matmul函数和tf.multiply函数
tf.matmul(a,b,transpose_a=False,transpose_b=False, adjoint_a=False, adjoint_b=False, a_is_sparse=Fal ...
- python protobuf序列化repeated运用
下面是proto描述文件的定义 message Person { required string name = 1; required int32 id = 2; optional string em ...
- CentOS7 安装supervisor守护进程管理器
supervisor没有发布在标准的CentOS源在,需要安装epel源.这种方式安装的可能不是最新版本,但比较方便,安装完成之后,配置文件会自动帮你生成. 默认配置文件:/etc/superviso ...
- no_unnest,push_subq,push_pred的用法 (转)
常常有人把这三个hint搞混,主要是因为对三种重写原理不清楚.特总结如下.(实验环境为10204)1. no_unnest, unnestunnest我们称为对子查询展开,顾名思义,就是别让子查询孤单 ...
- Github提交Spark代码
记录下提交过程,易忘供查询用.内容源自田总的分享. 1)在github上fork一份最新的master代码 2)用社区代码库创建本地仓库 git clone https://github.com/ap ...
- PHP mysqli_fetch_object() 函数实例讲解
定义和用法 mysqli_fetch_object() 函数从结果集中取得当前行,并作为对象返回. 注释:该函数返回的字段名是区分大小写的. 语法 mysqli_fetch_object(result ...
- msq_table's methods
-- 查看有哪些用户 host: % 代表任意地址都可以登录 host: localhost 代表仅本地可以连接select host,user from mysql.user; -- 建库 crea ...