Создание глобальной временной таблицы
Спецификация
См. спецификацию пункта «Создание таблицы».
Синтаксические правила
-
Создание глобальной временной таблицы выполняется аналогично созданию базовой таблицы, с учетом запрета следующих спецификаций:
-
работа триггеров (за исключением триггеров
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;