ben*_*rre 7 sql oracle hibernate
看起来Oracle SQL中有1000个参数的限制.我在生成诸如......等查询时遇到了这个问题.
select * from orders where user_id IN(large list of ids over 1000)
Run Code Online (Sandbox Code Playgroud)
我的解决方法是创建一个临时表,首先将用户ID插入到该表中,而不是通过JDBC发出查询,该查询在IN中有一个巨大的参数列表.
有人知道更简单的解决方法吗?由于我们正在使用Hibernate,我想知道它是否能够自动透明地执行类似的解决方法.
另一种方法是将数组传递到数据库并TABLE()在 IN 子句中使用函数。这可能会比临时表表现得更好。它肯定比运行多个查询更有效。但是,如果您有大量会话执行此操作,则需要监视 PGA 内存使用情况。另外,我不确定将其连接到 Hibernate 是否容易。
注意:TABLE()函数在SQL引擎中运行,因此需要我们声明SQL类型。
create or replace type tags_nt as table of varchar2(10);
/
Run Code Online (Sandbox Code Playgroud)
以下示例使用数千个随机标签填充一个数组。然后,它在查询的 IN 子句中使用该数组。
declare
search_tags tags_nt;
n pls_integer;
begin
select name
bulk collect into search_tags
from ( select name
from temp_tags
order by dbms_random.value )
where rownum <= 2000;
select count(*)
into n
from big_table
where name in ( select * from table (search_tags) );
dbms_output.put_line('tags match '||n||' rows!');
end;
/
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3458 次 |
| 最近记录: |