错误:使用 PostgreSQL 9.3 的 dblink 中的函数需要列定义列表

Posted

技术标签:

【中文标题】错误:使用 PostgreSQL 9.3 的 dblink 中的函数需要列定义列表【英文标题】:Error: a column definition list is required for functions in dblink using PostgreSQL 9.3 【发布时间】:2015-01-20 11:05:08 【问题描述】:

我有以下功能:

我通过使用dblink() 加入另一个数据库表来更新一个数据库表。

我已经安装了:

create extension dblink;

更多详情如下图:

CREATE OR REPLACE FUNCTION Fun_test
(
    Table_Name varchar
) 
RETURNS void AS

$BODY$

DECLARE
    dynamic_statement varchar;

BEGIN
    perform dblink_connect('port=5234 dbname=testdb user=postgres password=****');


    dynamic_statement := 'With CTE AS 
    ( 
        Select HNumber,JoiningDate,Name,Address
        From '|| Table_Name ||'c 
    )
    , Test_A 
    AS 
    ( 
    Select Row_Number() over ( Partition by PNumber order by Date1 Desc,Date2 Desc) AS roNum,
    Name,PNumber,Date1,Address
    From dblink(
            ''Select distinct PNumber,
            (
                case when fname is null then '' else fname end || '' ||
                case when lname is null then '' else lname end 
            ) as FullName,
            Address,
            Date1,Date2
            From testdb_Table
            inner join CTE on CTE.HNumber = PNumber''
           )  Num 
    )
    Update CTE
    Set 
    Name = Test_A.FullName
    ,SubAddress_A = Test_A.Address
    ,Date1 = Test_A.Date1
    from CTE 
    left outer join Test_A on 
    CTE.HNumber= Test_A.PNumber 
    where roNum =1';

    RAISE INFO '%',dynamic_statement;

    EXECUTE dynamic_statement;

    perform dblink_disconnect();
END;

$BODY$

LANGUAGE PLPGSQL;   

调用函数

select fun_test('test1');

得到一个错误:

ERROR:  a column definition list is required for functions returning "record"
LINE 11:    From dblink
                 ^

【问题讨论】:

@WingedPanther,不!那是不同的场景。 你必须告诉 PostgreSQL dblink 查询将返回哪些列。请参阅 dblink 手册。 @Craig Ringer,谢谢。我通过使用as t(column_list) 做到了这一点。但现在我收到新错误:relation "CTE" does not exist while 更新。 您无法在 PostgreSQL 中更新 CTE 术语(WITH 表达式)。 CTE 术语不被视为隐式可更新视图,它们像临时表一样具体化。无论如何,这是一个单独的问题。 @Craig Ringer,那么另一个选择是什么? 【参考方案1】:

您必须告诉 PostgreSQL dblink 查询将返回哪些列。

详见 dblink 手册。

这与返回运行时确定的record 类型的任何函数相同。如果不告诉 PostgreSQL 结果的列布局是什么,你就无法查询它。

您使用列说明符列表,例如

SELECT * FROM my_function_returning_record() f(col1 text, col2 integer);

如果您使用的是当前 PostgreSQL 版本,您可能希望查看 postgres_fdw 作为 dblink 的替代品。

【讨论】:

请你帮我解决这个问题:***.com/questions/28018991/…

以上是关于错误:使用 PostgreSQL 9.3 的 dblink 中的函数需要列定义列表的主要内容,如果未能解决你的问题,请参考以下文章

如何使用滞后功能跳过一行? PostgreSQL 9.3

将 Excel 数据导入 PostgreSQL 9.3

PostgreSQL 9.3 触发函数以参数化名称插入表

如何在CentOS 7/6.5/6.4 下安装PostgreSQL 9.3 与 phpPgAdmin

如何在CentOS 7/6.5/6.4 下安装PostgreSQL 9.3 与 phpPgAdmin

PostgreSQL 9.3 慢查询