Sybase Developer спрашивает: как создать временную таблицу в Oracle? - PullRequest
4 голосов
/ 21 октября 2008

Я знаком с сервером Sybase / SQL, где я могу создать временный сервер. таблица как это:

SELECT * 
INTO   #temp
FROM   tab1 , 
       tab2 
WHERE  tab1.key = tab2.fkey

SELECT * 
FROM   #temp 
WHERE  field1 = 'value' 

# temp существует только на время этого сеанса и может быть виден только мне.

Я бы хотел сделать то же самое в Oracle, но я читаю о «глобальных временных таблицах», которые не похожи на одно и то же.

Как я могу сделать то же самое в Oracle, что и в Sybase?

Спасибо:)

Ответы [ 6 ]

4 голосов
/ 22 октября 2008

Ваш первый подход должен состоять в том, чтобы сделать это одним запросом:

SELECT * 
FROM   
(
SELECT * 
FROM   tab1 , 
       tab2 
WHERE  tab1.key = tab2.fkey
)
WHERE  field1 = 'value';

Для очень сложных ситуаций или там, где temp # очень велик, попробуйте предложение факторинга подзапроса, дополнительно с подсказкой материализации:

with #temp as
(
SELECT /*+ materialize */ 
       * 
FROM   tab1 , 
       tab2 
WHERE  tab1.key = tab2.fkey
)
SELECT * 
FROM   temp#
WHERE  field1 = 'value';

Если это не поможет, перейдите к методу Глобальной временной таблицы.

4 голосов
/ 21 октября 2008

Глобальная временная таблица не совпадает, определение остается после окончания сеанса, также таблица (но не данные) видна всем сеансам.

Если вы пишете хранимые процедуры, изучали ли вы курсоры? Это немного сложнее, но очень эффективный и чистый способ работы с временным набором данных.

2 голосов
/ 21 октября 2008

Oracle не предоставляет прямого аналога этой возможности. Глобальная временная таблица похожа, но она должна быть создана заранее, и ее может быть сложно изменить по линии из-за проблем с блокировкой.

Большинство потребностей такого рода можно удовлетворить с помощью курсоров или одного из различных типов коллекций pl / sql (вложенные таблицы, массивы, ассоциативные массивы), но ни один из них нельзя использовать так, как если бы они были таблицей. То есть вы не можете выбрать из них.

1 голос
/ 22 октября 2008

Модель временных таблиц несколько отличается в Oracle и сосредоточена вокруг оператора "CREATE GLOBAL TEMPORARY TABLE ..". Определения временных таблиц всегда глобальны, но данные всегда являются частными для сеанса, и то, будут ли данные сохраняться в течение фиксации, зависит от того, указана ли квалификация «в строках сохранения коммита» или «в строках удаления коммита».

У меня есть несколько сценариев Perl и пост блога, который исследует конкретное поведение или временные таблицы Oracle на моем блоге .

1 голос
/ 21 октября 2008

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

Данные в глобальной временной таблице являются частными, так что данные, вставленные сеансом, могут быть доступны только этому сеансу. Специфичные для сеанса строки в глобальной временной таблице могут быть сохранены для всего сеанса или только для текущей транзакции. Предложение ON COMMIT DELETE ROWS указывает, что данные должны быть удалены в конце транзакции.

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

CREATE GLOBAL TEMPORARY TABLE my_temp_table ON COMMIT DELETE ROWS select * from other table;

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

0 голосов
/ 21 октября 2008

Да, Carson это правильно. Глобальные временные таблицы видны только сеансу, который их создает, и исчезают либо при первом подтверждении или откате, либо в конце сеанса. Вы можете установить это при создании gtt.

...