考虑我有一个用户定义的类型如下:
CREATE TYPE mytype AS
(myvar character(1),
myvar2 bit(10));
我可以使用Postgres的任何信息表来获取此类型的属性信息:
即。如果给出“mytype”,我想要的信息是:
myvar : character(1)
myvar2 : bit(10)
答案 0 :(得分:1)
是的,pg_type
表将填充typrelid
列。这是pg_class
表的OID键,然后在pg_attribute
表中使用,就像表,视图,索引等一样。所以就像:
select attname, format_type(atttypid, atttypmod)
from pg_type
join pg_class on pg_class.oid = pg_type.typrelid
join pg_attribute on pg_attribute.attrelid = pg_class.oid
where typname = 'mytype'
order by attnum
答案 1 :(得分:0)
除了回复https://stackoverflow.com/a/9195771/6178141之外,我还想添加一些评论。
在这里需要考虑几件事。
1)可以删除属性。是的,可以改变现有类型并添加和/或删除属性。删除的属性在attisdropped
列中标记为TRUE,但它们确实采用属性编号。例如,如果我们在上面的DTL中执行以下语句:
ALTER TYPE mytype ADD ATTRIBUTE abc double precision;
ALTER TYPE mytype DROP ATTRIBUTE myvar2;
然后属性abc
的物理编号为2,而attnum
的值为3。
所以我们需要将这个条件添加到WHERE
子句:
AND NOT attisdropped
2)还需要考虑类型的架构。 mytype
适用于public
架构。如果在不同的模式中创建type,则它将不起作用。在这种情况下,我个人更喜欢以下条件:
WHERE attrelid = 'myschema.mytype'::regclass