Изменения

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

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

4503 байта добавлено, 04:48, 20 декабря 2021
color
== Определение и присваивание переменных ==
Синтаксис
<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>;
66
правок

Навигация