吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 723|回复: 13
收起左侧

[讨论] oracle数据库循环更新问题请教!

[复制链接]
yk156511 发表于 2023-1-6 12:14
网络自学几天,求指点,求大佬嘴下留情轻喷。谢谢!
declare
v_bdcdyh varchar2(200);
h        number;
  dj       int;
    i        int := 1;
     v_s      varchar(1000);
      v_slid   varchar2(200);
     v_slid1   varchar2(200);
   v_fwid   varchar2(200);
  v_bdcqzh varchar2(200);
  cursor cur_qlrlb is select * from bdc_qlrlb where bz = 0 and dyid is null;
begin
  for qlrlb in cur_qlrlb
    loop
    select count(*) into h from bdc_regn_zb where slid = qlrlb.slid ;
    select count(*) into dj from bdc_qlrlb where bz = 0 and slid = qlrlb.slid;
    if h=1 then
   select djkid,slid,bdcqzh,bdcdyh into v_fwid,v_slid1,v_bdcqzh,v_bdcdyh from bdc_regn_zb where slid = qlrlb.slid ;
end if;
    if  h=dj  then
      v_S := 'update bdc_qlrlb set dyid=' || '''' || v_fwid || ''' ,bdcqzh=' || '''' || v_bdcqzh || ''',bdcdyh=' || '''' || v_bdcdyh || ''' where slid=' || '''' || trim(v_slid1) || ''' and  dyid is null and bz=''0''';   
end if ;
i:=i+sql%rowcount;
  end loop;
       dbms_output.put_line(i);
    execute  immediate  v_s;
end;
问题1: 请问下为什么每次执行都只更新一条。 打印出来的循环次数是有一万多条。(每执行提交一次,只能更新一条记录)。
问题2:  dbms_output.put_line(v_s);放在循环里面,执行语句有时候打印出来的全是一样的内容(多条语句,一个变量),变量相同;有时候又是正常的,变量是不同的(多条语句,不同变量)!
image.png
哪位大佬帮忙指点一下,我写的肯定有问题,不知道问题出在哪!     if  h=dj   then 这个判断去掉了也是只能更新一条!

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

ly765893958 发表于 2023-1-6 13:54
cursor cur_qlrlb is select * from bdc_qlrlb where bz = 0 and dyid is null;
begin
  for qlrlb in cur_qlrlb loop

总感觉你这里写的很奇怪,平时没这么写过,这里为啥要用游标呢,直接定义变量接收那段sql的count不就行了嘛
ly765893958 发表于 2023-1-6 13:57
end loop;
       dbms_output.put_line(i);
    execute  immediate  v_s;
这里你是不是应该把后两句写到end loop上面啊,循环都结束了,当然只能更新一条数据了,而且我没猜错的话,是循环的最后一条
 楼主| yk156511 发表于 2023-1-6 16:01
ly765893958 发表于 2023-1-6 13:57
end loop;
       dbms_output.put_line(i);
    execute  immediate  v_s;

image.png
第一种:放循环里面也是一样的。 一次更新一条。
image.png
第二种:这么写直接失败。
image.png
第三种:提交放到if里面,不报错,提交仍然只更新一条。
注:跟dbms打印的位置没有关系,我删了打印执行也是一样的结果。
 楼主| yk156511 发表于 2023-1-6 16:04
ly765893958 发表于 2023-1-6 13:54
cursor cur_qlrlb is select * from bdc_qlrlb where bz = 0 and dyid is null;
begin
  for qlrlb in c ...

可能是我的水平问题吧。主要是为了获取里面的slid。 接不接收总量其实无所谓。现在就是update的量我搞不懂,他只能更新一条
ly765893958 发表于 2023-1-6 16:07
yk156511 发表于 2023-1-6 16:04
可能是我的水平问题吧。主要是为了获取里面的slid。 接不接收总量其实无所谓。现在就是update的量我搞不 ...

很大可能就是循环有问题
ly765893958 发表于 2023-1-6 16:11
yk156511 发表于 2023-1-6 16:01
第一种:放循环里面也是一样的。 一次更新一条。

第二种:这么写直接失败。

可以这么理解  会不会是你整个循环里面,符合h=dj的情况就只有一次呢,所以就只会有一条update语句,也就只更新一次
ly765893958 发表于 2023-1-6 16:12
yk156511 发表于 2023-1-6 16:01
第一种:放循环里面也是一样的。 一次更新一条。

第二种:这么写直接失败。

第三种的写法没问题  检查h=dj,看看有多少次符合条件
 楼主| yk156511 发表于 2023-1-6 16:14
ly765893958 发表于 2023-1-6 16:11
可以这么理解  会不会是你整个循环里面,符合h=dj的情况就只有一次呢,所以就只会有一条update语句,也就 ...

不会。我尝试了的 去掉h=dj的条件。 也是一样的,只能循环一次。
 楼主| yk156511 发表于 2023-1-6 16:17
ly765893958 发表于 2023-1-6 16:12
第三种的写法没问题  检查h=dj,看看有多少次符合条件

我没提交一次 再去查select count(*) from bdc_qlrlb where bz = 0 and dyid is null;的量 都会少一条。

说明h=dj的不是一条数据。 不然不会每次提交都能少一条数据吧
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止回复与主题无关非技术内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-5-11 00:08

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表