使用SQL游标进行循环插入数据

使用SQL游标进行循环插入数据

--给新建页面添加权限控制
declare @RoleID varchar(50)    
declare @Oprator varchar(50)
DECLARE AutoInsertRow CURSOR FOR 
SELECT distinct RoleID, Operator FROM e
OPEN AutoInsertRow;
FETCH NEXT FROM  AutoInsertRow into @RoleID,@Oprator;
WHILE @@FETCH_STATUS = 0
BEGIN
    insert into tableT(RoleID,IID,Mode,Status,Operator) select top 3 @RoleID, IID, 2, '01',@Oprator from eInterfaces order by CreateDate desc
    FETCH NEXT FROM  AutoInsertRow into @RoleID,@Oprator;
END
CLOSE AutoInsertRow
DEALLOCATE AutoInsertRow
发布了42 篇原创文章 · 获赞 15 · 访问量 12万+
展开阅读全文

ORACLE 存储过程 关于游标循环从一个表COPY到另一个表插入问题

11-07

``` create or replace procedure insertspzl as is_tb number(2):=1;-- 1 已经同步 2 未同步 3 修改状态 spbh VARCHAR2(255); sccj VARCHAR2(255); sccjpd VARCHAR2(255); --判断生产厂家是否存在 变量 jxname VARCHAR2(255); jxnamepd VARCHAR2(255); spfl VARCHAR2(255); jyfw VARCHAR2(255); cursor cur is select trim(商品编号) spbh,trim(生产厂商) sccj,trim(剂型) jx,trim(商品类型) spfl,trim(商品类型) jyfw from 商品资料@TEST; begin -- 增加资料处理字段 -- alter table zl_spzlb add (bzdw VARCHAR2(255)); -- alter table zl_spzlb add (sccj VARCHAR2(255)); -- alter table zl_spzlb add (jx VARCHAR2(255)); -- alter table zl_spzlb add (spfl VARCHAR2(255)); -- For 循环逐条插入记录 for temp in cur loop spbh :=temp.spbh; sccj :=temp.sccj; jxname :=temp.jx; spfl :=temp.spfl; jyfw :=temp.jyfw; select trim(是否同步) into is_tb from 商品资料@TEST where trim(商品编号)=spbh ; Dbms_Output.put_line('--打印is_tb--'||is_tb||'--编号--'||spbh); -- If 判断单条条件处理 if is_tb =1 then Dbms_Output.put_line('--发现未同步商品--'||spbh); Dbms_Output.put_line('--厂家--'||sccj); Dbms_Output.put_line('开始插入数据'); --插入商品资料 insert into zl_spzlb (resid,bh,spbh,name,sptym,slv,pzwh,spcd,cctj,is_zdyh,is_ty,bzdw,spgg,sccj,jx,spfl) select seq_acl_res_resid.nextval,trim(商品编号),trim(商品编号),trim(商品名称),trim(通用名), trim(税率),trim(批准文号),trim(产地), decode(trim(储存条件),'密封,置阴凉处','阴凉、暗凉(密闭,遮光)','密封','阴凉、暗凉(密闭,遮光)', '密封,置阴凉处(不超过20°)','阴凉、暗凉(密闭,遮光)','遮光','阴凉、暗凉(密闭,遮光)','阴凉', '阴凉、暗凉(密闭,遮光)','常温','常温(干燥0℃-30℃)','冷藏','冷藏(2℃-10℃)','其他'), decode(trim(养护措施),'普通养护',2,'重点养护',1),decode(trim(是否停用),'否',2,'是',1),trim(单位), trim(规格),trim(生产厂商),trim(剂型), trim(商品类型) from 商品资料@TEST where trim(商品编号)=spbh; --插入包装资料 Dbms_Output.put_line('--商品--'||spbh); insert into zl_bzggzlb(bzid,spid,jlgg,is_hd,name) select seq_zl_bzggzlb_bzid.nextval,a.resid,1,1,a.bzdw from zl_spzlb a where a.spbh=spbh; --更新 update zl_spzlb a set (a.lsbzid,a.pfbzid)=(Select b.bzid,b.bzid From zl_bzggzlb b Where a.resid=b.spid and a.spbh=spbh) where a.spbh =spbh; end loop; commit; --for 循坏结束 end insertspzl; ``` 游标循环不允许再 遍历游标的时候 有insert的操作,并且执行了commit 但是如果commit 放在循化外面 会在获取 商品资料@TEST 第二行记录插入时候 --插入包装资料 在这一块把第一次生产的数据带出来重复插入 导致 --更新 这一块没办法进行 返回多行 如何去隔离上一次循环 不影响下一次并且最后提交都提交 求大大们指教 问答

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览