Создание глобальной временной таблицы
Спецификация
См. спецификацию пункта «Создание таблицы».
Синтаксические правила
-
Создание глобальной временной таблицы выполняется аналогично созданию базовой таблицы, с учетом запрета следующих спецификаций:
-
работа триггеров (за исключением триггеров DELETE для таблиц, созданных с предложением ON COMMIT DELETE ROWS). В этом случае временная таблица будет очищаться так же, как и при выполнении оператора TRUNCATE TABLE;
-
создание ссылочной целостности (ON UPDATE CASCADE, ON DELETE CASCADE);
-
поддержка BLOB-данных;
-
поддержка длинных записей (когда длина записи вместе с длиной заголовка превышает 4096 байт);
-
создание фразового индекса;
-
создание
< идентификационных столбцов >
; -
создание внешних ссылок на глобальную временную таблицу;
-
создание конструкции ON UPDATE {…}.
-
Общие правила
-
Глобальные временные таблицы предназначены для хранения промежуточных результатов обработки запросов выборки данных или для использования в качестве рабочего пространства.
-
Данные в глобальных временных таблицах не сохраняются в БД. Они автоматически удаляются в конце сеанса работы с СУБД или при завершении транзакции, в которой они были созданы. При повторном использовании они должны заполняться новыми данными.
-
Глобальные временные таблицы имеют постоянно сохраняемые в схеме БД определения (до тех пор, пока временная таблица, подобно любой другой, не будет удалена с помощью оператора DROP TABLE). Работа с такими таблицами выполняется с помощью SQL-операторов манипулирования данными.
-
К глобальным временным таблицам можно применять DDL-операторы такие, как ALTER TABLE, CREATE INDEX, но только в те моменты, когда сессия не обращается к временной таблице и не связана с ней (например, не выполняет DML-операторы).
-
Данные в глобальных временных таблицах удаляются в конце каждого сеанса работы клиентского приложения с СУБД ЛИНТЕР. Данные глобальной временной таблицы одного сеанса клиентского приложения не доступны сеансам других клиентских приложений (и, следовательно, другим пользователям), данные в глобальных временных таблицах доступны для любой программы или модуля только в пределах сеанса.
-
Конструкция
< действия при завершении транзакции >
определяет те действия, которые должны быть выполнены при завершении транзакции, в рамках которой была создана временная таблица. При выполнении команды COMMIT опция DELETE ROWS «очищает» таблицу, а PRESERVE ROWS – оставляет данные для выполнения следующей транзакции текущего сеанса СУБД («очищает» таблицу только после завершения сеанса). Если осуществляется откат транзакции (ROLLBACK) или прерывается ее выполнение, таблица возвращается к состоянию на конец предыдущей транзакции. При этом записи удаляются или сохраняются согласно следующему условию: сохранить состояние БД, соответствующее состоянию до отмененной транзакции. Если прерванная транзакция была первой в текущем сеансе, то таблица становится пустой. Значением по умолчанию является опция DELETE ROWS. -
Данные временной таблицы не видны из других сеансов. Т.е. пользователи могут одновременно использовать одну и ту же временную таблицу, не пересекаясь данными, поэтому блокировка таблиц с помощью команды LOCK TABLE не требуется.
-
Рекомендации по использованию глобальных временных таблиц:
-
сохранение результатов вызванной хранимой процедуры;
create or replace procedure proc_test (in i int) result cursor( MAKE char(20), MODEL char(20)) declare var d typeof(result);// code open d for direct "select make, model from auto where personid = " + itoa(i) + ";";// return d;// end; create or replace global temporary table tmp_tab (make char(20), model char(20)) on commit delete rows as (select * from proc_test(5));
-
объединение данных из различных табличных объектов (базовых таблиц, представлений или других временных таблиц).
-
-
Глобальная временная таблица удаляется с помощью оператора DROP TABLE.
-
Внешние ссылки на глобальную временную таблицу запрещены.
-
Внутри глобальной временной таблицы внешние ссылки разрешены только на базовые таблицы.
create table parent_tab (id int primary key); create global temporary table glb_tmp (id int primary key,name char(10),id_ref1 int, foreign key (id_ref1) references parent_tab(id) on delete cascade) on commit preserve rows;