如何通过jdbc获取postgres中的数组基类型

时间:2013-05-17 23:10:43

标签: java arrays postgresql jdbc types

如何通过Java获取Postgres中数组列的基类型/维度?

我有一个包含int[][]text[]等数组的表。

当我遍历JDBC中的元数据时,我只能输入java.sql.Array类型。 即使在information_schema.columns中,它也只是存储为ARRAY。

我如何知道基本类型及其维度?

我现在正致力于转储表信息的工具。

3 个答案:

答案 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 manualpg_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列会显示您想要的信息。