![]()
Главная Обратная связь Дисциплины:
Архитектура (936) ![]()
|
Выполнение хранимой процедуры
Для выполнения хранимой процедуры используется команда: [[ EXEC [ UTE] имя_процедуры [;номер][[@имя_параметра=]{значение | @имя_переменной} [OUTPUT ]|[DEFAULT ]][,...n]Если вызов хранимой процедуры не является единственной командой в пакете, то присутствие команды EXECUTE обязательно. Более того, эта команда требуется для вызова процедуры из тела другой процедуры или триггера. Использование ключевого слова OUTPUT при вызове процедуры разрешается только для параметров, которые были объявлены при создании процедуры с ключевым словом OUTPUT. Когда же при вызове процедуры для параметра указывается ключевое слово DEFAULT, то будет использовано значение по умолчанию. Естественно, указанное слово DEFAULT разрешается только для тех параметров, для которых определено значение по умолчанию. Из синтаксиса команды EXECUTE видно, что имена параметров могут быть опущены при вызове процедуры. Однако в этом случае пользователь должен указывать значения для параметров в том же порядке, в каком они перечислялись при создании процедуры. Присвоить параметру значение по умолчанию, просто пропустив его при перечислении нельзя. Если же требуется опуститьпараметры, для которых определено значение по умолчанию, достаточно явного указания имен параметров при вызове хранимой процедуры. Более того, таким способом можно перечислять параметры и их значения в произвольном порядке. Отметим, что при вызове процедуры указываются либо имена параметров со значениями, либо только значения без именипараметра. Их комбинирование не допускается. Пример 12.1. Процедура без параметров. Разработать процедуру для получения названий и стоимости товаров, приобретенных Ивановым. CREATE PROC my_proc1ASSELECT Товар.Название, Товар.Цена*Сделка.Количество AS Стоимость, Клиент.Фамилия FROM Клиент INNER JOIN (Товар INNER JOIN Сделка ON Товар.КодТовара=Сделка.КодТовара) ON Клиент.КодКлиента=Сделка.КодКлиента WHERE Клиент.Фамилия=’Иванов’Пример 12.1. Процедура для получения названий и стоимости товаров, приобретенных Ивановым. Для обращения к процедуре можно использовать команды: EXEC my_proc1 или my_proc1Процедура возвращает набор данных. Пример 12.2. Процедура без параметров. Создать процедуру для уменьшения цены товара первого сорта на 10%. CREATE PROC my_proc2ASUPDATE Товар SET Цена=Цена*0.9 WHERE Сорт=’первый’Пример 12.2. Процедура для уменьшения цены товара первого сорта на 10%. Для обращения к процедуре можно использовать команды: EXEC my_proc2 или my_proc2Процедура не возвращает никаких данных. Пример 12.3. Процедура с входным параметром. Создать процедуру для получения названий и стоимости товаров, которые приобрел заданный клиент. CREATE PROC my_proc3 @k VARCHAR(20)ASSELECT Товар.Название, Товар.Цена*Сделка.Количество AS Стоимость, Клиент.Фамилия FROM Клиент INNER JOIN (Товар INNER JOIN Сделка ON Товар.КодТовара=Сделка.КодТовара) ON Клиент.КодКлиента=Сделка.КодКлиента WHERE Клиент.Фамилия=@kПример 12.3. Процедура для получения названий и стоимости товаров, которые приобрел заданный клиент. Для обращения к процедуре можно использовать команды: EXEC my_proc3 'Иванов' или my_proc3 @k='Иванов'Пример 12.4. Процедура с входными параметрами. Создать процедуру для уменьшения цены товара заданного типа в соответствии с указанным %. CREATE PROC my_proc4 @t VARCHAR(20), @p FLOATASUPDATE Товар SET Цена=Цена*(1-@p) WHERE Тип=@tПример 12.4. Процедура для уменьшения цены товара заданного типа в соответствии с указанным %. Для обращения к процедуре можно использовать команды: EXEC my_proc4 'Вафли',0.05 илиEXEC my_proc4 @t='Вафли', @p=0.05Пример 12.5. Процедура с входными параметрами и значениями по умолчанию. Создать процедуру для уменьшения цены товара заданного типа в соответствии с указанным %. CREATE PROC my_proc5 @t VARCHAR(20)=’Конфеты', @p FLOAT=0.1ASUPDATE Товар SET Цена=Цена*(1-@p) WHERE Тип=@tПример 12.5. Процедура с входными параметрами и значениями по умолчанию. Создать процедуру для уменьшения цены товара заданного типа в соответствии с указанным %. Для обращения к процедуре можно использовать команды: EXEC my_proc5 'Вафли',0.05 илиEXEC my_proc5 @t='Вафли', @p=0.05 илиEXEC my_proc5 @p=0.05В этом случае уменьшается цена конфет (значение типа не указано при вызове процедуры и берется по умолчанию). EXEC my_proc5В последнем случае оба параметра (и тип, и проценты) не указаны при вызове процедуры, их значения берутся по умолчанию. Пример 12.6. Процедура с входными и выходными параметрами. Создать процедуру для определения общей стоимости товаров, проданных за конкретный месяц. CREATE PROC my_proc6 @m INT, @s FLOAT OUTPUTASSELECT @s=Sum(Товар.Цена*Сделка.Количество) FROM Товар INNER JOIN Сделка ON Товар.КодТовара=Сделка.КодТовара GROUP BY Month(Сделка.Дата) HAVING Month(Сделка.Дата)=@mПример 12.6. Процедура с входными и выходными параметрами. Создать процедуру для определения общей стоимости товаров, проданных за конкретный месяц. Для обращения к процедуре можно использовать команды: DECLARE @st FLOATEXEC my_proc6 1,@st OUTPUTSELECT @stЭтот блок команд позволяет определить стоимость товаров, проданных в январе ( входной параметр месяц указан равным 1). Создать процедуру для определения общего количества товаров, приобретенных фирмой, в которой работает заданный сотрудник. Сначала разработаем процедуру для определения фирмы, где работает сотрудник. CREATE PROC my_proc7 @n VARCHAR(20), @f VARCHAR(20) OUTPUTASSELECT @f=Фирма FROM Клиент WHERE Фамилия=@nПример 12.7. Использование вложенных процедур. Создать процедуру для определения общего количества товаров, приобретенных фирмой, в которой работает заданный сотрудник. Затем создадим процедуру, подсчитывающую общее количество товара, который закуплен интересующей нас фирмой. CREATE PROC my_proc8 @fam VARCHAR(20), @kol INT OUTPUTASDECLARE @firm VARCHAR(20)EXEC my_proc7 @fam,@firm OUTPUTSELECT @kol=Sum(Сделка.Количество) FROM Клиент INNER JOIN Сделка ON Клиент.КодКлиента=Сделка.КодКлиента GROUP BY Клиент.Фирма HAVING Клиент.Фирма=@firmПример 12.7. Создание процедуры для определения общего количества товаров, приобретенных фирмой, в которой работает заданный сотрудник. Вызов процедуры осуществляется с помощью команды: DECLARE @k INTEXEC my_proc8 ‘Иванов’,@k OUTPUTSELECT @kПонятие курсора Запрос к реляционной базе данных обычно возвращает несколько рядов (записей) данных, но приложение за один раз обрабатывает лишь одну запись. Даже если оно имеет дело одновременно с несколькими рядами (например, выводит данные в форме электронных таблиц), их количество по-прежнему ограничено. Кроме того, при модификации, удалении или добавлении данных рабочей единицей является ряд. В этой ситуации на первый план выступает концепция курсора, и в таком контекстекурсор – указатель на ряд. Курсор в SQL – это область в памяти базы данных, которая предназначена для хранения последнего оператора SQL. Если текущий оператор – запрос к базе данных, в памяти сохраняется и строка данных запроса, называемая текущим значением, или текущей строкой курсора. Указанная область в памяти поименована и доступна для прикладных программ. Обычно курсоры используются для выбора из базы данных некоторого подмножества хранимой в ней информации. В каждый момент времени прикладной программой может быть проверена одна строка курсора. Курсоры часто применяются в операторахSQL, встроенных в написанные на языках процедурного типа прикладные программы. Некоторые из них неявно создаются сервером базы данных, в то время как другие определяются программистами. В соответствии со стандартом SQL при работе с курсорами можно выделить следующие основные действия: · создание или объявление курсора ; · открытие курсора, т.е. наполнение его данными, которые сохраняются в многоуровневой памяти ; · выборка из курсора и изменение с его помощью строк данных; · закрытие курсора, после чего он становится недоступным для пользовательских программ; · освобождение курсора, т.е. удаление курсора как объекта, поскольку его закрытие необязательно освобождает ассоциированную с ним память. В разных реализациях определение курсора может иметь некоторые отличия. Так, например, иногда разработчик должен явным образом освободить выделяемую для курсора память. После освобождения курсора ассоциированная с ним память также освобождается. При этом становится возможным повторное использование его имени. В других реализациях при закрытии курсораосвобождение памяти происходит неявным образом. Сразу после восстановления она становится доступной для других операций:открытие другого курсора и т.д. В некоторых случаях применение курсора неизбежно. Однако по возможности этого следует избегать и работать со стандартными командами обработки данных: SELECT, UPDATE, INSERT, DELETE. Помимо того, что курсоры не позволяют проводитьоперации изменения над всем объемом данных, скорость выполнения операций обработки данных посредством курсора заметно ниже, чем у стандартных средств SQL.
![]() |