2

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

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 文档,我认为这是正确的,但它不起作用。

4

2 回答 2

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

于 2013-01-17T12:33:07.620 回答
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
                )
                )
于 2013-01-17T11:22:45.727 回答