Объявление дескриптора

 

Дескриптор может быть объявлен следующими способами:

  1. как идентификатор встроенного языка при первом использовании в исходном тексте модуля. В этом случае прекомпилятор автоматически создает переменную типа «дескриптор» (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; /* неявное задание имени дескриптора при его инициализации */
  2. как переменная основного языка типа «дескриптор» 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 */
  3. как переменные – указатели на тип 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;
    …
    }