【问题标题】:Where in the system catalog is the function body stored?函数体存放在系统目录的什么位置?
【发布时间】:2014-03-05 06:58:38
【问题描述】:

我正在尝试为我的数据库构建一个文档系统,并且我想包含我的函数和触发器的源代码。

我设法找到了有关函数和触发器的所有元数据,但是这些函数和触发器的实际主体存储在哪里?

【问题讨论】:

    标签: postgresql stored-procedures


    【解决方案1】:

    使用函数pg_get_functiondef()获取完整的函数定义:

    SELECT pg_get_functiondef('my_schema.my_func(int)'::regprocedure)
    

    转换为object identifier regprocedure 是获取函数的oid 的最简单方法,您可以将其提供给上述函数。

    The manual on pg_catalog.pg_proc:

    对于编译函数,包括内置函数和动态加载函数,prosrc 包含函数的 C 语言名称(链接符号)。对于所有其他 当前已知的语言类型,prosrc 包含函数的源文本。

    仅检索函数体:

    SELECT prosrc 
    FROM   pg_proc
    WHERE  oid = 'my_schema.my_func(int)'::regprocedure;
    

    【讨论】:

    • 太棒了。一个简单的补充:函数原型需要是模式限定的(至少在我的情况下,模式不在搜索路径中)。我已经查看了 pg_proc 目录表,但对大多数列显示数据但不是最后几列(包括 prosrc 列)这一事实感到困惑。当然,当我应该成为超级用户时,我是以“超级用户”(CREATEDB、CREATEROLE)的身份这样做的……ACL 对我没有多大帮助:{=r/postgres} 并显示了一些列数据,但显然不是全部。
    【解决方案2】:

    对于这样的事情,我使用了pg_dump --schema_only [database],但现在我使用我的专用工具以易于比较的格式报告架构:

    http://code.activestate.com/recipes/576557-dump-postgresql-db-schema-to-text/

    当然它读取函数/过程体/

    【讨论】:

      【解决方案3】:
      \ef sumall
      

      此命令以 CREATE OR REPLACE FUNCTION 或 CREATE OR REPLACE PROCEDURE 命令的形式获取并编辑命名函数或过程的定义。编辑的方式与 \edit 相同。如果您在不保存的情况下退出编辑器,则该语句将被丢弃。如果您保存并退出编辑器,如果您添加了分号,更新的命令将立即执行。否则会重新显示;输入分号或 \g 发送,或 \r 取消。
      链接:https://www.postgresql.org/docs/current/app-psql.html#APP-PSQL-PATTERNS

      \sf+ sumall
      

      此命令以 CREATE OR REPLACE FUNCTION 或 CREATE OR REPLACE PROCEDURE 命令的形式获取并显示命名函数或过程的定义。定义打印到当前查询输出通道,由 \o 设置。

      在 PSQL 中,现在你可以得到函数的定义,你也可以从上面提到的两个 PSQL 元命令中编辑它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-05
        相关资源
        最近更新 更多