3

我无法让一块 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 子句中?

4

4 回答 4

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'));
于 2012-10-09T13:03:44.697 回答
4

您可以使用XMLTABLE如下

SELECT * FROM users 
WHERE user_id IN (SELECT to_number(column_value) FROM XMLTABLE(v_list));
于 2014-12-31T12:04:38.617 回答
0

我也试图为此找到解决方案,但从未成功。您可以将查询构建为字符串,然后立即运行 EXECUTE,请参阅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)
于 2012-10-09T13:03:25.947 回答
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 '/'
                )

这可以在线程中的其他示例中找到:Split Comma Delimited String Oracle

如果您想沉浸在更多选项中,请访问 OTN plsql 论坛。

于 2012-10-09T13:37:18.173 回答