Postgresql 9.6,使用数据包装器调用远程函数会抛出各种错误

Postgresql 9.6, Calling a remote function with data wrapper throws various errors

我在数据库中创建了一个将记录插入 table 的函数。此函数 returns VOID 并将 VARIADIC 文本数组作为输入参数。当我 运行 来自本地数据库的函数时,它工作正常,正如预期的那样。

但是当我尝试从不同的数据库 运行 时,使用外部数据包装器它不会工作,根据我使用的方法抛出不同的错误。

下面是我如何进行一种调用:

SELECT dblink('pg_log', 
'SELECT public.insert_log(''usage'', ''txn'', ''dimensions'', ''test'', null, 
''pgwrapper'', ''temp_var'', null,  null, null, ''Start'', null, 
                     null, null, null);');

那个抛出这个错误:

function returning record called in context that cannot accept type record

当我将 Select dblink 替换为 PERFORM dblink 时,出现此错误:

syntax error at or near "PERFORM"

当我尝试时,SELECT dblink_exec:

我收到这个错误:

statement returning results not allowed

同样,该函数的工作原理与我在本地调用它进行测试时一样,并且它做了它应该做的事情。

我检查了与它的连接 return OK:

SELECT dblink_connect('pg_log');

有人知道失败的原因和修复建议吗?

谢谢!

看来您需要尝试 SELECT * FROM dblink(...) AS t1(column_name type) 而不是 SELECT dblink(...)

来自PostgresSQL Documenation:

函数 returns 查询产生的行。由于 dblink 可用于任何查询,因此它被声明为 return 记录,而不是指定任何特定的列集。这意味着您必须在调用查询中指定预期的列集——否则 PostgreSQL 将不知道会发生什么。这是一个例子:

SELECT *
FROM dblink('dbname=mydb options=-csearch_path=',
            'select proname, prosrc from pg_proc')
  AS t1(proname name, prosrc text)
WHERE proname LIKE 'bytea%';