Объявление дескриптора
Дескриптор может быть объявлен следующими способами:
-
как идентификатор встроенного языка при первом использовании в исходном тексте модуля. В этом случае прекомпилятор автоматически создает переменную типа «дескриптор» (DESCRIPTOR) с данным именем, например:
EXEC SQL DESCRIBE INPUT my_statement INTO SQL DESCRIPTOR ‘DSI’; /* неявное объявление дескриптора в операторе SQL DESCRIBE. Перед исполнением этого оператора должен быть вызван оператор ALLOCATE DESCRIPTOR, т.к. оператор SQL DESCRIBE только лишь вводит переменную DSI в пространство имен встроенного языка */ EXEC SQL ALLOCATE DESCRIPTOR tabl_desc WITH MAX 12; /* неявное задание имени дескриптора при его инициализации */
-
как переменная основного языка типа «дескриптор» DESCRIPTOR в секции объявлений переменных основного языка:
< объявление дескриптора >::= DESCRIPTOR < имя дескриптора >;
В этом случае дескриптор также должен быть перед использованием инициализирован с помощью оператора ALLOCATE DESCRIPTOR, например:
EXEC SQL BEGIN DECLARE SECTION; DESCRIPTOR update_desc; /* объявление дескрипторной переменной */ EXEC SQL END DECLARE SECTION; EXEC SQL ALLOCATE DESCRIPTOR :update_desc; /* инициализировали дескриптор */ EXEC SQL DESCRIBE INPUT ST INTO SQL DESCRIPTOR :update_desc; /* получили описание входных переменных предложения ST */
-
как переменные – указатели на тип t_sqlda (см. приложение 1) и использование конструкций SQL DESCRIBE BIND VARIABLES, SQL DESCRIBE SELECT LIST.
Примечание
Такой стиль строго не рекомендуется, т.к. является устаревшим и оставлен только для совместимости со старыми версиями прекомпилятора.
В этом случае объявление должно выполняться вне секции объявлений встроенного SQL. Этот тип описан в sqlda.h. Таким образом, sqlda.h должен быть включен в текст программы с помощью директивы EXEC SQL INCLUDE SQLDA.
Например:
EXEC SQL INCLUDE SQLDA; int main(int argc, char * argv[]) { t_sqlda *bind_dp = sqlald(12,67,67); t_sqlda *select_dp = sqlald(12,67,67); … /* Получение описания входных параметров предложения. Здесь переменная bind_dp – переменная */ /* основного языка. Причем при претрансляции не проводится проверка на ее видимость */ EXEC SQL DESCRIBE BIND VARIABLES FOR my_statement INTO bind_dp; /* Получение описания выходных параметров предложения */ EXEC SQL DESCRIBE SELECT LIST FOR my_statement INTO select_dp; … }