Изменения

Перейти к: навигация, поиск

Хранимые процедуры

946 байт добавлено, 19:08, 4 сентября 2022
м
rollbackEdits.php mass rollback
{{Определение|definition = '''Хранимая процедура''' {{---}} фрагмент кода, хранящийся в БД.}}
В отличие == Достоинства и мотивация ==Чем отличаются от [[Хранимые функции#Отличие от хранимых процедур | хранимых функций] может возвращать таблицу или не возвращать ничего].
Достоинства кода, хранящегося в БД:
*Обработка данных производится непосредственно на стороне БД.
*БД много знает про код {{-- -}} можно скомпилировать, построить оптимальный план исполнения.
*Дает возможность работать с недоступными данными с помощью заданного нами интерфейса.
*Более удобная работа с изменением данных {{-- -}} предварительные проверки, изменение сразу в нескольких местах.  
== Объявление ==
<font color = red>тело</font>
*<font color = red>Параметры</font> {{-- -}} список параметров через запятую. Объявление параметра: {<font color = blue>in</font> | <font color = blue>out</font> | <font color = blue>inout</font>} имя тип.**<font color = blue>in</font> (умолч.) {{--- }} внешний мир не узнает об изменении параметра.**<font color = blue>out</font> {{-- -}} запись результата, но читать изначальное значение нельзя.**<font color = blue>inout</font> {{-- -}} запись результата, но читать изначальное значение можно.*<font color = blue>language</font> {{-- -}} язык, на котором написала процедура. По умолчанию <font color = blue>sql</font>. Также поддерживаются <font color = blue>Ada</font>, <font color = blue>C</font>, <font color = blue>COBOL</font>, <font color = blue>Fortran</font>, <font color = blue>MUMPS</font>, <font color = blue>Pascal</font>, <font color = blue>PLI</font>.*[<font color = blue>not</font>] <font color = blue>deterministic</font> {{-- -}} является ли процедура детерминированной. По умолчанию {{--- }} нет.
*Отношение к данным. Соответственно: выполняет произвольные SQL операторы (умолч.), только читает, только изменяет, с данными не работает.
*Отношение к null-агрументам. Соответственно: процедура не вызовется и вернет <font color = red>null</font>, процедура вызовется (умолч.).
**Можно позволить пользователь работать с недоступными для него данными, но через предоставленный нами интерфейс. Для этого делаем процедуру, работающую с этими данными, даем ей права <font color = blue>definer</font> и разрешаем выполнять пользователю.
**Права <font color = blue>definer</font> наследуются при вызове других функций (иначе может не хватить прав при вызове процедуры, объявленной с правами <font color = blue>invoker</font>).
*Тело может быть как одним оператором (к примеру, <font color = blue>select</font> или <font color = blue>insert</font>), так и произвольным количеством операторов, заключенных в <font color = blue>begin</font>/<font color = blue>end</font>[[Хранимые процедуры и функции: операторы#Составной оператор| составным оператором]]. См . также [[Хранимые процедуры#Разделители | разделители]].
=== Примеры ===
===Доступ===
Чтобы вызывать процедуру, нужно иметь привилегию <font color = blue>execute</font>.
Может выполняться с разными правами доступа, указанными в [[Хранимые процедуры#Объявление | объявлении]].
=== Пример ===
== Разделители ==
Рассмотрим пример. Подробнее про содержимое <font color = blue><font color = blue>begin</font>/<font color = blue>end</font></font> см. [[Хранимые процедуры и функции: операторы|операторы]]. <font color = blue>create procedure </font> foo() <font color = blue>begin</font> <font color = blue>declare </font> x int; <font color = blue>set </font> x = 42; <font color = blue>end</font>;
Жадный парсер прочитает до первого разделителя (а он по умолчанию ";") и получится синтаксическая ошибка, так как объявление функции уже закончилось и он встречает строку "<font color = blue>set </font> x = 42;". <font color = blue>create procedure </font> foo() <font color = blue>begin</font> <font color = blue>declare </font> x int; --------------- <font color = blue>set </font> x = 42; <font color = blue>end</font>;
Выход {{-- -}} объявить на время другой разделитель. Так мы не сможем "разорвать" содержимое <font color = blue><font color = blue>begin</font>/<font color = blue>end</font></font>. <font color = blue>DELIMITER </font> // <font color = blue>create procedure </font> foo() <font color = blue>begin</font> <font color = blue>declare </font> x int; <font color = blue>set </font> x = 42; <font color = blue>end</font>;
//
<font color = blue>DELIMITER </font> ;
NB: Некоторые СУБД умеют парсить так, как нам хочется.
== См. также ==
*[[Хранимые функции]]
*[[ОператорыХранимые процедуры и функции: операторы]]
==Литература==
1632
правки

Навигация