1

我正在使用 PostgreSQL 9.1.3 和以下函数:

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

这里有什么问题?

PS:我必须使用EXECUTEas 函数来调用会有所不同,出于提问的目的简化了代码。

4

1 回答 1

2

你想要这样的东西:

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

返回类型不是两列 text[],int 它是 (text[],int) 的记录,需要展开。

于 2012-06-12T12:08:27.350 回答