Объявление PL / pgSQL
Вступление
Все переменные должны быть объявлены в разделе объявлений блока (отмечены красным цветом).
Версия: 9.3
Синтаксис:
[<< ярлык >>] [ОБЪЯВИТЬ декларации] НАЧАТЬ заявления END [метка];
Примечание. Единственным исключением является то, что переменная цикла цикла FOR, выполняющего итерацию по диапазону целочисленных значений, автоматически объявляется как целочисленная переменная.
Типы переменных PL / pgSQL аналогичны типам данных SQL, таким как integer, varchar и char.
Примеры:
roll_no integer; кол-во цифр (5); описание varchar; myrow tablename% ROWTYPE; myfield tablename.columnname% TYPE; arow RECORD;
Вот общий синтаксис объявления переменной:
Синтаксис:
имя [CONSTANT] тип [COLLATE collation_name] [NOT NULL] [{DEFAULT | : =} выражение];
Предложение DEFAULT, если оно задано, задает начальное значение, назначенное переменной при вводе блока. Если предложение DEFAULT не задано, переменная инициализируется нулевым значением SQL. Значение переменной по умолчанию оценивается и присваивается переменной каждый раз, когда вводится блок.
Примеры:
Кол-во целое число ПО УМОЛЧАНИЮ 1; roll_no CONSTANT integer: = 10; url varchar: = 'http: //example.com';
Объявление параметров функции
Параметры, передаваемые в функции, именуются с помощью идентификаторов $ 1, $ 2 и т. Д. При желании псевдонимы могут быть объявлены для имен параметров $ n для повышения читабельности. Предпочтительным способом является присвоение имени параметру в команде CREATE FUNCTION, например:
Код:
CREATE FUNCTION sum_of_two_numbers(m integer, n integer)
RETURNS integer AS $$
BEGIN
RETURN m + n;
END;
$$ LANGUAGE plpgsql;
Вот еще один пример:
Код:
CREATE FUNCTION FUN_TO_TEST () RETURNS double precision
AS $TEST$
BEGIN
RETURN 4.295806896E-29;
END;
$TEST$ LANGUAGE PLPGSQL
Вот та же функция, тело которой ограничено одинарными кавычками:
Код:
CREATE FUNCTION FUN_TO_TEST ()
RETURNS double precision AS '
BEGIN
RETURN 4.295806896E-29;
END;
'
LANGUAGE PLPGSQL
Вот еще один, который поможет вам понять, что использование апострофа в качестве разделителя тела не является лучшим решением:
Код:
CREATE FUNCTION TODAY_IS () RETURNS CHAR(22) AS '
BEGIN
RETURN ''Today''''is '' || CAST(CURRENT_DATE AS CHAR(10));
END;
'
LANGUAGE PLPGSQL
ALIAS
ALIAS используется для назначения другого имени для переменных с заранее определенными именами, таких как NEW или OLD в процедуре триггера. Вот синтаксис:
Код:
newname ALIAS FOR oldname;
Примеры:
Код:
CREATE FUNCTION FUN_TO_TEST(dt DATE, ing INTEGER)
RETURNS DATE AS $test$
DECLARE ss ALIAS FOR dt;
ff ALIAS FOR ing;
BEGIN
RETURN ss + ff * INTERVAL '2 DAY';
END;
$test$
LANGUAGE PLPGSQL
Вышеприведенная функция возвращает пройденную дату как количество дней, добавленных к желаемому аргументу.
В следующем примере вы можете использовать $ и позитрон переменной, передаваемой в аргументе, вместо имени новой переменной с псевдонимом.
Код:
CREATE FUNCTION FUN_TO_TEST(dt DATE, ing INTEGER)
RETURNS DATE AS $test$
DECLARE ss ALIAS FOR $1;
ff ALIAS FOR $2;
BEGIN
RETURN ss + ff * INTERVAL '2 DAY';
END;
$test$
LANGUAGE PLPGSQL
Типы переменных
% TYPE используется для получения типа данных переменной или столбца таблицы. В следующем примере roll_no - это столбец в таблице учеников. Чтобы объявить переменную с тем же типом данных, что и student.roll_no, вы должны написать:
Синтаксис :
имя переменной имя_таблицы.column_name% TYPE
Примеры:
Код:
DECLARE
roll_no student.roll_no%TYPE;
Вот еще один пример:
Код:
CREATE FUNCTION get_employee(text) RETURNS text AS '
DECLARE
frst_name ALIAS FOR $1;
lst_name employees.last_name%TYPE;
BEGIN
SELECT INTO lst_name last_name FROM employees
WHERE first_name = frst_name;
return frst_name || '' '' || lst_name;
END;
' LANGUAGE 'plpgsql';
Здесь, в приведенном выше примере, объявлен псевдоним для аргумента функции, который должен представлять собой имя сотрудника и переменную того же типа, что и поле last_name таблицы сотрудников.
Этот оператор извлекает фамилию сотрудника из таблицы сотрудников, чье имя соответствует аргументу, полученному функцией, и вставляет его в переменную lst_name и возвращает имя и фамилию, разделенные пробелом.
Вот результаты использования функции get_employee ().
postgres = # SELECT get_employee ('Джон'); get_first_name ---------------- Джон Чен (1 ряд)
Типы строк
Переменная составного типа называется переменной строки, которая может содержать целую строку результата запроса SELECT или FOR, если набор столбцов этого запроса соответствует объявленному типу переменной.
имя table_name% ROWTYPE; имя составное_тип_имя;
Доступ к отдельным полям значения строки осуществляется с использованием обычной точечной нотации, например rowvar.table_field. Поля типа строки наследуют размер или точность поля таблицы для типов данных, таких как char (n). Смотрите следующий пример:
Код:
CREATE FUNCTION get_employee (integer) RETURNS text AS '
DECLARE
emp_id ALIAS FOR $1;
found_employee employees%ROWTYPE;
BEGIN
SELECT INTO found_employee * FROM employees WHERE employee_id = emp_id;
RETURN found_employee.first_name || '' '' || found_employee.last_name;
END;
' LANGUAGE 'plpgsql';
Приведенный выше PL / pgSQL показывает, что был объявлен псевдоним для аргумента функции, который должен быть идентификатором сотрудника, а также была объявлена переменная found_employee, которая использует структуру таблицы сотрудников. Строка извлекает информацию о сотруднике для сотрудника, чей идентификационный номер соответствует аргументу, полученному функцией.
Вот результаты использования функции get_employee ().
postgres = # SELECT get_employee (108); get_employee ----------------- Нэнси Гринберг (1 ряд)
Типы записей
Переменные записи аналогичны переменным типа строки, но не имеют предопределенной структуры. Они принимают фактическую структуру строк строки, назначенной им во время команды SELECT или FOR. Подструктура переменной записи может изменяться каждый раз, когда она назначается. RECORD не является истинным типом данных, а только заполнителем, когда объявляется функция PL / pgSQL, возвращающая запись типа, это не совсем то же самое, что и переменная записи.
Синтаксис:
имя ЗАПИСЬ;
Пример:
Код:
CREATE FUNCTION get_employee (integer) RETURNS text AS '
DECLARE
emp_id ALIAS FOR $1;
found_employee RECORD;
BEGIN
SELECT INTO found_employee * FROM employees WHERE employee_id = emp_id;
RETURN found_employee.first_name || '' '' || found_employee.last_name;
END;
' LANGUAGE 'plpgsql';
Сортировка переменных PL / pgSQL
Когда функция PL / pgSQL имеет один или несколько параметров типов данных для сопоставления, для каждого вызова функции определяется сопоставление в зависимости от сопоставлений, назначенных фактическим аргументам, как описано в разделе 22.2. Если сопоставление успешно идентифицировано (т. Е. Между аргументами нет конфликтов неявных сопоставлений), то все параметры сопоставления обрабатываются как имеющие такое сопоставление неявно. Это повлияет на поведение чувствительных к сбору операций внутри функции. Например, рассмотрим
Вот пример таблицы «Работа »
job_id | job_title | min_salary | max_salary ------------ + --------------------------------- + --- --------- + ------------ AD_PRES | Президент | 20000 | 40000 AD_VP | Администрация Вице-президент | 15000 | 30000 AD_ASST | Помощник Администратора | 3000 | 6000 FI_MGR | Финансовый менеджер | 8200 | 16000 FI_ACCOUNT | Бухгалтер | 4200 | 9000 AC_MGR | Бухгалтер менеджер | 8200 | 16000 AC_ACCOUNT | Общественный бухгалтер | 4200 | 9000 SA_MAN | Менеджер по продажам | 10000 | 20000 SA_REP | Торговый представитель | 6000 | 12000 PU_MAN | Менеджер по закупкам | 8000 | 15000 PU_CLERK | Делопроизводитель | 2500 | 5500 ST_MAN | Фондовый менеджер | 5500 | 8500 ST_CLERK | Клерк акций | 2000 | 5000 SH_CLERK | Клерк доставки | 2500 | 5500 IT_PROG | Программист | 4000 | 10000 MK_MAN | Менеджер по маркетингу | 9000 | 15000 MK_REP | Представитель по маркетингу | 4000 | 9000 HR_REP | Представитель отдела кадров | 4000 | 9000 PR_REP | Представитель по связям с общественностью | 4500 | 10500
Вот пример
Код:
CREATE FUNCTION not_equal(maxa decimal, minb decimal)
RETURNS boolean AS $$
BEGIN
RETURN maxa <> minb;
END;
$$ LANGUAGE plpgsql;
Вот результаты использования функции not_equal ().
postgres = # SELECT not_equal (max_salary, min_salary) FROM заданий; не равный ----------- T T T T T T T T T T T T T T T T T T T (19 рядов)
Использование not_equal будет использовать для сравнения общее сопоставление maxa и minb, тогда как использование сопоставления C не поддерживается в целочисленном типе данных. Кроме того, идентифицированное сопоставление также предполагается в качестве сопоставления любых локальных переменных, относящихся к разводимым типам.
Вот еще один пример:
Код:
CREATE FUNCTION not_equal(fstnm text, lstnm text)
RETURNS boolean AS $$
BEGIN
RETURN fstnm <> lstnm;
END;
$$ LANGUAGE plpgsql;
Теперь посмотрим на использование сортировки Си.
postgres = # SELECT not_equal (имя, фамилия, имя COLLATE "C") ОТ сотрудников; не равный ----------- T T T T T T T T T .. ..
Вот еще один пример:
Код:
CREATE FUNCTION not_equal(fst_number integer, snd_number integer)
RETURNS boolean AS $$
DECLARE
fstnum integer := fst_number;
sndname integer:= snd_number;
BEGIN
RETURN fstnum<> sndname;
END;
$$ LANGUAGE plpgsql;
Теперь посмотрим на пример not_equal ()
postgres = # SELECT not_equal (15, 20);
Если параметры типов данных для сопоставления отсутствуют или для них нельзя определить общие параметры сортировки, то параметры и локальные переменные используют параметры сортировки по умолчанию для своего типа данных (обычно это параметры сортировки базы данных по умолчанию, но могут отличаться для переменных домена). типов). Локальная переменная типа данных с возможностью сопоставления может иметь другой сопоставление, связанное с включением опции COLLATE в ее объявление, например
Код:
DECLARE
local_a text COLLATE "en_US";
Эта опция переопределяет параметры сортировки, которые в противном случае были бы переданы переменной в соответствии с приведенными выше правилами. Также, конечно, явные предложения COLLATE могут быть написаны внутри функции, если требуется принудительно использовать конкретное сопоставление в конкретной операции. Например,
Код:
CREATE FUNCTION get_employee(fstnm text, lstnm text)
RETURNS boolean AS $$
BEGIN
RETURN fstnm < lstnm COLLATE "C";
END;
$$ LANGUAGE plpgsql;
Теперь посмотрим на пример get_employee ()
postgres = # SELECT get_employee (имя, фамилия, имя COLLATE "C") ОТ сотрудников; get_employee -------------- е е е T T е е .. ..
Следующий:
- Основные положения
- Управляющие структуры
Предыдущий: Введение в plpgSQL
Далее: Основные положения
Новый контент: Composer: менеджер зависимостей для PHP , R программирования