Статья основана на пятом видео из 31 темы курса SQL 2.0 — PL/pgSQL в PostgreSQL от Аристова Евгения, который является логическим продолжением курса SQL c 0. Ссылки на видео на платформах RUTUBE и VK видео.
В данной статье подробно разбираются присваивание значения переменной, типы данных, как и где их использовать.
В прошлой статье мы разобрали команды возврата функции, и при каких обстоятельствах возврат может не произойти.
Презентация и исходники доступны по ссылке.
Переменные
Значение вычисляется и присваивается переменной каждый раз при входе в блок (более подробно про понятие в следующей статье).
Если переменная типа timestamp имеет функцию now() в качестве значения по умолчанию, это приведёт к тому, что переменная всегда будет содержать время текущего вызова функции, а не время, когда функция была предварительно скомпилирована.
Примеры присвоения значений:
quantity timestamp DEFAULT now();
url varchar := 'Ivan Ivanov';
user_id CONSTANT integer := 100;
Объявление параметров функции
Переданные в функцию параметры именуются идентификаторами $1, $2 и т. д.
Создать псевдоним можно двумя способами.
Предпочтительный способ это дать имя параметру в команде CREATE FUNCTION, а не полагаться на нумерацию параметров, например:
CREATE FUNCTION sales(total real) RETURNS real AS $$
BEGIN
RETURN total * 2;
END;
$$ LANGUAGE plpgsql;
Другой способ это явное объявление псевдонима при помощи синтаксиса:
имя ALIAS FOR $n;
Предыдущий пример для этого стиля выглядит так
CREATE FUNCTION sales_tax(real) RETURNS real AS $$
DECLARE
subtotal ALIAS FOR $1;
BEGIN
RETURN subtotal * 0.06;
END;
$$ LANGUAGE plpgsql;
Обратите внимание, что эти два примера не полностью эквивалентны. В первом случае на total можно ссылаться как sales.total, а во втором случае такая ссылка невозможна.
Если бы к внутреннему блоку была добавлена метка, то total можно было бы дополнить этой меткой. Но более подробно про блоки мы поговорим с вами в следующей статье.
Также обратите внимание, что вручную переменные не удаляются — они исчезают автоматически при выходе из функции (блока)
Типы данных
select typname, typlen, typtype from pg_type;
select count(typtype) from pg_type;
https://www.postgresql.org/docs/current/datatype.html
значения typtype:
- b — базовый тип (base)
select typname, typlen, typtype from pg_type where typtype='b';
- c — составной (composite)
- d — для домена (domain)
- e — перечисляемый (enum)
- p — псевдотип (pseudo-type)
- r — диапазон (range)
Базовые типы данных
Кодировка CP1251/KOI8R -> UTF
select bit_length('test');
select bit_length('тест');

Финансовая арифметика
money not good -> numeric
Отличие американской системы от остального мира:
в америке считаем до 1/1000 доллара в отличие от остального мира, где 1/100
в америке — округление к ближайшему четному, в остальном мире к ближайшему:
3.5->4 4.5->4
3.5->3 4.5->4
SHOW lc_monetary — текущие параметры локали
Преобразование типов
PostgreSQL: Documentation: Chapter 10 Type Conversion
В Постгресе существует специальный оператор :: -> ‘10’::real
Также есть набор функций:
PostgreSQL: Documentation: 9.8. Data Type Formatting Functions
Также можно скастовать тип:
SELECT CAST ('expression' AS INTEGER);
Добавить комментарий