0

別の TYPE の SETOF であるフィールドを含む TYPE を作成しようとすると、問題が発生します。

DROP TYPE IF EXISTS subType CASCADE;
CREATE TYPE subType AS (
    filename varchar,
    image bytea
);

DROP TYPE IF EXISTS superType CASCADE;
CREATE TYPE superType AS (
    sort int,
    label varchar,
    photos SETOF subType,
);

しかし、これはうまくいきません。Postgres でエラーが発生します。

ERROR:  column "photos" cannot be declared SETOF
CONTEXT:  SQL statement "CREATE TYPE superType AS ( sort int, label varchar, photos SETOF subType )"
PL/pgSQL function "update_database_script" line 2684 at SQL statement

この構造体を返す必要がありますが、画像データ (bytea 型) のみを返し、subType で画像のファイル名を返さなくてもかまいません。ただし、複数の写真をサポートする必要があります。

誰かがこれを達成する方法に光を当てることができますか?

4

1 に答える 1

1

PostgreSQL はネストされたセット (およびこのコンテキストのキーワード SETOF) をまだサポートしていません。代わりに配列を使用できます。

postgres=# CREATE TYPE xx AS (a int, b int);
CREATE TYPE

postgres=# CREATE TYPE yy AS (a int, b xx[]);
CREATE TYPE
postgres=# SELECT '(10,20)'::xx;
   xx    
---------
 (10,20)
(1 row)

postgres=# select (10, ARRAY[(10,20),(30,40)]::xx[])::yy;
               row                
----------------------------------
 (10,"{""(10,20)"",""(30,40)""}")
(1 row)

通常、ネストされた構造を返すのは複雑です。ほとんどすべてのドライバーは、この構造を適切なターゲット構造にマップしていないため、返された文字列を手動で解析する必要があります。通常、返されるデータの最適な形式は、スカラー、ベクター、またはテーブルです。

于 2013-11-05T11:10:22.843 に答える