• oracle多个结果集拼接字符串;where id in 字符串 (转)


    转自: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更安全高效;

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

  • 相关阅读:
    使用MySQL实现分布式锁
    文件分享
    redis geo 做距离计算排序分页
    在不修改iframe文件的情况下如何设置iframe里面的css样式
    tp 队列分享
    guzzlehttp/guzzle发送请求说明
    简说Vue中的插槽
    leetcode398 随机数索引蓄水池算法
    flex强化学习
    《汉杏》书28th0424:《优雅丛书》
  • 原文地址:https://www.cnblogs.com/kingxiaozi/p/4530889.html
Copyright © 2020-2023  润新知