2016-01-06 69 views
2

我得到一个文件作为输入,并且我必须加载与文件中存在的所有ID相对应的数据[内存]。Oracle:如何过滤基于大量ID的结果[20K]

我试过了。

  • 插入标识到一个临时表,然后做一个连接,但这是并行运行 产生的问题。意味着同一个 应用程序的多个实例不能共享相同的临时表。在这里,我无法为每次执行创建一个 临时表。

  • 'in`从句中我可以通过ID列表,但是对查询的大小有 的限制。

我应该如何处理这个问题?

+0

可以使用该文件,就好像它是一个表?例如http://www.dba-oracle.com/art_ext_tabs_spreadsheet.htm –

回答

3

创建一个global temporary table。表定义是共享的,但每个会话都有自己的一组私有数据。

+0

我如何将插入到GTT中,以及我的主要查询。因为一旦陈述完成,数据将会丢失。我正在从C++的角度来谈论。 – gjha

+0

当您提交事务时,数据刚刚被删除,而不是针对每个语句(并且存在替代语法,因此在提交时它不会被删除,如果这是您需要的)。 –

1

您可以批量加载数据。对于Oracle,IN clause的限制为1k,因此您可以安全地按批次的500个ID装入条目,例如。

最好的解决方案很明显取决于您的具体情况,但这对大多数情况很适用。它不涉及写入操作(如插入临时表),因此不会对DB(事务日志)施加额外的压力,不需要清理作业,可以节省重做日志等。

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;