本文主要是介绍Oracle存储过程中的IN子句传参字符串的问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
在实际使用中,经常会有带in的子查询,如where id in (1,2,3),或者where name in ('a','b','c')这样的情况,但是到存储过程中,如果使用变量当作查询条件会有问题。
示例:
CREATE OR REPLACE
PROCEDURE test (vi_types in VARCHAR2)
AS vs_str VARCHAR2(100);
BEGIN-- vi_types当作条件查询SELECT name into vs_str FROM log_tableWHERE type IN (vi_types);dbms_output.put_line(vs_str);
end;
调用:
call test('a,b,c');
期待结果打印出类型为,a或者b或者c的,但是没有,查找原因以为是没加单引号造成,改成:
call test('''a'',''b'',''c''');
还是不行,原因是直接传的字符串当作一个整体去查询了,也就是type为'a,b,c',才能查出来,我们要的不是这个效果,修改后的
CREATE OR REPLACE
PROCEDURE test (vi_types in VARCHAR2)
AS vs_str VARCHAR2(100);
BEGIN-- vi_types当作条件查询SELECT name into vs_str FROM log_tableWHERE type IN (SELECT REGEXP_SUBSTR(vi_types, '[^,]+', 1, rownum)FROM dualCONNECT BY rownum <= LENGTH(vi_types) - LENGTH(regexp_replace(vi_types, ',', '')) + 1 );dbms_output.put_line(vs_str);
end;
调用:
call test('a,b,c');
说明:
SELECT REGEXP_SUBSTR('a,b,c', '[^,]+', 1, rownum)
FROM dual
CONNECT BY
rownum <= LENGTH('a,b,c') - LENGTH(regexp_replace('a,b,c', ',', '')) + 1
查出的结果是:
参考:https://blog.csdn.net/qq_44952766/article/details/89448046
这篇关于Oracle存储过程中的IN子句传参字符串的问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!