2015-09-13 29 views
0

我有一個pgSQL函數聲明爲:SOCI,pgSQL函數返回表的記錄 - type_conversion不工作

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( '無效')」 。

我嘗試列出列,通過soci ::指標等 我不能得到它的工作。 異常來自基礎type_conversion <>。

在類型轉換,traits.h有評論指出:

//默認的特性類type_conversion,作爲通過對 行::得到()//當沒有實際的轉換是必要的。

爲什麼不需要轉換?是的,我的函數返回表類型「auth.sessions」的記錄。 它是否應該返回記錄,以便轉換啓動?

回答

0

顯然,這可以做的唯一方法是讓函數返回SETOF記錄。我相信不需要轉換,因爲在我的情況下,整個結果是NULL,並且不能以某種方式投射到我自己的類型。 只要有任何結果,就返回表格類型的單個記錄。

如果一個函數被設計爲總是返回一個記錄,即使它是空的,但仍然是一個「記錄」,它會起作用。

0

墊認爲你是對的回報。要以這種方式調用此函數,您需要返回QUERY,TABLE或SETOF記錄。

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

+0

是的,醫生說: 「如果最後一個查詢碰巧不返回行,空值將返回」。當時我並不確定,因爲在psql中,相同的查詢以某種方式顯示我「空行」而不僅僅是NULL。我不知道它是如何完成的,因爲未設置echo_hidden並不會顯示任何魔法。但psql似乎遵循聲明的返回類型,併產生en空元組而不是NULL。 – PadThink