Як створити тимчасову таблицю в базі даних 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.