错误:使用 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 中的函数需要列定义列表的主要内容,如果未能解决你的问题,请参考以下文章
如何在CentOS 7/6.5/6.4 下安装PostgreSQL 9.3 与 phpPgAdmin