代码之家  ›  专栏  ›  技术社区  ›  EricBlair1984

Postgresql 9.6使用数据包装器调用远程函数会引发各种错误

  •  2
  • EricBlair1984  · 技术社区  · 6 年前

    我在数据库中创建了一个函数,可以将记录插入到表中。此函数返回VOID并将可变文本数组作为输入参数。当我在本地从数据库运行该函数时,正如预期的那样,它工作得很好。

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

    以下是我打电话的方式:

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

    该错误会引发以下错误:

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

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

    “执行”处或附近出现语法错误

    当我尝试时,选择dblink\u exec:

    我收到以下错误:

    不允许返回结果的语句

    同样,该函数的工作方式是我在本地调用它来测试它,并执行它应该执行的操作。

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

    SELECT dblink_connect('pg_log');
    

    有人知道为什么会失败,并对修复提出建议吗?

    谢谢

    1 回复  |  直到 6 年前
        1
  •  1
  •   Gregory Arenius    6 年前

    看来你需要试试 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%';