plpgsql中的整数数组在PostgreSQL 9.1中引发错误但在9.3中有效

时间:2014-09-25 12:07:52

标签: plpgsql postgresql-9.1 postgresql-9.3

我有这个功能:

CREATE OR REPLACE FUNCTION check_presence_row(
    _id_att_files integer[],
    _people_name character varying, 
    _people_id character varying, 
    _time_start timestamp without time zone, 
    _time_end timestamp without time zone
)
RETURNS integer[] AS $BODY$
DECLARE
    ids integer array;
BEGIN
    ids := (SELECT "id_att_file"FROM att_presence WHERE
        "id_att_file" = ANY ("_id_att_files") AND
        "id_people" = get_people(
                "_people_id",
                "_people_name") AND
        "time_start" = "_time_start" AND
        "time_end" = "_time_end");

   RETURN ids;
END;$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;

当我用PostgreSQL版9.3这样称呼它时:

SELECT check_presence_row(
    CAST ('{1,4}' AS int[]), 
    CAST ('Random Guy' AS varchar), 
    CAST ('D0388A' AS varchar), 
    CAST ('2014/08/23 8:04:00' AS timestamp without time zone), 
    CAST ('2014/08/23 8:34:00' AS timestamp without time zone)
);

它运行正常,并根据需要返回结果,但在9.1发送相同的查询时,它会抛出错误:

ERROR:  array value must start with "{" or dimension information
CONTEXT:  PL/pgSQL function "check_presence_row" line 5 at assignment
********** Error **********

ERROR: array value must start with "{" or dimension information
SQL state: 22P02
Context: PL/pgSQL function "check_presence_row" line 5 at assignment

我发现当该数组的任何输入值正好是1时,它会以这种方式失败但如果我将它们更改为某个不同的整数值则传递....但仅限于我的localhost。我们的生产服务器仍然无法传递任何值。我们尝试了另一台计算机,即使值为1,也会通过一台计算机。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

虚假警报,我刚发现它是由那个ID引起的:=赋值。因为我在att_file表中有一行id = 1,所以在我的本地主机上出错了,而在另一台空数据库的计算机上则没有。我将返回更改为不通过变量,而只是查询:

CREATE OR REPLACE FUNCTION check_presence_row(
    _id_att_files integer[], 
    _people_name character varying, 
    _people_id character varying, 
    _time_start timestamp without time zone, 
    _time_end timestamp without time zone
)
RETURNS SETOF integer AS
$BODY$
BEGIN
    RETURN QUERY SELECT "id_att_file"FROM att_presence WHERE
        "id_att_file" = ANY ("_id_att_files") AND
        "id_people" = get_people(
            "_people_id",
            "_people_name") AND
        "time_start" = "_time_start" AND
        "time_end" = "_time_end";
END;$BODY$
LANGUAGE plpgsql