|
Программирование >> Построение запросов sql
WHERE ExecutorCD=:ECode; END CLOSE Req; SELECT ExecutorCD, Fio, Info FROM Executor INTO :ECode, :EName, :Info DO SUSPEND; END !! SET TERM ; !! В начале скрипта с помощью запроса ALTER TABLE в таблицу Executor добавляется столбец Info. После этого создается процедура ExecReq, в которой сначала явным курсором Req выполняется выборка строк из таблицы Request, а затем проверяется ряд условий. Если очередная ремонтная заявка не выполнена (EDate IS NULL), то происходит ее позиционированное удаление, а в таблице Executor поле Info получает значение DELNotExec (признак того, что для данного исполнителя удалены невыполненные заявки). Если выполненная ремонтная заявка не погашена (Exec=0), то происходит позиционированное обновление (Executed = 1) той строки таблицы Request, на которой в данный момент находится курсор Req. Затем в таблице Executor происходит обновление поля Info. Поле Info получает значение UPD Executed (признак того, что для данного исполнителя погашены непогашенные заявки). Если очередная ремонтная заявка и выполнена, и погашена, то позиционированная модификация строки в таблице Request не выполняется и для исполнителя соответствующей заявки в таблице Executor поле Info не обновляется (будет иметь NULL-значение). Затем курсор Req закрывается и происходит выборка в цикле FOR SELECT DO (неявный курсор) всех полей таблицы Executor в выходные параметры процедуры Exec Req. Процедура Exec Req выполняется с помощью следующего запроса: SELECT * FROM Exec Req;. Результат представлен на рис. 6.4.
Рис. 6.4. Результат работы процедуры ExecReq В таблице Request будут удалены две строки, где значение поля ExecutionDate равно NULL (ремонтные заявки с кодами 5 и 16), а в строках с кодами заявок 3 и 10 значение поля Executed примет значение 1. 6.2.3. Выполняемые процедуры Выполняемые процедуры производят некоторые действия и могут не возвращать результирующий набор строк, как это происходит в процедурах выбора. Синтаксис определения выполняемых процедур аналогичен синтаксису определения процедур выбора с тем исключением, что выполняемые процедуры могут не содержать выходных параметров, а для правильной работы процедуры выбора наличие выходных параметров обязательно. Запрос на вызов выполняемых хранимых процедур имеет следующий формат: EXECUTE PROCEDURE имя процецуры [(] [вхоцной параметр1[ [, вхоцной параметр2 ] [)[ [RETURNING VALUES выхоцной параметр1 [,выхоцной параметр2 ]];. В качестве входных параметров, как и при вызове процедуры выбора, могут использоваться выражения. Предложение RETURNING VALUES предназначено для присвоения каким-либо переменным значений, возвращаемых вызываемой процедурой. Рассмотрим следующий пример SQL-сценария, в котором создается таблица Ftable и две выполняемые процедуры с именами Factorial [26] и FactorialSet: CONNECT c:\sqllab.fdb USER SYSDBA PASSWORD masterkey; CREATE TABLE Ftable (Fnum INTEGER, Fvalue DOUBLE PRECISION); SET TERM !! ; CREATE PROCEDURE Factorial (Num INTEGER) RETURNS (N Factorial DOUBLE PRECISION) DECLARE VARIABLE Num Less One INTEGER; BEGIN IF (Num < 0 OR Num > 170) THEN EXIT; IF (Num = 1 OR Num = 0) THEN BEGIN N Factorial = 1; EXIT; END ELSE BEGIN Num Less One = Num - 1; EXECUTE PROCEDURE Factorial (Num Less One) RETURNING VALUES N Factorial; N Factorial = N Factorial * Num; EXIT; END END !! CREATE PROCEDURE FactorialSet (Minf INTEGER, Maxf INTEGER) DECLARE VARIABLE i INTEGER; DECLARE VARIABLE f DOUBLE PRECISION; BEGIN DELETE FROM Ftable; IF (Maxf < Minf) THEN EXIT; i = Minf; WHILE ( i <= Maxf) DO BEGIN EXECUTE PROCEDURE Factorial (i) RETURNING VALUES f; INSERT INTO Ftable (Fnum, Fvalue) VALUES :f); i = i + 1; END END !! SET TERM ; !! Таблица Ftable предназначена для хранения значений факториала. В столбце Fnum хранится число, для которого вычисляется факториал (ограничение <170 и >0), а в столбце Fvalue - само значение факториала. Для типа DOUBLE PRECISION (тип выходного параметра) возможно вычисление факториала (без переполнения разрядной сетки) для значения 170, поэтому введена дополнительная проверка входного значения. Выполняемая процедура Factorial вычисляет значение факториала рекурсивным методом. Если на входе процедуры ноль или единица, то значение факториала (NFactorial) принимается равным единице и оператор EXIT осуществляет возврат выходного параметра и выход из процедуры. Если на входе целое положительное число, меньшее 170 и отличное от нуля или единицы, то происходит рекурсивное вычисление факториала с использованием следующего соотношения: Num! = Num * (Num-1)! Рекурсивный вызов процедуры осуществляется при вызове процедурой самой себя запросом EXECUTE PROCEDURE. Примечание. При рекурсивном вызове допускается глубина вложенности не более 1000 [27]. Оператор вызова процедуры EXECUTE PROCEDURE может также использоваться и в SQL-редакторе IBExpert. Например, чтобы вызвать
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |