当前位置:首页 > 开发 > 数据库 > 正文

oracle之存储过程中传入以逗号分割字符串,解决多参数问题

发表于: 2014-10-22   作者:迷雾雪兰   来源:转载   浏览:
摘要: 这几天写存储过程,需要用到多参数传入,传入的参数是给一个select语句的where条件使用的。 但是写的时候遇到一个麻烦的问题,这个where条件的参数必须是number型的,而且使用的是in,也就是多个参数,比如select * from account where id in (11,23,202,41),其中的11,23,202,41即是通过存储过程的参数传入的。 这里有个问题,如果在
这几天写存储过程,需要用到多参数传入,传入的参数是给一个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之存储过程中传入以逗号分割字符串,解决多参数问题

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
/* * 传入一个字符串 将它分割成大写字符为首的字符串数组 */ private ArrayList<String> spl
oracle部分: 定义类型(用于字符串分割): create or replace TYPE "STR_SPLIT" IS TABLE OF VARC
最近做PHP的webService服务器,发现用Get方法获取参数时获取到的参数时乱码。一番折腾后发现时浏览
我们知道,用户拥有的role权限在存储过程是不可用的。如: SQL> select * from dba_role_privs w
1、定义一个程序包 create or replace package pag_q is type cur_result is ref cursor; end pag_q
2013-02-23 不折腾不舒服(>_<)。在虚拟机上运行Ubuntu程序一多就明显卡顿,感觉效率不高。为
LoadRunner11安装过程中遇到的问题及解决 一、安装LoadRunner时出现“计算机缺少vc2005_sp1_with_at
执行接收参数: 首先引入一个sys 模块 import sys sys 跟python解释器相关的所有功能都有关 跟python
摘要:近来之前的项目数据出现了问题,原因是由于之前在设计数据库的时候把时间字段设置成了字符串
摘要:近来之前的项目数据出现了问题,原因是由于之前在设计数据库的时候把时间字段设置成了字符串
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号