gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 11:17:35 24 4
gpt4 key购买 nike

我正在开发一个实用程序,该实用程序使用模板生成针对 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;

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

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

最佳答案

psql 元命令是查找信息模式内容的简单快捷方式。

尝试 test=#\d? 查找内省(introspection)信息。

然后 psql -E -c '\df' 将显示 show function 命令后面的 sql:

d$ psql -E -c '\df+'
********* QUERY **********
SELECT n.nspname as "Schema",
p.proname as "Name",
pg_catalog.pg_get_function_result(p.oid) as "Result data type",
pg_catalog.pg_get_function_arguments(p.oid) as "Argument data types",
CASE
WHEN p.proisagg THEN 'agg'
WHEN p.proiswindow THEN 'window'
WHEN p.prorettype = 'pg_catalog.trigger'::pg_catalog.regtype THEN 'trigger'
ELSE 'normal'
END as "Type",
CASE
WHEN p.provolatile = 'i' THEN 'immutable'
WHEN p.provolatile = 's' THEN 'stable'
WHEN p.provolatile = 'v' THEN 'volatile'
END as "Volatility",
pg_catalog.pg_get_userbyid(p.proowner) as "Owner",
l.lanname as "Language",
p.prosrc as "Source code",
pg_catalog.obj_description(p.oid, 'pg_proc') as "Description"
FROM pg_catalog.pg_proc p
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace
LEFT JOIN pg_catalog.pg_language l ON l.oid = p.prolang
WHERE pg_catalog.pg_function_is_visible(p.oid)
AND n.nspname <> 'pg_catalog'
AND n.nspname <> 'information_schema'
ORDER BY 1, 2, 4;
**************************

在您的情况下,这就是您想要的:

 pg_catalog.pg_get_function_result(p.oid) as "Result data type",

关于postgresql - 是否可以从 Postgres 函数中发现列类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4386631/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com