问题描述
我有一个具有20000个ID的xls
我需要提取在Col1中具有这些ID的表的行
在Oracle SQL中有一种聪明的方法吗?
我对此数据库只有读权限。
我想对20000个ID进行切片,以便将前1000个放入变量p_list1中,然后将1000个放入变量p_list2中,并使用IN子句和并集来获取整个结果
但是我不习惯在查询中使用参数。
您可以复习一下吗?
预先感谢您的帮助
DECLARE
p_list1 VARCHAR2(10) := '''id1''','''id2''','''id3''',..ect
BEGIN
execute immediate 'select * from table1 where Col1 in ('|| p_list ||')' ;
END;
解决方法
如果您可以创建一个临时表,则可以按照以下方式进行操作:
- 创建临时表
- 使用EXISTS子句重新编写查询,如下所示:
SELECT *
FROM table1
WHERE EXISTS(select 1 from temp_table tt WHERE tt.id = table1.Col1)
,
一个方便的解决方法是使用元组列表而不是值列表。无论出于何种原因,Oracle在in
条件下允许超过2000个 tuple ,而不允许超过2000个值。
所以:
declare
p_list clob := '(1,''id1''),(1,''id2''),''id3'')';
begin
execute immediate 'select * from table1 where (1,col1) in ('|| p_list ||')' ;
end;
/
请注意,我将p_list
参数更改为CLOB;如果它将包含超过2000个值,则可能超过4000个字节。我还修复了单引号顺序。
如果参数来自代码外部,这仍然给您带来注入问题:在这种情况下,您确实想使用准备好的语句而不是execute immediate
(不过,可以使用相同的逻辑)