程序1:
create or replace procedure pro_1()
as
$$
begin
raise info 'pro1';
end
$$
language plpgsql;
程序2:
create or replace procedure pro_2()
as
$$
begin
raise info 'pro.1';
raise info 'pro.2';
end
$$
language plpgsql;
在其他程序中查找程序名称:
select proname
from pg_proc
where lower(pg_get_functiondef(oid)) like '%pro_1%' and prokind = 'p'
输出:
pro_1
pro_2
不明白为什么 pro_2 被列出,尽管提到了
pro.1
而不是 pro_1
。
从9.7开始。 LIKE
运算符上的模式匹配:
模式中的下划线(
)代表(匹配)任何单个字符;百分号 (_
) 匹配任何零个或多个字符的序列。%
因此
'%pro_1%'
也可以匹配 'pro.1'
以及 'pro_1'
、'pro#1'
等,以及该位置上的任何其他字符。要匹配文字下划线,请将其转义:%pro\_1%
默认转义字符是 反斜杠,但可以使用
子句选择不同的转义字符。要匹配转义字符本身,请写入两个转义字符。ESCAPE
也可以通过写来选择不转义字符。ESCAPE ''
pg_get_functiondef()
不仅仅是正文,因此您还要与例程的名称进行匹配。如果您显示的示例没有拼写错误,则与模式匹配的不是第一个过程正文中的 pro1
pro_1
,而是该过程的名称。
如果您只是检查子字符串是否存在,那么使用纯 SQL 或 POSIX 正则表达式引擎可能有点过分了。您可以使用更简单的
strpos()<>0
:select proname
from pg_proc
where strpos(lower(pg_get_functiondef(oid)),'pro_1')<>0 and prokind = 'p'