2015-09-02 29 views
1

ALL 我有一個PostgreSQL的功能,所以這樣的:如何調用Libpq的一個PG功能,並獲得參數值的方式

CREATE OR REPLACE FUNCTION query_callouts(

    INOUT io_cursor_ref refcursor, 
    INOUT opstatus integer, 
    INOUT errtext character varying) 
    RETURNS record AS 
$BODY$ 
DECLARE 

BEGIN 

    OPEN $1 FOR 
    SELECT tablename FROM pg_tables limit 10; 
    --SELECT * from call_out_numbers; 

    RETURN; 
    Exception 
    When Others Then 
     GET STACKED DIAGNOSTICS opstatus = RETURNED_SQLSTATE, 
           errText = MESSAGE_TEXT; 
END; 

$BODY$ 
    LANGUAGE plpgsql VOLATILE 
    COST 100; 
ALTER FUNCTION query_callouts(refcursor, integer, character varying) 
    OWNER TO postgres; 

我想知道,如何在我的C代碼使用libpq的訪問函數 - query_callouts並獲取參數io_cursor_ref和opstatus和errtext?

回答

0

你可以調用就像你正在執行的任何查詢功能:如果發生異常

select * from query_callouts('mycur', 0, ''); 

io_cursor_ref | opstatus | errtext 
---------------+----------+--------- 
mycur   |  0 | 
(1 row) 

opstatuserrtext將被設置爲合適的值。 io_cursor_ref包含您傳遞給函數的名稱。

在內部,一個指針值是簡單地包含遊標活動查詢所謂 門戶的字符串名稱。此名稱可以是 傳遞,分配給其他refcursor變量,等等, 而不會打擾門戶。

請注意,您只能在事務中使用refcursor。

所有門戶在事務結束時都隱式關閉。因此,一個 refcursor值可用於引用一個打開的光標,直到該事務結束 。

您可以使用顯式的事務:

begin; 
select * from query_callouts('mycur', 0, ''); 
fetch all in mycur; 
-- save or show the query result 
-- and finally 
commit; 

或使用mycur一個函數內部。

報價從the documentation

+0

這是可以在我的psql工作,但如何在我的C/C++代碼與libpq工作? –

+0

我不知道你在問什麼。你的問題應該更具體。 [這裏](http://www.postgresql.org/docs/9.4/static/libpq-example.html)你可以找到完整的示例程序,如果你不知道如何使用libpq。 – klin

+0

哦,謝謝,我通過你的鏈接得到它的代碼,這是我需要的。我不使用libpq來 –

0

它就像任何其他查詢。

SELECT * FROM query_callouts('cursorname', 4, 'msg') 

我懷疑有些即使不是所有的參數應該是OUT參數不INOUT參數,雖然。您至少不會使用輸入值errtext

相關問題