Оформить и купить диплом на бланке ГОЗНАК без предоплаты

Вложенный SQL

Вложенный SQL полезен для передачи результатов вывода из таблиц базы данных в программу и для ввода в таблицы из программы. Сам язык SQL не является языком программирования, так как не может описать последовательность процедур для достижения цели. Традиционный язык программирования может описать как обработку данных, так и принятие решения, основанное на результатах обработки. Применяя встроенный SQL можно изменять последовательность команд SQL в зависимости от результатов запросов и  форматировать вывод сложными способами ( например, преобразовывать числа в графики ).

Стандарт ANSI не поддерживает вложенный SQL. В стандарте есть только  понятие, называемое "модуль", которое обозначает вызываемый набор процедур SQL. Однако ANSI создало четыре документа (не являющиеся частью стандарта ), которые определяют синтаксис вложения SQL для четырех языков: КОБОЛ, ПАСКАЛЬ, ФОРТРАН и ПЛ/1.

Команды SQL помещаются в текст главной программы и им предшествует фраза EXEC SQL ( EXECute SQL ). Текст программы, написанной на другом языке, должен пройти предкомпиляцию. Программа-прекомпилятор (препроцессор) просматривает текст программы и преобразует команды SQL в вызов библиотечных процедур. Затем используется обычный транслятор,  преобразующий программу в выполняемый код.

Все переменные, на которые имеется ссылка в предложениях SQL, должны сначала быть объявлены в секции SQL DECLARE SECTION перед использованием переменных. Секция должна начинаться и заканчиваться командами BEGIN DECLARE SECTION и END DECLARE SECTION, которым должно предшествовать EXEC SQL.

Когда глобальные переменные применяются в команде SQL, они должны иметь предшествующее двоеточие (:).

Например, чтобы ввести переменные id и person в программу на ПАСКАЛЕ, необходимо следующее объявление:

 

EXEC SQL BEGIN DECLARE SECTION;

Var

id-num:       integer;

pers:  packed array (1 . .10) ot char;

EXEC SQL END DECLARE SECTION;

 

 Команда SQL в программе может иметь следующий вид:

EXEC SQL INSERT INTO Students VALUES ( :id, :pers);

Текущие значения переменных id и person будут помещены в таблицу.

В конце команды точка с запятой должна отсутствовать для ФОРТРАНА, а для КОБОЛА должна быть заменена на слово END-EXEC.

В приведенном ниже фрагменте программы на ПАСКАЛЕ значения переменных считываются из файла в цикле и заносятся в базу данных:

 

         while not end_of_file(input) do

           begin

               readln (id, pers);

               EXEC SOL INSERT INTO Salespeople VALUES (:id, :pers);

           end;

 

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

Например:

EXEC SQL SELECT id, person

INTO :id, :pers

FROM Students WHERE id >= 100;

 

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

Курсор – это переменная типа связанного списка. Значением этой переменной служит одна из строк, выведенных при запросе.

Курсор должен быть объявлен до использования командой DECLARE CURSOR следующим образом:

EXEC SQL DECLARE CURSOR stud FOR

SELECT * FROM СТУДЕНТ WHERE Город = 'Санкт-Петербург';

Запрос не выполнится немедленно; он только определяется.

В том месте программы, где нужно выполнить запрос, курсор открывается с помощью следующей команды:

EXEC SQL OPEN CURSOR stud;

В этот момент курсор получает значение. Затем используется команда FETCH для извлечения значений курсора:

EXEC SQL FETCH stud INTO :id, :pers;

Для вывода всех значений используется цикл. Условие выхода из цикла следует формировать на основе свойства команды FETCH: если  нет больше строк, то выводятся последние значения переменных в предложении INTO. Можно не выводить сразу все значения курсора, так как при повторном обращении к нему вывод продолжается с последнего места.

После использования значений курсора его следует закрыть для экономии памяти командой EXEC SQL CLOSE CURSOR. Например:

EXEC SQL CLOSE CURSOR stud;

В зависимости от стадии использования курсора его называют объявленным, открытым или закрытым. Курсор может быть модифицируемым или “только для чтения”. Модифицируемый курсор не может использоваться с предложениями ORDER BY или UNION.

С целью упрощения взаимодействия с командами SQL во вложенном SQL имеется особая переменная SQLCODE ( SQLCOD в ФОРТРАНе ) и флаги SQLERROR и NOT FOUND. Значение SQLCODE устанавливается каждый раз, когда выполняется команда SQL.

Значения переменной SQLCODE:

SQLCODE = 100.     Установлен флаг NOT FOUND – команда выполнена без ошибки, но не произвела никакого действия.

SQLCODE = 0.         Команда выполнена нормально и результат не пустой.

SQLCODE < 0.         Установлен флаг SQLERROR – команда сгенерировала ошибку.

Анализ значения SQLCODE делается с помощью предложения WHENEVER. Например:

EXEC SQL WHENEVER SQLERROR GOTO Err_handler;

EXEC SQL WHENEVER NOT FOUND CONTINUE;

Здесь использованы предложения GOTO и CONTINUE вложенного SQL, аналогичные соответствующим выражениям языков программирования.

Область действия курсора для выполнения команды UPDATE на определенных столбцах может быть ограничена с помощью заключительной фразы определения курсора:

FOR UPDATE OF <перечень_столбцов>.

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

Переменная типа indicator объявляется в секции объявлений SQL и должна иметь тип главного языка, который соответствует числовому типу в SQL. В тексте запроса переменная типа indicator присоединяется к имени переменной, которая может получить NULL-значение, вслед за именем  без пробела. Для лучшей читаемости текста разрешается вставлять слово INDICATOR между обоими именами. Напомним, что перед каждым именем еще имеется двоеточие как признак переменной SQL.

Сопровождающая переменная типа indicator в процессе выполнения команды SELECT сначала получает значение 0, а затем если сопровождаемая переменная получает NULL-значение, переустанавливается на  отрицательное значение. Анализ значения переменной типа indicator позволяет узнать, получила ли сопровождаемая переменная NULL-значение.

Переменная типа indicator также используется для назначения значения NULL. Она добавляется к имени сопровождаемой переменной в команде UPDATE или INSERT тем же способом, что и в команде SELECT. Если переменная типа indicator имеет отрицательное значение, в поле будет помещено значение NULL . Переменная типа indicator показывает также сокращение строки, если размер строковой переменной SQL недостаточен. Переменная типа indicator устанавливается в положительное значение, указывающее на длину отбрасываемой части строки.

В реализациях объектно-ориентированного языка программирования Си++ язык SQL поддерживается посредством особых классов и их методов. Например, в системе программирования Visual C++ фирмы MicroSoft класс CDatabase содержит средства для соединения с источником данных в виде базы данных, класс CRecordset  предназначен для перемещения курсора по списку выведенных строк, класс CRecordView позволяет визуализировать выведенные строки, а метод ExecuteSQL класса CDatabase служит для передачи серверу текстовой строки с SQL-запросом и т. д. Методы классов размещают в динамически-подключаемых библиотеках.

Средства системы программирования дополняются программными

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

Шагом в направлении стандартизации взаимодействия прикладных программ и программ-серверов баз данных служит ODBC (Open Database Connectivity) – интерфейс на уровне вызова процедур для взаимодействия с базой данных в архитектуре “клиент-сервер”.

Достоинством технологии ODBC является то, что не нужно вносить изменений в язык программирования; SQL-запросы подготавливаются и пересылаются как текстовые строки.