PL/SQL查询IN逗号分隔字符串

ora*_*_so 9 oracle plsql oracle-apex

我正在Oracle APEX中开发一个应用程序.我有一个用户ID的字符串,以逗号分隔,看起来像这样,

45,4932,20,19
Run Code Online (Sandbox Code Playgroud)

该字符串存储为

:P5_USER_ID_LIST
Run Code Online (Sandbox Code Playgroud)

我想要一个查询,它将查找此列表中的所有用户,我的查询如下所示

SELECT * FROM users u WHERE u.user_id IN (:P5_USER_ID_LIST);
Run Code Online (Sandbox Code Playgroud)

我一直收到Oracle错误:数字无效.但是,如果我将字符串硬编码到查询中就可以了.像这样:

SELECT * FROM users u WHERE u.user_id IN (45,4932,20,19);
Run Code Online (Sandbox Code Playgroud)

任何人都知道为什么这可能是一个问题?

Ton*_*ews 11

绑定变量绑定一个值,在本例中为字符串'45,4932,20,19'.您可以使用Randy建议的动态SQL和串联,但是您需要非常小心,用户无法修改此值,否则您会遇到SQL注入问题.

更安全的方法是将ID放入PL/SQL进程中的Apex集合中:

declare
    array apex_application_global.vc_arr2;
begin
    array := apex_util.string_to_table (:P5_USER_ID_LIST, ',');
    apex_collection.create_or_truncate_collection ('P5_ID_COLL');
    apex_collection.add_members ('P5_ID_COLL', array);
end;
Run Code Online (Sandbox Code Playgroud)

然后将您的查询更改为:

SELECT * FROM users u WHERE u.user_id IN 
(SELECT c001 FROM apex_collections
 WHERE collection_name = 'P5_ID_COLL')
Run Code Online (Sandbox Code Playgroud)


Ran*_*ndy -1

您需要将其作为动态 SQL 运行。

创建整个字符串,然后动态运行它。