Я хотів би створити тимчасову таблицю в базі даних Oracle
щось на зразок
Declare table @table (int id)
На сервері SQL
А потім заповніть його оператором select
Це можливо?
Дякую
Відповіді:
Так, у 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 за допомогою вбудованих подань.
CREATE TABLE AS SELECT
: виберіть із віддалених таблиць зі стовпцями LOB, оскільки безпосередньо SELECT
з них неможливо . Я пишу процедуру копіювання записів з віддаленої бази даних, і це було моє рішення: перенести записи в GTT, а потім скопіювати з них у "справжню" таблицю.
Тільки підказка. Тимчасові таблиці в Oracle відрізняються від SQL Server. Ви створюєте його РАЗ, і лише РАЗ, не кожен сеанс. Рядки, які ви вставляєте в нього, є видимими лише для вашої сесії та автоматично видаляються (тобто, TRUNCATE
ні DROP
) після завершення сеансу (або закінчення транзакції, залежно від того, яке положення "ON COMMIT" ви використовуєте).
DELETED
, не DROP
пед.
CREATE GLOBAL TEMPORARY TABLE Table_name
(startdate DATE,
enddate DATE,
class CHAR(20))
ON COMMIT DELETE ROWS;
ON COMMIT DELETE ROWS
означає, що їх буде відкинуто раніше, якщо ви поступово виконуєте комісію під час сеансу.