gan*_*esh 150 postgresql
如何在postgresql中打印函数和触发源代码?如果有人知道查询显示功能,请告诉我,触发源代码.
小智 139
\df+在psql中为您提供源代码.
fra*_*ncs 124
功能:
您可以查询pg_proc视图,如下所示
select proname,prosrc from pg_proc where proname= your_function_name;
Run Code Online (Sandbox Code Playgroud)
另一种方法是只执行commont \df并\ef列出函数.
skytf=> \df
List of functions
Schema | Name | Result data type | Argument data types | Type
--------+----------------------+------------------+------------------------------------------------+--------
public | pg_buffercache_pages | SETOF record | | normal
skytf=> \ef pg_buffercache_pages
Run Code Online (Sandbox Code Playgroud)
它将显示该函数的源代码.
对于触发器:
我不知道是否有直接获取源代码的方法.只要知道以下方式,可能会对你有所帮助!
skytf=> select tgrelid from pg_trigger where tgname='insert_tbl_tmp_trigger';
tgrelid
---------
26599
(1 row)
skytf=> select oid,relname from pg_class where oid=26599;
oid | relname
-------+-----------------------------
26599 | tbl_tmp
(1 row)
skytf=> \d tbl_tmp
它将显示表格触发器的详细信息.通常触发器使用函数.所以你可以得到触发函数的源代码,就像我指出的那样!
Sat*_*ish 31
以下是PostgreSQL-9.5的几个例子
显示清单:
\df+\dy+显示定义:
postgres=# \sf
function name is required
postgres=# \sf pg_reload_conf()
CREATE OR REPLACE FUNCTION pg_catalog.pg_reload_conf()
RETURNS boolean
LANGUAGE internal
STRICT
AS $function$pg_reload_conf$function$
postgres=# \sf pg_encoding_to_char
CREATE OR REPLACE FUNCTION pg_catalog.pg_encoding_to_char(integer)
RETURNS name
LANGUAGE internal
STABLE STRICT
AS $function$PG_encoding_to_char$function$
Run Code Online (Sandbox Code Playgroud)
Grz*_*ski 20
有很多种可能性.最简单的方法是使用pgAdmin并从SQL窗口获取.但是,如果你想获得这个程序然后examinate pg_proc和pg_trigger系统目录或routines与triggers从信息架构视图(这是SQL标准的方式,但它可能不包括特别是PostgreSQL特有的所有功能).例如:
SELECT
routine_definition
FROM
information_schema.routines
WHERE
specific_schema LIKE 'public'
AND routine_name LIKE 'functionName';
Run Code Online (Sandbox Code Playgroud)
myt*_*der 10
稍微不仅仅是显示功能,如何获得编辑就地设施.
\ef <function_name>非常方便.它将以可编辑格式打开函数的源代码.您不仅可以查看它,还可以编辑和执行它.
只是\ef没有function_name将打开可编辑的CREATE FUNCTION模板.
如需进一步参考 - > https://www.postgresql.org/docs/9.6/static/app-psql.html
除了@franc的答案,你可以从sql界面使用它:
select
prosrc
from pg_trigger, pg_proc
where
pg_proc.oid=pg_trigger.tgfoid
and pg_trigger.tgname like '<name>'
Run Code Online (Sandbox Code Playgroud)
(取自此处:http://www.postgresql.org/message-id/Pine.BSF.4.10.10009140858080.28013-100000@megazone23.bigpanda.com)
\sf psql中的function_name产生单个函数的可编辑源代码。
从https://www.postgresql.org/docs/9.6/static/app-psql.html:
\ sf [+] function_description此命令以CREATE OR REPLACE FUNCTION命令的形式获取并显示命名函数的定义。
如果在命令名称后附加+,则对输出行进行编号,功能主体的第一行为行1。
小智 7
列出所有函数:
select n.nspname as function_schema,
p.proname as function_name,
l.lanname as function_language,
case when l.lanname = 'internal' then p.prosrc
else pg_get_functiondef(p.oid)
end as definition,
pg_get_function_arguments(p.oid) as function_arguments,
t.typname as return_type
from pg_proc p
left join pg_namespace n on p.pronamespace = n.oid
left join pg_language l on p.prolang = l.oid
left join pg_type t on t.oid = p.prorettype
where n.nspname not in ('pg_catalog', 'information_schema')
order by function_schema,
function_name;
Run Code Online (Sandbox Code Playgroud)
现在,如果您想在所有函数中搜索特定单词或文本,请确保替换函数中的文本:
with tbl as (
select n.nspname as function_schema,
p.proname as function_name,
l.lanname as function_language,
case when l.lanname = 'internal' then p.prosrc
else pg_get_functiondef(p.oid)
end as definition,
pg_get_function_arguments(p.oid) as function_arguments,
t.typname as return_type
from pg_proc p
left join pg_namespace n on p.pronamespace = n.oid
left join pg_language l on p.prolang = l.oid
left join pg_type t on t.oid = p.prorettype
where n.nspname not in ('pg_catalog', 'information_schema')
)
select *
from tbl
where definition ilike '%word or text you want to search%'
order by function_schema,
function_name;
Run Code Online (Sandbox Code Playgroud)
自版本:psql(9.6.17,服务器 11.6)
我已经尝试了以上所有答案,但对我来说
postgres=> \sf jsonb_extract_path_text
CREATE OR REPLACE FUNCTION pg_catalog.jsonb_extract_path_text(from_json jsonb, VARIADIC path_elems text[])
RETURNS text
LANGUAGE internal
IMMUTABLE PARALLEL SAFE STRICT
AS $function$jsonb_extract_path_text$function$
postgres=> \df+
ERROR: column p.proisagg does not exist
LINE 6: WHEN p.proisagg THEN 'agg'
^
HINT: Perhaps you meant to reference the column "p.prolang".
Run Code Online (Sandbox Code Playgroud)
df 似乎对我不起作用。
| 归档时间: |
|
| 查看次数: |
183552 次 |
| 最近记录: |