在所有其他程序中查找程序名称

问题描述 投票:0回答:1

程序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

postgresql pgadmin-4 postgresql-16
1个回答
0
投票

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
:
db<>fiddle 的演示

select proname 
from pg_proc 
where strpos(lower(pg_get_functiondef(oid)),'pro_1')<>0 and prokind = 'p'
© www.soinside.com 2019 - 2024. All rights reserved.