我无法获得一块pl/sql代码.在我的程序的顶部,我从我的oracle apex应用程序中获取了一些关于复选框的数据.因为包含复选框的报表是动态生成的,所以我必须遍历
APEX_APPLICATION.G_F01
Run Code Online (Sandbox Code Playgroud)
列出并生成一个逗号分隔的字符串,如下所示
v_list VARCHAR2(255) := (1,3,5,9,10);
Run Code Online (Sandbox Code Playgroud)
我想稍后在该列表上查询并将v_list放在IN子句上,就像这样
SELECT * FROM users
WHERE user_id IN (v_list);
Run Code Online (Sandbox Code Playgroud)
这当然会引发错误.我的问题是我可以将v_list转换为什么,以便能够将它插入到pl/sql过程中的查询中的IN子句中?
您可以使用XMLTABLE如下
SELECT * FROM users
WHERE user_id IN (SELECT to_number(column_value) FROM XMLTABLE(v_list));
Run Code Online (Sandbox Code Playgroud)
如果users很小并且user_id不包含逗号,您可以使用:
SELECT * FROM users WHERE ',' || v_list || ',' LIKE '%,'||user_id||',%'
Run Code Online (Sandbox Code Playgroud)
此查询不是最佳的,因为它无法使用索引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;
/
Run Code Online (Sandbox Code Playgroud)
然后,您就可以构建查询,例如:
SELECT *
FROM users
WHERE user_id IN (SELECT *
FROM TABLE(string_to_table_num('1,2,3,4,5'));
Run Code Online (Sandbox Code Playgroud)