我得到一个文件作为输入,我必须加载与文件中存在的所有ID相对应的数据[在内存中]。
我试过了。
将ID插入临时表,然后进行连接,但就是这样 为并行运行创建问题。意味着多个相同的实例 应用程序无法共享相同的临时表。在这里,我不能创建一个 每次执行临时表。
'在`子句中,我可以传递ID列表,但是有限制 查询的大小。
我该如何解决这个问题?
答案 0 :(得分:3)
创建global temporary table。表定义是共享的,但每个会话都有自己的一组私有数据。
答案 1 :(得分:1)
您可以批量加载数据。 Oracle的{{1}}限制为1k,因此您可以安全地按批次500个ID加载条目。
最佳解决方案显然取决于您的具体情况,但这对大多数情况都适用。它不涉及写操作(如插入临时表),因此DB(事务日志)没有额外的压力,不需要清理作业,节省重做日志等。
答案 2 :(得分:0)
使用集合:
CREATE TYPE number_tt IS TABLE OF NUMBER(8,0);
/
VARIABLE ids REFCURSOR;
/
DECLARE
t_ids number_tt := number_tt();
BEGIN
-- Loop through file to get IDs
FOR id IN 1 .. 20000 LOOP
t_ids.EXTEND;
t_ids(t_ids.COUNT) := id;
END LOOP;
-- Use MEMBER OF instead of IN
OPEN :ids FOR
SELECT LEVEL
FROM DUAL
CONNECT BY LEVEL MEMBER OF t_ids;
END;
/
PRINT ids;