Компиляция программы на Embedded SQL
Так как внедренная программа SQL содержит сочетание инструкций SQL и языка узла, его невозможно отправить непосредственно компилятору на хост-языке. Вместо этого он компилируется с помощью многоэтапного процесса. Хотя этот процесс отличается от продукта к продукту, шаги примерно одинаковы для всех продуктов.
На этом рисунке показаны шаги, необходимые для компиляции внедренной программы SQL.
Пять шагов участвуют в компиляции внедренной программы SQL:
Внедренная программа SQL отправляется в прекомпилатор SQL, средство программирования. Предварительная компиляция сканирует программу, находит внедренные инструкции SQL и обрабатывает их. Для каждого языка программирования, поддерживаемого СУБД, требуется другой предварительной компиляции. Продукты СУБД обычно предлагают предварительные компиляции для одного или нескольких языков, включая C, Pascal, COBOL, Фортран, Ada, PL/I и различные языки сборки.
Прекомпилатор создает два выходных файла. Первый файл — это исходный файл, отрезаемый от внедренных инструкций SQL. На их месте прекомпилатор заменяет вызовы собственных подпрограмм СУБД, которые обеспечивают связь во время выполнения между программой и СУБД. Как правило, имена и вызывающие последовательности этих подпрограмм известны только предварительной компиляции и СУБД; они не являются общедоступным интерфейсом для СУБД. Второй файл — это копия всех внедренных инструкций SQL, используемых в программе. Этот файл иногда называется модулем запроса базы данных или DBRM.
Выходные данные исходного файла из предварительной компиляции передаются стандартному компилятору для языка программирования узла (например, компилятора C или COBOL). Компилятор обрабатывает исходный код и создает код объекта в качестве выходных данных. Обратите внимание, что этот шаг не связан с СУБД или с SQL.
Компоновщик принимает модули объектов, созданные компилятором, связывает их с различными подпрограммами библиотеки и создает исполняемую программу. Подпрограммы библиотеки, связанные с исполняемой программой, включают собственные подпрограммы СУБД, описанные на шаге 2.
Модуль запроса базы данных, созданный предварительной компиляцией, отправляется в специальную программу привязки. Эта программа проверяет инструкции SQL, анализирует, проверяет и оптимизирует их, а затем создает план доступа для каждой инструкции. Результатом является объединенный план доступа для всей программы, представляющий исполняемую версию внедренных инструкций SQL. Служебная программа привязки хранит план в базе данных, обычно присваивая ему имя программы приложения, которая будет использовать ее. Независимо от того, выполняется ли этот шаг во время компиляции или во время выполнения, зависит от СУБД.
Обратите внимание, что шаги, используемые для компиляции внедренной программы SQL, тесно связаны с инструкциями, описанными ранее в процессе обработки инструкции SQL. В частности, обратите внимание, что предварительная компиляция отделяет инструкции SQL от кода языка узла, а служебная программа привязки анализирует и проверяет инструкции SQL и создает планы доступа. В DBMSs, где шаг 5 происходит во время компиляции, первые четыре шага обработки инструкции SQL происходят во время компиляции, а последний шаг (выполнение) происходит во время выполнения. Это влияет на выполнение запросов в таких СУБД очень быстро.