Як створити тимчасову таблицю в базі даних Oracle?


90

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

щось на зразок

Declare table @table (int id)

На сервері SQL

А потім заповніть його оператором select

Це можливо?

Дякую

Відповіді:


130

Так, у 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 за допомогою вбудованих подань.


40
Ніякого голосу проти, але я ніколи не рекомендував би СТВОРИТИ ТАБЛИЦЮ ЯК ВИБЕРИТИ для глобальної тимчасової таблиці - менш досвідчений розробник може отримати неправильне уявлення про те, що їм кожен раз потрібно заповнювати GTT. Звичайно, це зручний спосіб скопіювати визначення з іншої таблиці, але приклад, мабуть, заплутає деяких людей.
— Джеффрі Кемп,

Я повністю погоджуюсь з Джеффрі Кемпом тут, це лише один із способів створення цієї таблиці, я натрапив на це, і зрозумів, чи потрібно мені поміщати цей вибраний вислів у свій DDL.
— Віджай Кумар,

3
ви можете просто додати "де 1 = 0";
— Пальсенте

@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
Ти не створюєш тимчасову таблицю кожного сеансу, а один раз. Таблиця доступна в системі. До таблиці можна отримати будь-який створений вами сеанс, включаючи паралельні сеанси. але коли ви вставляєте дані всередині одного сеансу, ці дані не видно з інших паралельних сеансів у системі. Дані одного сеансу є властивістю лише цього сеансу. Таким чином, дані специфічні для сесії, а не системно видимі. Отже, коли ви закриваєте один сеанс, дані цього сеансу видаляються з таблиці.
— Subhasis M

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, так, ви можете видалити вручну під час сеансу. Під час сеансу тимчасова таблиця поводиться точно так само, як звичайна таблиця. Єдина різниця між тимчасовою таблицею і реальною таблицею, з точки зору користувача, полягає в тому, що всі рядки видаляються після закінчення сеансу, і жоден інший сеанс не може прочитати вміст таблиці, яка використовується сеансом. Існує примірник таблиці за сеанс; два сеанси можуть використовувати одну і ту ж тимчасову таблицю одночасно і мати два різні набори рядків, без жодних конфліктів.
— Ганс Дерагон,

-2

СТВОРИТИ ТАБЛИЦЮ table_temp_list_objects AS

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


Будь ласка, відформатуйте свою відповідь. Було б добре, якщо б ви написали щось про свій код.
— Хостел
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.