2

ユーザー定義関数で、他のテーブルを結合する投影から形成されたテーブルをどのように返しますか?

これが簡単な例です

CREATE FUNCTION something123(character varying(100)) RETURNS TABLE (a integer, b character varying(300)) AS
$$
  SELECT b.year, p.materialUsed FROM bestBefore b join packaged p on b.id=p.id WHERE id=$1;
$$
LANGUAGE SQL
;

TABLEでは常にエラーが発生します。そのselectステートメントの内容をどのように取得して返しますか?

Postgres8.1.21を使用しています

4

1 に答える 1

4

コードは問題ありませんが、PostgreSQLのバージョンは問題ありません。のPostgreSQL8.1ドキュメントにRETURNS TABLEよると、はサポートされていません。CREATE FUNCTION

8.1のような非常に古いバージョンのPostgreSQLでは、古いバージョンではサポートされていなかったため、RETURNS SETOF RECORDを使用せずに宣言する必要があります。関数が匿名レコードセットを返すようにします。次に、次のように、呼び出しサイトでレコード構造を指定する必要があります。RETURNS TABLERETURNS 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

于 2012-10-24T08:17:39.983 に答える