0

我正在尝试为 Postgres 9.6 编写一个函数来访问一些用 C 编写的代码。

我的功能定义为:

CREATE OR REPLACE FUNCTION graph_cluster_graph (sql text, has_rcost boolean)
  RETURNS SETOF RECORD AS
    '$libdir/libpgrouting-2.4', 'dir_graph_cluster_desc'
    LANGUAGE c STABLE STRICT;

当试图调用它时:

select * from   graph_cluster_graph('select * from case3_cab_dist_table',true);

我得到错误

record返回“ ”的函数需要定义列表


如果我写它会起作用

select graph_cluster_graph('select * from case3_cab_dist_table',true);

在这种情况下,它调用所请求的 C 函数,然后在它返回时退出。

我确实更改了 C 函数的名称,只是为了了解会发生什么(您可能会出现关于无法找到该函数的错误)。所以我知道它可以找到我的 C 例程。再次使用select语句的第二种形式并获得响应意味着 C 函数已被正确调用。

有谁知道我做错了什么?

4

1 回答 1

2

使用RETURNS SETOF RECORD查询解析器不知道结果行将具有哪些列的函数,您必须在查询中提供该信息。

就像文档说的那样,

在某些情况下,定义可以根据调用方式返回不同列集的表函数很有用。为了支持这一点,表函数可以声明为返回伪类型记录。当在查询中使用这样的函数时,必须在查询本身中指定预期的行结构,以便系统知道如何解析和计划查询。此语法如下所示:

function_call [AS] alias (column_definition [, ... ]) function_call AS [alias] (column_definition [, ... ]) ROWS FROM( ... function_call AS (column_definition [, ... ]) [, ... ] )

如果您事先知道记录将包含哪些列,最好将函数定义为

RETURNS SETOF datatype

或者

RETURNS TABLE ( column_name column_type [, ...] )

后者是旧语法的简写:

funcname(..., OUT column_name column_type, ...) RETURNS SETOF record

于 2017-03-06T13:22:33.413 回答