Альтернатива для временной таблицы MySQL в Oracle - PullRequest
3 голосов
/ 25 августа 2011

Я заметил, что концепция временных таблиц в этих двух системах различна, и у меня есть соображения .. У меня есть следующий сценарий в MySQL:

  1. Удалите временную таблицу 'a', если существует
  2. Создать временную таблицу 'a'
  3. Заполнить ее данными через хранимую процедуру
  4. Использовать данные в другой хранимой процедуре

Как можноЯ реализую тот же сценарий в Oracle?Могу ли я (в одной процедуре предпочтительно) создать временную таблицу, заполнить ее и вставить данные в другую (не временную) таблицу?

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

Ответы [ 4 ]

6 голосов
/ 25 августа 2011

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

Если вам просто нужно временное место для хранения данных при выполнении вычислений PL / SQL, коллекции PL / SQL используются чаще, чем временные таблицы в Oracle. Таким образом, вы не перемещаете данные назад и вперед из механизма PL / SQL в механизм SQL и обратно в механизм PL / SQL.

CREATE PROCEDURE do_some_processing
AS
  TYPE emp_collection_typ IS TABLE OF emp%rowtype;
  l_emps emp_collection_type;

  CURSOR emp_cur
      IS SELECT *
           FROM emp;
BEGIN
  OPEN emp_cur;
  LOOP
    FETCH emp_cur 
     BULK COLLECT INTO l_emps
    LIMIT 100;

    EXIT WHEN l_emps.count = 0;

    FOR i IN 1 .. l_emps.count
    LOOP
      <<do some complicated processing>>
    END LOOP;
  END LOOP;
END;

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

2 голосов
/ 25 августа 2011

Вы правы, временные таблицы будут работать на вас.

Если вы решили придерживаться обычных таблиц, вы можете использовать совет, который дал @Johan, вместе с

ALTER TABLE <table name> NOLOGGING;

чтобы сделать это немного быстрее.

1 голос
/ 25 августа 2011

В вашей версии MySQL я не видел шаг 5 для удаления таблицы a.Поэтому, если вы хотите или не возражаете против сохранения данных в таблице, вы также можете использовать материализованное представление и просто обновлять по требованию.С материализованным представлением вам не нужно управлять никакими операторами INSERT, просто включите SQL:

CREATE MATERIALIZED VIEW my_mv
NOCACHE -- NOCACHE/CACHE: Optional, cache places the table in the most recently used part of the LRU blocks
BUILD IMMEDIATE  -- BUILD DEFERRED or BUILD IMMEDIATE
REFRESH ON DEMAND
WITH PRIMARY KEY -- Optional: creates PK column
AS
SELECT * 
FROM ....;

Затем в вашей другой хранимой процедуре вызовите:

BEGIN   
    dbms_mview.refresh ('my_mv', 'c'); -- 'c' = Complete
END;

Сказав,Глобальная временная таблица также будет работать, но вы управляете вставкой и исключениями.

1 голос
/ 25 августа 2011

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

Сделайте это, создав таблицу как обычно, затем выполните

ALTER TABLE <table_name> CACHE;  

Приоритет таблицы для хранения в памяти.

Пока вы заполняете и , быстро очищаете стол, вам не нужно выполнять шаги 1 и 2.
Помните, что модификатор cache это просто подсказка. Таблица все еще стареет в кэше и в конечном итоге будет вытеснена из памяти.

Просто сделай:

  1. Заполнить кеш-таблицу данными через хранимую процедуру

  2. Используйте данные в другой хранимой процедуре, но не ждите долго. 2а. Очистить данные в таблице кеша.

...