Изменения

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

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

6438 байт добавлено, 04:23, 20 декабря 2021
init

Список операторов, использующихся в хранимых [[Хранимые процедуры | процедурах]] и [[Хранимые функции | функциях]].

== Определение и присваивание переменных ==
Синтаксис
declare имя тип [default значение];
set переменная = значение
[, переменная = значение]*;

Примеры
declare finish datetime default now();

set idx = 0;
set idx = idx + 1, idy = 0;
set name = (select FirstName from Students where SId = id);

*После default {{---}} любое вычисляемое значение.
*В последнем примере мы присвоили переменной значение подзапроса.
*:В идеале должны получить единственное значение.
*:Если ничего не нашли -- будет [not found], если несколько -- что-то из них выберется и запишется в переменную.

== Select into ==
Синтаксис
select ...
into переменные
from ...

Пример
select FirstName, LastName
into FN, LN
from Students
where SId = id;

*Записывает соответственно переменным полученные значения.
*Нужен в том случае, если хотим записать данные в несколько переменных из одной найденной строчки. Делать это через несколько присваиваний неэффективно.
*Переменные должны быть объявлены, их количества совпадать и иметь соответствующие типы с результатом.
*Нельзя получать больше одного значения, при отсутствии результата переменные заполнятся null-ами.

== Ветвления ==
=== If ===
Синтаксис
if условие then операторы
[else if условие then операторы]*
[else операторы]
end if;
Пример
if badDays > 0 then
update Accounts set Balance = Balance - amount;
set badDays = 0;
end if;

=== Case-оператор ===
Синтаксис
case выражение
[when значение then операторы]+
[else операторы]
end case;

Пример
case name
when 'Иван' then set name = 'Ивана'
when 'Пётр' then set name = 'Петра'
else set name = '???'
end case;

=== Case-операция ===
set name = case name
when 'Иван' then 'Ивана'
when 'Пётр' then 'Петра'
else '???'
end case;

*если нет else, а ни один when не сработал, будет null.

== Циклы ==
Метка до цикла может понадобиться для [[Хранимые процедуры и функции: операторы # Leave, iterate | leave и iterate]].

Метка после end <loop name> исключительно для программиста -- по стандарту проверят, что метки совпадают.

=== While ===
Синтаксис
[метка:] while условие do
операторы
end while [метка];

Пример (добавляем 10 студентов).
declare i int default 1;
ins: while i <= 10 do
insert into Students (Id) values (i);
set i = i + 1;
end while ins;

=== Repeat ===
Синтаксис
[метка:] repeat
операторы
until условие
end repeat [метка];

Пример (делаем то же самое, но с помощью repeat)
declare i int default 1;
repeat
insert into Students (Id) values (i);
set i = i + 1;
until i <= 10
end repeat;

=== Loop ===
Синтаксис
[метка:] loop
операторы
end loop [метка];
*Бесконечных циклов не бывает, поэтому мы ожидаем, что цикл завершится с [ошибкой] (в примере ниже, вероятно, out of memory).

Пример (добавляем бесконечное число студентов)
declare i int default 1;
loop
insert into Students (Id) values (i);
set i = i + 1;
end loop;

=== Leave, iterate ===
Синтаксис
leave label
iterate label
*leave = break, iterate = continue
*Метка указывает на цикл (он имеет ту же метку), с которым мы проводим эту операцию.

Пример (исправляем прошлый пример с loop)
declare i int default 1;
l: loop
insert into Students (Id) values (i);
if i > 10 then
leave l;
end if;
set i = i + 1;
end loop;

== Составной оператор ==
Синтаксис

[метка:] begin
определения
тело
end

Пример

begin
declare x int;
declare y int;

set x = 42;
set y = 43;
end;

== Обработчики ошибок ==
На самом деле блок begin/end -- неявный "try". Мы можем определить обработчики. Для каждой ошибки может быть не более одного обработчика.

Синтаксис
declare {continue|exit|undo} handler
for условие
оператор
*continue|exit|undo -- тип обработчика. Соответственно: продолжить выполнение, выйти из блока, откатить изменения и выйти из блока.
*условие -- код ошибки. Синтаксис: sqlstate [value]. Есть зарезервированные и имеющие имена (можно использовать оба варианта):
**sqlwarning -- sqlstate 01xxx
**not found -- sqlstate 02xxx
**sqlexception -- sqlstate yyxxx
*оператор -- код, который должен исполниться при возникновении ошибки.

Примеры
*Подавление ошибки
begin
declare exit handler for not found begin end;
...
end;

*Подмена значения
begin
declare continue handler for not found set name = '?';
set name = (select FirstName from students where SId = id);
...
end;
66
правок

Навигация