Хранимые процедуры и функции: операторы — различия между версиями
Dmitriy (обсуждение | вклад) (-- fix) |
|||
Строка 1: | Строка 1: | ||
+ | {| class="wikitable" align="center" style="color: red; background-color: black; font-size: 56px; width: 800px;" | ||
+ | |+ | ||
+ | |-align="center" | ||
+ | |'''НЕТ ВОЙНЕ''' | ||
+ | |-style="font-size: 16px;" | ||
+ | | | ||
+ | 24 февраля 2022 года российское руководство во главе с Владимиром Путиным развязало агрессивную войну против Украины. В глазах всего мира это военное преступление совершено от лица всей страны, всех россиян. | ||
+ | |||
+ | Будучи гражданами Российской Федерации, мы против своей воли оказались ответственными за нарушение международного права, военное вторжение и массовую гибель людей. Чудовищность совершенного преступления не оставляет возможности промолчать или ограничиться пассивным несогласием. | ||
+ | |||
+ | Мы убеждены в абсолютной ценности человеческой жизни, в незыблемости прав и свобод личности. Режим Путина — угроза этим ценностям. Наша задача — обьединить все силы для сопротивления ей. | ||
+ | |||
+ | Эту войну начали не россияне, а обезумевший диктатор. И наш гражданский долг — сделать всё, чтобы её остановить. | ||
+ | |||
+ | ''Антивоенный комитет России'' | ||
+ | |-style="font-size: 16px;" | ||
+ | |Распространяйте правду о текущих событиях, оберегайте от пропаганды своих друзей и близких. Изменение общественного восприятия войны - ключ к её завершению. | ||
+ | |-style="font-size: 16px;" | ||
+ | |[https://meduza.io/ meduza.io], [https://www.youtube.com/c/popularpolitics/videos Популярная политика], [https://novayagazeta.ru/ Новая газета], [https://zona.media/ zona.media], [https://www.youtube.com/c/MackNack/videos Майкл Наки]. | ||
+ | |} | ||
+ | |||
+ | |||
Список операторов, использующихся в хранимых [[Хранимые процедуры | процедурах]] и [[Хранимые функции | функциях]]. | Список операторов, использующихся в хранимых [[Хранимые процедуры | процедурах]] и [[Хранимые функции | функциях]]. |
Версия 07:06, 1 сентября 2022
НЕТ ВОЙНЕ |
24 февраля 2022 года российское руководство во главе с Владимиром Путиным развязало агрессивную войну против Украины. В глазах всего мира это военное преступление совершено от лица всей страны, всех россиян. Будучи гражданами Российской Федерации, мы против своей воли оказались ответственными за нарушение международного права, военное вторжение и массовую гибель людей. Чудовищность совершенного преступления не оставляет возможности промолчать или ограничиться пассивным несогласием. Мы убеждены в абсолютной ценности человеческой жизни, в незыблемости прав и свобод личности. Режим Путина — угроза этим ценностям. Наша задача — обьединить все силы для сопротивления ей. Эту войну начали не россияне, а обезумевший диктатор. И наш гражданский долг — сделать всё, чтобы её остановить. Антивоенный комитет России |
Распространяйте правду о текущих событиях, оберегайте от пропаганды своих друзей и близких. Изменение общественного восприятия войны - ключ к её завершению. |
meduza.io, Популярная политика, Новая газета, zona.media, Майкл Наки. |
Список операторов, использующихся в хранимых процедурах и функциях.
Содержание
Определение и присваивание переменных
Синтаксис
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.
Метка после 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;
См. также
Литература
- Дейт К. Введение в системы баз данных (главы 4 и 17)
- Уидом Д., Ульман Д. Основы реляционных баз данных (раздел 7.4)
- Gulutzan P., Pelzer T. SQL-99 complete, really