【问题标题】:PostgreSQL function data typesPostgreSQL 函数数据类型
【发布时间】:2015-05-15 05:21:09
【问题描述】:

如何获取 PostgreSQL 函数中使用的所有变量的名称和数据类型?通过 pg_proc 中的 prosrc 列是一种方法。有没有更好的 - 一些以易于查询/过滤的格式存储信息的视图? PostgreSQL 版本是 9.0。

【问题讨论】:

  • 你的意思是在函数内部,而不仅仅是传递给它们的参数?
  • 是的,在函数内部。我可以使用 pg_get_function_arguments 得到的参数

标签: postgresql function variables


【解决方案1】:

不,PostgreSQL 中没有内置的方法来执行此操作。函数体存储为文本字符串,无需将其解析为组件。您可以 - 显然 - 解析出变量名称和数据类型,但它需要一些认真的解析。

对于 PL/pgSQL:

  1. 读取第一个词(即第一个词与下一个词用空格分隔);如果是declare,请继续阅读,直到出现begin这个词。
  2. 阅读下一个单词,这是一个变量的名称。
  3. 阅读所有内容,直到逗号,(将一个变量与另一个分隔)或单词begin(变量结尾),但忽略括号()内的逗号,因为它们与变量的初始化或数据类型修饰符(如numeric(8, 2))。这是数据类型,包含它的所有修饰符和任何初始化。
  4. 从上一步中读取的文本中提取直到:= 的所有内容。之前的所有内容都是数据类型和任何修饰符,之后的所有内容都是初始值。
  5. 从第 2 步开始重复,直到遇到单词 begin

单个过程中可能有嵌套块,因此您必须对主体中的每个块重复此过程。

对于 PL/Perl、PL/Tcl 和 PL/Python 等其他语言,您必须根据该语法解析变量。然后还有其他带有过程语言的模块,例如 PL/R 或 PL/Sh,它们的语法又有所不同。

这显然不是在查询中使用简单的reg_exp 完成的,而是需要一些更高级的逻辑处理。

【讨论】:

  • 你可以嵌套 DECLARE/BEGIN/END 块,所以它可能会比这更糟......
  • 这也仅适用于 PL/PgSQL 函数。如果有PL/Perl、PL/R或其他函数,它们的变量定义是不同的。
猜你喜欢
  • 2015-11-16
  • 2010-10-25
  • 2014-03-25
  • 1970-01-01
  • 2020-06-13
  • 2013-08-16
  • 2018-10-02
  • 1970-01-01
  • 2017-09-29
相关资源
最近更新 更多