您的位置:首页 > 数据库 > Oracle

oracle多个结果集拼接字符串;where id in 字符串

2013-01-31 09:53 309 查看
最近修改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更安全高效;

问题解决心情舒畅,在此总结一下。希望能给遇到同样问题的朋友点帮助。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: