|
Программирование >> Sql: полное руководство
main(} { exec sql include sqlca; exec sql begin declare section; int officenum; /* идентификатор офиса (вводит пользователь) */ char cityname[16]; /* полученное название города */ char regionname[11]; /* полученное название региона */ float targetval; /* полученный план */ float salesval; /* полученный объем продаж */ exec sql end declare section; /* Обработка ошибок */ exec sql whenever sqlerror goto query error; exec sql whenever not found goto bad number; /* Запросить у пользователя идентификатор офиса */ printf( Введите идентификатор офиса: ); scanf( %d , Sofficenum); /* Выполнить SQL-запрос */ exec sql select city, region, target, sales from offices where office = ;officenum into :cityname, :regionname, :targetval, isalesval; /* Вывести результаты */ printf( Город; %s\n , cityname); printf( Регион: %s\n , regionname); printf( План: %f\n , targetval); ptintf( Продажи: %f\n , salesval); exit(O); query error: printf( Ошибка SQL: %id\n , sqlca.sqlcode); exit(1); bad number: printf( Неправильный идентификатор офиса.\n ); exitd) ; Рис. 17.2. Типичная программа со встровии! SQL Не беспокойтесь, если программа покажется вам необычной или вы не сможете понять смысл некоторых инструкций, пока не прочитаете до конца настоящую главу. Один из недостатков встроенного SQL заключается в том, что исходный текст программы становится неоднородной смесью двух различных языков, что делает программу трудной для понимания без знания как SQL, так и базового языка. Другим недостатком встроенного SQL является то, что в нем используются конструкции, которых нет в интерактивном SQL; например, в данной программе присутствуют инструкция whenever и предложение into инструкции select. Компиляция прогроАлмы СО встроенным SQL Программа со встроенным SQL содержит смесь инструкций SQL и базового языка программирования, поэтому ее нельзя просто скомпилировать с помощью компилятора базового языка. Вместо этого программа проходит через многоэтапный процесс, схематически изображенный на рис. 17.3. На самом деле этот рисунок иллюстрирует процесс, применяемый в СУБД компании IBM (DB2, SQL/DS), однако во всех СУБД, поддерживающих встроенный SQL, применяется аналогичный алгоритм: 1 Исходная программа со встроенным SQL подается на вход препроцессора SQL, представляющего собой специальную утилиту. Препроцессор просматривает программу, находит в ней встроенные инструкции SQL и обрабатывает их. Для каждого языка программирования, поддерживаемого конкретной СУБД, требуется свой препроцессор. В коммерческие реляционные СУБД, как правило, входят препроцессоры для нескольких языков программирования, включая С, Pascal, COBOL, FORTRAN, Ada, PL/I и различные версии ассемблера. 2. Препроцессор создает на выходе два файла. Первый файл представляет собой исходный текст программы, из которого удалены встроенные инструкции SQL. Препроцессор заменяет их вызовами закрытых функций СУБД, обеспечивающих связь между программой и СУБД на этапе выполнения. Имена и соглащения о вызове этих функций известны только препроцессору и СУБД; они не являются открытым интерфейсом СУБД. Второй файл содержит копии всех инструкций SQL, встроенных в программу. Этот файл иногда называют модулем запросов к базе данных (Database Request Module - DBRM). 3. После препроцессора файл с исходным текстом программы компилируется стандартным компилятором базового языка программирования (например, компилятором С или COBOL). Компилятор преобразует исходный текст программы в объектный код. Обратите внимание: этот этап не имеет никакого отнощения ни к СУБД, ни к SQL. 4. Объектные модули, созданные компилятором, поступают на вход компоновщика. Он связывает их с различньгми библиотечными функциями и на выходе создает исполняемую программу. В число библиотечных функций, связанных с исполняемой программой, входят и закрытые функции СУБД, упомянутые в пункте 2. 5. Модуль запросов к базе данных, подготовленный препроцессором, передается в специальную утилиту BIND. Она исследует инструкции SQL, анализирует, проверяет, оптимизирует их и для каждой инструкции создает план выполнения. Результатом работы утилиты BIND является объединенный план выполнения для всех инструкций SQL, встроенных в программу. Он представляет собой выполняемую в СУБД версию встроенных инструкций SQL. Утилита BIND сохраняет этот план в базе данных и обычно присваивает ему имя прикладной программы, создавшей его. Следует отметить, что между процессом компиляции программы, представленным на рис. 17.3, и процессом выполнения инструкций SQL в СУБД, схематически изображенным на рис. 17.1, существует соответствие. В частности, препроцессор обычно вьшолняет синтаксический анализ инструкции (первый этап), а утилита BIND проверяет правильность инструкции, производит ее оптимизацию и создает план выполнения (второй, третий и четвертый этапы). Следовательно, когда применяется встроенный SQL, первые четыре этапа из числа представленных на рис. 17.1 выполняются во время компиляции. Только пятый этап - фактическая реализация плана - осуществляется во время выполнения. Таким образом, исходная программа встроенным SQL в процессе компиляции преобразуется в два исполняемых компонента: * исполняемая программа, которая хранится в виде файла того же формата, что и любая другая исполняемая программа; * исполняемый план, который хранится внутри базы данных в формате, необходимом для данной СУБД. Исходный текст программы, содержащий инструкции SQL (препроцессоэ) Исходный текст программы без инструкций SQL Модуль запросов к базе данных Компилятор Утилита BIND Объектный код Библиотека i I (Компоновщик) План выполнения Исполняемая профамма План выполнения База данных Рис ?Z3. ПроцвЬс ко т программы, использующей встроенный SQL Процесс компиляции программы со встроенным SQL может показаться странным; во всяком случае, он менее понятен, чем компиляция стандартной программы на С или COBOL. В большинстве случаев все этапы, представленные на рис. 17.3, выполняются с помошью одной управляющей процедуры, так что отдельные этапы будут скрыты от прикладного программиста. Но с точки зрения СУБД этот процесс имеет несколько основных преимуществ: Смешение инструкций SQL и языка программирования в исходном тексте программы является эффективным методом слияния двух языков. Базовый язык обеспечивает управление, блочную структуру, использование переменных и функций ввода/вывода, а SQL - только доступ к базе данных. Применение препроцессора означает, что трудоемкая работа по синтаксическому анализу и оптимизации может быть выполнена на этапе разработки. Полученная
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |