Я перечисляю все функции схемы PostgreSQL и нуждаюсь в человеческих читаемых типах для каждого аргумента функций. OID типов a, представленных в виде массива в proallargtypes
. Я могу отключить массив и применить к нему format_type()
, что заставляет запрос разбиваться на несколько строк для одной функции. Чтобы этого избежать, мне нужно создать внешний SELECT
до GROUP
аргументов снова, потому что, по-видимому, нельзя группировать неустановленный массив. Все столбцы зависят от пронума, но я должен перечислить все столбцы в разделе GROUP BY
, что необязательно, но пронумеровать is not a primary key.Применить функцию к каждому элементу массива в инструкции SELECT
Есть ли лучший способ достичь своей цели выхода, как это:
proname | ... | protypes
-------------------------------------
test | ... | {integer,integer}
В настоящее время я, используя этот запрос:
SELECT
proname,
prosrc,
pronargs,
proargmodes,
array_agg(proargtypes), -- see here
proallargtypes,
proargnames,
prodefaults,
prorettype,
lanname
FROM (
SELECT
p.proname,
p.prosrc,
p.pronargs,
p.proargmodes,
format_type(unnest(p.proallargtypes), NULL) AS proargtypes, -- and here
p.proallargtypes,
p.proargnames,
pg_get_expr(p.proargdefaults, 0) AS prodefaults,
format_type(p.prorettype, NULL) AS prorettype,
l.lanname
FROM pg_catalog.pg_proc p
JOIN pg_catalog.pg_language l
ON l.oid = p.prolang
JOIN pg_catalog.pg_namespace n
ON n.oid = p.pronamespace
WHERE n.nspname = 'public'
) x
GROUP BY proname, prosrc, pronargs, proargmodes, proallargtypes, proargnames, prodefaults, prorettype, lanname
Благодарим за это! Я проверю это и вернусь к вам. К сожалению, я не могу создать свою собственную функцию, потому что я пишу инструмент, независимый от базы данных, который может перечислить функции. Просто прочитайте доступ. – AmShaegar
Удивительно, я знал о проблеме с аргументами OUT. Все, что мне нужно для решения моей проблемы, это функция ARRAY() вашей пользовательской функции. Большое спасибо! – AmShaegar
@AmShaegar: just note - ARRAY() не является функцией - это «конструктор массива с подзапросом». Синтаксис такой же, но семантика немного отличается :) –