|
Программирование >> Построение запросов sql
BEGIN EXECUTE STATEMENT SELECT MAX( :ColName ) FROM :TableName INTO :Maxim; END. Процедура SampleTwo определяет в указанной таблице БД максимальное значение в заданном столбце, имеющем числовой тип данных. Процедура может быть выполнена следующим запросом: EXECUTE PROCEDURE SampleTwo (Paysum,Paysumma);. Результат выполнения процедуры SampleTwo представлен на рис. 6.8. ------Procedure executing results; ...... MAXIM = Z50 Рис. 6.8. Результат выполнения процедуры SampleTwo Наконец, оператор EXECUTE STATEMENT поддерживает выполнение запроса SELECT внутри цикла FOR для возвращения в список переменных по одной строке за каждый проход цикла. Третья форма представлена следующим синтаксисом: FOR EXECUTE STATEMENT <строка> INTO :<имя переменной1> [, :<имя переменной2> < группа операторов >;. В данном случае <строка> может представлять собой запрос, возвращающий как одиночную строку данных, так и множество строк данных. Таким образом, любой запрос SELECT может быть использован в данной форме EXECUTE STATEMENT. Рассмотрим процедуру, в которой используется оператор EXECUTE STATEMENT в третье форме синтаксиса. Примером создания такой процедуры может быть следующий: CREATE PROCEDURE SampleThree (TextField VARCHAR(100), TableName VARCHAR(100)) RETURNS (Line VARCHAR(32000)) AS DECLARE VARIABLE OneLine VARCHAR(100); BEGIN Line = ; FOR EXECUTE STATEMENT SELECT :TextField FROM :TableName INTO :OneLine IF (OneLine IS NOT NULL) THEN Line = Line :OneLine , ; END. Данная процедура производит запись в одну строку через запятую всех значений заданного столбца из указанной таблицы. Процедура SampleThree может быть выполнена с помощью следующего запроса: EXECUTE PROCEDURE SampleThree(Fio,Abonent); Результат выполнения представлен на рис. 6.9. - racedofe execoting resolts:...... L№=АКСЕНОВ C.A., ШЩШ Е.В., ШтШ B.C., ШПОВА Ш., СВША З.А., СТАРОДУБЦЕВ Е.В., 1АШВ СВ., МАРКОВА В.П., ДЕНИСОВА К, ЛУШША P.M., 1УБША Т.П., Т101ШНА Н.Г, Рис. 6.9. Результат выполнения процедуры SampleThree Оператор EXECUTE STATEMENT добавляет гибкости модулям на PSQL, но с риском ошибок. Оператор EXECUTE STATEMENT следует применять только в случае невозможности получить нужные результаты другими средствами или (что мало вероятно) когда это действительно улучшает выполнение запроса. При использовании EXECUTE STATEMENT следует учесть следующие особенности: - во время компиляции синтаксический анализатор не может проверить синтаксис запроса в строке аргумента; - во время компиляции возвращаемые значения не проверяются на соответствие типов данных (например, строка 1234 может быть преобразована в целое число, а строка абв вызовет ошибку преобразования), поэтому они должны быть внимательно проверены разработчиком, чтобы избежать непредсказуемых исключений преобразования данных при последующем выполнении процедуры; - не проверяются зависимости или существование защиты для предотвращения удаления или изменения таблиц и столбцов; - операции EXECUTE STATEMENT выполняются медленно, потому что встроенный оператор должен подготавливаться на сервере каждый раз перед выполнением; - если ХП имеет специальные привилегии к некоторым объектам, то динамический оператор, выдаваемый в строке EXECUTE STATEMENT, не наследует их. Используются те привилегии, которые имеет пользователь, выполняющий процедуру. Следует учесть также, что невозможно подсчитать количество строк, возвращаемых выполненным в операторе EXECUTE STATEMENT запросом с помощью переменной ROWCOUNT. Контекстная переменная ROWCOUNT, использованная после EXECUTE STATEMENT, всегда возвращает ноль. 6.3. Триггеры Триггером называется особый вид хранимых процедур. В СУБД Firebird существует два вида триггеров: триггеры DML и триггеры БД. Триггеры DML исполняются СУБД автоматически при проведении операций изменения данных. Триггер DML фактически является обработчиком на событие изменения данных в базе. При создании такой триггер связывается с какой-то одной таблицей БД. Триггеры DML предоставляют возможность производить некоторые определяемые пользователем действия при выполнении над данными заданной таблицей трех операций: удаления, изменения и вставки. Один и тот же триггер может отслеживать разные виды операций (например, вставку и изменение), причем операцию можно отслеживать до и после ее выполнения. Триггеры БД не связываются с конкретной таблицей базы данных. Они исполняются при подключении к базе данных или отключении от нее, а также при запуске, успешном завершении или откате транзакции. Использование триггеров имеет следующие преимущества: - возможность автоматической проверки триггерами DML корректности данных, определенные значения которых необходимо хранить в соответствующей таблице; - создание более гибкой системы поддержки целостности БД по сравнению со стандартными средствами; - сокращение объема поддержки приложений, поскольку изменения триггеров автоматически отражаются во всех приложениях, использующих связанные с триггерами таблицы (без необходимости их повторной сборки и компиляции); - возможность создания системы автоматической фиксации изменений в таблицах БД (ведение журнала изменений). 6.3.1. Триггеры DML 6.3.1.1. Определение триггера С любым событием, вызывающим изменение содержимого таблицы (представления), можно связать определенные действия, которые СУБД будет автоматически выполнять при каждом возникновении события. Триггер DML - это предварительно определенное действие или последовательность действий, автоматически производимых при выполнении запросов обновления, добавления или удаления данных к определенной таблице (представлению) БД. Триггер создается для заданной таблицы (представления) и сохраняется в БД как часть метаданных.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |