- •Введение
- •Прочие команды
- •Структура базы данных
- •Ключи, ограничения
- •Индексы
- •Представления
- •Процедуры и функции
- •Триггеры
- •Пользователи и сессии
- •Инструментарий скачать субд
- •Инсталляция
- •Выполнение запросов
- •Использование примеров
- •Комментарий
- •Идентификаторы
- •Обзор типов данных
- •Интервал времени
- •Литералы
- •Выражения и операции
- •Cтроковые операции
- •Алгебраические операции
- •Операции отношения
- •Логические операции и предикаты
- •Условные выражения
- •Прочие операции
- •Обзор функций
- •Математические функции
- •Строковые функции
- •Работа с датами
- •Преобразование типов
- •Функции Oracle
- •Функции PostgreSql
- •Функции MySql
- •Создание таблицы
- •Значения полей по умолчанию
- •Ключи и ограничения
- •Настройка внешнего ключа
- •Создание по выборке
- •Дополнительные параметры таблицы
- •Изменение, удаление таблицы
- •Переименование таблицы или ее столбца
- •Добавление/удаление столбца
- •Первичный ключ
- •Уникальный ключ
- •Внешний ключ
- •Безошибочное удаление таблиц
- •Добавление записей
- •Значения по умолчанию
- •Подзапросы
- •Вставка по условию
- •Обновление записей
- •Обновление подзапросом
- •Обновление по данным другой таблицы
- •Удаление записей
- •Выборка записей
- •Выборка констант
- •Выборка по столбцам таблиц
- •Синонимы (алиасы)
- •Уникальные записи
- •Выборка по условию
- •Выборка по группам
- •Соединения
- •Агрегатные функции, группировка данных
- •Операции над выборками
- •Добавление итогов
- •Нумерация записей
- •Обеспечение уникальности первичного ключа
- •Столбцы с автоинкрементом
- •Индексы
- •Представления
- •Динамический sql (dsql)
- •Процедурные операторы блоковая структура кода
- •Присвоение
- •Условный оператор
- •Оператор выбора
- •Безусловный цикл
- •Цикл с предусловием
- •Цикл по счетчику
- •Цикл по элементам
- •Операторы выхода/продолжения итерации
- •Выборка в переменные
- •Хранимые процедуры
- •Вызов процедур
- •Исключения
- •Курсоры
- •Триггеры
- •Числа прописью
- •Транзакции, конкурирующие запросы
- •Управление аккаунтами пользователи
- •Права доступа
- •Права доступа MySql
- •Права доступа PostgreSql
- •Права доступа Oracle
- •Удаление прав доступа
- •Роли PostgreSql
- •Роли Oracle
- •Роли MySql
- •Файловый вывод/ввод
- •Информация о базе данных
Цикл с предусловием
Цикл с предусловием определяется оператором WHILE.
-- Oracle, PostgreSQL
WHILE i < 10 LOOP
i:=i+1;
END LOOP;
-- MySQL
WHILE i < 10 DO
set i:=i+1;
END WHILE;
Цикл по счетчику
MySQL не поддерживает цикл по счетчику. Счетчик в виде переменной объявлять не надо. По умолчанию счетчик изменяется на 1, если присутствует ключевое слово REVERSE на -1.
-- Oracle, PostgreSQL
FOR j IN 1..10 LOOP
i:=i+1;
END LOOP;
-- Oracle
FOR j IN REVERSE 1..10 LOOP
i:=i+1;
END LOOP;
-- PostgreSQL
FOR j IN REVERSE 10..1 LOOP
i:=i+1;
END LOOP;
Цикл по элементам
Для обработки записей запроса добавлен специальный цикл. В PostgreSQL переменная, в которой будет храниться текущая запись, должна быть объявлена явно с типом RECORD. Также вместо одной переменной можно указать список переменных, соответствующих столбцам запроса.
-- Oracle
FOR cur IN
(select * from tblname )
LOOP
i:=i+cur.id;
END LOOP;
-- PostgreSQL
declare
i integer := 1;
cur RECORD;
begin
FOR cur IN
(select * from tblname )
LOOP
i:=i+cur.id;
END LOOP;
...
Операторы выхода/продолжения итерации
Для выхода из цикла и перехода на следующую итерацию служат операторы EXIT и CONTINUE в Oracle и PostgreSQL. В MySQL это операторы LEAVE и ITERATE.
-- Oracle, PostgreSQL
<<l1>>for m in 1..20 loop
for n in 1..30 loop
if n=15 then
CONTINUE;
end if;
i:=n+m;
...
-- выход из обоих циклов
EXIT l1 WHEN i>50;
end loop;
end loop l1;
-- MySQL
l1: loop
set i:=i+1;
if i=5 then
ITERATE l1;
end if;
...
if i>11 then
LEAVE l1;
end if;
end loop l1;
Выборка в переменные
В динамический SQL добавлен особый синтаксис для команды SELECT, позволяющий сохранить выбранные данные в указанные переменные. Если запрос возвращает более одной записи или ни одной, то возникает исключение.
-- Oracle, PostgreSQL
-- переменная r типа tblname%rowtype;
SELECT * INTO r FROM tblname WHERE id=1;
-- PostgreSQL
-- переменная r типа record
SELECT * INTO r FROM tblname WHERE id=1;
-- Oracle, PostgreSQL, MySQL
-- типы и колличество переменных v соответствует
-- типам и колличеству столбцов в выборке
SELECT * INTO v1, v2,... FROM tblname WHERE id=1;
Хранимые процедуры
Процедуры и функции основные места, где разрешено использования процедурного расширения, что позволяет решать более сложные задачи. Процедуры не возвращают значений как это делают функции, однако результат их работы можно сохранить в аргументах. Для этого им надо задать атрибут OUT, по умолчанию же аргументы обычно имеют атрибут IN.
Некоторые СУБД позволяют перегрузку, т.е. создание нескольких процедур или функций с одним именем, но с разным числом или типами аргументов.
Использование хранимых процедур уменьшает нагрузку на клиентские машины, за счет нагрузки на сервер. Во-вторых, они облегчают разработку клиентских программ, особенно их модернизацию. Так как при незначительных изменениях хранимой процедуры не нужно компилить заново клиентскую программу (вызывающую хранимую процедуру) и раздавать новые версии пользователям.
Для примера создадим процедуру вставки пяти записей в следующую таблицу:
create table tblname (
id integer,
i integer,
constraint pk_tblname primary key(id)
);
Oracle
В Oracle можно задать аргументам значения по умолчанию. Конструкция OR REPLACE позволяет пересоздать процедуру, если она существует без вывода сообщения об ошибке. Для уничтожения процедуры служит командаDROP PROCEDURE. Перегрузка разрешена только внутри пакетов.
-- создание процедуры
CREATE OR REPLACE PROCEDURE insert5(n IN OUT integer)
AS
o integer :=n; -- локальная переменная
BEGIN
delete from tblname where id < 6;
insert into tblname values(1,o);
insert into tblname values(2,o);
insert into tblname values(3,o);
insert into tblname values(4,o);
insert into tblname values(5,o);
commit;
n:=5;
END insert5;
-- уничтожение процедуры
drop procedure insert5;
PostgreSQL
Для создания процедур и функций в PostgreSQL используется одна конструкция. В первом случае мы просто не указываем тип возвращаемого значения. Более того, это запрещено, если выходных параметров более одного. Если выходных аргументов нет, то в качестве возвращаемого типа надо указать void. Также нельзя задавать аргументам значение по умолчанию, но это компенсируется механизмом перегрузки.
-- создание процедуры
CREATE OR REPLACE FUNCTION insert5(n INOUT integer)
AS $$
DECLARE
o integer :=5; -- локальная переменная
BEGIN
delete from tblname where id < 6;
insert into tblname values(1,o);
insert into tblname values(2,o);
insert into tblname values(3,o);
insert into tblname values(4,o);
insert into tblname values(5,o);
commit;
n:=5;
END
$$
LANGUAGE plpgsql;
-- нет выходных аргументов
CREATE OR REPLACE FUNCTION pdemo()
returns void
AS $$
DECLARE
r integer;
BEGIN
r:=3;
END
$$
LANGUAGE plpgsql;
-- уничтожение процедуры
DROP FUNCTION insert5(n INOUT integer);
MySQL
Ниже приведен пример процедуры для MySQL.
-- создание процедуры
DELIMITER $$
DROP PROCEDURE IF EXISTS insert5 $$
CREATE PROCEDURE insert5 (INOUT n integer)
BEGIN
declare o integer default 1;
set o:=n;
delete from tblname where id < 6;
insert into tblname values(1,o);
insert into tblname values(2,o);
insert into tblname values(3,o);
insert into tblname values(4,o);
insert into tblname values(5,o);
commit;
set n:=5;
END $$
DELIMITER ;
-- уничтожение процедуры
DROP PROCEDURE insert5;
