Доброго времени суток.
На днях предстоит экзамен по postgressql, будут два билета про Хранимые процедуры и Триггеры.
Я в общих чертах знаю sql , но ранее с функциями и триггерами не сталкивался...
Почитал про хранимые процедуры
Храни́мая процеду́ра — объект базы данных, представляющий собой набор SQL-инструкций, который компилируется один раз и хранится на сервере.
Хочется понять разницу между обычной процедурой и Хранимой процедурой.
Нашел такую разницу - Вместо хранения часто используемого запроса, клиенты могут ссылаться на соответствующую хранимую процедуру. При вызове хранимой процедуры её содержимое сразу же обрабатывается сервером.
И то что хранимая процедура вызывается с помощью функции CALL и EXECUTE.
Если есть еще какие то различия подскажите пожалуйста...
По поводу Триггеров
Триггеры предназначены для автоматического выполнения отдельных процедур в зависимости от операции, для которой они были назначены. Триггеры могут быть назначены до или после операций INSERT, UPDATE или DELETE как для случаев изменения записи в таблице так и для случая выполнения оператора SQL. Если произошло событие, на которое был назначен триггер, то вызывается закреплённая за этим триггером процедура.
Начиная с 9.0.x есть триггеры на колонки (столбцы) и кроме того, при объявлении триггера можно использовать ключевое слово WHEN, добавляющее дополнительное условие для срабатывания триггера.
Если с теорией еще более менее есть понимание что это такое... То с практикой вообще беда... А билеты по данным вопросам будут именно по части практики, врядли задания сложные будут, но сейчас на данном этапе я даже простые сделать не смогу потому что не представляю как прописывается в postgresql Хранимые процедуры и триггеры на примере какой нибудь самой простой базы данных.
Помогите, покажите простые но рабочие примеры по хранимым процедурам и тригерам на примере простой какой нибудь базе с пару таблиц, чтоб можно было оттолкнутся от этого и чтоб само понимание пришло...
Нашел вот такой пример функции , но так понимаю не хранимой, а простой, но даже это пример не до конца понимаю..
CREATE FUNCTION sales_tax(subtotal REAL) RETURNS REAL AS $$
BEGIN
RETURN subtotal * 0.06;
END;
$$ LANGUAGE plpgsql;
В первой строчке понимаю что идет создание функции, название функции sales_tax, тип передаваемого или используемого аргумента типа REAL, А вот эта часть не совсем понятна "RETURNS REAL AS $$ " Ну RETURNS REAL я так понимаю вернуть значение типа Real, AS обычно используется для объявления псевдонима но тут не вижу какого именно псевдонима... Не понятные два значка $$ что они значат не пойму...
Потом в теле процедуры снова встречается слово "RETURN" а именно RETURN subtotal * 0.06;
В процедуры нужно дважды указывать слово RETURN? одно в шапке а другое в теле процедуры???
Нашел другой пример той же функции
CREATE FUNCTION sales_tax(REAL) RETURNS REAL AS $$
DECLARE
subtotal ALIAS FOR $1;
BEGIN
RETURN subtotal * 0.06;
END;
$$ LANGUAGE plpgsql;
Только добавилась часть DECLARE в которой обычно описываются переменные и фраза subtotal из шапки перенесена именно в этот раздел...
Помогите все понять это, кто уже этим хорошо владеет а когда то начинал как и я уверен сможет понятно и доходчиво описать все как есть об этих вещах, очень важно для меня, заранее спасибо..
Печаль, что так
Печаль, что так плохо
>>Хочется понять разницу между обычной процедурой и Хранимой процедурой.
Обычная процедура - это вообще алгоритм, последовательность действий. Она может запускаться хоть с сервера, хоть с клиента.
Хранимая процедура - это такая процедура, которая хранится на сервере, а с клиента она только вызывается через её декларацию (название процедуры).
В мире PG процедуры называются функциями - functions.
>> И то что хранимая процедура вызывается с помощью функции CALL и EXECUTE.
Не в случае с PG. Тут они вызываются как правило через SELECT someProc();
Ты просишь примеров, ну вот они:
http://www.postgresql.org/docs/9.3/static/sql-createtrigger.html
http://www.postgresql.org/docs/9.3/static/sql-createfunction.html
Там очень доступно и понятно. Или на этом ресурсе есть даже на русском (наверное), ну, или погугли.
Эту функцию можно прочесть даже без особых знаний.
CREATE FUNCTION - создать функцию
sales_tax - наименование функции
(subtotal REAL) - то, что функция принимает в качестве входного параметра: обзываем её subtotal и указываем тип REAL
RETURNS REAL - показываем, какой тип должна функция вернуть
AS - указывает на то, что далее идёт собственно тело функции, декларативная часть закончилась
$$ - указывает начало функции, может иметь вид, например, "$body$"
BEGIN ... END; - ещё одна оболочка
RETURN - указывает, что далее идёт текст с тем, что мы должны вернуть в качестве результата функции
subtotal * 0.06 - операция умножения входного параметра subtotal на 0.06. Данная операция и является результатом работы функции.
$$ - закрываем тело функции
LANGUAGE plpgsql; - указывает на каком языке написана сама функция, т.к. их может быть много и разных
фууух... есть уточняющие вопросы? ))