转自: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. pl sql 存储过程 执行sql 锁死状态

    背景 这是在一个不知如何表达的项目中,我在这个项目中做的就是不知如何表达的事情.只是想着技术,到是通过这个项目把存储过程基本能用的都用了,oracle开发的技术我感觉基本都全活了.别人没搞定的我搞定了 ...

  2. Project Euler Problem9

    Special Pythagorean triplet Problem 9 A Pythagorean triplet is a set of three natural numbers, a  b  ...

  3. windows系统实现mysql数据库数据库主从复制

    环境: master mysql服务器 192.168.8.201 slave mysql服务器 192.168.8.89 目标: 实现主从复制 1.将MySQL5.5安装文件分别拷贝到两台机器的c盘 ...

  4. C#控制台中创建数据库连接

    与数据库的连接主要有以下三种类: sqlconnection:数据库连接类: sqlcommand:数据库操作: sqldatareader:数据库读取: SqlDataReader dr = cmd ...

  5. Java基础99 待续

    1.待续 原创作者:DSHORE 作者主页:http://www.cnblogs.com/dshore123/ 原文出自:https://www.cnblogs.com/dshore123/p/107 ...

  6. activiti 基础

    一:activiti 入门 作者:fenng 商丘 工作流(Workflow) 就是业务过程的部分或整体在计算机应用环境下的自动化主要解决的是"使在多个参与者之间按照某种定义的规则传递文档, ...

  7. PHP将数据写入指定文件中

    首先创建一个空的txt文件,这里我们创建了一个1.txt的空文件. 第一种方法:fwrite函数 <?php $file=fopen('1.txt','rb+'); var_dump(fwrit ...

  8. cf776c

    这题用尺取法是怼不出来的... 一开始看到区间和等于k的幂,并且有负数,首先想到将前缀和排序后用尺取法,但因为排序后的前缀和次序是乱的,只适用带绝对值的情况(poj2566),所以无法做. 看了题解后 ...

  9. pytest八:skip 跳过用例

    这是一个快速指南,介绍如何在不同情况下跳过模块中的测试1.无条件地跳过模块中的所有测试:pytestmark = pytest.mark.skip("all tests still WIP& ...

  10. 优化MVC,实现数据库表的记录的添加、删除、修改、查询。

    一.在UserDAO里面重写实体user要调用的方法: 1.查询所有user表中的记录.用getAllUser()方法得到List public class UserDAO { public List ...