2

我在数据库中创建了一个将记录插入表中的函数。此函数返回 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);');

那会抛出这个错误:

函数返回在不能接受类型记录的上下文中调用的记录

当我用 PERFORM dblink 替换 Select dblink 时,我收到此错误:

“PERFORM”处或附近的语法错误

当我尝试时,选择 dblink_exec:

我收到此错误:

不允许返回结果的语句

再次,该函数的工作原理是我在本地调用它来测试它,它做了它应该做的事情。

我检查了与此的连接,它返回正常:

SELECT dblink_connect('pg_log');

任何人都有任何想法为什么会失败并提出修复建议?

谢谢!

4

1 回答 1

1

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

来自PostgresSQL 文档:

该函数返回查询产生的行。由于 dblink 可用于任何查询,因此声明它返回记录,而不是指定任何特定的列集。这意味着您必须在调用查询中指定预期的列集——否则 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%';
于 2018-04-26T21:27:52.310 回答