使用另一个TYPE的SET OF字段创建TYPE

时间:2013-11-05 10:46:50

标签: postgresql postgresql-8.3

我在尝试创建一个包含字段的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中图像的文件名是可以接受的。它应该支持多张照片。

有人可以说明如何实现这个目标吗?

1 个答案:

答案 0 :(得分: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)

返回一些嵌套结构通常是复杂的 - 几乎所有驱动程序都没有将此结构映射到适当的目标结构,您应该手动解析返回的字符串。通常,返回数据的最佳格式是标量,向量或表格。