我有以下函数,它接收一个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文档,我认为这是正确的,但它不起作用。
答案 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