|
Программирование >> Построение запросов sql
Возможно, результат будет достаточно естественным для пользователей представления Nach Information 15, которым известно условие представления, но те, кто работает с представлением Nach Information 20, обнаружат в теле результирующей таблицы 6 строк с измененными значениями полей Summa (с идентификаторами факта начисления 6, 21, 32, 34, 40, 50). В таблице NachSumma также будут изменены 6 записей. Случай 2. В определении представления Nach Information 20 содержится раздел WITH CHECK OPTION, а в определении Nach Information 15 раздел WITH CHECK OPTION отсутствует. В этом случае запрос U1 будет отвергнут системой (поскольку его выполнение нарушает условие представления Nach Information 20). Будет выдано следующее сообщение: Operation violates CHECK constraint on view or table NACH INFORMATION 20 . Но заметим, что такое поведение системы будет совершенно неожиданным и непонятным для тех пользователей базы данных, которым известно только определение представления Nach Information 15, поскольку запрос U1 явно не может нарушить видимое ими ограничение. С другой стороны, запрос U2 будет выполнен и по-прежнему приведет к опустошению представления Nach Information 15. Те, кто работает с представлением Nach Information 20, обнаружат в теле результирующей таблицы 6 строк с измененными значениями полей NachSum, как и в предыдущем случае (см. рис. 5.24). Случай 3. В определении представления Nach Information 20 раздел WITH CHECK OPTION отсутствует, а в определении Nach Information 15 содержится раздел WITH CHECK OPTION. Запрос U1 (увеличение размера начисления) будет успешно выполнен, поскольку он не противоречит локальным ограничениям представления NACH INFORMATION 15. После выполнения запроса U1 представление Nach Information 15 оказывается пустым. Его строки перестают удовлетворять условию представления Nach Information 20 и исчезают из него. Данные представления Nach Information 20 будут совпадать с данными, показанными на рис. 5.23 (случай 1). В таблице NachSumma также будут изменены 6 записей. Запрос U2 не будет работать (его выполнение не будет допущено условием проверки представления NACH INFORMATION 15). Случай 4. В определении представлений Nach Information 20 и Nach Information 15 содержится раздел WITH CHECK OPTION. В этом случае запрос U1 не будет выполнен, так как его выполнение нарушает условие проверки представления NACH INFORMATION 20, а запрос U2 не будет выполнен, так как его выполнение нарушает условие проверки представления NACH INFORMATION 15. Только в этом случае операции обновления будут выполняться корректно. Очевидный вывод из приведенного анализа заключается в том, что единственным способом обеспечить корректность выполнения операций обновления через представления (допускающие операции обновления) является включение в определение каждого имеющегося в БД представления предложения WITH CHECK OPTION. Контрольные вопросы 1. Какие запросы языка DML используются в SQL СУБД Firebird? 2. Как осуществляется добавление новых данных в таблицу с помощью однострочного запроса? 3. Как добавить в таблицу строки из другой таблицы? 4. Какие существуют ограничения на подзапрос, используемый в многострочном запросе INSERT? 5. Как осуществляется простое обновление данных в таблице БД? 6. Как могут использоваться подзапросы при обновлении данных? 7. Как построить запрос на обобщенное добавление и обновление данных средствами языка SQL? 8. Как выполнить обновление или вставку строк в одной таблице на основании данных другой таблицы? 9. Как выполнить простое удаление данных из таблицы БД? 10. Каким образом работает запрос на удаление данных с подзапросом? 11. В каком случае к представлению можно применять запросы DML? 12. Какие проблемы могут возникнуть, если при создании представления не использовалось предложение WITH CHECK OPTION? 6. Процедурный язык Эта глава посвящена изучению процедурного языка SQL, который предполагает расширение стандартного набора запросов, изученных в предыдущих главах, средой программирования. В СУБД Firebird существует возможность создания независимых исполняемых модулей, представленных разработчиками в виде исходных кодов. Такие коды выполняются полностью на сервере, возвращая при необходимости клиентскому приложению значения, полученные в результате выполнения. Язык, который предоставляет такую возможность для сервера Firebird, называется PSQL (процедурный SQL). Это простой, но мощный набор расширений языка SQL, которых нет в стандарте SQL2, но которые включены в стандарт языка SQL3. Такими расширениями являются триггеры и хранимые процедуры. В настоящей главе, прежде всего, рассмотрен ряд предварительных вопросов, относящихся к процедурному языку, без знания которых невозможно создавать и использовать триггеры и хранимые процедуры. Далее приведены особенности создания и работы с хранимыми процедурами и триггерами. Здесь же отдельно рассмотрен оператор EXECUTE BLOCK, который предоставляет возможность выполнения кода на PSQL без оформления именованной ХП. Такой фрагмент кода на PSQL подобен хранимой процедуре (может иметь входные и выходные параметры, результат работы идентичен результату ХП). 6.1. Основы разработки модулей на PSQL Процедурный язык Firebird - это язык программирования, используемый для написания хранимых процедур и триггеров в СУБД Firebird. Он может включать стандартные запросы SQL, а также расширения языка SQL. Расширения языка PSQL в Firebird включают следующие языковые элементы: - объявление и инициализация локальных переменных, оператор присваивания; - условные операторы (оператор ветвления и оператор цикла); - явный и неявный курсоры для выполнения цикла при просмотре строк; - генератор последовательности целых значений; - генерация сообщения об исключительной ситуации и прерывание выполнения кода триггера или хранимой процедуры; - оператор EXECUTE STATEMENT для выполнения запросов DML и DDL в модуле. Существует следующий ряд ограничений языка для кодов в модулях PSQL: - запросы языка определения данных (DDL) не разрешены в PSQL (передача DDL-запроса возможна только с помощью EXECUTE STATEMENT); - команды управления транзакциями недопустимы в PSQL, потому что хранимые процедуры и триггеры всегда выполняются в контексте существующей клиентской транзакции, а Firebird не поддерживает вложенные транзакции. 6.1.1. Переменные В модулях на PSQL может быть использовано четыре типа переменных, причем возможность использования конкретной переменной определяется тем, является ли модуль хранимой процедурой или триггером. Различают локальные переменные, контекстные переменные, входные параметры и выходные параметры. Локальные переменные используются для хранения значений как в ХП, так и в триггерах. Объявление локальной переменной в теле триггера или хранимой процедуры осуществляется с помощью следующего оператора: DECLARE [VARIABLE] имя локальной переменной <тип переменной> [{ = DEFAULT} <значение>];,
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |