CREATE OR REPLACE FUNCTION fnMyFunction(recipients recipient[]) ...
FOREACH v_recipient IN ARRAY recipients
LOOP
v_total := v_total + v_recipient.amount;
INSERT INTO tmp_recipients(id, amount)
VALUES(v_recipient.id, v_recipient.amount::numeric(10,2));
END LOOP;
...
これは開発環境ではうまく機能しますが、リリース環境が 8.4 であり、FOREACH コンストラクトをサポートしていないようです。完全なリファクタリングを回避するために、配列パラメーター セットを使用し、同様の方法で配列の値を使用して、ループの代替実装に誰かが光を当ててくれることを期待していました。
私が受け取っているエラーメッセージは次のとおりです。
エラー: "FOREACH" SQL 状態またはその付近での構文エラー: 42601 コンテキスト: 行 ## 付近の PL/PgSQL 関数 "fnMyFunction" の SQL ステートメント
データベース環境は共有ホスト上にあるため、プラットフォームをアップグレードするオプションはありません。
postgres 9.1 と 8.4 にタグを付けました。関数は 9.x では正常に動作しますが、8.4 では失敗するためです。