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更安全高效;
问题解决心情舒畅,在此总结一下。希望能给遇到同样问题的朋友点帮助。
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更安全高效;
问题解决心情舒畅,在此总结一下。希望能给遇到同样问题的朋友点帮助。
相关文章推荐
- oracle多个结果集拼接字符串;where id in 字符串 (转)
- 解决Oracle in 超过1000个问题 C#拼接字符串
- oracle 数据库 结果集字符串拼接的简单解决方式
- Mysql where in中的参数传入字符串(字符串拼接)
- mysql select *... where id in (select 字符串 from ... )查询结果问题?
- Ora-03113\Ora-03114与Oracle In 拼接字符串的问题
- MySQL 存储过程或者函数中传参数实现where id in(1,2,3,...)IN条件拼接
- How To Access Forms Directly In Oracle Applications R12 [ID 552301.1]
- [转]Oracle字符串拼接的方法
- oracle 字符串切割成结果集方法
- oracle处理传入的是字符串的数字,通过传入的字符串数字执行IN操作
- SqlServer和Oracle从多行记录(数据集)中查询结果并拼接成一个字符串的SQL语句(纵表数据转成拼接的文本)
- C# 拼接sql where in 语句
- Placement of Voting disk and OCR Files in Oracle RAC 10g and 11gR1 [ID 293819.1]
- oracle操作字符串:拼接、替换、截取、查找
- 在存储过程中如何实现将id列表字符串传入in()
- where id in用 order by field 保持排序
- How does ASM work with RAID where striping and mirroring are already built-in [ID 330398.1]
- What does a (+) sign mean in an Oracle SQL WHERE clause?
- oracle操作字符串:拼接、替换、截取、查找(修改版)