博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
oracle多个结果集拼接字符串;where id in 字符串 (转)
阅读量:7238 次
发布时间:2019-06-29

本文共 2288 字,大约阅读时间需要 7 分钟。

转自:http://blog.sina.com.cn/s/blog_af26e333010194ht.html

最近修改oracle触发器,在过程中遇到两个问题:

select lastname from hrmresource where id in (waigaunyanshourens);

此sql只要功能:根据id 到人力资源表找相应的人名;

此处waigaunyanshourens 是一个存储外观验收人变量;原只是一个存储外观验收人的id变量,现在界面要求外观验收人可以多选,如(41,42,43);现在问题来了:

(1.)一条sql不可能接收多个结果集;

(2.)我还的返回的是 人名集的字符串,如(人名A,人名B,人名C)

刚开始也认为挺简单的 ,运用游标处理一下就可以了。不过在多次试验后发现解决有点困难

第一种思路:

定义游标:

cursor cur_wgys is select lastname  from hrmresource where id in (waigaunyanshourens);

c_wg cur_wgys%rowtype;

使用游标:

for c_wg in cur_wgys loop

                dbms_output.put_line(c_wg.lastname);
                waiguanstr := waiguanstr ||','|| c_wg.lastname;
      end loop;
            dbms_output.put_line(ltrim(waiguanstr,','));

 

这样整体也就解决了这两个问题;在执行触发器的时候都没问题;但在触发时会对这

cursor cur_wgys is select lastname  from hrmresource where id in (waigaunyanshourens);

行,报“无效数字”的错误;

第二种思路:由于第一种思路老是不知道什么原因,也就另寻他路;

select ltrim(max(sys_connect_by_path(lastname, ',')),',') 

from (select lastname, rownum t  from hrmresource where  id in(waigaunyanshourens)           connect by prior t = t - 1  start with t = 1;

此种方法比较简洁;不要要游标;直接就可以接收多个结果集,并且将结果集自动拼接成用逗号隔开的字符串;

运用此种发放正常理解这是没问题的;可是也是这样在第二行报“无效数字”。

 

综上两种方法:给自己的感觉是这两种方法都是正确的,不过还是哪的细节没注意,导致报错;

寻找原因发现:id类型是INTEGER;而这个waigaunyanshourens(41,42,43)是一个字符串;

现在问题也找出来了,也试了各种方法,最终终于解决了,对此一番折腾,在此记录,共大家参考!!!

 

第一种解决方法:

定义游标:

cursor cur_wgys is select lastname  from hrmresource where 

INSTR(   (select  ',' ||   waigaunyanshouren  || ','   from formtable_main_112 where requestid = :new.requestid),    ',' ||  TRIM(TO_CHAR(id ))  || ','  )  > 0;

 c_wg cur_wgys%rowtype;

使用游标:

            for c_wg in cur_wgys loop

                dbms_output.put_line(c_wg.lastname);
                waiguanstr := waiguanstr ||','|| c_wg.lastname;
            end loop;

                 dbms_output.put_line(ltrim(waiguanstr,','));

输出结果:

人名A

人名B

人名C

人名A,人名B,人名C 

第二种解决方法:

  select ltrim(max(sys_connect_by_path(lastname, ',')),',') into waigaunyanshourens 

  from (select lastname, rownum t  from hrmresource where   INSTR(   (select  ',' ||  waigaunyanshouren  || ','   from formtable_main_112 where requestid = :new.requestid),   ',' ||  TRIM(TO_CHAR(id ))  || ','  )  > 0) 
connect by prior t = t - 1  start with t = 1;

 

  dbms_output.put_line(waigaunyanshourens||'==============');

 

输出结果:人名A,人名B,人名C==============

 

这样就解决了where id in (string)的问题

关键就是where后面这句话,看似挺长挺乱的,不过就是一个类似一个 like,但绝对比like更安全高效;

问题解决心情舒畅,在此总结一下。希望能给遇到同样问题的朋友点帮助。

转载于:https://www.cnblogs.com/kingxiaozi/p/4530889.html

你可能感兴趣的文章
移动端、服务器端车牌识别的区别
查看>>
ZooKeeper学习
查看>>
Ubuntu桌面系统安装配置备忘
查看>>
移动端总结
查看>>
【史上最全版】支付宝之所以牛逼的原因:来看内部架构剖析
查看>>
详解udev
查看>>
Linux From Scratch(来源于网络资料整理)
查看>>
linux vim的配置
查看>>
《网络攻防技术与实践》读书笔记:第一部分 概述02
查看>>
UIPicker实现循环联动效果
查看>>
堡垒机等线上操作
查看>>
石家庄市桥西区利民电器修理部
查看>>
Ubuntu 下Eclipse 安装SVN
查看>>
网站分析:5173首页前端性能优化实践
查看>>
社交系统ThinkSNS V4系统产品介绍
查看>>
datagrid的“idField”的作用
查看>>
微信小程序图片上传使用整理(一)
查看>>
DNS常见配置
查看>>
flask 实现 Authorization请求报头认证
查看>>
OC语言BLOCK和协议
查看>>