postgresql: универсальная хранимая процедура (выдаваемый результат зависит от типа полей таблицы)

Рейтинг: 0Ответов: 1Опубликовано: 18.06.2023

есть следующая ситуация:

необходимо для разных полей таблицы выполнять следующий запрос:

select 
    count(*) as count, 
    <field> as value
from
    table
group by <field>

в текущий момент приходится использовать 2 хранимки для строк и для целых чисел

CREATE OR REPLACE FUNCTION get_stats_by_item_text(
 field text,
 expr_where text DEFAULT ''::text)
    RETURNS TABLE(count bigint, value text) 
    LANGUAGE 'plpgsql'
    COST 100
    VOLATILE PARALLEL UNSAFE
    ROWS 1000

и

CREATE OR REPLACE FUNCTION get_stats_by_item_int(
 field text,
 expr_where text DEFAULT ''::text)
    RETURNS TABLE(count bigint, value integer) 
    LANGUAGE 'plpgsql'
    COST 100
    VOLATILE PARALLEL UNSAFE
    ROWS 1000

Вопрос - а можно ли сделать только одну универсальную хранимку? При этом:

  1. чтобы не передавать тип выбираемых данных в качестве одного из параметров, передаваемых хранимке
  2. чтобы не было (ну или практически не было) падения производительности относительно специализированной хранимки

Ответы

▲ 0

Либо имя функции совокупно с типами данных аргументов однозначно определяют тип выходных данных, либо вы делаете в функции returns record, но потому обязаны описать типы возвращаемых данных в самом вызывающем запросе:

select * from GetRows('Department') as dept(deptid int, deptname text);

Запрос обязан иметь информацию о типах данных результата функции до вызова функции.