Создание глобальной временной таблицы
Спецификация

См. спецификацию пункта «Создание таблицы».

Синтаксические правила
  1. Создание глобальной временной таблицы выполняется аналогично созданию базовой таблицы, с учетом запрета следующих спецификаций:

    • работа триггеров (за исключением триггеров DELETE для таблиц, созданных с предложением ON COMMIT DELETE ROWS). В этом случае временная таблица будет очищаться так же, как и при выполнении оператора TRUNCATE TABLE;

    • создание ссылочной целостности (ON UPDATE CASCADE, ON DELETE CASCADE);

    • поддержка BLOB-данных;

    • поддержка длинных записей (когда длина записи вместе с длиной заголовка превышает 4096 байт);

    • создание фразового индекса;

    • создание < идентификационных столбцов >;

    • создание внешних ссылок на глобальную временную таблицу;

    • создание конструкции ON UPDATE {…}.

Общие правила
  1. Глобальные временные таблицы предназначены для хранения промежуточных результатов обработки запросов выборки данных или для использования в качестве рабочего пространства.

  2. Данные в глобальных временных таблицах не сохраняются в БД. Они автоматически удаляются в конце сеанса работы с СУБД или при завершении транзакции, в которой они были созданы. При повторном использовании они должны заполняться новыми данными.

  3. Глобальные временные таблицы имеют постоянно сохраняемые в схеме БД определения (до тех пор, пока временная таблица, подобно любой другой, не будет удалена с помощью оператора DROP TABLE). Работа с такими таблицами выполняется с помощью SQL-операторов манипулирования данными.

  4. К глобальным временным таблицам можно применять DDL-операторы такие, как ALTER TABLE, CREATE INDEX, но только в те моменты, когда сессия не обращается к временной таблице и не связана с ней (например, не выполняет DML-операторы).

  5. Данные в глобальных временных таблицах удаляются в конце каждого сеанса работы клиентского приложения с СУБД ЛИНТЕР. Данные глобальной временной таблицы одного сеанса клиентского приложения не доступны сеансам других клиентских приложений (и, следовательно, другим пользователям), данные в глобальных временных таблицах доступны для любой программы или модуля только в пределах сеанса.

  6. Конструкция < действия при завершении транзакции > определяет те действия, которые должны быть выполнены при завершении транзакции, в рамках которой была создана временная таблица. При выполнении команды COMMIT опция DELETE ROWS «очищает» таблицу, а PRESERVE ROWS – оставляет данные для выполнения следующей транзакции текущего сеанса СУБД («очищает» таблицу только после завершения сеанса). Если осуществляется откат транзакции (ROLLBACK) или прерывается ее выполнение, таблица возвращается к состоянию на конец предыдущей транзакции. При этом записи удаляются или сохраняются согласно следующему условию: сохранить состояние БД, соответствующее состоянию до отмененной транзакции. Если прерванная транзакция была первой в текущем сеансе, то таблица становится пустой. Значением по умолчанию является опция DELETE ROWS.

  7. Данные временной таблицы не видны из других сеансов. Т.е. пользователи могут одновременно использовать одну и ту же временную таблицу, не пересекаясь данными, поэтому блокировка таблиц с помощью команды LOCK TABLE не требуется.

  8. Рекомендации по использованию глобальных временных таблиц:

    • сохранение результатов вызванной хранимой процедуры;

      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));
    • объединение данных из различных табличных объектов (базовых таблиц, представлений или других временных таблиц).

  9. Глобальная временная таблица удаляется с помощью оператора DROP TABLE.

  10. Внешние ссылки на глобальную временную таблицу запрещены.

  11. Внутри глобальной временной таблицы внешние ссылки разрешены только на базовые таблицы.

    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;