コードは問題ありませんが、PostgreSQLのバージョンは問題ありません。のPostgreSQL8.1ドキュメントにRETURNS TABLE
よると、はサポートされていません。CREATE FUNCTION
8.1のような非常に古いバージョンのPostgreSQLでは、古いバージョンではサポートされていなかったため、RETURNS SETOF RECORD
を使用せずに宣言する必要があります。関数が匿名レコードセットを返すようにします。次に、次のように、呼び出しサイトでレコード構造を指定する必要があります。RETURNS TABLE
RETURNS SETOF RECORD
regress=# CREATE FUNCTION something123_legacy(character varying(100))
RETURNS SETOF RECORD AS
$$
SELECT 1, 'fred'::varchar(300);
$$
LANGUAGE SQL;
regress=# SELECT * FROM something123_legacy('blah') somethingresult(col1name integer, col2name character varying(300));
col1name | col2name
----------+----------
1 | fred
(1 row)
または、CREATE TYPE
定義済みの行タイプを作成することも、すべてのテーブルに同じ名前の行タイプがあるため、既存のテーブルタイプを使用することもできます。その後、関数はその行タイプを返すことができます。
regress=# CREATE TYPE something123type AS (col1name integer, col2name character varying(300));
CREATE TYPE
regress=# CREATE FUNCTION something123_legacy2(character varying(100))
RETURNS SETOF something123type AS
$$
SELECT 1, 'fred'::varchar(300);
$$
LANGUAGE SQL;
CREATE FUNCTION
regress=# SELECT * FROM something123_legacy2('blah');
col1name | col2name
----------+----------
1 | fred
(1 row)
パラメータを使用することもできOUT
ますが、ある時点でPL / PgSQL(SQL関数ではない)でのみサポートされていたことを漠然と覚えているようで、8.1で機能するかどうかはわかりません。それを試してみてください:
CREATE FUNCTION something123( IN character varying(100), OUT integer, OUT character varying(300) ) RETURNS setof record AS
$$
SELECT b.year, p.materialUsed FROM bestBefore b join packaged p on b.id=p.id WHERE id=$1;
$$
LANGUAGE SQL;
警告:お使いのPostgreSQLバージョンはサポートされておらず、2年間使用されています。セキュリティやバグ修正が行われていません。最終的にはアップグレードする必要があり、待つ時間が長くなるほど難しくなります。今すぐアップグレードの計画を開始してください。アップグレードノートと互換性ノートに特に注意しながら、現在のバージョンとの間のすべての.0バージョン(8.2.0、8.3.0など)のリリースノートをお読みください。テキストへの暗黙のキャストの削除、bytea_outputの変更、およびstandard_conforming文字列の変更に注意してください。新しいバージョンのマニュアルのアップグレードセクションを読み、新しいバージョンのを使用するなどのアドバイスに注意してくださいpg_dump
。