2013-05-17 30 views
2

如何在Java中由Postgres獲取數組列的基類型/維數?如何通過jdbc在postgres中獲取數組基類型

我有一個表,其中包含數組像int[][]text[]

當我遍歷JDBC的元數據時,我只能得到java.sql.Array的類型。 即使在information_schema.columns它簡單地存儲爲ARRAY。

我如何知道基本類型及其維度?

我現在正在研究轉儲表信息的工具。

回答

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. (目前,數組的維數沒有被強制執行,所以任何非零值都意味着「它是一個數組」。)

+0

謝謝:)這應該是一個解決方案,以及:) – user1192878

+1

意識到,你是最終真實的維度是不可靠的:) – user1192878

4

對於數組基類型,DatabaseMetaData.getColumns()返回包含列元數據的ResultSet。返回的列之一是TYPE_NAME。這似乎包含數組基類型的名稱,前綴爲下劃線。例如,_int4_text。有一些關於pg_type中的類型的其他信息可能會有所幫助。

對於這些維度,它們似乎不太可能在元數據中。從documentation

但是,目前的實現忽略任何提供的數組的大小限制,即該行爲是相同的,作爲未指定長度的陣列。

當前實現不強制聲明的維數。無論大小或維數如何,特定元素類型的數組都被視爲相同類型。因此,在CREATE TABLE中聲明數組大小或維數是簡單的文檔;它不會影響運行時行爲。

array_dims函數將返回數組值的當前維數。但是,由於表格中的每一行都可能有所不同,我懷疑這會對您有所幫助。

UPDATE:它看起來尺寸在元數據中可用。見@a_horse_with_no_name's answer

+0

您的更新有問題,因爲@a_horse在這個問題上。看到我留下的評論。 –

+0

@ErwinBrandstetter雖然我同意它沒有執行,但信息似乎仍然存在。我在9.1.9只測試了1到3個維度,'attndims'是正確的。 –

+0

它*不能*是「正確的」,因爲沒有「正確的」。無論您如何聲明列,相關列都可以保存任意維度的數組。你不必相信我,只要嘗試一下。 '0' /'> 0'以外'attndims'中的信息僅適用於* intent *的文檔。不保證有關實際值的任何信息。 –

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()實際上將返回即使柱規定爲int[][]integer[]attndims列將攜帶你想要的信息。

+0

'attndims'是*旨在*爲此目的,但它目前尚未實施或強制執行,如[手冊通知](http://www.postgresql.org/docs/current/interactive/catalog-pg-attribute.html):'維數,如果列是一個數組類型;否則爲0.(目前,數組的維數沒有被強制執行,所以任何非零值都意味着「它是一個數組」。)# –

+2

@ErwinBrandstetter:問題是「*如何獲得數組列的維數」*這正是「attndims」所做的。事實上,這不是強制數據被放入該列與該問題無關(至少尚未......) –

+0

謝謝:)是的,我沒有意識到,數組維度是不強制執行到現在爲止。 – user1192878