Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Справочник по SQL http.doc
Скачиваний:
4
Добавлен:
01.03.2025
Размер:
671.74 Кб
Скачать

Цикл с предусловием

Цикл с предусловием определяется оператором 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;