Временные таблицы
Временная таблица (temp-table) — очень важная конструкция ABL, позволяющая определить набор данных. Временные таблицы представляют собой реляционные структуры, видимые для сессии OpenEdge, которая их создаёт, и существуют только в течение жизни этой сессии. Временные таблицы могут представлять данные из одной или нескольких таблиц в вашей базе данных или содержать разные данные.
Случаи применения
Есть два основных варианта использования временных таблиц. Вы можете использовать временную таблицу для представления данных из одной или нескольких таблиц в вашей базе данных. В этом случае вы выполняете аналогичные операции с временной таблицей, как и с таблицей базы данных, однако сама база данных не затрагивается. Это позволяет выполнять операции в логике приложения без участия сервера базы данных. Сначала вы заполняете временную таблицу данными из одной или нескольких таблиц в базе данных. Затем вы можете манипулировать данными во временной таблице, не связывая базу данных. База данных может быть обновлена с учётом изменений из временной таблицы позднее, хотя необходимо соблюдать целостность данных, поскольку за это время база данных могла измениться.
Второй вариант использования — когда вы хотите работать с набором локальных данных и даже передавать этот набор данных в другую процедуру или сеанс. В этом случае временную таблицу можно представить как столбчатую структуру, в которой каждая строка использует одно и то же определение локальной схемы.
Статические временные таблицы
Статические временные таблицы используются, когда схема таблицы известна во время разработки. Вы определяете статическую временную таблицу, используя оператор DEFINE TEMP-TABLE, чтобы создать схему для временной таблицы. Запись во временной таблице создаётся с помощью оператора CREATE. В следующем примере кода определяется временная таблица ttCustomer с двумя полями (столбцами), создаётся запись, присваиваются значения полям и отображается запись.
DEFINE TEMP-TABLE ttCustomer NO-UNDO // Define the temp-table FIELD CustName AS CHARACTER FIELD CustId AS CHARACTER. CREATE ttCustomer. // Create a record CustName = "John Smith". // Assign values to the fields CustId = "98765". DISPLAY ttCustomer. // Display the record
Вы можете передать статическую временную таблицу другой процедуре, используя параметр TABLE. В этом случае данные таблицы копируются из одной процедуры в другую. Статические временные таблицы требуют полного статического определения таблицы на каждой стороне передачи, поскольку схема не передаётся как часть параметра. Дополнительные сведения см. в разделе «Использование временной таблицы в качестве параметра».
Динамические временные таблицы
Динамические временные таблицы используются, когда схема таблицы неизвестна до времени выполнения. Для создания пустой временной таблицы во время выполнения используется оператор CREATE TEMP-TABLE. Затем определяется схема, используя методы ADD, такие как ADD-NEW-FIELD() и ADD-NEW-INDEX(). Как только определение динамической временной таблицы завершено, вызывается TEMP-TABLE-PREPARE(), чтобы сообщить, что определение таблицы завершено. Теперь временная таблица готова для хранения данных.
В следующем примере кода показано создание динамической временной таблицы.
VAR HANDLE tth. VAR HANDLE bufferh. /* Create an empty, undefined temp-table */ CREATE TEMP-TABLE tth. /* Add fields to the temp-table */ tth:ADD-NEW-FIELD("custName","character"). tth:ADD-NEW-FIELD("custNum","integer"). /* Signal that the temp-table definition is complete and assign it the name "ttCust" */ tth:TEMP-TABLE-PREPARE("ttCust"). /* Get the buffer-handle for the temp-table */ bufferh = tth:DEFAULT-BUFFER-HANDLE. /* Create a record and store it in the buffer */ bufferh:BUFFER-CREATE(). /* Assign values */ bufferh:BUFFER-FIELD("custName"):BUFFER-VALUE = "John Smith". bufferh:BUFFER-FIELD("custNum"):BUFFER-VALUE = "12345". ...
Чтобы передать динамическую временную таблицу, передаётся её дескриптор. Также динамическую временную таблицу можно передать, используя параметр TABLE-HANDLE. Дополнительные сведения о передаче параметров см . в разделе «Синтаксис передачи параметров».
Дополнительные сведения о временных таблицах см. в разделе «Определение и использование временных таблиц» и «Дескриптор объекта временной таблицы».
Включаемые файлы для определения временных таблиц
Включаемый файл ABL — это файл, содержащий код ABL, который включается в другую процедуру или класс при компиляции процедуры или класса. Включаемый файл ABL имеет расширение .i. Включаемые файлы используются для помещения общего кода в отдельный файл, где общий код обычно используется другими процедурами или классами в вашем приложении. Лучшей практикой является помещение определений временных таблиц, совместно используемых логикой пользовательского интерфейса и бизнес-логикой, во включаемый файл.
В следующем примере кода показано определение временной таблицы, помещённое в отдельный файл с именем ttOrder.i.
/* ttOrder.i */ DEFINE TEMP-TABLE ttOrder NO-UNDO FIELD OrderNum AS INTEGER FIELD OrderDate AS DATE FIELD ShipDate AS DATE FIELD PromiseDate AS DATE FIELD OrderTotal AS DECIMAL INDEX OrderNum IS UNIQUE PRIMARY OrderNum.
Чтобы использовать включаемый файл в своём коде, окружите путь к включаемому файлу фигурными скобками ({}) и поместите его в код туда, куда вы хотите вставить код из этого файла. Определение временной таблицы обычно помещается ближе к началу файла. Вы так же можете указать путь относительно переменной среды PROPATH.
/* myProcedure.p */ BLOCK-LEVEL ON ERROR UNDO, THROW. {ttOrder.i} /* code to populate the ttOrder temp-table*/
Дополнительные сведения см. в разделах «{} Справочник по включаемым файлам» и «Использование включаемых файлов для дублирования кода».
Очистка временных таблиц
Статические временные таблицы остаются на весь срок действия процедуры, в которой они определены. Рекомендуется обращать внимание на область временной таблицы и очищать её, когда она больше не нужна или когда вам нужен новый набор записей. Если временную таблицу не очистить, то в неё могут содержаться записи из предыдущего вызова, что может быть неожиданным, и чего следует избегать. Чтобы очистить временную таблицу, используется оператор EMPTY TEMP-TABLE.
Синтаксис:
EMPTY TEMP-TABLE temp-table-name.
Копирование записей из базы данных во временную таблицу
Вы можете заполнить временную таблицу, скопировав в неё записи из базы данных. Вы можете скопировать всю запись или выбрать поля. Чтобы скопировать запись из таблицы базы данных во временную таблицу, необходимо:
- Создать запись во временной таблице.
- Скопировать запись из базы данных (источник) в запись временной таблицы (цель).
Основной синтаксис для создания записи временной таблицы такой же, как и для создания записи таблицы базы данных:
CREATE ttName.
Где ttName — имя временной таблицы. Это пример создаёт запись во временной таблице.
Смотрите оператор CREATE для получения более подробной информации.
Следующий синтаксис используется для копирования буфер записи базы данных в буфер записи временной таблицы:
BUFFER-COPY source TO target.
См. оператор BUFFER-COPY для получения более подробной информации.
В следующем примере кода показано, как заполнить временную таблицу ttCustomer из базы данных. Обратите внимание, что BUFFER-COPY копирует только совпадающие поля; поля в базе данных или временной таблице, которые не соответствуют друг другу, игнорируются.
DEFINE TEMP-TABLE ttCustomer NO-UNDO // Define the temp-table FIELD CustNum AS INTEGER FIELD Name AS CHARACTER FIELD City as CHARACTER FIELD State as CHARACTER FIELD Country as CHARACTER. FOR EACH Customer WHERE Customer.Country = "USA": // Iterate through Customer table CREATE ttCustomer. // Create the temp-table record BUFFER-COPY Customer TO ttCustomer. // Copy database record into temp-table record DISPLAY ttCustomer. END. /* return the temp-table to the UI client */