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

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

oracle多个结果集拼接字符串;where id in 字符串 (转)的更多相关文章

  1. 使用Dapper读取Oracle多个结果集

    Dapper对SQL Server支持很好,但对于Oracle有些用法不一样,需要自己进行特殊处理. 1.首先要自定义一个Oracle参数类 public class OracleDynamicPar ...

  2. Oracle Database常用补丁集Patch号及各版本PSU

    Oracle Database常用补丁集Patch号及各版本PSU------------------------------------------------------------------- ...

  3. oracle中一个字符串包含另一个字符串中的所有字符

    oracle中一个字符串包含另一个字符串中的所有字符 --解决监理报告中所勾选的标段信息,与该用户所管理的标段字符串不匹配的问题. select * from a where instr(a,b)&g ...

  4. oracle返回多结果集

    kavy 原文 oracle返回多结果集 Oracle存储过程: create or replace procedure P_Sel_TopCount2(in_top in number, out_c ...

  5. oracle 存储过程返回结果集 (转载)

    好久没上来了, 难道今天工作时间稍有空闲, 研究了一下oracle存储过程返回结果集. 配合oracle临时表, 使用存储过程来返回结果集的数据读取方式可以解决海量数据表与其他表的连接问题. 在存储过 ...

  6. 安装ORACLE高可用RAC集群11g执行root脚本的输出信息

    安装ORACLE高可用RAC集群11g执行root脚本的输出信息 作者:Eric 微信:loveoracle11g [root@node1 ~]# /u01/app/oraInventory/orai ...

  7. 安装ORACLE高可用RAC集群11g校验集群安装的可行性输出信息

    安装ORACLE高可用RAC集群11g校验集群安装的可行性输出信息 作者:Eric 微信:loveoracle11g [grid@node1 grid]$ ./runcluvfy.sh stage - ...

  8. Oracle查询client编码集

    Oracle查询client编码集 SQL> select userenv('language') from dual; USERENV('LANGUAGE') ---------------- ...

  9. PHP採集利器:依据開始字符串和结束字符串截取须要的採集内容数据

    PHP採集利器:依据開始字符串和结束字符串截取须要的採集内容数据 function strCutByStr(&$str, $findStart, $findEnd = false, $enco ...

随机推荐

  1. 超级wifi

    超级wifi (super wi-fi)是相对于现有的wifi提出的改进版,执行响应的 802.11af标准. 802.11af 标准是2014年2月提出的,它的主要特点是"建议在电视频率之 ...

  2. CentOS 6.5 rsync+inotify实现数据实时同步备份

    CentOS 6.5 rsync+inotify实现数据实时同步备份 rsync    remote sync 远程同步,同步是把数据从缓冲区同步到磁盘上去的.数据在内存缓存区完成之后还没有写入到磁盘 ...

  3. spring和hibernate集成事物管理配置方法

    spring+hibernate,采用声明式事务 1.声明式事务配置 * 配置SessionFactory * 配置事务管理器 * 事务的传播特性 * 那些类那些方法使用事务 2.编写业务逻辑方法 * ...

  4. 关于报错stale element reference: element is not attached to the page document处理

    1.现象 在执行脚本时,有时候引用一些元素对象会抛出如下异常 org.openqa.selenium.StaleElementReferenceException: stale element ref ...

  5. ubuntu 语言设置

    1.ubuntu ibus 输入法无法切换拼音 原因未安装中文输入法 sudo apt install ibus-pinyin //安装pinyinwin + space(空格) 切换中文输入法 再用 ...

  6. html----常见的标签

    HTML标签: <strike>为文字加上一条中线</strike> <em>: 文字变成斜体.</em> 2<sup>2</sup& ...

  7. js获取当前有效样式

      js获取有效样式   节点.currentStyle["属性名"]        兼容ie方法(只有ie有效) getcomputedStyle(节点)["属性名&q ...

  8. Grafana 监控系统是否重启

    一.概述 Linux 内核(以下简称内核)是一个不与特定进程相关的功能集合,内核的代码很难轻易的在调试器中执行和跟踪.开发者认为,内核如果发生了错误,就不应该继续运 行.因此内核发生错误时,它的行为通 ...

  9. PTA之多项式求值

    时间限制: 400ms 内存限制: 64MB 代码长度限制: 16KB 函数接口定义: double f( int n, double a[], double x ); 其中n是多项式的阶数,a[]中 ...

  10. mysql 快速拷贝表