- •Структурированный язык запросов sql. Оператор delete. Структура оператора и примеры использования. Примеры использования delete с вложенными подзапросами.
- •Структурированный язык запросов sql. Оператор insert. Структура оператора и примеры использования. Использование insert с вложенными подзапросами.
- •Структурированный язык запросов sql. Оператор update. Структура оператора и примеры использования. Использование update с вложенными подзапросами.
- •Выборка данных оператором select. Структура оператора и примеры использования. Способы задания отображаемых полей. Использование distinct. Выборка значений с упорядочиванием.
- •Использование фразы where в операторах sql. Способы задания логических выражений в sql. Операторы in, like, between. Использование значения null в логических выражениях.
- •7 Вложенные подзапросы. Типы вложенных подзапросов. Способы включения вложенных подзапросов. Примеры использования вложенных подзапросов с разными способами включения.
- •Создание таблиц
- •Пример создания таблиц
- •Модификация таблиц
- •Удаление таблиц
- •Создание представлений. Правила создания модифицируемых представлений. Достоинства и недостатки представлений. Особенности определения полей представлений. Примеры использования.
- •Хранимые процедуры InterBase. Виды хранимых процедур. Расширения языка sql для использования в хранимых процедурах. Примеры создания хранимых процедур и их вызова.
- •Расширения языка sql для использования в хранимых процедурах и триггерах. Циклы и ветвления. Обработка исключений и ошибок.
- •Генераторы InterBase. Создание генераторов. Установка значений генераторов. Получение значений генераторов из
- •Триггеры InterBase. Типы триггеров. Контекстные переменные. Примеры создания триггеров для автоинкрементных полей и протоколирования изменений.
- •17. Транзакции в InterBase. Механизм транзакций. Параметры транзакций. Уровни изоляции и способы их задания в InterBase. Управление транзакциями. Примеры использования.
- •18. Библиотека доступа InterBase eXpress. Основные компоненты. Подключение к базе данных InterBase и организация просмотра и модификации данных.
- •20.Особенности системы защиты данных в InterBase. Пользователи и роли: создание и удаление. Вида прав. Раздача
Хранимые процедуры InterBase. Виды хранимых процедур. Расширения языка sql для использования в хранимых процедурах. Примеры создания хранимых процедур и их вызова.
Хранимые процедуры
Хранимая процедура (ХП) - это часть метаданных базы данных, представляющая собой откомпилированную во внутреннее представление InterBase подпрограмму, написанную на специальном языке, компилятор которого встроен в ядро сервера InteiBase Хранимую процедуру можно вызывать из клиентских приложений, из триггеров и других хранимых процедур. Хранимая процедура выполняется внутри серверного процесса и может манипулировать данными в базе данных, а также возвращать вызвавшему ее клиенту (т е триггеру, ХП, приложению) результаты своего выполнения Основой мощных возможностей, заложенных в ХП, является процедурный язык программирования, имеющий в своем составе как модифицированные предложения обычного SQL, такие, как INSERT, UPDATE и SELECT, так и средства организации ветвлений и циклов (IF, WHILE), а также средства обработки ошибок и исключительных ситуаций Язык хранимых процедур позволяет реализовать сложные алгоритмы работы с данными, а благодаря ориентированности на работу с реляционными данными ХП получаются значительно компактнее аналогичных процедур на традиционных языках.
Пример простой хранимой процедуры
Синтаксис хранимых процедур описывается следующим образом: CREATE PROCEDURE name [ ( param datatype [, param datatype ...] ) ] [RETURNS ( param datatype [, param datatype ...])] AS <procedure_body>; < procedure_body> = [<vanable_declaration_list>] < block> < vanable_declaration_list> = DECLARE VARIABLE var datatype; [DECLARE VARIABLE var datatype; ...] <block> = BEGIN < compound_statement> [< compound_statement> ...] END < compound_statement> = (<block> statement;} Итак, вот пример очень простой хранимой процедуры, которая принимает на входе два числа, складывает их и возвращает полученный результат: CREATE PROCEDURE SP_Add(first_arg DOUBLE PRECISION, second_arg DOUBLE PRECISION) RETURNS (Result DOUBLE PRECISION) AS BEGIN Result=first_arg+second_arg; SUSPEND; END Как видите, все просто: после команды CREATE PROCEDURE указывается имя вновь создаваемой процедуры (которое должно быть уникальным в пределах базы данных) - в данном случае SP_Add, затем в скобках через запятую перечисляются входные параметры ХП - first_arg и second_arg - с указанием их типов. Список входных параметров является необязательной частью оператора CREATE PROCEDURE - бывают случаи, когда все данные для своей работы процедура получает посредством запросов к таблицам внутри тела процедуры.
В хранимых процедурах используются любые скалярные типы данных InteiBase He предусмотрено применение массивов и типов, определяемых пользователем, - доменов
Далее идет ключевое слово RETURNS, после которого в скобках перечисляются возвращаемые параметры с указанием их типов — в данном случае только один - Result. Если процедура не должна возвращать параметры, то слово RETURNS и список возвращаемых параметров отсутствуют. После RETURNSQ указано ключевое слово AS. До ключевого слова AS идет заголовок, а после него - течо процедуры. Тело хранимой процедуры представляет собой перечень описаний ее внутренних (локальных) переменных (если они есть, подробнее рассмотрим ниже), разделяемый точкой с запятой (;), и блок операторов, заключенный в операторные скобки BEGIN END. В данном случае тело ХП очень простое - мы просю складываем два входных аргумента и присваиваем их результат выходному, а затем вызываем команду SUSPEND. Чуть позже мы разъясним суть действия этой команды, а пока лишь отметим, что она нужна для передачи возвращаемых параметров туда, откуда была вызвана хранимая процедура.
Разделители в хранимых процедурах
Команда isql, изменяющая разделитель предложений SQL, выглядит так: SET TERM <new_term><old_term> Для типичного случая создания хранимой процедуры это выглядит так: SET TERM ^; CREATE PROCEDURE some_procedure ... . . END ^ SET TERM ;^
Вызов хранимой процедуры
Но вернемся к нашей хранимой процедуре. Теперь, когда она создана, ее надо как-то вызвать, передать ей параметры и получить возвращаемые результаты. Это сделать очень просто - достаточно написать SQL-запрос следующего вида: SELECT * FROM Sp_add(181.35, 23.09) Этот запрос вернет нам одну строку, содержащую всего одно поле Result, в котором будет находиться сумма чисел 181.35 и 23.09 т. е. 204.44. процедуры для определенного типа вызова.
То есть процедура-выборка специально создается для вызова из запроса SELECT, а исполняемая процедура - для вызова с использованием EXECUTE PROCEDURE. Давайте рассмотрим, в чем же заключаются отличия при проектировании этих двух видов ХП. Для того чтобы понять, как работает процедура-выборка, придется немного углубиться в теорию. Давайте представим себе обычный SQL-запрос вида SELECT ID, NAME FROM Table_example. В результате его выполнения мы получаем на выходе таблицу, состоящую из двух столбцов (ID и NAME) и некоторого количества строк (равного количеству строк в таблице Table_example). Возвращаемая в результате этого запроса таблица называется также набором данных SQL Задумаемся же, как формируется набор данных во время выполнения этого запроса Сервер, получив запрос, определяет, к каким таблицам он относится, затем выясняет, какое подмножество записей из этих таблиц необходимо включить в результат запроса. Далее сервер считывает каждую запись, удовлетворяющую результатам запроса, выбирает из нее нужные поля (в нашем случае это ID и NAME) и отсылает их клиенту. Затем процесс повторяется снова - и так для каждой отобранной записи. Все это отступление нужно для того, чтобы уважаемый читатель понял, что все наборы данных SQL формируются построчно, в том числе и в хранимых процедурах! И основное отличие процедур-выборок от исполняемых процедур в том, что первые спроектированы для возвращения множества строк, а вторые - только для одной. Поэтому они и применяются по-разному: процедура-выборка вызывается при помощи команды SELECT, которая "требует" от процедуры отдать все записи, которая она может вернуть. Исполняемая процедура вызывается с помощью EXECUTE PROCEDURE, которая "вынимает" из ХП только одну строку, а остальные (даже если они есть!) игнорирует. Давайте рассмотрим пример процедуры-выборки, чтобы было понятнее. Для > прощения создадим хранимую процедуру, которая работает точно так же, как запрос SELECT ID, NAME FROM Table_Example, т е она просто делает выборку полей ID и NAME из всей таблицы. Вот этот пример: CREATE PROCEDURE Simple_Select_SP RETURNS ( procID INTEGER, procNAME VARCHAR(80)) AS BEGIN FOR SELECT ID, NAME FROM table_example INTO :procID, :procNAME DO BEGIN SUSPEND; END END