PL / SQL - кэширование двух наборов результатов в коллекции и объединение их вместе? - PullRequest
2 голосов
/ 24 февраля 2010

У меня есть две очень большие таблицы, и мне нужно обработать небольшой набор результатов из этих таблиц. Однако обработка выполняется в нескольких функциях, каждая из которых должна выполнить некоторое объединение, чтобы правильно отформатировать данные.

Мне бы определенно нужно было как-то кэшировать исходный набор результатов, чтобы его можно было повторно использовать в функциях. Я хотел бы поместить первый набор результатов в одну коллекцию, второй набор результатов в другую коллекцию, а затем манипулировать этими коллекциями с помощью запросов SQL, как если бы они были настоящими таблицами SQL.

Можете ли вы предложить, как это можно сделать?

Ответы [ 3 ]

5 голосов
/ 24 февраля 2010

Звучит как работа для временных таблиц:

CREATE GLOBAL TEMPORARY TABLE table_name (...) ON ...

У ON есть два варианта с разным воздействием:

  1. ON COMMIT DELETE ROWS указывает, что временная таблица будет зависеть от транзакции. Данные сохраняются в таблице до момента окончания транзакции. Если вы завершаете транзакцию, база данных обрезает таблицу (удаляет все строки). Предположим, что если вы выполните commit или запустите ddl, данные во временной таблице будут потеряны. Это опция по умолчанию.

  2. ON COMMIT PRESERVE ROWS указывает, что временная таблица будет зависеть от сеанса. Данные сохраняются в таблице до времени окончания сеанса. Если вы завершите сеанс, база данных усекает таблицу (удалите все строки). Предположим, что вы вводите exit в SQL * Plus, тогда данные во временной таблице будут потеряны.

Ссылка:

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

3 голосов
/ 24 февраля 2010

Если ваши коллекции объявлены с типом SQL, вы можете использовать их в инструкциях SQL с функцией TABLE (). В Oracle 10g мы можем объединять коллекции, используя оператор MULTISET UNION. Следующий код показывает примеры обоих методов ...

SQL> declare
  2      v1 sys.dbms_debug_vc2coll;
  3      v2 sys.dbms_debug_vc2coll;
  4      v3 sys.dbms_debug_vc2coll := sys.dbms_debug_vc2coll();
  5  begin
  6      select ename
  7      bulk collect into v1
  8      from emp;
  9      select dname
 10      bulk collect into v2
 11      from dept;
 12
 13      -- manipulate connects using SQL
 14
 15      for r in ( select * from table(v1)
 16                 intersect
 17                 select * from table(v2)
 18               )
 19      loop
 20          dbms_output.put_line('Employee '|| r.column_value ||' has same name as a department');
 21      end loop;
 22
 23      -- combine two collections into one
 24
 25      dbms_output.put_line('V3 has '|| v3.count() ||' elements');
 26      v3 := v1 multiset union v2;
 27      dbms_output.put_line('V3 now has '|| v3.count() ||' elements');
 28  end;
 29  /
Employee SALES has same name as a department
V3 has 0 elements
V3 now has 23 elements

PL/SQL procedure successfully completed.

SQL>

Существует ряд других подходов, которые вы можете использовать. Как правило, лучше использовать SQL, чем PL / SQL, поэтому предложение OMG Ponies о временных таблицах может быть уместным. Это действительно зависит от точных деталей ваших потребностей обработки.

1 голос
/ 24 февраля 2010

Вам необходимо создать тип уровня схемы (не внутри пакета) как вложенную таблицу. Вы можете заполнить их, а затем использовать их в своих запросах как обычные таблицы, используя оператор table ().

Эта ссылка объясняет, что вам нужно. Быстрый пример

create type foo as table of number;-- or a record type, data%rowtype, whatever
...
myfoo1 foo := foo (1,2,3);
myfoo2 foo := foo(3,4,5)

select column_value
into bar
from table(foo1) join table(foo2) using (column_value)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...