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(...)
。
函数 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%';
我在数据库中创建了一个将记录插入 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(...)
。
函数 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%';