Программирование >>  Построение запросов sql 

1 ... 77 78 79 [ 80 ] 81 82 83 ... 101


процедуру Factorial в интерактивном режиме и передать ей в параметра значение 170, необходимо выполнить следующий запрос: EXECUTE PROCEDURE Factorial (170);. Результат вызова процедуры Factorial представлен на рис. 6.5.

качестве

Procedure exe<:utin9 results:

N FACTORIAL = 7,257415615307ЭЭЕ306 Рис. 6.5. Результат вызова процедуры Factorial

Удалить процедуру Factorial нельзя из-за того, что ее использует процедура FactorialSet.

Выполняемая процедура FactorialSet предназначена для вычисления значений факториала чисел из некоторого диапазона и занесения полученных результатов в таблицу Ftable. Процедура получает в качестве параметров первое (Minf) и последнее (Maxf) значения диапазона вычисления факториала. В теле процедуры осуществляется цикл от Minf до Maxf с шагом, равным единице. Для каждого значения параметра цикла (локальная переменная i) вычисляется значение факториала путем вызова процедуры Factorial. Число, для которого вычислен факториал, и значение факториала заносятся в таблицу Ftable. Например, чтобы вычислить пять значений факториала от 1 до 5, необходимо в интерактивном режиме выполнить следующий запрос:

EXECUTE PROCEDURE FactorialSet (1, 5);.

Для просмотра результатов выполнения процедуры необходимо выполнить следующий запрос для таблицы Ftable: SELECT * FROM Ftable;. Результат выполнения запроса представлен на рис. 6.6.

Fnum

Fvalue

1,000

2,000

6,000

24,000

120,000

Рис. 6.6. Таблица Ftable со значениями факториалов от 1 до 5

В хранимых процедурах можно использовать запросы модификации данных INSERT, UPDATE OR INSERT, UPDATE и DELETE, содержащие предложение RETURNING для указания, что значения определенных столбцов в изменяемых строках должны запоминаться в соответствующих переменных, перечисленных в списке после INTO. Предложение RETURNING, употребляемое в конце запросов модификации DML, имеет следующий формат:



RETURNING <список столбцов> INTO <список переменных>;.

Столбцы, указанные в <список столбцов>, могут быть любыми столбцами из целевой таблицы, в том числе обновляемыми.

Следует учесть, что запросы модификации данных, использующие предложение RETURNING, должны оперировать не более чем с одной строкой набора данных.

Например, определение выполняемой хранимой процедуры, использующей запрос на удаление данных с предложением RETURNING, может выглядеть следующим образом:

CREATE PROCEDURE Save Del (Req CD INTEGER)

RETURNS (RAccountCD VARCHAR(6), RDate DATE) AS

BEGIN

DELETE FROM Request WHERE RequestCD= :Req CD RETURNING AccountCD, IncomingDate INTO :RAccountCD, :RDate;

END.

Эта ХП удаляет информацию о ремонтной заявке с заданным номером (Req CD). При этом номер лицевого счета абонента, подавшего удаляемую заявку, и дата подачи этой заявки выводятся как результат выполнения процедуры.

Процедура может быть выполнена, например, с помощью следующего запроса:

EXECUTE PROCEDURE Save Del(1);.

Результат выполнения процедуры представлен на рис. 6.7.

Рис. 6.7. Результат выполнения процедуры SaveDel

Процедурный язык Firebird предоставляет возможность выполнения запросов DDL и DML в теле модуля с помощью оператора EXECUTE STATEMENT. В таком случае запрос записывается как <строка>, которая может быть сконструирована как локальная переменная в теле модуля или же передана внешним приложением или хранимой процедурой в качестве входного аргумента для другой хранимой процедуры. Оператор EXECUTE STATEMENT может использоваться как в хранимых процедурах, так и в триггерах и выполняемых блоках на PSQL.

Синтаксис оператора EXECUTE STATEMENT следующий:



FOR] EXECUTE STATEMENT <строка> [INTO: <имя переменной1> [, : <имя переменной2> ]] DO <группа операторов>;.

Можно выделить в данном синтаксисе три формы использования оператора EXECUTE STATEMENT.

Первая форма (простейшая) представлена следующим синтаксисом:

EXECUTE STATEMENT <строка>;.

В простейшей форме оператор EXECUTE STATEMENT выполняет запрос SQL, записанный как <строка>, который производит какое-то действие, но не возвращает строк данных. Такой запрос может представлять собой следующее:

- запрос DML (INSERT, DELETE, UPDATE);

- EXECUTE PROCEDURRE;

- любой запрос DDL за исключением CREATE DATABASE и DROP DATABASE.

Например, если создать процедуру следующим образом:

CREATE PROCEDURE SampleOne

(Sql VARCHAR(60), Account VARCHAR(30))

BEGIN

EXECUTE STATEMENT Sql :Account;

END,

то выполнить ее можно, например, с помощью следующего запроса:

EXECUTE PROCEDURE SampleOne

(DELETE FROM REQUEST WHERE AccountCD=, 005488);.

Вторая форма оператора EXECUTE STATEMENT имеет следующий формат:

EXECUTE STATEMENT <строка>

INTO :<имя переменной1> [, :<имя переменной2>

В этом случае <строка> представляет собой запрос, возвращающий одиночную строку данных. Только <скалярный поцзапрос> может быть выполнен при использовании второй формы оператора EXECUTE STATEMENT (<поцзапрос столбца> и <табличный поцзапрос> не могут использоваться).

Примером создания выполняемой процедуры, использующей вторую форму синтаксиса оператора EXECUTE STATEMENT, может быть следующий: CREATE PROCEDURE SampleTwo (

ColName VARCHAR(50), TableName VARCHAR (50))

RETURNS (Maxim NUMERIC(15,2))



1 ... 77 78 79 [ 80 ] 81 82 83 ... 101

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика