是否可以从Postgres函数中发现列类型?

Mar*_*ark 9 postgresql stored-procedures

我正在使用一个实用程序来使用模板来生成针对Postgres数据库的数据访问层.作为其中的一部分,我试图动态发现存储过程的返回类型.在返回单个标准类型的简单情况下这很容易,但是当它返回用户定义的类型时我很挣扎.

如果有人能提供必要的SQL来返回这些数据,我将不胜感激.

谢谢马克

我很欣赏我到目前为止的答案,这些答案有效地归结为以下SQL

SELECT p.proname, t.typname, p,proretset
FROM pg_catalog.pg_proc p
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace
INNER JOIN pg_type t ON p.prorettype = t.oid
WHERE n.nspname = 'public'
--and proname = 'foo'
ORDER BY proname;
Run Code Online (Sandbox Code Playgroud)

这将返回返回类型的名称.但是,当它返回用户定义的类型时,我仍然需要将类型分解为构成它的属性.

在函数返回记录的情况下,除了调用函数并检查其返回值之外,我认为没有任何方法可以发现它的返回结构.

Mar*_*ark 1

感谢大家的帮助,我认为 JackPDouglas 是正确的,并且由于返回记录集的函数可以是多态的,因此无法找出返回类型定义。

然而,这是我正在寻找的用于获取返回复合类型的函数的定义的 SQL:

SELECT t.typname, attname, a.typname
from pg_type t
JOIN pg_class on (reltype = t.oid)
JOIN pg_attribute on (attrelid = pg_class.oid)
JOIN pg_type a on (atttypid = a.oid)
WHERE t.typname = (
    SELECT t.typname
    FROM pg_catalog.pg_proc p
    LEFT JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace
    INNER JOIN pg_type t ON p.prorettype = t.oid
    WHERE n.nspname = 'public'
    and proname = 'foo'
    ORDER BY proname
);
Run Code Online (Sandbox Code Playgroud)