0

我在尝试创建一个包含另一个 TYPE 的字段的 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 回答