Array
本章节描述在JDBC驱动使用java.sql.Array类型时,Oracle与GaussDB的差异。
| 构造方式 | Oracle数据库 | GaussDB数据库 | 接口差异 |
|---|---|---|---|
| 1. ArrayDescriptor的静态构造方法构造ArrayDescriptor对象; 2. 通过ArrayDescriptor构造Array对象。 | String typeName = "XXX"; Connection conn = getConnection(); Object[] elements = null; ArrayDescriptor desc = ArrayDescriptor.createDescriptor(typeName, conn); Array array = new ARRAY(desc, conn, elements); | String typeName = "xxx"; Connection conn = getConnection(); Object[] elements = null; ArrayDescriptor desc = ArrayDescriptor.getDescriptor(typeName, conn); Array array = new GaussArray(desc, elements); |
| 方法名 | 返回值类型 | throws | GaussDB数据库 |
|---|---|---|---|
| getBaseTypeName() | String | SQLException | 支持 |
| getBaseType() | int | SQLException | 支持 |
| getArray() | Object | SQLException | 支持 |
| getArray(java.util.Map<String,Class<?>> map) | Object | SQLException | 不支持 |
| getArray(long index, int count) | Object | SQLException | 支持 |
| getArray(long index, int count, java.util.Map<String,Class<?>> map) | Object | SQLException | 不支持 |
| getResultSet() | ResultSet | SQLException | 不支持 |
| getResultSet(java.util.Map<String,Class<?>> map) | ResultSet | SQLException | 不支持 |
| getResultSet(long index, int count) | ResultSet | SQLException | 不支持 |
| getResultSet (long index, int count, java.util.Map<String,Class<?>> map) | ResultSet | SQLException | 不支持 |
| free() | void | SQLException | 不支持 |
| 元素数据库类型 | getArray接口实际返回值类型(Oracle) | getArray接口实际返回值类型(GaussDB) |
|---|---|---|
| CHAR | java.lang.String[] | java.lang.String[] |
| VARCHAR/VARCHAR2 | java.lang.String[] | java.lang.String[] |
| NCHAR | java.lang.String[] | java.lang.String[] |
| NVARCHAR2 | java.lang.String[] | java.lang.String[] |
| NUMBER | java.math.BigDecimal[] | java.math.BigDecimal[] |
| NUMERIC | java.math.BigDecimal[] | java.math.BigDecimal[] |
| DECIMAL | java.math.BigDecimal[] | java.math.BigDecimal[] |
| INTEGER | java.math.BigDecimal[] | java.lang.Integer[] |
| SMALLINT | java.math.BigDecimal[] | java.lang.Short[] |
| DOUBLE PRECISION | java.math.BigDecimal[] | java.lang.Double[] |
| FLOAT | java.math.BigDecimal[] | java.lang.Double[] |
| REAL | java.math.BigDecimal[] | java.lang.Float[] |
| BINARY_DOUBLE | java.lang.Double[] | java.lang.Double[] |
| BINARY_INTEGER | java.math.BigDecimal[] | java.lang.Integer[] |
| BOOLEAN | java.math.BigDecimal[] | java.lang.Boolean[] |
| TIMESTAMP | java.sql.Timestamp[] | java.sql.Timestamp[] |
| TIMESTAMP WITH TIME ZONE | java.time.OffsetDateTime[] | java.sql.Timestamp[] |
| BLOB | oracle.sql.BLOB[] | java.sql.Blob[] |
| CLOB | oracle.sql.CLOB[] | java.sql.Clob[] |
| 集合类型/数组类型 | java.lang.Object[] | java.sql.Array[] |
| RECORD类型 | java.lang.Object[] | java.sql.Struct[] |
- 对于上述表格中未列举出的类型,GaussDB暂不支持。
- getArray(long index, int count)接口返回值差异也参考上述表格。
- getArray接口(long index, int count),参数index的差异如下:
- Oracle支持范围为[1, Long.MAX_VALUE];Gauss支持范围为[1, Integer.MAX_VALUE]。
- Oracle在index > Integer.MAX_VALUE时index会被截断;Gauss在index > Integer.MAX_VALUE时报错。
| 元素数据库类型 | getBaseType接口返回值(Oracle) | getBaseType接口返回值(GaussDB) |
|---|---|---|
| CHAR | java.sql.Types.CHAR | java.sql.Types.CHAR |
| VARCHAR/VARCHAR2 | java.sql.Types.VARCHAR | java.sql.Types.VARCHAR |
| NCHAR | java.sql.Types.NCHAR | java.sql.Types.CHAR |
| NVARCHAR2 | java.sql.Types.NVARCHAR | java.sql.Types.VARCHAR |
| NUMBER | java.sql.Types.NUMERIC | java.sql.Types.NUMERIC |
| NUMERIC | java.sql.Types.DECIMAL | java.sql.Types.NUMERIC |
| DECIMAL | java.sql.Types.DECIMAL | java.sql.Types.NUMERIC |
| INTEGER | java.sql.Types.NUMERIC | java.sql.Types.INTEGER |
| SMALLINT | java.sql.Types.NUMERIC | java.sql.Types.SMALLINT |
| DOUBLE PRECISION | java.sql.Types.FLOAT | java.sql.Types.DOUBLE |
| FLOAT | java.sql.Types.FLOAT | java.sql.Types.DOUBLE |
| REAL | java.sql.Types.FLOAT | java.sql.Types.REAL |
| BINARY_DOUBLE | oracle.jdbc.OracleTypes.BINARY_DOUBLE | java.sql.Types.DOUBLE |
| BINARY_INTEGER | java.sql.Types.NUMERIC | java.sql.Types.INTEGER |
| BOOLEAN | java.sql.Types.NUMERIC | java.sql.Types.BIT |
| TIMESTAMP | java.sql.Types.TIMESTAMP | java.sql.Types.TIMESTAMP |
| TIMESTAMP WITH TIME ZONE | oracle.jdbc.OracleTypes.TIMESTAMPTZ | java.sql.Types.TIMESTAMP |
| BLOB | java.sql.Types.BLOB | java.sql.Types.BLOB |
| CLOB | java.sql.Types.CLOB | java.sql.Types.CLOB |
| 集合类型/数组类型 | java.sql.Types.ARRAY | java.sql.Types.ARRAY |
| RECORD类型 | java.sql.Types.STRUCT | java.sql.Types.STRUCT |
对于上述表格中未列举出的类型,GaussDB暂不支持。
| 元素数据库类型 | getBaseTypeName接口返回值(Oracle) | getBaseTypeName接口返回值(GaussDB) |
|---|---|---|
| CHAR | "CHAR" | "bpchar" |
| VARCHAR/VARCHAR2 | "VARCHAR" | "varchar" |
| NCHAR | "NCHAR" | "bpchar" |
| NVARCHAR2 | "NVARCHAR" | "nvarchar2" |
| NUMBER | "NUMBER" | "numeric" |
| NUMERIC | "DECIMAL" | "numeric" |
| DECIMAL | "DECIMAL" | "numeric" |
| INTEGER | "NUMBER" | "int4" |
| SMALLINT | "NUMBER" | "int2" |
| DOUBLE PRECISION | "FLOAT" | "float8" |
| FLOAT | "FLOAT" | "float8" |
| REAL | "FLOAT" | "float4" |
| BINARY_DOUBLE | "BINARY_DOUBLE" | "float8" |
| BINARY_INTEGER | "NUMBER" | "int4" |
| BOOLEAN | "NUMBER" | "bool" |
| TIMESTAMP | "TIMESTAMP" | "timestamp" |
| TIMESTAMP WITH TIME ZONE | "TIMESTAMP WITH TIME ZONE" | "timestamptz" |
| BLOB | "BLOB" | "blob" |
| CLOB | "CLOB" | "clob" |
| 集合类型/数组类型 | 见说明部分 | 见说明部分 |
| RECORD类型 | 见说明部分 | 见说明部分 |
- 对于上述表格中未列举出的类型,GaussDB暂不支持。
- 元素为集合类型、数组类型或record类型,且元素类型是package里定义的类型时,getBaseTypeName返回规则如下:
- OJDBC11返回schemaName.packageName.typeName。
- OJDBC8一般返回schemaName.packageName.typeName,在类型名满足以下条件返回"schemaName"."packageName.typeName":
schemaName/packageName/typeName中有任意名称不符合首字符为字母,其他字符为字母、数字或下划线。
- GaussDB一般返回schemaName.packageName.typeName,在类型名满足以下条件返回"schemaName"."packageName"."typeName":
schemaName/packageName/typeName中有任意名称不符合首字符为字母或下划线,其他字符为字母、数字或下划线。
- 元素为集合类型、数组类型或record类型,且元素类型是schema下定义的类型时(非package里定义的类型),getBaseTypeName返回规则如下:
- 若元素类型在创建时不做特殊处理,Oracle的getBaseTypeName接口通常返回的是大写的类型名称,GaussDB的getBaseTypeName接口通常返回的是小写的类型名称。
| 元素数据库类型 | 元素入参支持的Java类型列表(Oracle OJDBC8) | 元素入参支持的Java类型列表(GaussDB) | 差异说明 |
|---|---|---|---|
| CHAR | 任意Java类型 | Byte、Short、Integer、Long、BigInteger、BigDecimal、Float、Double、Character、Boolean、java.sql.Date、java.sql.Time、java.sql.Timestamp、PGClob | 元素入参支持的类型差异见表格。 |
| VARCHAR/VARCHAR2 | 任意Java类型 | Byte、Short、Integer、Long、BigInteger、BigDecimal、Float、Double、Character、Boolean、java.sql.Date、java.sql.Time、java.sql.Timestamp、PGClob | 元素入参支持的类型差异见表格。 |
| NCHAR | 任意Java类型 | Byte、Short、Integer、Long、BigInteger、BigDecimal、Float、Double、Character、Boolean、java.sql.Date、java.sql.Time、java.sql.Timestamp、PGClob | 元素入参支持的类型差异见表格。 |
| NVARCHAR2 | 任意Java类型 | Byte、Short、Integer、Long、BigInteger、BigDecimal、Float、Double、Character、Boolean、java.sql.Date、java.sql.Time、java.sql.Timestamp、PGClob | 元素入参支持的类型差异见表格。 |
| NUMBER | Byte、Short、Integer、Long、Float、Double、Boolean、BigDecimal、BigInteger、String、oracle.sql.NUMBER | Byte、Short、Integer、Long、Float、Double、Boolean、BigDecimal、BigInteger、String |
|
| NUMERIC | Byte、Short、Integer、Long、Float、Double、Boolean、BigDecimal、BigInteger、String、oracle.sql.NUMBER | Byte、Short、Integer、Long、Float、Double、Boolean、BigDecimal、BigInteger、String |
|
| DECIMAL | Byte、Short、Integer、Long、Float、Double、Boolean、BigDecimal、BigInteger、String、oracle.sql.NUMBER | Byte、Short、Integer、Long、Float、Double、Boolean、BigDecimal、BigInteger、String |
|
| INTEGER | Byte、Short、Integer、Long、Float、Double、Boolean、BigDecimal、BigInteger、String、oracle.sql.NUMBER | Byte、Short、Integer、Long、Float、Double、Boolean、BigDecimal、BigInteger、String |
|
| SMALLINT | Byte、Short、Integer、Long、Float、Double、Boolean、BigDecimal、BigInteger、String、oracle.sql.NUMBER | Byte、Short、Integer、Long、Float、Double、Boolean、BigDecimal、BigInteger、String |
|
| DOUBLE PRECISION | Byte、Short、Integer、Long、Float、Double、Boolean、BigDecimal、BigInteger、String、oracle.sql.NUMBER | Byte、Short、Integer、Long、Float、Double、Boolean、BigDecimal、BigInteger、String |
|
| FLOAT | Byte、Short、Integer、Long、Float、Double、Boolean、BigDecimal、BigInteger、String、oracle.sql.NUMBER | Byte、Short、Integer、Long、Float、Double、Boolean、BigDecimal、BigInteger、String |
|
| REAL | Byte、Short、Integer、Long、Float、Double、Boolean、BigDecimal、BigInteger、String、oracle.sql.NUMBER | Byte、Short、Integer、Long、Float、Double、Boolean、BigDecimal、BigInteger、String |
|
| BINARY_DOUBLE | Double、oracle.sql.BINARY_DOUBLE | Byte、Short、Integer、Long、Float、Double、Boolean、BigDecimal、BigInteger、String |
|
| BINARY_INTEGER | Byte、Short、Integer、Long、Float、Double、Boolean、BigDecimal、BigInteger、AtomicInteger、AutomicLong、DoubleAccumulator、DoubleAddr、LongAccumulator、LondAdder、Striped64、String、oracle.sql.NUMBER | Byte、Short、Integer、Long、Float、Double、Boolean、BigDecimal、BigInteger、String | |
| BOOLEAN | Byte、Short、Integer、Long、Float、Double、Boolean、BigDecimal、BigInteger、AtomicInteger、AutomicLong、DoubleAccumulator、DoubleAddr、LongAccumulator、LondAdder、Striped64、String、oracle.sql.NUMBER | Byte、Short、Integer、Long、Float、Double、Boolean、BigDecimal、BigInteger、String |
|
| TIMESTAMP | byte[]、java.sql.Date、Calendar、java.util.Date、LocalDate、LocalDateTime、LocalTime、OffsetDateTime、OffsetTime、String、java.sql.Time、java.sql.Timestamp、oracle.sql.DATE、oracle.sql.TIMESTAMP、oracle.sql.TIMESTAMPTZ、oracle.sql.TIMESTAMPLTZ、ZonedDateTime | java.util.Date、java.sql.Date、java.sql.Time、java.sql.Timestamp、LocalDateTime、String | 元素入参支持的类型差异见表格。 |
| TIMESTAMP WITH TIME ZONE | java.sql.Date、Calendar、java.util.Date、LocalDate、LocalDateTime、LocalTime、OffsetDateTime、OffsetTime、String、java.sql.Time、java.sql.Timestamp、oracle.sql.DATE、oracle.sql.TIMESTAMP、oracle.sql.TIMESTAMPTZ、oracle.sql.TIMESTAMPLTZ、ZonedDateTime | java.util.Date、java.sql.Date、java.sql.Time、java.sql.Timestamp、LocalDateTime、String |
|
| BLOB | oracle.sql.BLOB、oracle.jdbc.driver.OracleBlob | PGBlob | 元素入参支持的类型差异见表格。 |
| CLOB | oracle.sql.CLOB、oracle.jdbc.driver.OracleClob、InputStream、Reader | PGClob | 元素入参支持的类型差异见表格。 |
| 集合类型/数组类型 | ARRAY、Object | GaussArray、Object | |
| RECORD类型 | STRUCT、Object[] | GaussStruct、Object[] |
- 构造Array时,若传入元素的Java类型不符合目标类型,会进行相应的隐式转换操作,对于不同的数据库元素类型,支持传入的元素的Java类型差异见上表。
- 对于上述表格中未列举出的类型,GaussDB暂不支持。
- 构造方法需要提供元素数组,上述表格描述的是数组中每一个元素对应的差异。