PLSQL - IN 子句使用具有多个值的变量
PLSQL - IN clause using variable with multiple values
我正在循环语句并提取 ID 并将其放入变量中:
declare
l_id NUMBER;
BEGIN
FOR i IN 1..l_row_count
loop
l_id := to_number(apex_json.get_varchar2(p_path => 'rows[%d].id',
p0 => i, p_values => l_values
)
);
end loop:
我正在尝试获取所有 ID,然后 运行 一个 select 语句,其中将在 where 语句中使用此 ID 列表。所以完整的代码看起来像这样:
declare
l_id NUMBER;
l_id_list [SOME_TYPE_NOT_SURE];
BEGIN
FOR i IN 1..l_row_count
loop
l_id := to_number(apex_json.get_varchar2(p_path => 'rows[%d].id',
p0 => i, p_values => l_values
)
);
//somehow add l_id to the l_id_list
end loop:
SELECT * FROM mytable WHERE someid IN (l_id_list);
END;
我无法让它工作。我不是 PLSQL 专家,但我尝试使用数组或尝试将 l_id_list 连接为字符串,但我无法让它工作。基本上我想做的就是创建一个包含所有 ID 的列表,然后 运行 一个 select 语句来查看这些 ID 是否存在于另一个 table.
中
在您的情况下,l_id_list
的类型必须全局声明为 collection-type。本地定义的类型不能用作集合,因此不能在 in
-clause.
中使用
declare
l_id NUMBER;
l_id_list [SOME_GLOBAL_COLLECTION_TYPE];
BEGIN
FOR i IN 1..l_row_count
loop
l_id := to_number(apex_json.get_varchar2(p_path => 'rows[%d].id',
p0 => i, p_values => l_values
)
);
//somehow add l_id to the l_id_list
end loop:
SELECT * FROM mytable WHERE someid IN (select * from table(l_id_list));
END;
全局声明类型:
CREATE TYPE number_list IS TABLE OF NUMBER;
然后您可以初始化列表,然后在循环的每次迭代中,EXTEND
列表并分配值,最后使用 MEMBER OF
运算符或 IN
使用子查询和 table 集合表达式:
DECLARE
l_id_list NUMBER_LIST := NUMBER_LIST();
BEGIN
FOR i IN 1..l_row_count
LOOP
l_id_list.EXTEND;
l_id_list(l_id_list.COUNT) := to_number(
apex_json.get_varchar2(
p_path => 'rows[%d].id',
p0 => i,
p_values => l_values
)
);
END LOOP;
SELECT *
-- BULK COLLECT INTO ...
FROM mytable
WHERE someid MEMBER OF l_id_list;
-- or
SELECT *
-- BULK COLLECT INTO ...
FROM mytable
WHERE someid IN (SELECT COLUMN_VALUE FROM TABLE(l_id_list));
END;
我正在循环语句并提取 ID 并将其放入变量中:
declare
l_id NUMBER;
BEGIN
FOR i IN 1..l_row_count
loop
l_id := to_number(apex_json.get_varchar2(p_path => 'rows[%d].id',
p0 => i, p_values => l_values
)
);
end loop:
我正在尝试获取所有 ID,然后 运行 一个 select 语句,其中将在 where 语句中使用此 ID 列表。所以完整的代码看起来像这样:
declare
l_id NUMBER;
l_id_list [SOME_TYPE_NOT_SURE];
BEGIN
FOR i IN 1..l_row_count
loop
l_id := to_number(apex_json.get_varchar2(p_path => 'rows[%d].id',
p0 => i, p_values => l_values
)
);
//somehow add l_id to the l_id_list
end loop:
SELECT * FROM mytable WHERE someid IN (l_id_list);
END;
我无法让它工作。我不是 PLSQL 专家,但我尝试使用数组或尝试将 l_id_list 连接为字符串,但我无法让它工作。基本上我想做的就是创建一个包含所有 ID 的列表,然后 运行 一个 select 语句来查看这些 ID 是否存在于另一个 table.
中在您的情况下,l_id_list
的类型必须全局声明为 collection-type。本地定义的类型不能用作集合,因此不能在 in
-clause.
declare
l_id NUMBER;
l_id_list [SOME_GLOBAL_COLLECTION_TYPE];
BEGIN
FOR i IN 1..l_row_count
loop
l_id := to_number(apex_json.get_varchar2(p_path => 'rows[%d].id',
p0 => i, p_values => l_values
)
);
//somehow add l_id to the l_id_list
end loop:
SELECT * FROM mytable WHERE someid IN (select * from table(l_id_list));
END;
全局声明类型:
CREATE TYPE number_list IS TABLE OF NUMBER;
然后您可以初始化列表,然后在循环的每次迭代中,EXTEND
列表并分配值,最后使用 MEMBER OF
运算符或 IN
使用子查询和 table 集合表达式:
DECLARE
l_id_list NUMBER_LIST := NUMBER_LIST();
BEGIN
FOR i IN 1..l_row_count
LOOP
l_id_list.EXTEND;
l_id_list(l_id_list.COUNT) := to_number(
apex_json.get_varchar2(
p_path => 'rows[%d].id',
p0 => i,
p_values => l_values
)
);
END LOOP;
SELECT *
-- BULK COLLECT INTO ...
FROM mytable
WHERE someid MEMBER OF l_id_list;
-- or
SELECT *
-- BULK COLLECT INTO ...
FROM mytable
WHERE someid IN (SELECT COLUMN_VALUE FROM TABLE(l_id_list));
END;