我无法获得一块pl / sql代码。在我的程序的顶部,我从我的oracle apex应用程序中获取了一些关于复选框的数据。因为包含复选框的报表是动态生成的,所以我必须遍历
APEX_APPLICATION.G_F01
列出并生成一个逗号分隔的字符串,如下所示
v_list VARCHAR2(255) := (1,3,5,9,10);
我想稍后在该列表上查询并将v_list放在IN子句上,如此
SELECT * FROM users
WHERE user_id IN (v_list);
这当然会引发错误。我的问题是我可以将v_list转换为什么,以便能够将它插入到pl / sql过程中的查询中的IN子句中?
答案 0 :(得分:5)
如果users
很小且user_id
不包含逗号,您可以使用:
SELECT * FROM users WHERE ',' || v_list || ',' LIKE '%,'||user_id||',%'
此查询不是最佳查询,因为它无法使用user_id
上的索引。
我建议你使用一个流水线函数,它返回一个你可以直接查询的NUMBER
表。例如:
CREATE TYPE tab_number IS TABLE OF NUMBER;
/
CREATE OR REPLACE FUNCTION string_to_table_num(p VARCHAR2)
RETURN tab_number
PIPELINED IS
BEGIN
FOR cc IN (SELECT rtrim(regexp_substr(str, '[^,]*,', 1, level), ',') res
FROM (SELECT p || ',' str FROM dual)
CONNECT BY level <= length(str)
- length(replace(str, ',', ''))) LOOP
PIPE ROW(cc.res);
END LOOP;
END;
/
然后,您就可以构建如下的查询:
SELECT *
FROM users
WHERE user_id IN (SELECT *
FROM TABLE(string_to_table_num('1,2,3,4,5'));
答案 1 :(得分:4)
您可以按如下方式使用XMLTABLE
SELECT * FROM users
WHERE user_id IN (SELECT to_number(column_value) FROM XMLTABLE(v_list));
答案 2 :(得分:0)
我也试图找到解决方案,但从未成功过。您可以将查询构建为字符串,然后运行EXECUTE IMMEDIATE,请参阅http://docs.oracle.com/cd/B19306_01/appdev.102/b14261/dynamic.htm#i14500。
那就是说,我刚刚想到IN子句的参数可以是一个子选择:
SELECT * FROM users
WHERE user_id IN (SELECT something FROM somewhere)
那么,是否可以将复选框值公开为存储函数?然后你可能会做类似
的事情SELECT * FROM users
WHERE user_id IN (SELECT my_package.checkbox_func FROM dual)
答案 3 :(得分:0)
就个人而言,我喜欢这种方法:
with t as (select 'a,b,c,d,e' str from dual)
--
select val
from t, xmltable('/root/e/text()'
passing xmltype('<root><e>' || replace(t.str,',','</e><e>')|| '</e></root>')
columns val varchar2(10) path '/'
)
可以在Thread: Split Comma Delimited String Oracle
中的其他示例中找到如果您想要更多选项,请访问OTN plsql论坛。