2016-01-06 2 views
2

Я получаю файл как вход, и мне приходится загружать данные [В памяти], соответствующие всем идентификаторам, содержащимся в файле.Oracle: как фильтровать результаты на основе большого количества идентификаторов [20K]

Я пробовал следующее.

  • Вставка идентификаторов во временную таблицу, а затем сделать присоединиться, но это создание проблем для параллельных трасс. Значит, несколько экземпляров одного и того же приложения не могут использовать одну и ту же таблицу темп. Здесь я не могу создать одну временную таблицу за выполнение.

  • 'in`, где я могу передать список идентификаторов, но существует ограничение на размер запроса .

Как подойти к этой проблеме?

+0

Можно ли использовать файл, как если бы это был стол? например http://www.dba-oracle.com/art_ext_tabs_spreadsheet.htm –

ответ

3

Создать global temporary table. Определение таблицы является общим, но каждый сеанс получает собственный набор частных данных.

+0

Как объединить вставки в GTT с моим основным запросом. потому что данные будут потеряны после завершения инструкции. Я говорю с точки зрения C++. – gjha

+0

Данные просто удаляются при совершении транзакции, а не для каждого оператора (и есть альтернативный синтаксис, чтобы он не удалялся при фиксации, если это то, что вам нужно). –

1

Данные могут быть загружены в пакеты. Ограничение IN clause - 1k для Oracle, поэтому вы можете безопасно загружать записи пакетами из 500 идентификаторов, например.

Лучшее решение зависит, очевидно, от ваших конкретных обстоятельств, но это будет хорошо работать для большинства случаев. Он не включает операции записи (например, вставки в временную таблицу), поэтому нет лишней нагрузки на БД (журнал транзакций), нет необходимости в выполнении работ по очистке, вы сохраняете на повторных журналах и т. Д.

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; 
Смежные вопросы