2

私は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のドキュメントを見てきましたが、これは正しいと思いますが、うまくいきません。

4

2 に答える 2

1

この行:

FOR id IN SELECT $1 LOOP

は、 type の単一フィールドを持つ単一レコードを返すid各値に割り当てることを意味します。SELECT $1INT[]

としてid宣言されINTているため、観察している変換エラーが発生します。

以上で、8.4を使用できますUNNEST8.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 に答える
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 に答える