Если разрабатываемое приложение обрабатывает большие объемы данных, ведет расчет и использует большое количество промежуточных значений, то может быть актуальным вопрос использования временных таблиц СУБД. Работа с временными таблицами осуществляется с использованием команды выполнения SQL-запросов. При работе необходимо учитывать синтаксис SQL-запросов, который различается в зависимости от используемой СУБД:
Var
MB: IMetabase;
Connection: ISecurityConnection;
Command: IDalCommand;
SQL: String = "";
Begin
MB := MetabaseClass.Active;
Connection := (MB.ItemById("DB").Open(Null) As 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 не позволяет в рамках таких команд создавать и использовать временные объекты. Для разрешения данного конфликта можно использовать следующий код на языке 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(Null) As 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;
См. также: