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

Arrays 将整数数组传递给plpgsql函数时出错(postgres 8.3.7),arrays,postgresql,postgresql-8.3,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] = calculat

我有以下函数,它接收一个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]);

但我总是犯同样的错误:

[Error Code: 0, SQL State: 22P02]  ERROR: invalid input syntax for integer: "{85,74,75,76,77,78,79,80}"
我不知道如何调用这个函数。我看过博士后的医生,我认为这是正确的,但它不起作用

这一行:

FOR id IN SELECT $1 LOOP
这意味着您将
id
分配给
SELECT$1
中的每个值,该值返回一条记录,其中包含一个类型为
INT[]
的字段

id
被声明为
INT
时,您将得到正在观察的转换错误

8.4
及以上版本中,您可以使用
unest
,在
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
                )
                )

您需要像这样循环数组的元素:

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

而不是像这样的for循环,
for i in 1。。数组长度($1,1)循环
更好吗?(并在循环中使用
$1[i]
)@a_horse_,名称:是,可能。将其作为答案发布,我将向上投票。从PostgreSQL 9.1开始,您可以使用
SELECT  ARRAY_TO_STRING
                (
                ARRAY
                (
                SELECT  calculateAbsenceForID($1[i])
                FROM    generate_series(1, ARRAY_UPPER($1, 1)) i
                )
                )
BEGIN
  FOR i in 1 .. array_length($1, 1) LOOP

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

  END LOOP;
  RETURN array_to_string(resultArray, result);

END;