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

标签 postgresql dblink foreign-data-wrapper

我在数据库中创建了一个函数,用于将记录插入表中。此函数返回 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"

当我尝试时,选择 dblink_exec:

我收到这个错误:

statement returning results not allowed

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

我检查了与它的连接,它返回 OK:

SELECT dblink_connect('pg_log');

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

谢谢!

最佳答案

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

来自PostgresSQL Documenation:

该函数返回查询产生的行。由于 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%';

关于Postgresql 9.6,使用数据包装器调用远程函数会抛出各种错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50051951/

相关文章:

php - 使用 postgres 数据库表为表创建删除按钮

sql - 外部数据包装器 "postgres_fdw"不存在(即使存在)

mysql - 使用 dblink(mysql) 制作 mview 失败

mysql - 创建 Oracle DBlink 以从 MySql 获取数据

oracle - 通过 dblink 查询 JSONB (Oracle <> Postgres)

postgresql - 在 postgreSQL 中连接三个外部表

postgresql - 外部数据包装器远程触发器找不到远程表

sql - PostgreSQL 在外键中使用常量

python - 如何使用 Flask、SQLAlchemy 或 psycopg2 从 Postgres 中的游标获取数据

postgresql - pgSQL - INSERT 之前触发函数检查是否存在具有相同 id 的记录