Мартин Грубер - Понимание SQL (991940), страница 45
Текст из файла (страница 45)
Сделайте запрос каталога чтобы выяснить, сколько синонимов существует для каждой таблицы в базе данных. Не забудьте, что один и тот же синоним принадлежащий двум различным пользователям — это фактически два разных синонима.3. Выясните сколько таблиц имеют индексы в более чем пятьдесяти процентов ихстолбцов.(См. Приложение A для ответов.)25ИСПОЛЬЗОВАНИЕ SQL СДРУГИМ ЯЗЫКОМ(ВЛОЖЕННЫЙ SQL)В ЭТОЙ ГЛАВЕ ВЫ УЗНАЕТЕ КАК SQL ИСПОЛЬЗУЕТСЯ для расширения программ написанных на других языках.
Хотя непроцедурность языка SQL делает егоочень мощным, в то же время это накладывает на него большое число ограничений.Чтобы преодолеть эти ограничения, вы можете включать SQL в программы написанные на том или другом процедурном языке (имеющем определенный алгоритм). Длянаших примеров, мы выбрали Паскаль, считая что этот язык наиболее прост в понимании для начинающих, и еще потому, что Паскаль — один из языков, для которыхANSI имеет полуофициальный стандарт.ЧТО ТАКОЕ ВЛОЖЕНИЕ SQLЧтобы вложить SQL в другой язык, вы должны использовать пакет программ, который бы обеспечивал поддержку вложения SQL в этот язык и конечно же, поддержкусамого языка. Естественно, вы должны быть знакомы с языком, который вы используете.
Главным образом, вы будете использовать команды SQL для работы в таблицах базы данных, передачи результатов вывода в программу и получения ввода изпрограммы в которую они вкладываются, обобщенно ссылаясь к главной программе(которая может или не может принимать их из диалога или посылать обратно в диалог пользователя и программы).ЗАЧЕМ ВКЛАДЫВАТЬ SQL?Хотя и мы потратили некоторое время на то чтобы показать что умеет делатьSQL, но если вы — опытный программист, вы вероятно отметили, что сам по себе, онне очень полезен при написании программ.Самое очевидное ограничение — это то, что в то время как SQL может сразувыполнить пакет команды, интерактивный SQL в основном выполняет по одной команде в каждый момент времени.Типы логических конструкций типа if ...
then ("если ... то"), for ... do ("для ... выполнить") и while ... repeat ("пока ... повторять") — используемых для структурбольшинства компьютерных программ, здесь отсутствуют, так что вы не сможете принять решение — выполнять ли, как выполнять, или как долго выполнять одно действие в результате другого действия. Кроме того, интерактивный SQL не может делатьмногого со значениями, кроме ввода их в таблицу, размещения или распределения ихс помощью запросов, и конечно вывода их на какое-то устройство.Более традиционные языки, однако, сильны именно в этих областях.
Они разработаны так, чтобы программист мог начинать обработку данных, и основываясь на еерезультатах, решать, делать ли это действие или другое, или же повторять действиедо тех пор, пока не встретится некоторое условие, создавая логические маршруты ициклы. Значения сохраняются в переменных, которые могут использоваться и изменяться с помощью любого числа команд.
Это дает вам возможность указывать пользователям на ввод или вывод этих команд из файла, и возможность форматироватьвывод сложными способами (например, преобразовывать числовые данные в диаграммы).Цель вложенного SQL состоит в том, чтобы объединить эти возможности, позволяющие вам создавать сложные процедурные программы, которые адресуют базуданных посредством SQL — позволяя вам устранить сложные действия в таблицах напроцедурном языке, который не ориентирован на такую структуру данных, в тожевремя поддерживая структурную строгость процедурного языка.КАК ДЕЛАЮТСЯ ВЛОЖЕНИЯ SQLКоманды SQL помещаются в исходный текст главной программы, которой предшествует фраза — EXEC SQL (EXECute SQL).
Далее устанавливаются некоторые команды, которые являются специальными для вложенной формы SQL и которые будутпредставлены в этой главе.Строго говоря, стандарт ANSI не поддерживает вложенный SQL как таковой. Онподдерживает понятие, называемое — модуль, который более точно, является вызываемым набором процедур SQL, а не вложением в другой язык.
Официальное определение синтаксиса вложения SQL, будет включать расширение официальногосинтаксиса каждого языка в который может вкладываться SQL, что весьма долгая инеблагодарная задача, которую ANSI избегает. Однако, ANSI обеспечивает четыреприложения (не являющиеся частью стандарта), которые определяют синтаксис вложения SQL для четырех языков: КОБОЛ, ПАСКАЛЬ, ФОРТРАН, и ПЛ/1. Язык C — также широко поддерживается как и другие языки.
Когда вы вставляете команды SQL втекст программы, написанной на другом языке, вы должны выполнить предкомпиляцию прежде, чем вы окончательно ее скомпилируете.Программа, называемая прекомпилятором (или препроцессором), будет просматривать текст вашей программы и преобразовывать команды SQL в форму, удобную для использования базовым языком. Затем вы используете обычный транслятор,чтобы преобразовывать программу из исходного текста в выполняемый код.Согласно подходу к модульному языку определенному ANSI, основная программа вызывает процедуры SQL.
Процедуры выбирают параметры из главной программы и возвращают уже обработанные значения обратно в основную программу.Модуль может содержать любое число процедур, каждая из которых состоит из одиночной команды SQL. Идея в том, чтобы процедуры могли работать тем же самымспособом, что и процедуры на языке, в который они были вложены (хотя модуль ещедолжен идентифицировать базовый язык из-за различий в типах данных различныхязыков). Реализации могут удовлетворить стандарту, выполнив вложение SQL такимспособом, как если бы модули уже были точно определены. Для этой цели прекомпилятор будет создавать модуль, называемый модулем доступа. Только один модуль,содержащий любое число процедур SQL, может существовать для данной программы.
Размещение операторов SQL непосредственно в главном коде происходит болеепросто и более практично, чем непосредственно создание самих модулей.Каждая из программ, использующих вложение SQL, связана с ID доступа вовремя ее выполнения. ID доступа, связанный с программой, должен иметь все привилегии, чтобы выполнять операции SQL, выполняемые в программе. Вообще то, вложенная программа SQL регистрируется в базе данных, также как и пользователь,выполняющий программу. Более подробно, это определяет проектировщик, но вероятно было бы неплохо для включить в вашу программу команду CONNECT или ей подобную.ИСПОЛЬЗОВАНИЕ ПЕРЕМЕННЫХ ОСНОВНОГО ЯЗЫКА ВSQLОсновной способ которым SQL и части базового языка ваших программ будутсвязываться друг с другом — это с помощью значений переменных. Естественно, чторазные языки распознают различные типы данных для переменных.
ANSI определяетэквиваленты SQL для четырех базовых языков — ПЛ/1, Паскаль, КОБОЛ, и ФОРТРАН;все это подробности описаны в Приложении B. Эквиваленты для других языков — определяет проектировщик.Имейте в виду, что типы, такие как DATE, не распознаются ANSI; и следовательно никаких эквивалентных типов данных для базовых языков не существуют в стандарте ANSI.
Более сложные типы данных базового языка, такие как матрицы, неимеют эквивалентов в SQL. Вы можете использовать переменные из главной программы во вложенных операторах SQL везде, где вы будете использовать выражениязначений. (SQL, используемый в этой главе, будет пониматься как к вложенный SQL,до тех пор пока это не будет оговорено особо.)Текущим значением переменной, может быть значение, используемое в команде.
Главные переменные должны * быть обьявленными в SQL DECLARE SESSION (РАЗДЕЛ ОБЪЯВЛЕНИЙ), который будет описан далее.* иметь совместимый тип данных с их функциями в команде SQL (например, числовой тип, если они вставляется в числовое поле)* быть назначеными значению во время их использования в команде SQL, есликоманда SQL самостоятельно не может сделать назначение.* предшествовать двоеточию (:) когда они упоминаются в команде SQLТак как главные переменные отличаются от имен столбцов SQL наличием у нихдвоеточия, вы можете использовать переменные с теми же самыми именами, что иваши столбцы, если это конечно нужно.Предположим что вы имеете четыре переменных в вашей программе, с именами: id_num, salesperson, loc и comm.