Как создать временную таблицу в базе данных Oracle?

93

Я хочу создать временную таблицу в базе данных Oracle

что-то типа

Declare table @table (int id)

На сервере SQL

А затем заполните его оператором select

Является ли это возможным?

Благодарность

GigaPr
источник

Ответы:

131

Да, у Oracle есть временные таблицы. Вот ссылка на статью AskTom с их описанием, а вот официальная документация Oracle CREATE TABLE.

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

CREATE GLOBAL TEMPORARY TABLE today_sales(order_id NUMBER)
ON COMMIT PRESERVE ROWS;

Oracle 18c добавил частные временные таблицы, которые являются объектами в памяти для одного сеанса. Смотрите документацию для более подробной информации. Частные временные таблицы можно создавать и удалять динамически.

CREATE PRIVATE TEMPORARY TABLE ora$ptt_today_sales AS
SELECT * FROM orders WHERE order_date = SYSDATE;

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

Hamishmcn
источник
40
Никаких отрицательных голосов, но я бы никогда не рекомендовал CREATE TABLE AS SELECT для глобальной временной таблицы - менее опытный разработчик может ошибиться в том, что они должны каждый раз заполнять GTT таким образом. Конечно, это удобный способ скопировать определение из другой таблицы, но этот пример, вероятно, запутает некоторых людей.
Джеффри Кемп
Я полностью согласен с Джеффри Кемпом здесь, это всего лишь один способ создания этой таблицы, я столкнулся с этим и понял, чувак, мне нужно поместить этот оператор выбора в свой DDL.
Виджай Кумар
3
вы можете просто добавить «где 1 = 0»;
Palcente 01
@Palcente, который по-прежнему подразумевает, что вам понадобится «настоящая таблица» с той же структурой, чтобы создать временную, что не так (также см. Этот ответ . Кроме того, в этом ответе не указывается, что существует не только GLOBAL временной таблицы, но можно также использовать «обычные» временные таблицы. разница в SQL Server, как и указывал Мэтью , еще один важный момент , нужно сделать , чтобы не пропустить (или удивления об ошибках на «втором вызове» об уже существующем объекте;)
Иззи
2
Допустимый вариант использования для CREATE TABLE AS SELECT: выбора из удаленных таблиц со столбцами LOB, поскольку вы не можете напрямую SELECTиз них. Я пишу процедуру для копирования записей из удаленной базы данных, и это было моим решением: перенести записи в GTT, а затем скопировать из него в «настоящую» таблицу.
rgoliveira
78

Просто совет .. Временные таблицы в Oracle отличаются от SQL Server. Вы создаете его ОДИН РАЗ и только ОДИН РАЗ, а не каждую сессию. Строки, которые вы вставляете в него, видны только вашему сеансу и автоматически удаляются (т. Е. TRUNCATEНет DROP), когда вы завершаете сеанс (или завершаете транзакцию, в зависимости от того, какое предложение «ON COMMIT» вы используете).

Мэтью Уотсон
источник
15
Я не совсем понимаю. Вы сказали, что создаете его только один раз, а не на каждом сеансе. Однако вы также сказали, что временная таблица удаляется каждый сеанс. Разве это не означает, что вам нужно создавать временную таблицу каждый сеанс?
Хаос,
31
DELETEDа не DROPпед.
Tripp Kinetics
10
Вы не создаете временную таблицу каждый сеанс, а только один раз. Таблица доступна во всей системе. Таблица доступна из любого сеанса, который вы создаете, включая параллельные сеансы. но когда вы вставляете данные изнутри одного сеанса, эти данные не видны из других параллельных сеансов в системе. Данные одного сеанса являются собственностью только этого сеанса. Таким образом, данные зависят от сеанса и не видны системно. Следовательно, когда вы закрываете один сеанс, данные этого сеанса удаляются из таблицы.
SubhasisM
33
CREATE GLOBAL TEMPORARY TABLE Table_name
    (startdate DATE,
     enddate DATE,
     class CHAR(20))
  ON COMMIT DELETE ROWS;
хариш из нит амеерпет
источник
10
Обратите внимание, что строки всегда будут удаляться в конце сеанса; ON COMMIT DELETE ROWSозначает, что они будут отброшены раньше, если вы будете делать коммит постепенно во время сеанса.
1
zygimantus, да, можно вручную удалить во время сеанса. Во время сеанса временная таблица ведет себя точно так же, как обычная таблица. Единственное различие между временной таблицей и реальной таблицей с точки зрения пользователя заключается в том, что все строки удаляются после завершения сеанса, и никакой другой сеанс не может прочитать содержимое таблицы, используемой сеансом. Для каждого сеанса существует экземпляр таблицы; два сеанса могут использовать одну и ту же временную таблицу одновременно и иметь два разных набора строк без каких-либо конфликтов.
Ханс Дерагон 01
-2

СОЗДАТЬ ТАБЛИЦУ table_temp_list_objects AS

ВЫБЕРИТЕ o.owner, o.object_name FROM sys.all_objects o WHERE o.object_type = 'TABLE';

Эди Мунис
источник
Пожалуйста, отформатируйте свой ответ. Было бы хорошо, если бы вы написали что-нибудь о своем коде.
Хостел