在NUM子列的IN子句中使用逗号分隔值

rav*_*avi 1 sql oracle plsql procedure

我在包中有2个程序.我正在调用一个过程来获取逗号分隔的用户ID列表.

我将结果存储在VARCHAR变量中.现在当我使用这个以逗号分隔的列表放入其中的一个IN子句时抛出" ORA-01722:INVALID NUMBER"异常.

这就是我的变量的样子

l_userIds VARCHAR2(4000) := null;
Run Code Online (Sandbox Code Playgroud)

这是我分配值的地方

l_userIds := getUserIds(deptId);  -- this returns a comma separated list
Run Code Online (Sandbox Code Playgroud)

我的第二个问题是 -

select * from users_Table where user_id in (l_userIds);
Run Code Online (Sandbox Code Playgroud)

如果我运行此查询,我会收到INVALID NUMBER错误.

有人可以在这帮忙.

Jus*_*ave 8

你真的需要返回以逗号分隔的列表吗?声明集合类型通常会好得多

CREATE TYPE num_table
    AS TABLE OF NUMBER;
Run Code Online (Sandbox Code Playgroud)

声明一个返回此集合实例的函数

CREATE OR REPLACE FUNCTION get_nums
  RETURN num_table
IS
  l_nums num_table := num_table();
BEGIN
  for i in 1 .. 10
  loop
    l_nums.extend;
    l_nums(i) := i*2;
  end loop;
END;
Run Code Online (Sandbox Code Playgroud)

然后在查询中使用该集合

SELECT *
  FROM users_table
 WHERE user_id IN (SELECT * FROM TABLE( l_nums ));
Run Code Online (Sandbox Code Playgroud)

也可以使用动态SQL(@Sebas演示).然而,它的缺点是每次调用该过程都会生成一个新的SQL语句,需要在执行之前再次对其进行解析.它还对库缓存施加压力,这可能导致Oracle清除许多其他可重用的SQL语句,这些语句可能会产生许多其他性能问题.