Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 如何使用PostgreSQL中的特定表获取存储过程列表?_Database_Postgresql_Function_Plpgsql - Fatal编程技术网

Database 如何使用PostgreSQL中的特定表获取存储过程列表?

Database 如何使用PostgreSQL中的特定表获取存储过程列表?,database,postgresql,function,plpgsql,Database,Postgresql,Function,Plpgsql,在PostgreSQL(9.3)中,是否有一种简单的方法来获取使用特定表的存储过程列表 我正在更改几个表,需要修复使用它们的存储过程。此任务并不简单,因为PostgreSQL没有任何关于函数和表之间依赖关系的证据。据我所知,没有任何公共工具可以做到这一点。一个是Skype,但我不确定这个工具是否是在Skype之外发布的。如果您知道C,那么您可以修改,其中该信息可用,但未使用 这是一个糟糕的解决方案——您可以尝试在源代码中搜索特定的字符串 postgres=# CREATE OR REPLACE

在PostgreSQL(9.3)中,是否有一种简单的方法来获取使用特定表的存储过程列表


我正在更改几个表,需要修复使用它们的存储过程。

此任务并不简单,因为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,否-您可以在存储源代码的表中搜索。@非常感谢您,先生……您刚刚为我节省了几个小时:)