Хранимые процедуры
Создание и выполнение процедур
То есть по сути хранимые процедуры представляют набор инструкций, которые выполняются как единое целое. Тем самым хранимые процедуры позволяют упростить комплексные операции и вынести их в единый объект. Изменится процесс покупки товара, соответственно достаточно будет изменить код процедуры. То есть процедура также упрощает управление кодом.
Также хранимые процедуры позволяют ограничить доступ к данным в таблицах и тем самым уменьшить вероятность преднамеренных или неосознанных нежелательных действий в отношении этих данных.
Таким образом, хранимая процедура имеет три ключевых особенности: упрощение кода, безопасность и производительность.
Например, пусть в базе данных есть таблица, которая хранит данные о товарах:
Создадим хранимую процедуру для извлечения данных из этой таблицы:
Поскольку команда CREATE PROCEDURE должна вызываться в отдельном пакете, то после команды USE, которая устанавливает текущую базу данных, используется команда GO для определения нового пакета.
После имени процедуры должно идти ключевое слово AS.
Для отделения тела процедуры от остальной части скрипта код процедуры нередко помещается в блок BEGIN. END:
И мы сможем управлять процедурой также и через визуальный интерфейс.
Выполнение процедуры
Для выполнения хранимой процедуры вызывается команда EXEC или EXECUTE :
Удаление процедуры
Для удаления процедуры применяется команда DROP PROCEDURE :
Т.к. подобный запрос мы будем использовать каждый раз, когда нам необходимо будет добавить нового покупателя, то вполне уместно оформить его в виде процедуры:
Обратите внимание, как задаются параметры: необходимо дать имя параметру и указать его тип, а в теле процедуры мы уже используем имена параметров. Один нюанс. Как вы помните, точка с запятой означает конец запроса и отправляет его на выполнение, что в данном случае неприемлемо. Поэтому, прежде, чем написать процедуру необходимо переопределить разделитель с ; на «//», чтобы запрос не отправлялся раньше времени. Делается это с помощью оператора DELIMITER // :
Таким образом, мы указали СУБД, что выполнять команды теперь следует после //. Следует помнить, что переопределение разделителя осуществляется только на один сеанс работы, т.е. при следующем сеансе работы с MySql разделитель снова станет точкой с запятой и при необходимости его придется снова переопределять. Теперь можно разместить процедуру:
Согласитесь, что так гораздо проще, чем писать каждый раз полный запрос. Проверим, работает ли процедура, посмотрев, появился ли новый покупатель в таблице Покупатели (customers):
Как было сказано в начале урока, процедуры позволяют объединить последовательность запросов. Давайте посмотрим, как это делается. Помните в уроке 11 мы хотели узнать, на какую сумму нам привез товар поставщик «Дом печати»? Для этого нам пришлось использовать вложенные запросы, объединения, вычисляемые столбцы и представления. А если мы захотим узнать, на какую сумму нам привез товар другой поставщик? Придется составлять новые запросы, объединения и т.д. Проще один раз написать хранимую процедуру для этого действия.
Казалось бы, проще всего взять уже написанные в уроке 11 представление и запрос к нему, объединить в хранимую процедуру и сделать идентификатор поставщика (id_vendor) входным параметром, вот так:
А потом создадим запрос, который просуммирует суммы поставок интересующего нас поставщика, например, с id_vendor=2:
Вот теперь мы можем объединить два этих запроса в хранимую процедуру, где входным параметром будет идентификатор поставщика (id_vendor), который будет подставляться во второй запрос, но не в представление:
Проверим работу процедуры, с разными входными параметрами:
Как видите, процедура срабатывает один раз, а затем выдает ошибку, говоря нам, что представление report_vendor уже имеется в БД. Так происходит потому, что при обращении к процедуре в первый раз, она создает представление. При обращении во второй раз, она снова пытается создать представление, но оно уже есть, поэтому и появляется ошибка. Чтобы избежать этого возможно два варианта.
Перед использованием этого варианта не забудьте удалить процедуру sum_vendor, а затем проверить работу:
Как видите, сложные запросы или их последовательность действительно проще один раз оформить в хранимую процедуру, а дальше просто обращаться к ней, указывая необходимые параметры. Это значительно сокращает код и делает работу с запросами более логичной.
Видеоуроки php + mysql
Если этот сайт оказался вам полезен, пожалуйста, посмотрите другие наши статьи и разделы.
Создание хранимой процедуры
В этом разделе описывается, как можно создать хранимую процедуру Transact-SQL в среде SQL Server Management Studio с использованием инструкции Transact-SQL CREATE PROCEDURE.
Разрешения
Для выполнения этой инструкции требуется разрешение CREATE PROCEDURE в отношении базы данных и разрешение ALTER в отношении схемы, в которой создается процедура.
Создание хранимой процедуры
Можно использовать один из следующих способов:
Использование среды SQL Server Management Studio
Создание процедуры в обозревателе объектов
В обозревателе объектов подключитесь к экземпляру компонента Компонент Database Engine и разверните его.
Последовательно разверните узел Базы данных, базу данных AdventureWorks2012 и узел Программирование.
Щелкните правой кнопкой мыши элемент Хранимые процедуры и выберите пункт Создать хранимую процедуру.
В меню Запрос выберите пункт Указать значения для параметров шаблона.
В диалоговом окне Задание значений для параметров шаблона введите для показанных параметров следующие значения.
Параметр | Значение |
---|---|
Автор | Ваше имя |
Дата создания | Сегодняшняя дата |
Описание | Возвращает данные о сотрудниках. |
Procedure_name | HumanResources.uspGetEmployeesTest |
@Param1 | @LastName |
@Datatype_For_Param1 | nvarchar(50) |
Default_Value_For_Param1 | NULL |
@Param2 | @FirstName |
@Datatype_For_Param2 | nvarchar(50) |
Default_Value_For_Param2 | NULL |
Нажмите кнопку ОК.
В редакторе запросов замените инструкцию SELECT следующей инструкцией:
Для проверки синтаксиса выберите пункт Выполнить анализ в меню Запрос. Если возвращается сообщение об ошибке, сравните инструкции с приведенными выше и при необходимости внесите исправления.
Чтобы создать процедуру, в меню Запрос выберите пункт Выполнить. Процедура создается как объект в базе данных.
Чтобы увидеть процедуру в обозревателе объектов, щелкните правой кнопкой мыши элемент Хранимые процедуры и выберите пункт Обновить.
Чтобы выполнить процедуру, в обозревателе объектов щелкните правой кнопкой мыши имя хранимой процедуры HumanResources.uspGetEmployeesTest и выберите пункт Выполнение хранимой процедуры.
В окне Выполнение процедуры введите Margheim в качестве значения для параметра @LastName и Diane в качестве значения для параметра @FirstName.
Проверяйте все данные, вводимые пользователем. Не включайте их в сценарий, не выполнив проверку. Никогда не выполняйте команду, построенную на основании непроверенных пользовательских входных данных.
Использование Transact-SQL
Создание процедуры в редакторе запросов
В обозревателе объектов подключитесь к экземпляру компонента Компонент Database Engine.
В меню Файл выберите пункт Создать запрос.
Скопируйте следующий пример в окно запроса и нажмите кнопку Выполнить. В данном примере создается та же хранимая процедура, что и раньше, но с другим именем процедуры.
Чтобы выполнить процедуру, скопируйте следующий пример в окно создаваемого запроса и нажмите кнопку Выполнить. Показаны различные методы задания значений параметров.
Создание хранимых процедур в MySQL
Хранимые процедуры — это определяемый пользователем список предварительно скомпилированных инструкций SQL, которые сохраняются и используются по запросу в банке данных MySQL для выполнения определенного процесса базы данных. Это означает, что существует вероятность повторного использования сценария снова и снова. У процедуры действительно есть заголовок, набор параметров и инструкция из SQL, так что хранимая процедура может работать на основе значения (значений) переданного параметра. Хранимые процедуры должны выполняться с использованием фразы CALL. В этом руководстве давайте подробно рассмотрим процесс создания новых хранимых процедур в предложении MySQL CREATE PROCEDURE. Итак, приступим.
Создать хранимую процедуру с помощью Workbench
Откройте только что установленную MySQL Workbench 8.0 и подключите ее к корневой базе данных localhost.
Внутри Workbench есть панель навигатора. Под этой панелью навигатора находится набор различных функций MySQL. Он включает в себя список баз данных, таблиц, хранимых процедур и многое другое, как вы можете видеть на изображении.
Когда вы исследуете опцию «Таблицы», вы найдете список таблиц в виде сетки. Как показано ниже, у нас есть таблица «социальные».
Щелкните правой кнопкой мыши параметр «Сохраненная процедура» и выберите параметр «Создать хранимую процедуру», как показано на рисунке.
Откроется новое окно, как показано на фото ниже. Вы можете изменить имя хранимой процедуры в области запроса, удалив значение в кавычках.
Теперь вы можете редактировать этот запрос по своему желанию. Мы называем хранимую процедуру «detail» при получении данных из таблицы «social», где ее значение в столбце «Website» эквивалентно значению «Instagram». Это означает, что процедура хранения при выполнении будет отображать только те записи из этой таблицы, где «веб-сайт» — «Instagram». Щелкните по кнопке Применить.
Вы получите экран предварительного просмотра, где вы можете изменить или изменить свой запрос, если это необходимо. Вы можете увидеть полный синтаксис вновь созданной хранимой процедуры через Workbench. Нажмите кнопку «Применить», чтобы выполнить его.
Если в запросе нет ошибок, он будет работать правильно, как показано ниже. Нажмите на кнопку «Готово».
Когда вы посмотрите на параметр хранимых процедур и обновите его, он покажет вам только что созданную процедуру.
Когда вы выполните эту процедуру, она покажет вам, что единственными записями, имеющими значение столбца «Веб-сайт», является «Instagram», как показано ниже.
Создайте хранимую процедуру через оболочку командной строки
Откройте клиентскую оболочку командной строки MySQL 8.0 и введите пароль MySQL внизу.
Предположим, у нас есть таблица с именем «запись» в схеме базы данных «данные». Давайте проверим его записи с помощью команды SELECT следующим образом:
Используйте команду «использовать данные», чтобы использовать базу данных, в которую вы хотите добавить хранимую процедуру.
Пример 1: Хранимая процедура без параметров
Чтобы создать процедуру без параметра, вы должны создать ее с помощью команды CREATE PROCEDURE, перед которой стоит ключевое слово «DELIMITER». Затем мы создаем процедуру с именем «Фильтр» без параметров. Он выбирает все записи из таблицы «запись», где в столбце «Страна» в конце значений стоит «ia». Процесс должен быть завершен ключевым словом «END».
Мы будем использовать предложение CALL для выполнения хранимой процедуры в командной строке. После выполнения команды CALL мы получаем следующие результаты. Вы можете видеть, что запрос должен получить только те записи, в которых столбец «Страна» имеет «ia» в конце значений.
Пример 2: Хранимая процедура с одним параметром
Пришло время сгенерировать процедуру с одним параметром. Для этого используйте запрос CREATE PROCEDURE с ключевым словом DELIMITER. Итак, мы должны создать процедуру «Rec», которая принимает одно значение в качестве входного аргумента, в котором в этом примере в параметрах пользователя указана переменная «Var1». Начните процедуру с ключевого слова BEGIN. Оператор SELECT используется для выборки всех записей из таблицы ’record’, где столбец ’Name’ имеет то же значение, что и в ’Var1′. Это сопоставление записей. Завершите хранимую процедуру ключевым словом «END», за которым следует знак «&&».
Сначала запустите запрос DELIMITER, чтобы хранимая процедура подготовилась. После этого выполните запрос CALL, после которого укажите имя процедуры и значение ее входного аргумента в фигурных скобках. Вам просто нужно запустить команду, показанную ниже, и вы получите результат. Как мы и предусмотрели в параметрах «Зафар», поэтому после сравнения мы получили такой результат.
Пример 3: Хранимая процедура с несколькими параметрами
Давайте посмотрим, как работает процедура, когда ей предоставлено несколько параметров. Не забудьте использовать ключевое слово «DELIMITER» вместе со знаками «&&». Используйте команду CREATE PROCEDURE, чтобы создать процедуру «New». Эта процедура будет принимать в параметрах два аргумента, например, «var1» и «var2». Начните процедуру с предложения BEGIN. Теперь это что-то новенькое. Предложение SELECT снова выбирает все записи из таблицы ’record’. Первый аргумент, переданный пользователем, будет сопоставлен со значениями столбца «Имя». С другой стороны, второй аргумент, переданный пользователем, будет сопоставлен со значениями столбца «Страна». Если записи совпадают, он будет извлекать все данные из последовательных строк. Процедура будет завершена ключевым словом «END».
Используйте ключевое слово DELIMITER, чтобы активировать процедуру. После этого выполните предложение CALL, за которым следует имя хранимой процедуры. Которое является «New» вместе со значениями параметров. Из изображения ниже видно, что запрос будет извлекать только запись таблицы «запись», в которой совпадают оба значения, введенные пользователем.
Заключение
В этом руководстве вы узнали о различных способах создания хранимой процедуры в MySQL Workbench и клиентской оболочке командной строки MySQL, например, о хранимой процедуре с параметрами и без них.
Хранимые процедуры в T-SQL — создание, изменение, удаление
В Microsoft SQL Server для реализации и автоматизации своих собственных алгоритмов (расчётов) можно использовать хранимые процедуры, поэтому сегодня мы с Вами поговорим о том, как они создаются, изменяются и удаляются.
Но сначала немного теории, чтобы Вы понимали, что такое хранимые процедуры и для чего они нужны в T-SQL.
Примечание! Начинающим программистам рекомендую следующие полезные материалы на тему T-SQL:
Что такое хранимые процедуры в T-SQL?
Хранимые процедуры – это объекты базы данных, в которых заложен алгоритм в виде набора SQL инструкций. Иными словами, можно сказать, что хранимые процедуры – это программы внутри базы данных. Хранимые процедуры используются для сохранения на сервере повторно используемого кода, например, Вы написали некий алгоритм, последовательный расчет или многошаговую SQL инструкцию, и чтобы каждый раз не выполнять все инструкции, входящие в данный алгоритм, Вы можете оформить его в виде хранимой процедуры. При этом, когда Вы создаете процедуру SQL, сервер компилирует код, а потом, при каждом запуске этой процедуры SQL сервер уже не будет повторно его компилировать.
Для того чтобы запустить хранимую процедуру в SQL Server, необходимо перед ее названием написать команду EXECUTE, также возможно сокращенное написание данной команды EXEC. Вызвать хранимую процедуру в инструкции SELECT, например, как функцию уже не получится, т.е. процедуры запускаются отдельно.
В хранимых процедурах, в отличие от функций, уже можно выполнять операции модификации данных такие как: INSERT, UPDATE, DELETE. Также в процедурах можно использовать SQL инструкции практически любого типа, например, CREATE TABLE для создания таблиц или EXECUTE, т.е. вызов других процедур. Исключение составляет несколько типов инструкций таких как: создание или изменение функций, представлений, триггеров, создание схем и еще несколько других подобных инструкций, например, также нельзя в хранимой процедуре переключать контекст подключения к базе данных (USE).
Хранимая процедура может иметь входные параметры и выходные параметры, она может возвращать табличные данные, может не возвращать ничего, только выполнять заложенные в ней инструкции.
Хранимые процедуры очень полезны, они помогают нам автоматизировать или упростить многие операции, например, Вам постоянно требуется формировать различные сложные аналитические отчеты с использованием сводных таблиц, т.е. оператора PIVOT. Чтобы упростить формирование запросов с этим оператором (как Вы знаете, у PIVOT синтаксис достаточно сложен), Вы можете написать процедуру, которая будет Вам динамически формировать сводные отчеты, например, в материале «Динамический PIVOT в T-SQL» представлен пример реализации данной возможности в виде хранимой процедуры.
Примеры работы с хранимыми процедурами в Microsoft SQL Server
Исходные данные для примеров
Все примеры ниже будут выполнены в Microsoft SQL Server 2016 Express. Для того чтобы продемонстрировать, как работают хранимые процедуры с реальными данными, нам нужны эти данные, давайте их создадим. Например, давайте создадим тестовую таблицу и добавим в нее несколько записей, допустим, что это будет таблица, содержащая список товаров с их ценой.
Данные есть, теперь давайте переходить к созданию хранимых процедур.
Создание хранимой процедуры на T-SQL – инструкция CREATE PROCEDURE
Хранимые процедуры создаются с помощью инструкции CREATE PROCEDURE, после данной инструкции Вы должны написать название Вашей процедуры, затем в случае необходимости в скобочках определить входные и выходные параметры. После этого Вы пишите ключевое слово AS и открываете блок инструкций ключевым словом BEGIN, закрываете данный блок словом END. Внутри данного блока Вы пишите все инструкции, которые реализуют Ваш алгоритм или какой-то последовательный расчет, иными словами, программируете на T-SQL.
Для примера давайте напишем хранимую процедуру, которая будет добавлять новую запись, т.е. новый товар в нашу тестовую таблицу. Для этого мы определим три входящих параметра: @CategoryId – идентификатор категории товара, @ProductName — наименование товара и @Price – цена товара, данный параметр будет у нас необязательный, т.е. его можно будет не передавать в процедуру (например, мы не знаем еще цену), для этого в его определении мы зададим значение по умолчанию. Эти параметры в теле процедуры, т.е. в блоке BEGIN…END можно использовать, так же как и обычные переменные (как Вы знаете, переменные обозначаются знаком @). В случае если Вам нужно указать выходные параметры, то после названия параметра указывайте ключевое слово OUTPUT (или сокращённо OUT).
В блоке BEGIN…END мы напишем инструкцию добавления данных, а также в завершении процедуры инструкцию SELECT, чтобы хранимая процедура вернула нам табличные данные о товарах в указанной категории с учетом нового, только что добавленного товара. Также в этой хранимой процедуре я добавил обработку входящего параметра, а именно удаление лишних пробелов в начале и в конце текстовой строки с целью исключения ситуаций, когда случайно занесли несколько пробелов.
Вот код данной процедуры (его я также прокомментировал).
Запуск хранимой процедуры на T-SQL – команда EXECUTE
Запустить хранимую процедуру, как я уже отмечал, можно с помощью команды EXECUTE или EXEC. Входящие параметры передаются в процедуры путем простого их перечисления и указания соответствующих значений после названия процедуры (для выходных параметров также нужно указывать команду OUTPUT). Однако название параметров можно и не указывать, но в этом случае необходимо соблюдать последовательность указания значений, т.е. указывать значения в том порядке, в котором определены входные параметры (это относится и к выходным параметрам).
Параметры, которые имеют значения по умолчанию, можно и не указывать, это так называемые необязательные параметры.
Вот несколько разных, но эквивалентных способов запуска хранимых процедур, в частности нашей тестовой процедуры.
Изменение хранимой процедуры на T-SQL – инструкция ALTER PROCEDURE
Внести изменения в алгоритм работы процедуры можно с помощью инструкции ALTER PROCEDURE. Иными словами, для того чтобы изменить уже существующую процедуру, Вам достаточно вместо CREATE PROCEDURE написать ALTER PROCEDURE, а все остальное изменять по необходимости.
Допустим, нам необходимо внести изменения в нашу тестовую процедуру, скажем, параметр @Price, т.е. цену, мы сделаем обязательным, для этого уберём значение по умолчанию, а также представим, что у нас пропала необходимость в получении результирующего набора данных, для этого мы просто уберем инструкцию SELECT из хранимой процедуры.
Удаление хранимой процедуры на T-SQL – инструкция DROP PROCEDURE
В случае необходимости можно удалить хранимую процедуру, это делается с помощью инструкции DROP PROCEDURE.
Например, давайте удалим созданную нами тестовую процедуру.
При удалении хранимых процедур стоит помнить о том, что, если на процедуру будут ссылаться другие процедуры или SQL инструкции, после ее удаления они будут завершаться с ошибкой, так как процедуры, на которую они ссылаются, больше нет.
У меня все, надеюсь, материал был Вам интересен и полезен, пока!