2016-09-28 41 views
1

我有這個PostgreSQL的PL/pgSQL函數:如何使用SOCI進行動態綁定到PL/pgSQL函數?

CREATE OR REPLACE FUNCTION get_people() 
RETURNS SETOF people AS $$ 
BEGIN 
RETURN QUERY SELECT * FROM people; 
END; 
$$ LANGUAGE plpgsql; 

然後我嘗試使用SOCI的應用程序來讀取數據,使用此代碼:

session sql {"postgresql://dbname=postgres"}; 
row person {}; 
procedure proc = (sql.prepare << "get_people()", into(person)); 
proc.execute(true); 

我期望person有數據的第一個人,但它只包含一個帶有存儲過程名稱的列(即「get_people」)。

所以我不知道我在做什麼錯在這裏,或不做。它是PL/pgSQL代碼還是SOCI代碼?也許SOCI不支持存儲過程的動態綁定。此外,這種方法只允許我讀第一行,但其餘的行呢?我知道SOCI與rowset類讀取結果集,但文檔說它只適用於查詢。請幫忙。

回答

1

SELECT get_people()將返回單個列,類型爲people,以該過程命名。

SELECT * FROM get_people()會給你預期的行爲,在people記錄分解成它們的成分領域。

source來看,它看起來像SOCI procedure類(或至少,其Postgres的實現)是硬連接到運行程序爲SELECT ...,而不是SELECT * FROM ...

我想這意味着你需要編寫自己的查詢,即:

statement stmt = (sql.prepare << "SELECT * FROM get_people()", into(person)); 
+0

是的,現在我明白了!對於不返回任何東西的函數,您應該使用'procedure'類,但對於返回查詢結果的函數,您必須使用'statement'類並編寫一個調用函數的查詢(就像在SQL中那樣)。一旦你意識到這一點,你知道你可以用'rowset'類使用相同的方法獲得多行。謝啦。 – eXe

相關問題