Изменения

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

Хранимые процедуры и функции: операторы

5321 байт добавлено, 19:36, 4 сентября 2022
м
rollbackEdits.php mass rollback
== Определение и присваивание переменных ==
Синтаксис
<font color = blue>declare </font> имя тип [<font color = blue>default </font> значение]; <font color = blue>set </font> переменная = значение
[, переменная = значение]*;
Примеры
<font color = blue>declare </font> finish <font color = blue>datetime </font> <font color = blue>default </font> now();
<font color = blue>set </font> idx = 0; <font color = blue>set </font> idx = idx + 1, idy = 0; <font color = blue>set </font> name = (<font color = blue>select </font> FirstName <font color = blue>from </font> Students <font color = blue>where </font> SId = id);
*После <font color = blue>default </font> {{---}} любое вычисляемое значение.
*В последнем примере мы присвоили переменной значение подзапроса.
*:В идеале должны получить единственное значение.
*:Если ничего не нашли {{-- -}} будет [[Хранимые процедуры и функции: операторы#Обработчики ошибок | not found]], если несколько {{--- }} что-то из них выберется и запишется в переменную.
== Select into ==
Синтаксис
<font color = blue>select </font> ... <font color = blue>into </font> переменные <font color = blue>from </font> ...
Пример
<font color = blue>select </font> FirstName, LastName <font color = blue>into </font> FN, LN <font color = blue>from </font> Students <font color = blue>where </font> SId = id;
*Записывает соответственно переменным полученные значения.
=== If ===
Синтаксис
<font color = blue>if </font>условие <font color = blue>then </font> операторы [<font color = blue>else </font> <font color = blue>if </font>условие <font color = blue>then </font> операторы]* [<font color = blue>else </font> операторы] <font color = blue>end </font> if;
Пример
<font color = blue>if </font>badDays > 0 <font color = blue>then</font> <font color = blue>update </font> Accounts <font color = blue>set </font> Balance = Balance - amount; <font color = blue>set </font> badDays = 0; <font color = blue>end </font> if;
=== Case-оператор ===
Синтаксис
<font color = blue>case </font> выражение [<font color = blue>when </font> значение <font color = blue>then </font> операторы]+ [<font color = blue>else </font> операторы] <font color = blue>end </font> <font color = blue>case</font>;
Пример
<font color = blue>case </font> name <font color = blue>when </font> 'Иван' <font color = blue>then </font> <font color = blue>set </font> name = 'Ивана' <font color = blue>when </font> 'Пётр' <font color = blue>then </font> <font color = blue>set </font> name = 'Петра' <font color = blue>else </font> <font color = blue>set </font> name = '???' <font color = blue>end </font> <font color = blue>case</font>;
=== Case-операция ===
<font color = blue>set </font> name = <font color = blue>case </font> name <font color = blue>when </font> 'Иван' <font color = blue>then </font> 'Ивана' <font color = blue>when </font> 'Пётр' <font color = blue>then </font> 'Петра' <font color = blue>else </font> '???' <font color = blue>end </font> <font color = blue>case</font>;
*если нет <font color = blue>else</font>, а ни один <font color = blue>when </font> не сработал, будет null.
== Циклы ==
Метка до цикла может понадобиться для [[Хранимые процедуры и функции: операторы # Leave, Leave2C iterate | leave и iterate]].
Метка после end <loop nameloop_name> исключительно для программиста {{-- -}} по стандарту проверят, что метки совпадают.
=== While ===
Синтаксис
[<font color = red>метка</font>:] <font color = blue>while </font> условие <font color = blue> do</font>
операторы
<font color = blue>end </font> <font color = blue>while </font> [<font color = red>метка</font>];
Пример (добавляем 10 студентов).
<font color = blue>declare </font> i int <font color = blue>default </font> 1; ins: <font color = blue>while </font> i <= 10 <font color = blue> do</font> <font color = blue>insert </font> <font color = blue>into </font> Students (Id) values (i); <font color = blue>set </font> i = i + 1; <font color = blue>end </font> <font color = blue>while </font> ins;
=== Repeat ===
Синтаксис
[<font color = red>метка</font>:] <font color = blue>repeat</font>
операторы
<font color = blue>until </font> условие <font color = blue>end </font> <font color = blue>repeat </font> [<font color = red>метка</font>];
Пример (делаем то же самое, но с помощью <font color = blue>repeat</font>) <font color = blue>declare </font> i int <font color = blue>default </font> 1; <font color = blue>repeat</font> <font color = blue>insert </font> <font color = blue>into </font> Students (Id) values (i); <font color = blue>set </font> i = i + 1; <font color = blue>until </font> i <= 10 <font color = blue>end </font> <font color = blue>repeat</font>;
=== Loop ===
Синтаксис
[<font color = red>метка</font>:] <font color = blue>loop</font>
операторы
<font color = blue>end </font> <font color = blue>loop </font> [<font color = red>метка</font>];*Бесконечных циклов не бывает, поэтому мы ожидаем, что цикл завершится с [[Хранимые процедуры и функции: операторы#Обработчики ошибок | ошибкой]] (в примере ниже, вероятно, out of memory).
Пример (добавляем бесконечное число студентов)
<font color = blue>declare </font> i int <font color = blue>default </font> 1; <font color = blue>loop</font> <font color = blue>insert </font> <font color = blue>into </font> Students (Id) values (i); <font color = blue>set </font> i = i + 1; <font color = blue>end </font> <font color = blue>loop</font>;
=== Leave, iterate ===
Синтаксис
<font color = blue>leave </font> label <font color = blue>iterate </font> label*<font color = blue>leave </font> = break, <font color = blue>iterate </font> = continue.
*Метка указывает на цикл (он имеет ту же метку), с которым мы проводим эту операцию.
Пример (исправляем прошлый пример с <font color = blue>loop</font>) <font color = blue>declare </font> i int <font color = blue>default </font> 1; l: <font color = blue>loop</font> <font color = blue>insert </font> <font color = blue>into </font> Students (Id) values (i); <font color = blue>if </font>i > 10 <font color = blue>then</font> <font color = blue>leave </font> l; <font color = blue>end </font> if; <font color = blue>set </font> i = i + 1; <font color = blue>end </font> <font color = blue>loop</font>;
== Составной оператор ==
Синтаксис
[<font color = red>метка</font>:] <font color = blue>begin</font>
определения
тело
<font color = blue>end</font>
Пример
<font color = blue>begin</font> <font color = blue>declare </font> x int; <font color = blue>declare </font> y int;
<font color = blue>set </font> x = 42; <font color = blue>set </font> y = 43; <font color = blue>end</font>;
== Обработчики ошибок ==
На самом деле блок <font color = blue>begin</font>/<font color = blue>end </font> {{--- }} неявный "try". Мы можем определить обработчики. Для каждой ошибки может быть не более одного обработчика.
Синтаксис
<font color = blue>declare </font> {<font color = blue>continue</font>|<font color = blue>exit</font>|<font color = blue>undo</font>} <font color = blue>handler</font> <font color = blue>for </font> условие
оператор
*<font color = blue>continue</font> |<font color = blue>exit</font> |<font color = blue>undo </font> {{-- -}} тип обработчика. Соответственно: продолжить выполнение, выйти из блока, откатить изменения и выйти из блока.*условие {{-- -}} код ошибки. Синтаксис: sqlstate [value]. Есть зарезервированные и имеющие имена (можно использовать оба варианта):**:<font color = blue>sqlwarning </font> {{-- -}} sqlstate 01xxx**:<font color = blue>not </font><font color = blue>found </font> {{-- -}} sqlstate 02xxx**:<font color = blue>sqlexception </font> {{-- -}} sqlstate yyxxx*оператор {{--- }} код, который должен исполниться при возникновении ошибки.
Примеры:*:Подавление ошибки <font color = blue>begin</font> <font color = blue>declare </font> <font color = blue>exit </font> <font color = blue>handler </font> <font color = blue>for </font> <font color = blue>not </font><font color = blue>found </font> <font color = blue>begin </font> <font color = blue>end</font>;
...
<font color = blue>end</font>;
*:Подмена значения <font color = blue>begin</font> <font color = blue>declare </font> <font color = blue>continue </font> <font color = blue>handler </font> <font color = blue>for </font> <font color = blue>not </font><font color = blue>found </font> <font color = blue>set </font> name = '?'; <font color = blue>set </font> name = (<font color = blue>select </font> FirstName <font color = blue>from </font> students <font color = blue>where </font> SId = id);
...
<font color = blue>end</font>== См. также ==*[[Хранимые функции]]*[[Хранимые процедуры]] ==Литература==* ''Дейт К. Введение в системы баз данных (главы 4 и 17)''* ''Уидом Д., Ульман Д. Основы реляционных баз данных (раздел 7.4)''* ''Gulutzan P., Pelzer T. SQL-99 complete, really''** [https://crate.io/docs/sql-99/en/latest/chapters/25.html Chapter 25 – SQL-Invoked Routine]** [https://crate.io/docs/sql-99/en/latest/chapters/26.html Chapter 26 – PSM: Not Just Persistent Stored Modules] [[Категория: Базы данных]]
1632
правки

Навигация