Язык запросов SQL

         

Встроенный SQL



Встроенный SQL

Самый распространенный метод сочетания SQL с процедурными языками называется встроенным SQL. Как понятно из названия, операторы SQL вставляются в нужные места процедурной программы. Естественно, внезапно появившись в программе, написанной, скажем, на языке С, оператор SQL может стать неприятным сюрпризом для компилятора. По этой причине программы, в которых имеется встроенный SQL, перед компиляцией или интерпретацией пропускают через препроцессор. О встроенном SQL-коде препроцессор предупреждается директивой EXEC SQL.

В качестве примера использования встроенного SQL рассмотрим программу, написанную на языке Рго*С фирмы Oracle, являющемся вариантом языка С. Программа получает доступ к таблице с данными сотрудников компании, предлагает пользователю ввести имя сотрудника, а затем выводит зарплату и комиссионные этого сотрудника. Затем она предлагает ввести новые данные по зарплате и комиссионным этого же сотрудника и обновляет этими данными таблицу.

EXEC SQL BEGIN DECLARE SECTION;

VARCHAR uid[20];

    VARCHAR pwd[20];

    VARCHAR ename[10];

    FLOAT salary, comm;

    SHORT salary_ind, comm_ind;

EXEC SQL END DECLARE SECTION;

main ()

{

    int sret;                             /* Возвращаемый код scanf */

    /* Регистрация */

    strcpy(uid.arr,"FRED");             /*Копировать имя пользователя */

    uid.len=strlen(uid.arr);



    strcpy(pwd.arr,"TOWER")    ;             */ Копировать пароль /*

    pwd.len=strlen(pwd.arr);

    EXED SQL WHENEVER SQLERROR STOP;

    EXED SQL WHENEVER NOT FOUND STOP;

EXEC SQL CONNECT :uid;

printf("Соединение с пользователем: percents \n",uid.arr);

    printf("Введите имя пользователя для обновления: ");

    scanf("percents",ename.arr);

    ename.len=strlen(ename.arr);

    EXEC SQL SELECT SALARY,COMM INTO :salary,:cornm

            FROM EMPLOY

            WHERE ENAME=:ename;

    printf("Сотрудник: percents оклад: percent6.2f комиссионные:

        percent6.2f \n",

            ename.arr, salary, comm);

    printf("Введите новый оклад: ");

    sret=scanf("percentf",&salary);

    salary_ind =0; /* Инициализировать индикатор */

    if (sret == EOF !! sret == 0)

        salary_ind =-1; /* Установить индикатор отсутствия ввода */

    printf("Введите новые комиссионные: ");

    sret=scanf("percentf",&comm);

    comm_ind =0; /* Инициализировать индикатор */

    if (sret == EOF !! sret == 0)

        comm_ind=-1; /* Установить индикатор отсутствия ввода */

    EXEC SQL UPDATE EMPLOY

            SET SALARY=:salary:salary_ind

            SET COMM=:comm:comm_ind

            WHERE ENAME=:ename;

printf("Данные сотрудника percents обновлены. \n",ename.arr);

    EXEC SQL COMMIT WORK;

    exit(0);

}

He надо быть экспертом по языку С, чтобы понять суть того, что и каким образом делает программа. Ниже приведена последовательность выполнения операторов.

  • SQL объявляет базовые переменные.
  • Язык С контролирует процедуру регистрации пользователя.
  • SQL активизирует обработку ошибок и соединяется с базой данных.
  • Язык С запрашивает у пользователя имя сотрудника, которое помещает в переменную rename.
  • Оператор SQL SELECT извлекает данные по зарплате и комиссионным указанного пользователя и сохраняет их в двух переменных базового языка, .salary и xomm.
  • Далее язык С выводит имя сотрудника, его зарплату и комиссионные, а затем требует ввести новые значения зарплаты и комиссионных. Он также проверяет, введены ли требуемые значения, и если нет, то устанавливает индикатор отсутствия ввода.
  • SQL обновляет данные в базе на основе новых значений.
  • Язык С отображает сообщение о завершении операции.
  • SQL завершает транзакцию, и С завершает выполнение программы.

Совет 2
Совет 2

Смешивать команды двух языков так, как это делается здесь, можно благодаря препроцессору. Он отделяет операторы SQL от команд базового языка, помещая эти операторы в отдельную внешнюю процедуру. Каждый оператор SQL заменяется вызовом соответствующей внешней процедуры. Теперь за свою работу может приниматься компилятор этого языка. Способ, с помощью которого операторы SQL будут передаваться базе данных, зависит от реализации. Но вы как разработчик ни о чем таком беспокоиться не должны. Этим займется препроцессор. Вам надо лишь позаботиться о базовых переменных и совместимости типов данных.



Содержание раздела