Цель лекции: показать основные возможности формирования запросов к базе данных из прикладных программ.
Основная работа с базой данных проводится с использованием прикладных программ, из которых и идут запросы к базам данных. В этом случае
Программный SQL предназначен для того, чтобы встраивать SQL-запросы в прикладную программу, написанную на одном из языков программирования. При этом возникают следующие вопросы:
Решение этих проблем частично описано в стандарте SQL.
Рассмотрим алгоритм выполнения SQL-запросов в интерактивном режиме работы. Легко видеть, что пользователь вынужден ожидать результатов выполнения запроса в течение всего времени работы реализации SQL-запроса. Если через некоторое время пользователю снова нужно будет выполнить тот же самый запрос, СУБД вновь проделает те же самые действия, что и при предыдущем обращении. Налицо некоторое несовершенство механизма:
Решение подобных проблем очевидно – часть действий по обработке запроса необходимо выполнять один раз, сохранять результат в некотором виде, а потом использовать столько раз, сколько необходимо. Эта идея является одной из основных идей программного SQL. Таким образом, программный SQL позволяет:
На настоящий момент используются три варианта встраивания запросов на
Основная особенность статического SQL определяется его названием: встраиваемые запросы должны быть четко определены на стадии написания прикладной программы, так как именно конкретный текст запросов вставляется в прикладную программу.
Рассмотрим два основных этапа, связанных с работой
Схема компиляции и сборки программы выглядит следующим образом (рис 13.1):
(рис 13.1) Схема компиляции программы с встроенными инструкциями статического SQLСхема выполнения программы выглядит следующим образом (рис 13.2.):
Программа запускается на выполнение обычным образом. При необходимости выполнить запрос программой осуществляется вызов специальной
(рис 13.2) Схема выполнения программы с встроенными инструкциями статического SQLДля реализации вышеуказанных схем
|
Спецификатор, указывающий, что следующая за ним инструкция является инструкцией |
; |
В языке C – признак окончания инструкции |
DECLARE TABLE |
Объявляет таблицу, которая потом будет использоваться в инструкциях |
SQLCODE |
Переменная для обработки ошибок |
SQLSTATE |
Переменная для обработки ошибок |
GET DIAGNOSTICS |
Инструкция для обработки ошибок |
WHENEVER SQLERROR SQLWARNING NOT FOUND GOTO CONTINUE |
Набор совместно используемых инструкций для упрощения обработки ошибок |
BEGIN DECLARE SECTION END DECLARE SECTION |
Инструкции для определения области, в которой будут объявлены переменные, впоследствии используемые в запросах SQL |
INTO |
Используется в операторе SELECT для указания переменной, в которую необходимо поместить результат выполнения запроса |
|
Курсор – специальный инструмент, предназначенный для обработки результатов запроса, содержащих более одной строки. Работа с курсором похожа на работу с файлами. Данная инструкция служит для создания курсора и связывания его с конкретным запросом |
OPEN |
Команда, открывающая курсор и побуждающая СУБД начать выполнение запроса. Устанавливает курсор перед первой строкой результата запроса |
FETCH |
Команда, перемещающая указатель текущей строки (курсор) на следующую строку. В некоторых СУБД и |
CLOSE |
Закрывает курсор и прекращает доступ к результатам запроса |
Использование описанной выше схемы компиляции/сборки/выполнения программы позволяет:
Однако статическая разновидность программного SQL имеет некоторые существенные ограничения. Так, переменные в запросах могут использоваться только в тех местах, где в запросах обычно стоят константы. Например, нельзя задавать имя таблицы, из которой производится выборка, а также названия столбцов, как параметр. В связи с этим при использовании статического варианта вложенного (программного) SQL необходимо на этапе написания программы точно знать состав запросов, которые необходимо будет выполнять в прикладной программе. Во многих случаях это ограничение является существенным. Для его устранения была введена новая разновидность программного SQL –
История возникновения
Напомним, что при использовании
Учитывая относительно низкую производительность
EXECUTE IMMEDIATE |
Немедленное выполнение инструкции |
PREPARE |
Подготовка инструкции к выполнению |
EXECUTE |
Выполнение подготовленной ранее инструкции |
|
Специальная команда, участвующая при возврате результата выполнения инструкций |
|
Разновидность инструкции PREPARE ) |
OPEN FETCH CLOSE |
Разновидности инструкций для работы с курсором в |
Рассмотрим схему функционирования
Одноэтапное выполнение инструкций осуществляется командой EXECUTE IMMEDIATE.
(рис 13.3) Схема выполнения программы со встроенными инструкциями динамического SQL с применением одноэтапной схемыСхема выполнения инструкции подразумевает:
Основные проблемы одноэтапной схемы заключаются в том, что она не позволяет выполнять инструкции SELECT (ибо нет средств для возврата в приложение результатов запроса) и приводит к нерациональному расходованию вычислительных ресурсов (т.к. при повторном выполнении той же инструкции вновь будет затрачено время на все те же действия по ее интерпретации и выполнению).
Двухэтапное выполнение инструкций основано на следующем соображении: скорее всего, команда
(рис 13.4) Схема выполнения программы со встроенными инструкциями динамического SQL с применением двухэтапной схемыНа этапе подготовки можно осуществить синтаксический анализ инструкции, интерпретировать ее и подготовиться к выполнению, выбрав
На этапе выполнения СУБД подставляет значения параметров (полученные из программы) и использует сформированный ранее
При этом реализуется идея однократного выполнения тех действий, которые можно выполнить один раз. Так, подготовленная один раз инструкция может быть выполнена десятки раз с разными параметрами.
Как замечено выше, программный SQL отличается от обычной, интерактивной формы наличием некоторых специальных инструкций, а также механизмом трансляции и выполнения запросов. Таким образом, для применения программного SQL в тексте своих программ программистам необходимо ознакомиться с некоторым специфическим набором инструкций. Стоит заметить, что в разных СУБД эти наборы инструкций, вообще говоря, могут несколько отличаться друг от друга. В результате возникает некоторая проблема, связанная с непереносимостью программы.
Наряду с описанным выше механизмом существует и активно применяется еще один подход, связанный с наличием специальных интерфейсов –
Применение подобного подхода приводит к тому, что программистам более не требуется изучать специальные наборы инструкций SQL, а необходимо лишь изучить специальную библиотеку функций. С учетом того, что механизм использования
Кроме этого, программа, содержащая вызовы некоторых функций специализированной библиотеки, ничем не отличается по схеме компиляции и выполнения от обычной программы. Так, подобная программа не требует применения специализированного препроцессора с механизмом раздельной компиляции. Может показаться, что подход, связанный с использованием библиотек
В данном разделе рассматривается подход, основанный на
Посмотрим, как работают прикладные программы, использующие различные
Из имеющихся для реализации SQL-запросов интерфейсов
].
Основной целью разработки протокола ODBC считается стандартизация механизмов взаимодействия с различными СУБД. Основная проблема, связанная с разработкой приложений, взаимодействующих с базами данных на основе специальных SQL API, состояла в том, что каждая СУБД имела собственный программный интерфейс доступа, каждый из них имел свои особенности и функционировал не совсем так, как другие. В связи с этим разработка приложения существенно зависела от используемой СУБД. Компания Microsoft сделала важный шаг для решения этой проблемы. Основная идея заключалась в разработке универсального интерфейса на уровне семейства операционных систем Windows, который мог бы быть поддержан в разных СУБД.
Рассмотрим кратко структуру программного обеспечения ODBC []:
Схема выполнения программы с использованием протокола ODBC для доступа к данным приводится на рис 13.5.
(рис 13.5) Схема выполнения программы с использованием протокола ODBC для доступа к даннымПеречень некоторых
| Назначение | Функция | Описание |
|---|---|---|
| Соединение с источником данных | SQLAlocEnv |
Получает указатель окружения. Одно окружение может служить для создания нескольких соединений. |
SQLAlIoc Connect |
Получает указатель соединения. | |
|
Соединяется с указанным драйвером, используя имя источника данных, идентификатор пользователя и пароль. | |
| Подготовка SQL запросов | SQLAllocStmt |
Размещает указатель выражения. |
SQLPrepare |
Подготавливает SQL выражение для дальнейшего использования. | |
SQLGet CursorName |
Возвращает имя, связанное c указателем выражения. | |
SQLSet CursorName |
Устанавливает имя курсора. | |
| Выполнение запросов | SQLExecute |
Выполняет заранее подготовленный запрос. |
SQLExec Direct |
Выполняет запрос. | |
| Выборка результатов и информации о результатах | SQLRow Count |
Возвращает количество записей, задействованных в операциях вставки, удаления, модификации. |
SQLNum ResultCol |
Возвращает количество колонок в выбранном наборе данных. | |
SQLDescribe Col |
Описывает колонку в выбранном наборе данных. | |
SQLCol Attributes |
Описывает атрибуты колонки в выбранном наборе данных. | |
SQLBindCol |
Присваивает место в памяти для колонки в выбранном наборе данных и указывает ее тип данных. | |
SQLFetch |
Возвращает несколько наборов данных. |
JDBC (Java Database Connectivity) представляет собой
Рассмотрим основные принципы JDBC.
С развитием глобальных сетей, в частности Интернета, и всех сопутствующих технологий стали появляться новые языки, специально предназначенные для работы в новых условиях. Одним из таких языков является
Известно несколько различных версий JDBC. Так, версия 1.0 содержала некоторые средства доступа к данным:
Этот перечень определенным образом напоминает аналогичный функциональный аппарат протокола ODBC.
Версия JDBC 2.0 содержит существенные отличия. Так, вследствие увеличения возможностей интерфейса было проведено его идеологическое разделение на две основные части: Core API (основные возможности) и Extensions API (так называемые расширения).
В [] указаны следующие возможности JDBC:
Версия JDBC 3.0 появилась совсем недавно и содержит такие новации, как объектно-реляционные расширения SQL и улучшенные механизмы обработки транзакций. Архитектура JDBC берет свое начало от ODBC и в существенной части повторяет ее, поэтому схема выполнения программы на Java с использованием протокола JDBC для доступа к данным полностью аналогична схеме на рис 13.5 (слова ODBC заменяются на слова JDBC). В отличие от ODBC, драйверы JDBC подразделяются на четыре типа. Основные отличия между этими типами связаны с местонахождением API СУБД (на клиентской или серверной СУБД) и способом доступа к базе данных (через собственный API СУБД или через ODBC).
Библиотека DB-Library реализует
dblogin(); dbopen() – подключение к БД;dbopen(); dbexit() – установка/разрыв соединения с БД;dbcmd() – передача инструкции (пакета инструкций) SQL в СУБД в текстовом виде;dbSQLexec() – требование к СУБД выполнить текущий пакет инструкций;dbcancel() – прекращение выполнения пакета инструкций SQL;dbresults() – получение результатов выполнения очередной инструкции SQL в текущем пакете;dbbind(), dbdata(), dbnextrow(), dbnumcols(), dbdatlen() и др. – обработка результатов запросов на выборку данных.Логика работы прикладной программы, обрабатывающей данные, хранящиеся в базе данных под управлением Microsoft SQL Server, выглядит следующим образом:
dblogin(), dbopen() ) прикладная программа формирует сведение об авторизации и пытается установить соединение с СУБД;dbopen() );dbcmd() ) программа передает в СУБД текст SQL-инструкции, которую далее необходимо будет выполнить; в библиотеке DB-Library поддерживается так называемый пакетный режим работы. Данный режим подразумевает возможность создания пакетов инструкций. Так, вызывая функцию dbcmd() несколько раз, вы можете передать в СУБД текст нескольких команд SQL, которые впоследствии будут выполнены как одна команда;dbSQLexec(), программа вызывает выполнение инструкций, переданных ранее при помощи вызовов функций dbcmd() ;dbresults(), программа может определить, удалось ли СУБД выполнить очередную инструкцию (как правило, число вызовов dbresults() соответствует числу инструкций в очередном пакете);dbbind() осуществляет связывание каждого поля результатов запроса с некоторой областью оперативной памяти. Далее при помощи функции dbnextrow() программа выполняет переход к следующей строке результатов запроса, что приводит к помещению в буфер новых данных;dbexit() программа разрывает соединение с базой данных. Библиотека DB-Library представляет собой большой и сложный механизм. Так, в библиотеке предусмотрены специальные механизмы обработки ошибок, разные способы передачи результатов выполнения запросов в прикладную программу и т.д.Краткие итоги: В лекции рассматриваются разные технологии формирования запросов на
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.