我偶然发现了一个奇怪的函数签名pg_catalog.pg_stat_get_activity
:
CREATE OR REPLACE FUNCTION pg_stat_get_activity(
IN pid integer,
OUT datid oid,
OUT pid integer,
-- more parameters...)
RETURNS SETOF record AS 'pg_stat_get_activity'
LANGUAGE internal STABLE
COST 1
ROWS 100;
该函数两次声明了相同的参数名称,也是从information_schema
.
select
parameter_mode,
parameter_name
from information_schema.parameters
where specific_schema = 'pg_catalog'
and specific_name like 'pg_stat_get_activity%'
order by ordinal_position
以上产量(另请参阅此SQLFiddle):
+--------------+----------------+
|parameter_mode|parameter_name |
+--------------+----------------+
|IN |pid |
|OUT |datid |
|OUT |pid |
|... |... |
+--------------+----------------+
天真地,我尝试创建一个类似的功能,但无济于事:
CREATE FUNCTION f_2647(p1 IN int, p1 OUT int)
AS $$
BEGIN
p1 := p1;
END;
$$ LANGUAGE plpgsql;
我的问题:
- 为什么内部
pg_stat_get_activity
函数会两次重新声明相同的参数名称?这样做的目的是什么?例如,为什么不只使用一个INOUT
参数? pg_stat_get_activity
内部函数和我的有什么不同?为什么我不能使用这种语法?