2012-06-12 54 views
1
我使用PostgreSQL 9.1.3

及以下功能:通過INOUT參數返回數組無需修改

CREATE OR REPLACE FUNCTION cad(INOUT args text[], OUT retval int4) AS $cad$ 
BEGIN 
    retval := 0; 
    RAISE NOTICE 'cad: %', args; 
END; 
$cad$ LANGUAGE plpgsql; 

CREATE OR REPLACE FUNCTION dodo(in_args text[]) RETURNS text[] AS $dodo$ 
DECLARE 
    _res text[]; 
    _rv  int4; 

BEGIN 
    _res := in_args; 
    EXECUTE 'SELECT cad($1)' USING _res INTO _res, _rv; 

    RETURN _res; 
END; 
$dodo$ LANGUAGE plpgsql; 

當我直接打電話cad,我得到預期的輸出:

psql$ select cad(ARRAY['Quiz']); 
NOTICE: cad: {Quiz} 
-[ RECORD 1 ]--- 
cad | ({Quiz},0) 

Time: 0,319 ms 

我的預期調用dodo(ARRAY['Quiz'])的結果是沒有更改的輸入數組。但相反,我收到以下錯誤:

psql$ select dodo(ARRAY['Quiz']); 
NOTICE: cad: {Quiz}CONTEXT: SQL statement "SELECT cad($1)" 
PL/pgSQL function "dodo" line 8 at EXECUTE statement 
ERROR: array value must start with "{" or dimension information 
CONTEXT: PL/pgSQL function "dodo" line 8 at EXECUTE statement 

這裏有什麼問題?

P.S .:我必須使用EXECUTE作爲函數來調用會有所不同,代碼簡化爲目的的問題。

回答

1

你想要的東西,如:

EXECUTE 'SELECT * FROM cad($1)' USING _res INTO _res, _rv; 

的返回類型不是文本[]的兩列,詮釋它的(文本[],INT),這需要展開的記錄。

+0

確實,這樣一個錯過的簡單的事情... – vyegorov

+0

這是一旦你知道:-) –