如何显示完整的存储过程代码?


111

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

假设我有一个没有原始定义的旧函数-我想看看它在pg / psql中的作用,但是我似乎无法找出一种方法。

使用Postgres版本8.4.1

Answers:


19

使用pgAdmin或pg_proc获取存储过程的源。pgAdmin做同样的事情。


3
pg_proc就是这样!令我高兴的是,他们通过不调用pg_procedure ... geez节省了一些字节的空间。:)
达伦(Darren)2010年

14
通过以--echo-hidden参数启动psql,很容易找出psql正在使用哪些查询来检索该信息(例如,用于\ df命令)。这将显示内部使用的所有查询。pg_proc不存储完整的CREATE FUNCTION语句。您可以使用pg_get_functiondef()检索完整的源代码。
a_horse_with_no_name

5
以防万一有人对该表的位置感到困惑:pg_catalog-> system table-> pg_proc
Dimitris

242

\df+ <function_name>psql中


6
有没有办法漂亮地打印出来?我问的原因是因为这使它不可读。
12hys 2012年

3
对我来说,这很漂亮。请记住,如果您在psql中以交互方式执行此操作,并且行被换行并且分页器启动,那么您可以通过键入'-S'(与'less'命令行arg相同)来关闭换行,然后使用箭头键滚动周围。
乔纳森·哈特利

10
为了清晰起见,可以在显示函数定义之前使用\x psql meta-command\x对于查看包含长字符串记录的查询结果也很有用。


59
SELECT prosrc FROM pg_proc WHERE proname = 'function_name';

这告诉函数处理程序如何调用函数。根据实现语言/调用约定,它可能是解释语言功能的实际源代码,链接符号,文件名或几乎所有其他内容。


这很有用。有没有办法使输出漂亮打印?
Setjmp

这很有用,因为它不需要psql。请注意,函数名称似乎是小写的。
Seamus Abshere

@Maxim,您知道如何检测返回类型和输入参数吗?
Fivell 2014年

@Fivell,仅用于arg名称,而不用于:SELECT proname, prosrc, proargnames FROM pg_proc WHERE proname like '%func_name%'。至少在Pg 9.6上如此。您可以通过property获得类型的数字代码proargtypes,但是您需要与其他表连接才能将其作为名称。
塔利斯K.17年


10

如果有人想知道如何快速查询目录表并利用该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()似乎不处理用户定义的聚合函数。当我得到错误时:查询UDA时,“直方图”是一个聚合函数
Tim Child

2
[42809]错误:“ array_agg”是一个汇总函数
Daniel L. VanDenBosch

1
已纠正@ DanielL.VanDenBosch(以简单地排除聚合函数)
msciwoj

您救了我的命... pg_get_functiondef()可用于在定义中查找带有特定单词的procpg_get_functiondef(p.oid) ilike '%indicator_loss%'
零零

0

如果您在系统中进行了配置,也可以通过phpPgAdmin获取它,

步骤1:选择数据库

第2步:点击查找按钮

步骤3:将搜索选项更改为功能,然后单击查找。

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


-1

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

sp_helptext procedure/function_name

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

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

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

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

sp_helptext ProcedureName

使用以下命令查看为该功能编写的完整代码:

sp_helptext FunctionName

sp_helptext在postgresql中没有。
GSerg

-2

通常来说,您将使用pgAdmin之类的数据库管理器应用程序,浏览至您感兴趣的对象,然后右键单击“创建脚本”或类似方法。

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


2
只是命令行-没有管理应用程序。如果pgAdmin可以做到,那它必须使用某种命令-我只是找不到关于它的任何文档。我正在查看pg_ *表,但似乎没有一个脱颖而出。
达伦(Darren)2010年

很高兴您找到了答案,但是不确定为什么您要为自己的生活变得艰难!为什么不只安装pgAdmin?
annakata

7
在ssh会话中远程连接到数据库时,运行管理应用程序并不容易。
2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.