Способы передачи параметров во встроенном SQL
1) Переменные HOST-языка
Это простейший способ, основанный на применении раздела USING оператора EXECUTE. Число и типы данных переменных должны быть совместимы с типами данных соответствующих параметров. Если какая-нибудь переменная содержит отрицательное значение, то соответствующему маркеру параметра присваивается NULL-значение.
2) Дескрипторы СУБД
• Понятие дескриптора
Дескриптор представляет собой структуру, принадлежащую программному обеспечению СУБД. Она включает набор элементов данных, разделенных на две части. Первая часть определяет общее число элементов данных, а вторая часть описывает каждый элемент данных, состоит из 13 полей и повторяется для каждого элемента данных.
• Фиксированная часть структуры
Фиксированная часть описывает число передаваемых элементов. Для этого предназначено поле COUNT.
• Переменная часть структуры
TYPE | Тип данных элемента |
LENGTH | Длина элемента |
OCTET_LENGTH | Длина элементы (в виде количества восьмибитовых наборов) |
RETURNED_LENGTH | Длина возвращаемого элемента данных |
RETURNED_OCTED_LENGTH | Длина возвращаемых данных (в виде числа восьмибитовых наборов) |
PRECISION | Точность элемента данных |
SCALE | Показатель степени числового элемента данных |
DATETIME_INTERVAL_CODE | Код интервала времени |
DATETIME_INTERVAL_PRESITION | Точность интервала времени |
NULLABLE | Указывает, может ли элемент принимать значение NULL (1|0) |
INDICATOR | Указывает, содержит ли элемент данных значение NULL |
DATA | Сам элемент |
NAME | Имя элемента данных |
UNNAMED | Указывает, отсутствует ли у элемента данных имя |
• Коды типов данных
Тип данных | Код |
BIT | 14 |
FLOAT | 6 |
BIT VARYING | 15 |
INTEGER | 4 |
CHARACTER | 1 |
INTERVAL | 10 |
CHARACTER VARYING | 12 |
NUMERIC | 2 |
DATE, TIME или TIMESTAMP | 9 |
REAL | 7 |
DECIMAL | 3 |
SMALLINT | 5 |
DOUBLE PRICISION | 8 |
Тип, зависящий от реализации | <0 |
• Операторы работы с дескрипторами
• Создание области дескрипторов
ALLOCATE DESCRIPTOR <имя дескриптора> [WITH MAX <число элементов>]
• Удаление области дескрипторов
DEALLOCATE DESCRIPTOR <имя дескриптора>
• Связывание дескриптора с SQL-оператором
DESCRIBE [INPUT|OUTPUT]
USING SQL DESCRIPTOR <имя дескриптора>
• Помещение данных в дескриптор
SET DESCRIPTOR [GLOBAL|LOCAL] <имя дескриптора> {COUNT=<целое>|VALUE <номер элемента> <поле дескриптора = значение, ...>}
• Извлечение данных из дескриптора
GET DESCRIPTOR <имя дескриптора> {<переменная>=COUNT|VALUE <номер элемента> <переменная = поле дескриптора, ...>}
• Пример работы с дескриптором
exec sql allocate descriptor parmdesc with max :parment;
exec sql describe querystmt using sql descriptor
parmdesc;
exec sql set descriptor parmdesc value (:i+1)
type=:typecode;
exec sql set descriptor parmdesc value (:i+1)
length=:length;
Примечания: parmdesc – имя дескриптора; querystmt – имя оператора, подлежащего исполнению.
3) Область SQLDA в DB2
• Назначение области SQLDA
В СУБД DB2 для передачи параметров используется специальная структура данных, называемая областью данных SQL (SQLDA). Эта область описывается на HOST-языке и используется тогда, когда во время написания программы неизвестны ни число параметров, ни их типы данных. Область SQLDA позволяет выполнять функции передачи параметров довольно гибко, однако она обладает рядом недостатков. Поскольку эта структура низкого уровня, то весьма специфична для каждого языка программирования. Трудно ее использовать в языке Fortran.
• Особенности области SQLDA
SQLDA – это структура данных переменной длины, состоящая из двух частей:
— Постоянной части, располагаемой в начале области SQLDA. Ее поля идентифицируют структуру данных как область SQLDA и задают размер конкретной области.
— Переменной части, представляющей собой массив из одной или нескольких структур данных SQLVAR. Структура SQLVAR хотя и отличается от дескриптора, однако идем используются аналогичные.