0

自分で作った型を返す関数を作りたいのですが、実行すると型が存在しないと言われます。カスタムタイプを知らないのが原因だと思います。

UDT:

CREATE TYPE building_code AS ENUM ('IT','EMS','HSB','ENG');

関数:

 CREATE FUNCTION roomCode(id int ) RETURNS building_code AS 
$$
 SELECT building_code FROM venue as v WHERE id = v.id;
$$ LANGUAGE SQL;
4

1 に答える 1

1

これはうまくいくはずです。問題はenumありません。Postgres 9.1 および 9.2 でテスト済み

CREATE TYPE building_code AS ENUM ('IT','EMS','HSB','ENG');
CREATE TEMP TABLE venue (id int PRIMARY KEY, building_code building_code);
INSERT INTO venue VALUES (1, 'ENG');

CREATE OR REPLACE FUNCTION room_code(_id int) --!
  RETURNS building_code AS 
$func$
SELECT building_code FROM venue v WHERE v.id = $1 -- !
$func$ LANGUAGE SQL;

SELECT * FROM room_code(1);

を除いて...

  • 9.2 より前のバージョンでは、SQL 関数では位置 (数値) パラメータ( $1)のみを使用できます ( plpgsql 関数とは異なります)。9.2 以降
    で は、列名が優先されるため、元のコードの句は常に TRUE になり、すべての行が修飾されます。ただし、関数は. パラメータの名前を変更するか、位置パラメータを使用するか、できれば両方を使用してください。 競合するパラメーター名を使用する必要がある場合は、関数名を使用してパラメーターを修飾することにより、設定をオーバーライドできます。お気に入り:WHERESETOF building_code

    ... WHERE v.id = room_code.id
    
  • タイプ名を列名として使用しないでください。

  • roomCodeを二重引用符で囲まない限り、小文字に変換されるのように、引用符なしで大文字と小文字が混在する名前を使用しないでください"roomCode"

-> 3 つのバリアントを持つSQLfiddle

于 2013-08-14T15:27:46.077 に答える