4.4.5. Процедурные расширения языка SQL

 

Язык SQL позволяет создавать запросы высокой сложности, но на практике оказалась более простыми и востребованными иные решения. Как уже упомина­лось, стандарты SQL предполагают механизм курсоров, позволяющий получить построчный доступ к результатам запросов, т.е. фактически имеется навигацион­ная надстройка над SQL.

На практике этот механизм имеет смысл при наличие в языке операторов, позволяющие реализовывать различные алгоритмы обработки результатов запро­сов. Такие возможности, например, есть в языке PL (procedure language) SQL сре­ды FoxPro. Синтаксис дополнительных конструкций напоминает принятые в язы­ке Pascal.

Имеются и другие реализации. Так, в языке web-сценариев php (подробнее см. [20, 45]) sql-запросы играют вспомогательную роль, а обработка ведется уже средствами php. При этом могут использоваться, как «продвинутые» sql-запросы, так и их роль может быть сведена до минимума, в этом случае реализуется нави­гационный подход.

Пример. Реализация в php запроса «выдать фамилии преподавателей, полу­чающих зарплату более 15000 рублей». Используются таблицы БЫТЬ_СОТР и ПРЕПОДАВАТЕЛИ

A)   «Продвинутый» sql-запрос

$sql="select ФИО from ПРЕПОДАВАТЕЛИ, БЫТЬ_СОТР where (з/п>15000) AND (ПРЕПОДАВАТЕЛИ^=БЫТЬ_СОТР^_преп)"; $db->query($sql); //выполнить запрос

while ($db->next_record()) { //цикл по всем строкам результата запроса

$fio=db->f(^^'); //извлечение ФИО из очередной записи echo $fio."<br>"; //вывод фамилии в web-страницу

};

 

B)   Реализация с простыми запросами

$sql1="select id_преп from БЫТЬ_СОТР where з/п>15000"; $db1->query($sql1); //выполнить запрос

while ($db1->next_record()) { //цикл по строкам результата запроса $id_pr=db1->f('id_преп,); //извлечение id_преп из очередной записи $sql2="select ФИО from ПРЕПОДАВАТЕЛИ where id=$id_pr"; $db2->query($sql1); //выполнить запрос

while ($db2->next_record()) {//цикл по строкам результата запроса $fio=db1->f('fio'); //извлечение id_преп из очередной записи echo $fio."<br>"; //вывод фамилии в web-страницу

};

};

Примечание. Информацию об языке php можно посмотреть здесь [20, 45]. В то же время, для анализа примера не обязательно владеть навыками программирования на php, поскольку язык обладает C-подобным синтаксисом.

На самом деле, первый вариант эффективнее, т. к. требует меньше обраще­ний к БД. Обратим внимание, что возможно не только встраивание готовых SQL- операторов в надстройку (встраиваемый SQL), но и их генерация самим скриптом (динамический SQL).