Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
BD_KL_2010_14.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
28.97 Mб
Скачать

6.1.9.Вызов функций

При вызове функции PL/pgSQL из кода PL/pgSQL имя функции обычно включается в команду SQL SELECT или в команду присваивания. Примеры:

SELECT функция (аргументы);

переменная := функция(аргументы);

Подобный способ вызова функций при выборке и присваивании стал стандартным, поскольку любая функция PostgreSQL должна возвращать значение некоторого типа. Ключевое слово PERFORM позволяет вызвать функцию и проигнорировать возвращаемое значение. Синтаксис вызова функции с ключевым словом PERFORM:

PERFORM функция (аргументы);

В листинге 6.43 приведены примеры вызова функции PL/pgSQL с ключевым словом PERFORM и вызова другой функции PL/pgSQL посредством присваивания (в команде SELECT INTO).

Функция ship_item() является удобной «оболочкой» для вызова функции add_ship­ment(). Она получает исходные данные, убеждается в существовании покупателя и книги, а затем передает данные add_shipment().

Листинг 6.43. Использование ключевого слова PERFORM

CREATE FUNCTION ship_item (text, text, text) RETURNS integer AS '

DECLARE

-- Объявление псевдонимов для аргументов функции.

l_name ALIAS FOR $1;

f_name ALIAS FOR $2;

book_isbn ALIAS FOR $3;

-- Объявление переменной для хранения кода книги.

-- Переменная используется для проверки переданного кода ISBN.

book_id integer;

-- Объявление переменной для хранения кода покупателя.

-- Переменная используется для проверки данных покупателя.

customer_id integer;

BEGIN

-- Получить код покупателя при помощи ранее определенной функции.

SELECT INTO customer_id get_customer_id(l_name, f_name);

-- Если покупатель не найден, функция get_customerjd

-- возвращает -1. В этом случае вернуть -1 и выйти из функции.

IF customer_id = -1 THEN

RETURN -1;

END IF;

-- Получить код книги с заданным кодом ISBN.

SELECT INTO book_id FROM editions WHERE isbn = book_isbn;

-- Если данные книги отсутствуют в базе, вернуть -1.

IF NOT FOUND

THEN

RETURN -1;

END IF;

-- Если книга и покупатель существуют.

-- сохранить информацию о поставке в базе.

PERFORM add_shipment(customer_id, book_isbn);

-- Вернуть 1 - признак успешного выполнения функции.

RETURN 1;

END;

' LANGUAGE 'plpgsql';

6.2.Триггеры

Довольно часто перед некоторыми событиями SQL или после них должны выполняться определенные операции − например, проверка логической целостности данных, заносимых в базу, предварительное форматирование данных перед вставкой или модификация других таблиц, логически обусловленная удалением или модификацией записей. Традиционно такие операции выполнялись на программном уровне приложением, подключившимся к базе данных, а не самой СУБД.

В PostgreSQL поддерживаются нестандартные расширения, называемые триггерами (trigger) и упрощающие взаимодействие приложения с базой данных. Триггер определяет функцию, которая должна выполняться до или после некоторой операции с базой данных. Триггеры реализуются на языке С, PL/pgSQL или любом другом функциональном языке (кроме SQL), который может использоваться в PostgreSQL для определения функций.

ВНИМАНИЕ. Триггеры относятся к числу специфических расширений PostgreSQL, поэтому их не рекомендуется использовать в решениях, требующих высокой степени совместимости с другими РСУБД.

Триггеры срабатывают при выполнении с таблицей команды SQL INSERT, UPDATE или DELETE.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]