Переменные, приоритеты и основные типы данных

Статья основана на пятом видео из 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);


Опубликовано

в

Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

двенадцать − семь =