Oracle数据更新

深蓝冰心 2017-03-07 02:54:06
有a,b两张表,a表有字段tdzh,wjlj,id,b表有tdzh,wjlj,jsydid
现在要把a表的id更新到b表的jsydid上,判断条件是两张表的wjlj和tdzh,但是b表的wjlj需要截取一部分才能与a表的wjlj相等,
那现在语句怎样写比较好?以下是我写的语句,但是效率太低了
 DECLARE
CURSOR csr_data IS
SELECT *
FROM gltpid;
BEGIN
FOR a IN csr_data
LOOP
UPDATE dzdagxb b
SET
b.jsydid = a.id
WHERE b.wjlj = substr(b.wjlj,instr(b.wjlj,'/',1,1),instr(b.wjlj,'/',1,5)+instr(b.wjlj,'/',1,1)-2)
and
a.dah = b.tdzh ;
END LOOP;
END;


...全文
225 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
sxq129601 2017-03-08
  • 打赏
  • 举报
回复
效率低是因为你的语句没用到索引,数据量大也可以分批提交
POM_24 2017-03-08
  • 打赏
  • 举报
回复
我服自己了,上面的依然有问题,没有环境调试,见谅!
update b
   set b.jsydid =
       (select a.id
          from a
         where a.tdzh = b.tdzh
           and instr(b.wjlj, a.wjlj) = 1) 
 where exists (select 1
          from a
         where a.tdzh = b.tdzh
           and instr(b.wjlj, a.wjlj) = 1);
POM_24 2017-03-08
  • 打赏
  • 举报
回复
上面的代码有错误,使用这个
update b
   set b.jsydid =
       (select a.id
          from a
         where a.tdzh = b.tdzh
           and instr(b.wjlj, a.wjlj)=1   --替换掉了 a.wjlj = substr(b.wjlj,instr(b.wjlj,'/',1,1),instr(b.wjlj,'/',1,5)+instr(b.wjlj,'/',1,1)-2)
and 
       )
 where exists (select 1
          from a
         where a.tdzh = b.tdzh
           and instr(b.wjlj, a.wjlj)=1
               );
POM_24 2017-03-08
  • 打赏
  • 举报
回复
--为啥要用游标呢?
--思路是 使用update  join 替换掉游标
update b
   set b.jsydid =
       (select a.id
          from a
         where a.tdzh = b.tdzh
           and instr(b.wjlj, a.wjlj)   --替换掉了 a.wjlj = substr(b.wjlj,instr(b.wjlj,'/',1,1),instr(b.wjlj,'/',1,5)+instr(b.wjlj,'/',1,1)-2)
and 
       )
 where exists (select 1
          from a
         where a.tdzh = b.tdzh
           and instr(b.wjlj, a.wjlj)
               );
深蓝冰心 2017-03-08
  • 打赏
  • 举报
回复
引用 3 楼 u012557814 的回复:
1. 考虑下Merge into. 2. b.wjlj = substr(b.wjlj,instr(b.wjlj,'/',1,1),instr(b.wjlj,'/',1,5)+instr(b.wjlj,'/',1,1)-2) 怎么都是b的字段,考虑下如何优化这个函数吧。看看用正则表达式能不能使其简便点 3.数据多试试bulk collect. 或者按条数commit.
在end loop 后面加commit吗?
落落叶叶无声 2017-03-07
  • 打赏
  • 举报
回复
1. 考虑下Merge into. 2. b.wjlj = substr(b.wjlj,instr(b.wjlj,'/',1,1),instr(b.wjlj,'/',1,5)+instr(b.wjlj,'/',1,1)-2) 怎么都是b的字段,考虑下如何优化这个函数吧。看看用正则表达式能不能使其简便点 3.数据多试试bulk collect. 或者按条数commit.
深蓝冰心 2017-03-07
  • 打赏
  • 举报
回复
补充一下a表一条数据对应b表多条数据,所以a表的一个id会给b表多条数据都替换jsydid
js14982 2017-03-07
  • 打赏
  • 举报
回复
多commit吧

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧