这几天写存储过程,需要用到多参数传入,传入的参数是给一个select语句的where条件使用的。
但是写的时候遇到一个麻烦的问题,这个where条件的参数必须是number型的,而且使用的是in,也就是多个参数,比如select * from account where id in (11,23,202,41),其中的11,23,202,41即是通过存储过程的参数传入的。
这里有个问题,如果在sql中,where id in (11,23,202,41)这条语句会认为11,23,202,41是五个单独的number型,而不会将其作为一个字符串。但是如果在存储过程中作为一个整体的参数进行传入时,即会将11,23,202,41判定为'11,23,202,41',而'11,23,202,41'是一个字符串,这时候sql执行的实际上是select * from table_account where id in ('11,23,202,41'),而id是一个number型的,这时候就会报错。
原存储过程大致如下:
create or replace procedure test_prc(an_id in number)
is
begin
insert into tmp_account
select * from account where id in (an_id);
commit;
end;
如果将传入的参数an_id 改为varchar型的,如create or replace procedure test_prc(an_id in varchar),这时候虽然在传入的时候类型一致了,但是在执行select语句时——where id in (an_id),由于表table_name_1的id列是number型的, 传入的实际上是'11,23,202,41',这时候,也会报错。
使用instr函数可以解决:
create or replace procedure test_prc(an_id in varchar)
is
begin
insert into tmp_account
select * from account where instr(',' || an_id || ',' , ',' || id || ',') > 0;
commit;
end;
INSTR函数是个字符串搜索函数,默认情况下有两个参数:instr(string,set),用于在string中寻找set的位置,如果找到,返回set子串的第一个字符的位置,如果没有找到,则返回0。
之所以在开始和结束都加上',',是为去掉当查询11,23,202,41的时候,会取出1,11,2,3,23等。至此,问题解决。
分享到:
相关推荐
oracle存储过程中入参是逗号分隔,并且参数要使用在in过滤语句中查询数据。处理的方法与实现
oracle 关于字符串中带有逗号间隔的查询 例如 我想查出dwdh中有“飞信”的内容(不包括移动飞信,飞信移动) 关于字符串中带有逗号间隔的查询 利用like
这里利用了函数 regexp_substr和connect by 及oracle的正则相关函数实现oracle分割字符串方法
Oracle拆分字符串,字符串分割的函数,将返回一个表格,如果有需要的可以下载去看看。
oracle在存储过程中执行字符串中存有的sql语句
例如:字段为1,2,3,4,5 截取之后为 1 2 3 4 5
Oracle 分割字符串 返回多行数据
CLOB变量需要dbms_lob.createtemporary,临时表空间中,建立临时LOB。 大数据量,返回值虽然是CLOB,依然会报错; CLOB变量需要dbms_lob.createtemporary,临时表空间中,建立临时LOB。 大数据量,返回值虽然是CLOB...
oracle 某列存儲的值是有逗號的字符串,希望通過逗號分隔開來顯示多行。sql,有預期結果,有項目實戰。
oracle中操作字符串(带有,的字符串,从中取出“:”前面或后面的值)
Oracle_Sql_中常用字符串处理函数
传入一个字符串和该字符串的分割字符,返回去重后的字符串,可以直接在plsql中运行,简单的函数运用,能处理oracle中。资源仅供参考
oracle存储过程,传入一个字符串,将传入的字符调用webservice给服务器.oracle存储过程调用webservice
数据库给定字符串,对相应的字符串进行分割。比如 ',a,b,c,d,e,'则分割出来的结果为a b c d e。
string :需要进行正则处理的字符串 pattern :进行匹配的正则表达式 position :起始位置,从第几个字符开始正则表达式匹配(默认为1) occurrence :标识第几个匹配组,默认为1 modifier :模式(‘i’不区分大...
Oracle数据库的两个字段值为逗号分割的字符串,例如:字段A值为“1,2,3,5”,字段B为“2”。 想获取两个字段的交集(相同值)2,获取两个字段的差集(差异值)1,3,5。 一、最终实现的sql语句 1、获取交集(相同值)...
oracle 自定义函数 解析文件以“|”分割字符串
C#连接Oracle数据库字符串 C#连接Oracle数据库字符串
select f_find('Ap@2233ll@@l@@','@') from dual 返回结果为5,代表‘@’在该字符串中出现5次。 同理 select f_find('Ap@223SWEQQQ3ll@@l@@','Q') from dual---返回3,代表Q在字符串中出现了3次, select f_find('我...
oracle,按特定字符,截取字符串,直接出结果 oracle,按特定字符,截取字符串,直接出结果oracle,按特定字符,截取字符串,直接出结果