Postgres by Javaで配列列の基本型/次元を取得するには?
int[][]
やのような配列を含むテーブルがありますtext[]
。
JDBC からメタデータをトラバースすると、タイプ as しか取得できませんjava.sql.Array
。その中でもinformation_schema.columns
単純にARRAYとして保存されています。
ベースタイプとその寸法を知るにはどうすればよいですか?
現在、テーブル情報をダンプするツールに取り組んでいます。
Postgres by Javaで配列列の基本型/次元を取得するには?
int[][]
やのような配列を含むテーブルがありますtext[]
。
JDBC からメタデータをトラバースすると、タイプ as しか取得できませんjava.sql.Array
。その中でもinformation_schema.columns
単純にARRAYとして保存されています。
ベースタイプとその寸法を知るにはどうすればよいですか?
現在、テーブル情報をダンプするツールに取り組んでいます。
配列基本型の場合、含まれている列のメタデータをDatabaseMetaData.getColumns()
返します。ResultSet
返される列の 1 つが ですTYPE_NAME
。これには、アンダースコアで始まる配列の基本型の名前が含まれているようです。たとえば、_int4
または_text
. pg_typeには、タイプに関する役立つ情報がいくつかあります。
ディメンションについては、メタデータに含まれる可能性は低いようです。ドキュメントから:
ただし、現在の実装では、指定された配列サイズの制限は無視されます。つまり、動作は、長さが指定されていない配列の場合と同じです。
現在の実装では、宣言された次元数も強制されません。特定の要素型の配列は、サイズや次元数に関係なく、すべて同じ型であると見なされます。したがって、CREATE TABLE で配列のサイズまたは次元数を宣言することは、単なるドキュメントです。実行時の動作には影響しません。
このarray_dims
関数は、配列値の現在の次元を返します。しかし、これはテーブルの行ごとに異なる可能性があるため、これが役立つとは思えません。
更新: ディメンションはメタデータで利用できるようです。@a_horse_with_no_name の回答を参照してください。
@Joe がすでにクリアしたものに加えて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 まで)。
マニュアルに記載されているように、pg_attribute.attndims
ここでは使用が制限されています。
列が配列型の場合は次元数。それ以外の場合は 0。