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

错误:使用PostgreSQL 9.3的dblink中的函数需要列定义列表,postgresql,postgresql-9.3,dblink,Postgresql,Postgresql 9.3,Dblink,我有以下功能: 在其中,我通过使用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('

我有以下功能:

在其中,我通过使用
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
                 ^

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

有关详细信息,请参阅dblink手册

这与返回运行时确定的
记录
类型的任何函数相同。如果不告诉PostgreSQL结果的列布局,则无法查询它

使用列说明符列表,例如

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

如果您使用的是当前的PostgreSQL版本,您可能希望查看
postgres\u fdw
作为
dblink

@wingedparter,不!这是不同的场景。您必须告诉PostgreSQL dblink查询将返回哪些列。请参阅dblink手册。@Craig Ringer,谢谢。我是通过使用
作为t(列列表)
来实现的。但现在我得到了新的错误:
关系“CTE”在更新时不存在。您不能在PostgreSQL中更新CTE术语(
,带
表达式)。CTE术语不被视为可隐式更新的视图,它们被具体化为临时表。不管怎样,这是另一个问题。@Craig Ringer,那么还有什么选择呢?请你帮我解决这个问题: