RETURN TABLE 在 Postgres 函数中转换为 RETURN SETOF int

jza*_*ruk 6 postgresql pgadmin parameter functions

在 pgAdminIII 中,我创建了一个函数,该函数使用 RETURN TABLE 在名为 identifier 的单列中返回多行:

CREATE OR REPLACE FUNCTION test(
    IN parm1 date,
    IN parm2 interval)
  RETURNS TABLE(identifier INT) 
AS
$BODY$
BEGIN
    RETURN QUERY
    SELECT 1;

END;
$BODY$
  LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

创建函数后,pgAdminIII 显示该函数具有以下定义:

CREATE OR REPLACE FUNCTION test(IN parm1 date, IN parm2 interval)
  RETURNS SETOF integer AS
$BODY$
BEGIN
    RETURN QUERY
    SELECT 1;

END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100
Run Code Online (Sandbox Code Playgroud)

执行函数时,它遵循RETURNS TABLE. 但是,在编辑该函数时,它将拾取RETURNS SETOF. 这提供了与我指定的函数不同的功能(例如,返回的列的名称不再存在)。

那么,如何强制 pgAdminIII 保留返回的列名identifier?我并不特别关心我是否将其定义为 aTABLESETOF

Erw*_*ter 3

你看到的显然是当前 pgAdmin 1.20 中的显示错误。我可以重现它。

您必须注意,您看到的代码是根据系统表条目重新设计的。

如果你直接在系统目录中查找你的函数,你会发现你的返回类型已经正确注册(至少它在 pg 9.4 中对我有用):

SELECT pg_get_functiondef(oid)
FROM   pg_proc
WHERE  proname = 'test';
Run Code Online (Sandbox Code Playgroud)

更多有用的功能,如pg_get_functiondef() 手册中所示。

您可能想在 pgAdmin 支持列表中询问:

http://www.postgresql.org/list/pgadmin-support/

邮件至 pgadmin-support@postgresql.org

如何强制返回的列的名称为identifier

你的方法RETURNS TABLE(identifier int)是正确的。RETURNS SETOF不采用参数名称,除非将其与OUT参数结合使用。就像这样:

CREATE OR REPLACE FUNCTION test(parm1 date
                              , parm2 interval
                              , OUT identifier int)
  RETURNS SETOF integer AS ...
Run Code Online (Sandbox Code Playgroud)