【问题标题】:Postgres Functions: Getting the Return Table Column DetailsPostgres 函数:获取返回表列详细信息
【发布时间】:2021-06-09 17:26:12
【问题描述】:

我觉得有必要获取任何具有“记录”返回数据类型的函数返回的表的列名和数据类型,因为...

现有的基于 SQL Server 的系统中的一个关键过程利用了一个将用户定义的函数作为参数的存储过程。初始步骤获取作为参数传递的函数返回的表的列名和类型。

在 Postgres 13 中,我可以使用 pg_proc.prorettype 和相应的 pg_type 来查找返回记录类型的函数……这是一个开始。我还可以使用 pg_get_function_result() 来获取包含我需要的信息的字符串。但是,它是一个字符串,虽然我最终将不得不组装一个非常相似的字符串,但这只是信息的一个应用。是否有包含 (column_name, data_type, ordinal_position) 的表格等效项,还是我需要自己做?

是否可以访问系统在创建此类函数时可能已创建的复合数据类型?

我认为对我有用但有点奇怪的一个选项是:

> create temp table t as select * from function() limit 0;

然后在 info_schema.columns 中查找该表,组装我需要的内容并删除临时表...将所有这些放入一个函数中。

【问题讨论】:

  • 我认为可能总是对我有用的一个解决方案有点傻,但我可以
  • 那么您应该发布该解决方案作为答案,以帮助未来的提问者遇到同样的问题。也许社区可以让它变得不那么愚蠢

标签: postgresql


【解决方案1】:

您可以查询目录表pg_proc,其中包含所有需要的信息:

SELECT coalesce(p.na, 'column' || p.i),
       p.ty::regtype,
       p.i
FROM pg_proc AS f
   CROSS JOIN LATERAL unnest(
                         coalesce(f.proallargtypes, ARRAY[f.prorettype]),
                         f.proargmodes,
                         f.proargnames
                      )
                      WITH ORDINALITY AS p(ty,mo,na,i)
WHERE f.proname = 'interval_ok'
  AND coalesce(p.mo, 'o') IN ('o', 't')
ORDER BY p.i;

【讨论】:

  • 我花了 90 分钟或更长时间才让这个返回任何东西(是的,使用正确的 proname),但是那个单一的查询包含更多关于 Postgres 的信息,而不是我以前的全部知识。我的特殊情况的秘密是删除第二个 WHERE 约束——所有值都是“t”,所以我不明白为什么这样做会改变任何东西。将类型转换为 regtype 来解码它们也不是我曾经寻找过的东西——我一直在寻找一些“类型”的表格源来查找类型名称。解决了——现在只需了解原因(和目录)。不错。
  • 你是说proargmodes 包含t
  • 是的。与 RETURNS TABLE 部分关联的所有列都是“t”,IN 参数是“i”。我根本找不到任何关于 i、o、b 和 t 代码的参考——但我现在假设它们在 in、out、both 和 table 中。
  • 抱歉...我用于测试的特定函数只有一个 IN 参数,没有 INOUT,并且 RETURNS TABLE 大约有 20 列左右。正是这 20 个输出表列在 pg_proc 中被标记为“t”模式。
  • 哦,我的疏忽,感谢您的解释。我已经修复了查询。
猜你喜欢
  • 2012-06-02
  • 1970-01-01
  • 2011-12-04
  • 1970-01-01
  • 2017-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-08
相关资源
最近更新 更多