如何通过Java获取Postgres中数组列的基类型/维度?
我有一个包含int[][]
和text[]
等数组的表。
当我遍历JDBC中的元数据时,我只能输入java.sql.Array
类型。
即使在information_schema.columns
中,它也只是存储为ARRAY。
我如何知道基本类型及其维度?
我现在正致力于转储表信息的工具。
答案 0 :(得分:4)
对于数组基类型,DatabaseMetaData.getColumns()
返回包含列元数据的ResultSet
。返回的列之一是TYPE_NAME
。这似乎包含数组基类型的名称,前缀为下划线。例如,_int4
或_text
。有关pg_type中的类型的一些其他信息可能会有所帮助。
对于维度,它们似乎不太可能出现在元数据中。来自documentation:
但是,当前实现会忽略任何提供的数组大小限制,即行为与未指定长度的数组相同。
当前的实现也没有强制声明的维数。无论尺寸大小或数量如何,特定元素类型的数组都被认为是相同类型的。因此,在CREATE TABLE中声明数组大小或维数是简单的文档;它不会影响运行时行为。
array_dims
函数将返回数组值的当前维度。但由于表格中的每一行都有所不同,我怀疑这会对你有所帮助。
更新:图片中显示尺寸可用。请参阅@a_horse_with_no_name's answer。
答案 1 :(得分:2)
除@Joe already cleared up之外,您还可以使用pg_typof()
从PostgreSQL获取类型信息。
在此示例中给出一个2维的整数数组:
SELECT pg_typeof(a)::text AS type
,(SELECT typname FROM pg_type WHERE oid = pg_typeof(a)) AS base_type
,array_dims(a) AS dims
FROM (SELECT '{{11,12,13},{21,22,23}}'::int[]) x(a);
type | base_type | dims
-----------+-----------+------------
integer[] | _int4 | [1:2][1:3]
请注意,每个值的数组维度(dims
)可能不同。 Postgres目前不强制执行维度(包括v9.3)
As documented in the manual,pg_attribute.attndims
在这里使用有限:
维数,如果列是数组类型;否则为0。 (目前,没有强制执行数组的维数,因此 任何非零值都有效地表示“它是一个数组”。)
答案 2 :(得分:2)
您可以直接查询pg_attributes
:
select att.attname,
att.attndims,
pg_catalog.format_type(atttypid, NULL) as display_type
from pg_attribute att
join pg_class tbl on tbl.oid = att.attrelid
join pg_namespace ns on tbl.relnamespace = ns.oid
where tbl.relname = 'your_table_name'
and ns.nspname = 'table_schema'
SQLFiddle示例:http://sqlfiddle.com/#!12/50301/1
请注意format_type()
实际上会返回integer[]
,即使该列定义为int[][]
,但attndims
列会显示您想要的信息。