PostgreSQL | Как вернуть таблицу из функции, если количество столбцов неизвестно заранее? — efim360.ru

PostgreSQL | Как вернуть таблицу из функции, если количество столбцов неизвестно заранее?

RETURNS или RETURNS TABLE без определённого количества полей и типов данных

В чём проблема? Когда мы пишем функцию в PostgreSQL, тогда выражения RETURNS или RETURNS TABLE ждут от нас явного количества передаваемых параметров и их типов.

Иными словами. Если мы работаем с таблицей, то функция сломается, когда у таблицы появятся новые столбцы или исчезнут старые.

Это очень неудобно и не гибко. В развивающейся базе данных просто невозможно приковать таблицы фиксированными размерами. Что делать?

 

Решение

В PostgreSQL сильно намудрили с типами данных и любой классический язык программирования гораздо проще понять, чем SQL.

Что нужно знать?

Когда в PostgreSQL создаётся новая таблица, тогда в СУБД под эту таблицу создаётся новый ТИП ДАННЫХ. То есть каждая таблица - это какой-то тип данных.

Так вот для того чтобы не гадать с размерностью таблицы, можно просто указать путь до неё (путь до типа данных). Выглядит это примерно так.

-- SELECT a.get_old_datecheck_from_t_d();
-- SELECT * FROM a.get_old_datecheck_from_t_d();
-- DROP FUNCTION a.get_old_datecheck_from_t_d();

CREATE FUNCTION a.get_old_datecheck_from_t_d()
RETURNS a.t_d AS
$$
  SELECT * FROM a.t_d
  WHERE datecheck = (SELECT min(datecheck) FROM a.t_d)
  LIMIT 1;
$$
LANGUAGE sql;

Смотреть нужно на выражение "RETURNS a.t_d AS"

 

Получили таблицу из вызова функции не зная количества столбцов - PostgreSQL
Получили таблицу из вызова функции не зная количества столбцов - PostgreSQL

В нём a.t_d представляет собой тип данных таблицы. То есть если таблица поменяется, то и тип автоматически поменяется. Это значит что нам не нужно париться и вручную прописывать все названия столбцов и их типы данных в выводной таблице.

Предлагаю посмотреть обучающее видео на тему "Составные типы", чтобы лучше ориентироваться в проблеме.

 

Информационные ссылки

Официальный сайт WEB-оболочки pgAdmin - https://www.pgadmin.org

Официальный сайт СУБД PostgreSQL - https://www.postgresql.org

Стандартные типы данных в PostgreSQL - https://postgrespro.ru/docs/postgresql/14/datatype

Идентификаторы объектов - https://postgrespro.ru/docs/postgresql/14/datatype-oid#DATATYPE-OID-TABLE