В PostgreSQL оператор CREATE PROCEDURE
используется для создания хранимых процедур, которые выполняют последовательность команд SQL без возврата значения. В отличие от функций, процедуры вызываются с помощью CALL
и могут выполнять управляющие конструкции, включая транзакции.
Синтаксис
CREATE PROCEDURE имя_процедуры (аргументы)
LANGUAGE язык
AS $$
тело_процедуры
$$;
имя_процедуры
— уникальное имя процедуры в схеме.аргументы
— параметры, передаваемые в процедуру.- язык — язык, используемый для написания процедуры.
тело_процедуры
— код, выполняемый при вызове процедуры.
Создание простой процедуры
Пример процедуры без параметров:
CREATE PROCEDURE log_event()
LANGUAGE plpgsql
AS $$
BEGIN
INSERT INTO event_log (event_time, description) VALUES (NOW(), 'Событие зафиксировано');
END;
$$;
Вызов процедуры:
CALL log_event();
Создание процедуры с параметрами
Процедура, принимающая параметры:
CREATE PROCEDURE add_user(username TEXT, email TEXT)
LANGUAGE plpgsql
AS $$
BEGIN
INSERT INTO users (name, email) VALUES (username, email);
END;
$$;
Вызов с аргументами:
CALL add_user('John Doe', 'john@example.com');
Использование транзакций в процедурах
Процедуры могут управлять транзакциями с помощью COMMIT
и ROLLBACK
:
CREATE PROCEDURE transfer_money(sender INT, receiver INT, amount NUMERIC)
LANGUAGE plpgsql
AS $$
BEGIN
BEGIN
UPDATE accounts SET balance = balance - amount WHERE id = sender;
UPDATE accounts SET balance = balance + amount WHERE id = receiver;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
END;
END;
$$;
Удаление процедуры
Для удаления процедуры используется DROP PROCEDURE
:
DROP PROCEDURE add_user(TEXT, TEXT);