Разработка INTRANET приложений

         

Программирование на SQL


SQL используется в диалоговом и пакетном режимах. Диалоговый режим предполагает интерпретацию каждой конструкции и ее выполнение. Пакетный режим предполагает написание программ, реализующих обработку базы данных в прикладных интересах. Двухрежимное использование SQL очень удобно для предварительной интерактивной отладки программ и реализации окончательной версии приложения в виде более быстродействующей программы. Структура языка и его возможности в основном идентичны в обоих режимах.

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

Встроенный SQL предполагает использование некоторого основного языка программирования (например, С, Pascal, Ada, Cobol, Fortran, Assembler) и SQL-процессора. Реализация встроенного SQL регламентирована стандартом фирмы IBM для SQL-продуктов.

Текст программы состоит из произвольной смеси команд основного языка и команд SQL со специальным префиксом, например, ExecSQL. Структура SQL-предложений расширена для использования переменных основного языка в SQL-конструкциях.

SQL-процессор видоизменяет текст программы в соответствии с требованиями компилятора основного языка программирования. При этом в предусмотренной форме расставляются обращения к процедурам и функциям библиотеки, реализующей обработку SQL и основных функций СУБД. После компиляции программы и ее компоновки приложение представляет собой самостоятельный модуль.

Для работы препроцессора необходимо в каждой программе определять структуру используемых таблиц, например, с помощью конструкции CREATETABLE. Вводится дополнительная инструкция DECLARE, предоставляющая возможность ссылаться на описание таблицы из нескольких SQL-предложений в разрабатываемых программах. Структура такой инструкции аналогична CREATE, но содержит только информацию, необходимую для работы SQL-препроцессора.

Обработка ошибок во встроенном SQL выполняется на шаге компиляции и при выполнении. На шаге компиляции программы ошибки в SQL-предложениях выявляются препроцессором. При выполнении приложения код завершения каждого SQL-предложения содержится в специальной переменной основного языка программирования SQLCODE.

Для обработки ошибок времени выполнения предусмотрено специальное SQL-предложение WHENEVER, определяющее действия, которые необходимо предпринять при возникновении ошибочной ситуации.

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

Для получения значений многострочного запроса используется понятие курсора. Определение курсора с помощью DECLARECURSOR заключается в связывании имени курсора с определенным запросом - SELECT-предложением. Затем курсор открывается с помощью OPEN-предложения, с которым можно ассоциировать позиционирование к первой строке таблицы-результата. Предложение FЕTCH позволяет считать строку таблицы в указанные основные переменные и перейти к следующей строке. Это предложение выполняется в цикле до достижения конца таблицы-результата. При возникновении ситуации WHENEVERNOTFOUND необходимо закрыть курсор с помощью CLOSE.

Понятие курсора и текущей строки таблицы используется и для операций позиционированного обновления и удаления строк. В этом случае UPDATE и DELETE выполняются для текущей строки таблицы, с которой связан указанный курсор.

Язык структурированных запросов SQL является непроцедурным языком, ориентированным на работу с БД, и не содержит средств традиционных алгоритмических средств для описания логики приложения. Инструментарий для реляционных СУБД может включать алгоритмические процедурные расширения, оформленные в виде самостоятельных языков и соответствующих интерпретаторов и компиляторов. Примером такого языка является PL/SQL для СУБД Oracle.

OraclePL/SQL вводит следующие процедурные возможности для SQL:


  • операторы объявления и вызова процедурных модулей;
  • блочные конструкции BEGIN-END для операторов;
  • управляющие операторы:


  • IF-THEN-ELSE,
  • EXIT,
  • GOTO;


  • операторы циклов:


    • FOR-LOOP,
    • WHILE-LOOP;


    • операторы объявления переменных;
    • оператор присваивания с арифметическими выражениями.


    • Язык PL/ SQL широко используется при работе с различными программными продуктами Oracle:


      • при организации хранимых процедур сервера БД Oracle;
      • блоки PL/SQL применяются в генераторах OracleForms и Reports;
      • блоки применяются также во встроенных SQL для языков 3GL (например, в Pro*C).


      Механизм PL/SQLEngine встраивается в различные компоненты и обеспечивает распознавание операторов и конструкций SQL и PL/SQL в смешанном потоке предложений. Конструкции и операторы PL/SQL исполняются внутри интерпретатора. Обнаруженный оператор SQL передается серверу БД, где производится его синтаксический разбор, связывание со значениями переменных, компиляция и выполнение запроса к БД.

      Блоки и модули PL/SQL могут быть частично откомпилированы, что обеспечивает повышение скорости выполнения хранимых процедур и триггеров.


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