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错误.
有人可以在这帮忙.
你真的需要返回以逗号分隔的列表吗?声明集合类型通常会好得多
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语句,这些语句可能会产生许多其他性能问题.
| 归档时间: |
|
| 查看次数: |
2969 次 |
| 最近记录: |