将int数组传递给plpgsql函数时出错(postgres 8.3.7)

时间:2013-01-17 11:11:18

标签: arrays postgresql postgresql-8.3

我有以下函数,它接收一个int数组,迭代它调用其他函数:

CREATE FUNCTION calculateAbsencesForIDs(INT[]) RETURNS TEXT AS 
'
DECLARE
  index integer := 0;
  resultArray decimal[];
  id int;
  result text;
BEGIN
  FOR id IN SELECT $1 LOOP

        resultArray[index] = calculateAbsenceForID(id); 
        index := index + 1;

END LOOP;
RETURN array_to_string(resultArray, result);
END;
'
LANGUAGE plpgsql;

我尝试使用:

来调用它
SELECT calculateAbsencesForIDs(ARRAY[85,74,75,76,77,78,79,80]);

SELECT calculateAbsencesForIDs('{85,74,75,76,77,78,79,80}');

SELECT calculateAbsencesForIDs('{85,74,75,76,77,78,79,80}'::int[]);
...

但我总是犯同样的错误:

[Error Code: 0, SQL State: 22P02]  ERROR: invalid input syntax for integer: "{85,74,75,76,77,78,79,80}"

我不知道如何调用此功能。我查看了postgres文档,我认为这是正确的,但它不起作用。

2 个答案:

答案 0 :(得分:1)

这一行:

FOR id IN SELECT $1 LOOP

表示您为id中的每个值分配SELECT $1,该值会返回单个INT[]字段的单个记录。

id被声明为INT时,您会收到您正在观察的转化错误。

8.4及更高版本中,您可以使用UNNEST,在8.3中将其替换为

FOR id IN
SELECT  $1[i]
FROM    generate_series(1, ARRAY_UPPER($1, 1)) i
LOOP

或者,您可以这样做:

SELECT  ARRAY_TO_STRING
                (
                ARRAY
                (
                SELECT  calculateAbsenceForID($1[i])
                FROM    generate_series(1, ARRAY_UPPER($1, 1)) i
                )
                )

答案 1 :(得分:1)

你需要循环遍历数组的元素:

BEGIN
  FOR i in 1 .. array_length($1, 1) LOOP

        resultArray[i] = calculateAbsenceForID($1[i]); 

  END LOOP;
  RETURN array_to_string(resultArray, result);

END;

请注意,如果$ 1为NULL

,则会抛出错误