错误:使用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,那么还有什么选择呢?请你帮我解决这个问题: