我使用的是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这里出了什么问题?
附言:我不得不使用EXECUTE,因为调用的函数会有所不同,为了便于提问,代码也被简化了。
发布于 2012-06-12 20:08:27
你想要这样的东西:
EXECUTE 'SELECT * FROM cad($1)' USING _res INTO _res, _rv;返回类型不是两列的text[],而是需要解包的(text[],int)的记录。
https://stackoverflow.com/questions/10991827
复制相似问题