Работа с временными таблицами

Если разрабатываемое приложение обрабатывает большие объемы данных, ведет расчет и использует большое количество промежуточных значений, то может быть актуальным вопрос использования временных таблиц СУБД. Работа с временными таблицами осуществляется с использованием команды выполнения SQL-запросов. При работе необходимо учитывать синтаксис SQL-запросов, который различается в зависимости от используемой СУБД:

Var
    MB: IMetabase;
    Connection: ISecurityConnection;
    Command: IDalCommand;
    SQL: String = "";
Begin
    MB := MetabaseClass.Active;
    Connection := (MB.ItemById("DB").Open(NullAs IDatabaseInstance).Connection;
    //Создание временной таблицы
    SQL := "CREATE GLOBAL TEMPORARY TABLE temp_table (key NUMBER(2,0)) ON COMMIT PRESERVE ROWS"//Oracle
    SQL := "CREATE TABLE ##temp_table ([KEY] INT NULL)"//Microsoft SQL Server
    Command := Connection.CreateCommand(SQL);
    Command.Execute;
    //Занесение данных во временную таблицу
    SQL := "INSERT INTO temp_table(key) VALUES(1)"//Oracle
    SQL := "INSERT INTO ##temp_table VALUES (1)"//Microsoft SQL Server
    Command.SQL := SQL;
    Command.Execute;
    //Извлечение данных из временной таблицы
    SQL := "SELECT * FROM temp_table"//Oracle
    SQL := "SELECT * FROM ##temp_table"//Microsoft SQL Server
    Command.SQL := SQL;
    //...
    //Дальнейшая работа с данными и временной таблицей
    //...
    //Удаление временной таблицы
    SQL := "DROP TABLE temp_table"//Oracle
    SQL := "DROP TABLE ##temp_table"//Microsoft SQL Server
    Command.SQL := SQL;
    Command.Execute;

Особенности работы с локальными временными таблицами в СУБД Microsoft SQL Server

В СУБД Microsoft SQL Server имеется два вида временных таблиц: локальные (в наименовании добавляется символ #) и глобальные (в наименовании добавляются символы ##). Для работы с глобальными таблицами используется код, указанный выше. Если логика разрабатываемого приложения требует использования локальных временных таблиц, то необходимо учитывать следующую особенность: при выполнении запросов к СУБД Microsoft SQL Server ядро «Форсайт. Аналитическая платформа» всегда осуществляет подготовку команды для многократного использования на сервере. СУБД Microsoft SQL Server не позволяет в рамках таких команд создавать и использовать временные объекты. Для разрешения данного конфликта можно использовать следующий код на языке Fore.NET:

Public Shared Sub Main(Params: StartParams);
Var
    MB: IMetabase;
    Connection: ISecurityConnection;
    Command: IDalCommand;
    SQL: String;
Begin
    MB := Params.Metabase;
    Connection := (MB.ItemById["DB"].Open(NullAs IDatabaseInstance).Connection;
    //Создание временной таблицы
    SQL := "CREATE TABLE #TEMP_TABLE ([KEY] INT NULL)";
    Command := Connection.CreateCommandRawO(DalCommandOption.dccoWithoutException, SQL);
    Command.Execute();
    //Занесение данных во временную таблицу
    SQL := "INSERT INTO #TEMP_TABLE VALUES (1)";
    Command.SQL := SQL;
    Command.Execute();
    //...
    //Дальнейшая работа с временной таблицей
    //...
End Sub;

См. также:

Введение