Database 如何使用PostgreSQL中的特定表获取存储过程列表?
在PostgreSQL(9.3)中,是否有一种简单的方法来获取使用特定表的存储过程列表Database 如何使用PostgreSQL中的特定表获取存储过程列表?,database,postgresql,function,plpgsql,Database,Postgresql,Function,Plpgsql,在PostgreSQL(9.3)中,是否有一种简单的方法来获取使用特定表的存储过程列表 我正在更改几个表,需要修复使用它们的存储过程。此任务并不简单,因为PostgreSQL没有任何关于函数和表之间依赖关系的证据。据我所知,没有任何公共工具可以做到这一点。一个是Skype,但我不确定这个工具是否是在Skype之外发布的。如果您知道C,那么您可以修改,其中该信息可用,但未使用 这是一个糟糕的解决方案——您可以尝试在源代码中搜索特定的字符串 postgres=# CREATE OR REPLACE
我正在更改几个表,需要修复使用它们的存储过程。此任务并不简单,因为PostgreSQL没有任何关于函数和表之间依赖关系的证据。据我所知,没有任何公共工具可以做到这一点。一个是Skype,但我不确定这个工具是否是在Skype之外发布的。如果您知道C,那么您可以修改,其中该信息可用,但未使用 这是一个糟糕的解决方案——您可以尝试在源代码中搜索特定的字符串
postgres=# CREATE OR REPLACE FUNCTION foo()
RETURNS int AS $$
BEGIN
RETURN (SELECT a FROM t1);
END;
$$ LANGUAGE plpgsql;
CREATE FUNCTION
postgres=# SELECT oid::regprocedure FROM pg_proc WHERE prosrc ~ '\mt1\M';
┌───────┐
│ oid │
╞═══════╡
│ foo() │
└───────┘
(1 row)
\m\m
是正则表达式约束,请参见。函数体中包含文本“thetable”。
查询返回函数名、行号和包含“thetable”的行:
select *
from (
select proname, row_number() over (partition by proname) as line, textline
from (
select proname, unnest(string_to_array(prosrc, chr(10))) textline
from pg_proc p
join pg_namespace n on n.oid = p.pronamespace
where nspname = 'public'
and prosrc ilike '%thetable%'
) lines
) x
where textline ilike '%thetable%';
具有与
表关联类型的任何参数或返回值的函数
例如:
create function f2(rec thetable)...
create function f1() returns setof thetable...
此查询提供函数的名称、返回类型和参数类型:
with rtype as (
select reltype
from pg_class
where relname = 'thetable')
select distinct on (proname) proname, prorettype, proargtypes
from pg_proc p
join pg_namespace n on n.oid = p.pronamespace
cross join rtype
where nspname = 'public'
and (
prorettype = reltype
or reltype::text = any(string_to_array(proargtypes::text, ' ')))
当然,您可以将查询合并为一个查询。我将它们用于不同的目的。@Greg的问题是,我只需要使用特定表的过程——而不是数据库中所有过程的列表??我需要手动读取每个过程吗?我不知道,抱歉..所以我猜是先将文本转储到文件,然后手动搜索表名?,然后使用
pg_get_functiondef()(当用作标题中的行类型时,系统中的类型存在依赖关系。)@AlanWayne,否-您可以在存储源代码的表中搜索。@非常感谢您,先生……您刚刚为我节省了几个小时:)