0

我有一个 pgsql 函数声明为:

CREATE FUNCTION auth.read_session(session_id varchar) RETURNS auth.sessions

它从 auth.sessions 表中返回一条记录。我有一个 SOCI type_conversion 在我运行时运行良好select * from auth.sessions where id = :id。它在找到匹配记录并且结果为 NULL 时起作用。但是,当我将语句更改为:

select * from auth.read_session('invalid');

我得到例外:

执行“select * from auth.read_session('invalid')”时,此类型不允许空值。

我尝试列出列、传递 soci::indicator 等。我无法让它工作。异常来自基本 type_conversion<>。

在 type-conversion-traits.h 中有一条评论指出:

// 默认特征类 type_conversion,作为 row::get() 的传递 // 当不需要实际转换时。

为什么不需要转换?是的,我的函数返回表类型“auth.sessions”的记录。它是否应该返回 RECORD 以便启动转换?

4

2 回答 2

0

PadThink 你对回报的看法是正确的。要以您正在执行的方式调用此函数,您需要返回一个 QUERY、TABLE 或 SETOF 记录。

http://www.postgresql.org/docs/9.2/static/xfunc-sql.html

于 2015-09-16T02:07:14.597 回答
0

显然,可以做到这一点的唯一方法是让函数返回 SETOF 记录。我相信不需要转换,因为在我的情况下,整个结果是 NULL 并且不能以某种方式转换为我自己的类型。只要有任何结果,就可以返回表类型的单个记录。

如果一个函数被设计为总是返回一个记录,即使是一个空的,但仍然是一个“记录”,它会起作用。

于 2015-09-13T22:12:12.333 回答