我在尝试创建一个包含字段的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中图像的文件名是可以接受的。它应该支持多张照片。
有人可以说明如何实现这个目标吗?
答案 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)
返回一些嵌套结构通常是复杂的 - 几乎所有驱动程序都没有将此结构映射到适当的目标结构,您应该手动解析返回的字符串。通常,返回数据的最佳格式是标量,向量或表格。