【问题标题】:how to display full stored procedure code?如何显示完整的存储过程代码?
【发布时间】:2011-04-01 06:59:49
【问题描述】:

您如何查看存储过程/函数?

假设我有一个没有原始定义的旧函数 - 我想看看它在 pg/psql 中做了什么,但我似乎想不出办法。

使用 Postgres 版本 8.4.1

【问题讨论】:

    标签: postgresql stored-procedures


    【解决方案1】:

    \df+ <function_name>psql

    【讨论】:

    • 有没有办法漂亮地打印这个?我问的原因是因为这使它不可读。
    • 这对我来说印刷得很漂亮。请记住,如果您在 psql 中以交互方式执行此操作并且行被换行并且寻呼机启动,那么您可以通过键入“-S”(与“less”命令行参数相同)来关闭换行,然后使用箭头键滚动周围。
    • 为了便于阅读,您可以在显示函数定义之前使用\x psql meta-command\x 对于查看包含长字符串记录的查询结果也很有用。
    【解决方案2】:

    \ef <function_name> 在 psql 中。它将为整个功能提供可编辑的文本。

    【讨论】:

    • 准确答案。这将在编辑器中打开函数定义。
    • 这是最好的答案!它以可读的方式显示函数的定义。
    • 执行缓冲区后别忘了输入; <enter>
    • ERROR: more than one function named
    • @BrianCannard,如果添加(type)的needle函数没有错误
    【解决方案3】:
    SELECT prosrc FROM pg_proc WHERE proname = 'function_name';
    

    这告诉函数处理程序如何调用函数。它可能是解释语言的函数的实际源代码、链接符号、文件名或其他任何内容,具体取决于实现语言/调用约定

    【讨论】:

    • 这很有用。有没有办法让输出打印得漂亮?
    • 这很有用,因为它不需要psql。请注意,函数名称似乎是小写的。
    • @Maxim,你知道如何检测返回类型和输入参数吗?
    • @Fivell,仅用于 arg 名称,而非类型:SELECT proname, prosrc, proargnames FROM pg_proc WHERE proname like '%func_name%'。这至少在 Pg 9.6 上。您可以通过属性proargtypes 获取类型的数字代码,但您需要与其他一些表连接才能将其作为名称。
    【解决方案4】:

    使用 pgAdmin 或使用 pg_proc 获取存储过程的源代码。 pgAdmin 也是如此。

    【讨论】:

    • pg_proc 就是这样!我很高兴他们通过不将其称为 pg_procedure...geez 节省了几个字节的空间。 :)
    • 通过使用 --echo-hidden 参数启动 psql 很容易找出 psql 正在使用哪些查询来检索该信息(例如,对于 \df 命令)。这将显示内部使用的所有查询。 pg_proc 不存储完整的 CREATE FUNCTION 语句。您可以使用 pg_get_functiondef() 来检索完整的源代码。
    • 以防万一有人对该表的位置感到困惑:pg_catalog -> 系统表 -> pg_proc
    【解决方案5】:

    使用\df 列出Postgres 中的所有存储过程。

    【讨论】:

      【解决方案6】:

      如果有人想知道如何快速查询目录表并使用pg_get_functiondef() 函数,这里是示例查询:

      SELECT n.nspname AS schema
            ,proname AS fname
            ,proargnames AS args
            ,t.typname AS return_type
            ,d.description
            ,pg_get_functiondef(p.oid) as definition
      --      ,CASE WHEN NOT p.proisagg THEN pg_get_functiondef(p.oid)
      --            ELSE 'pg_get_functiondef() can''t be used with aggregate functions'
      --       END as definition
        FROM pg_proc p
        JOIN pg_type t
          ON p.prorettype = t.oid
        LEFT OUTER
        JOIN pg_description d
          ON p.oid = d.objoid
        LEFT OUTER
        JOIN pg_namespace n
          ON n.oid = p.pronamespace
       WHERE NOT p.proisagg
         AND n.nspname~'<$SCHEMA_NAME_PATTERN>'
         AND proname~'<$FUNCTION_NAME_PATTERN>'
      

      【讨论】:

      • pg_get_functiondef() 似乎不能处理用户定义的聚合函数。当我得到 ERROR: "histogram" is a aggregate function when I query a UDA
      • [42809] 错误:“array_agg”是一个聚合函数
      • @DanielL.VanDenBosch 已更正(仅排除聚合函数)
      • 你救了我的命... pg_get_functiondef() 可用于在定义pg_get_functiondef(p.oid) ilike '%indicator_loss%'中查找具有特定单词的procs
      【解决方案7】:

      如果你在系统中配置了phpPgAdmin,也可以通过phpPgAdmin获取,

      第 1 步:选择您的数据库

      第 2 步:点击查找按钮

      第 3 步:将搜索选项更改为函数,然后点击查找。

      您将获得已定义函数的列表。您也可以按名称搜索函数,希望这个答案对其他人有所帮助。

      【讨论】:

        【解决方案8】:

        由于PostgreSQL 9.1 \sf 可用。

        【讨论】:

          【解决方案9】:

          通常来说,您会使用像pgAdmin 这样的数据库管理器应用程序,浏览到您感兴趣的对象,然后右键单击您的方式以“创建脚本”或类似的方式。

          您是否尝试在没有管理应用的情况下执行此操作?

          【讨论】:

          • 只有命令行 - 没有管理应用程序。如果 pgAdmin 可以做到,它必须使用某种命令——我只是找不到任何关于它的文档。我正在浏览 pg_* 表,但似乎没有一个突出。
          • 很高兴您找到了答案,但不确定您为什么要让自己的生活变得艰难!为什么不直接安装 pgAdmin?
          • 在 ssh 会话中远程连接到数据库时,运行管理应用程序并不容易。
          【解决方案10】:

          要查看用存储过程/函数编写的完整代码(查询),请使用以下命令:

          sp_helptext procedure/function_name
          

          对于函数名和过程名,不要添加前缀“dbo”。或“系统”。

          不要在过程或函数名称的末尾添加括号,也不要传递参数。

          使用 sp_helptext 关键字,然后只传递过程/函数名称。

          使用以下命令查看为过程编写的完整代码:

          sp_helptext ProcedureName
          

          使用以下命令查看为函数编写的完整代码:

          sp_helptext FunctionName
          

          【讨论】:

          • postgresql 中没有sp_helptext
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-01-13
          • 1970-01-01
          • 2020-04-14
          • 2017-10-25
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多