oracle结果集已耗尽_oracle字符串函数

oracle结果集已耗尽_oracle字符串函数最近修改oracle触发器,在过程中遇到两个问题:selectlastnamefromhrmresourcewhereidin(waigaunyanshourens);此sql只要功能:根据id到人力资源表找相应的人名;此处waigaunyanshourens是一个存储外观验收人变量;原只是一个存储外观验收人的id变量,现在界面要求外观验收人可以多选,如(41,42,43);现在问题…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

最近修改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更安全高效;

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/192977.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • PyCharm激活码永久有效PyCharm2019.2.4激活码教程-持续更新,一步到位

    PyCharm激活码永久有效PyCharm2019.2.4激活码教程-持续更新,一步到位PyCharm激活码永久有效2019.2.4激活码教程-Windows版永久激活-持续更新,Idea激活码2019.2.4成功激活

  • PAT刷题C语言1002——写出这个数

    PAT刷题C语言1002——写出这个数思路:首先要定义一个字符数组a[0]-a[9]应该对应:ling到shi的拼音对于测试数据一次取一位并进行累加sum,遇到0可以丢弃把sum按位取出对应数组做输出(要求sum的位数,遇到最后一位时候不能输出回车)参考答案:…

  • MYSQL数据类型_c语言数据类型详解

    MYSQL数据类型_c语言数据类型详解上一篇博客中我们学习了MySQL的基础知识以及表结构的相关操作,知道了MySQL中常用的数据类型有数值型、字符串型、日期时间类型下面我们来使用一下这些数据类型。数值类型首先数值类型分为整型和浮点型我们先来看看整型整型首先创建一个表CREATETABLEint_db(aTINYINT,bSMALLINT,cMIDDLEINT,dINT,eB…

  • Java 十六进制(Hex)与byte数组之间的转换

    Java 十六进制(Hex)与byte数组之间的转换

  • leetcode-150. 逆波兰表达式求值(栈)

    leetcode-150. 逆波兰表达式求值(栈)根据 逆波兰表示法,求表达式的值。有效的算符包括 +、-、*、/ 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。说明:整数除法只保留整数部分。给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。 示例 1:输入:tokens = [“2″,”1″,”+”,”3″,”*”]输出:9解释:该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9示例 2:输入:tokens = [“4″,”13″,”5″,”/”,”+”]输

  • 好员工,别以为裁员与你无关(上

    好员工,别以为裁员与你无关(上分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!               版权声明:原创作品,允

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号