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).
|