Изменения

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

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

544 байта добавлено, 05:01, 20 декабря 2021
м
link operator
**Можно позволить пользователь работать с недоступными для него данными, но через предоставленный нами интерфейс. Для этого делаем процедуру, работающую с этими данными, даем ей права <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><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: Некоторые СУБД умеют парсить так, как нам хочется.
66
правок

Навигация