Struct
本章节描述在JDBC驱动使用java.sql.Struct类型时,Oracle与GaussDB的差异。
构造方式 | Oracle数据库 | GaussDB数据库 | 接口差异 |
|---|---|---|---|
1. StructDescriptor的静态构造方法构造StructDescriptor对象 2. 通过StructDescriptor构造Struct对象 | String typeName ="XXX"; Connection conn =getConnection(); Object[] attributes =null; StructDescriptor desc =StructDescriptor.createDescriptor(typeName, conn); Struct struct =new STRUCT(desc, conn, attributes); | String typeName ="xxx"; Connection conn =getConnection(); Object[] elements =null; StructDescriptor desc =StructDescriptor.getDescriptor(typeName, conn); Struct struct =new GaussStruct(desc, attributes); | |
通过Connection的createStruct标准接口构造Struct对象 | String typeName ="XXX"; Connection conn =getConnection(); Object[] attributes =null; Struct struct =conn.createStruct(typeName, attributes); | String typeName ="XXX"; Connection conn =getConnection(); Object[] attributes =null; Struct struct =conn.createStruct(typeName, attributes); |

方法名 | 返回值类型 | throws | GaussDB数据库 |
|---|---|---|---|
getSQLTypeName() | String | SQLException | 支持 |
getAttributes() | Object[] | SQLException | 支持 |
getAttributes(java.util.Map<String,Class<?>> map) | Object[] | SQLException | 不支持 |

getSQLTypeName接口差异参考如下说明:
- 对于package类型,通过packageName.typeName形式构造的Struct,getSQLTypeName接口差异如下:
- OJDBC11返回packageName.typeName。
- OJDBC8返回packageName.typeName,在packageName和typeName满足以下条件时返回"packageName"."typeName":
- GaussDB返回schemaName.packageName.typeName,在schemaName、packageName和typeName满足以下条件时返回"schemaName"."packageName"."typeName":
schemaName/packageName/typeName有任意名称不符合首字符为字母或者下划线,其他字符为字母、数字或者下划线。
- 对于package类型,其他场景下getSQLTypeName接口差异如下:
- OJDBC11返回schemaName.packageName.typeName。
- OJDBC8返回schemaName.packageName.typeName,在schemaName、packageName和typeName满足以下条件时返回"schemaName"."packageName.typeName":
schemaName/packageName/typeName有任意名称不符合首字符为字母,其他字符为字母或者数字或者下划线。
- GaussDB返回schemaName.packageName.typeName,在schemaName、packageName和typeName满足以下条件时返回"schemaName"."packageName"."typeName":
schemaName/packageName/typeName有任意名称不符合首字符为字母或者下划线,其他字符为字母、数字或者下划线。
- 对于非package类型,getSQLTypeName接口差异如下:
- OJDBC11返回schemaName.typeName。
- OJDBC8返回schemaName.typeName,在schemaName和typeName满足以下条件时返回"schemaName"."typeName":
- GaussDB返回schemaName.typeName,在schemaName和typeName满足以下条件时返回"schemaName"."typeName":
Attribute数据库类型 | 返回值中对应元素的Java类型(Oracle OJDBC8) | 返回值中对应元素的Java类型(Oracle OJDBC11) | 返回值中对应元素的Java类型(GaussDB) |
|---|---|---|---|
CHAR | String | String | String |
VARCHAR/VARCHAR2 | String | String | String |
NCHAR | String | String | String |
NVARCHAR2 | String | String | String |
NUMBER | BigDecimal | BigDecimal | BigDecimal |
NUMERIC | BigDecimal | BigDecimal | BigDecimal |
DECIMAL | BigDecimal | BigDecimal | BigDecimal |
INTEGER | BigDecimal | BigDecimal | Integer |
SMALLINT | BigDecimal | BigDecimal | Short |
DOUBLE PRECISION | BigDecimal | BigDecimal | Double |
FLOAT | BigDecimal | BigDecimal | Double |
REAL | BigDecimal | BigDecimal | Float |
BINARY_DOUBLE | Double | Double | Double |
BINARY_INTEGER | BigDecimal | Integer | Integer |
BOOLEAN | BigDecimal | Integer | Boolean |
TIMESTAMP | Timestamp | Timestamp | Timestamp |
TIMESTAMP WITH TIME ZONE | TIMESTAMPTZ | TIMESTAMPTZ | Timestamp |
BLOB | BLOB | BLOB | PGBlob |
CLOB | CLOB | CLOB | PGClob |
集合类型/数组类型 | ARRAY | ARRAY | GaussArray |
RECORD类型 | STRUCT | STRUCT | GaussStruct |

对于上述表格中未列举出的类型,GaussDB暂不支持。
Attribute数据库类型 | Attribute入参支持的Java类型列表(Oracle) | Attribute入参支持的Java类型列表(GaussDB) | 差异说明 |
|---|---|---|---|
CHAR | 任意Java类型 | Byte、Short、Integer、Long、BigInteger、BigDecimal、Float、Double、Character、Boolean、String、java.sql.Date、java.sql.Time、java.sql.Timestamp、PGClob |
|
VARCHAR/VARCHAR2 | 任意Java类型 | Byte、Short、Integer、Long、BigInteger、BigDecimal、Float、Double、Character、Boolean、String、java.sql.Date、java.sql.Time、java.sql.Timestamp、PGClob | attribute入参支持的类型差异见表格。 |
NCHAR | 任意Java类型 | Byte、Short、Integer、Long、BigInteger、BigDecimal、Float、Double、Character、Boolean、String、java.sql.Date、java.sql.Time、java.sql.Timestamp、PGClob | attribute入参支持的类型差异见表格。 |
NVARCHAR2 | 任意Java类型 | Byte、Short、Integer、Long、BigInteger、BigDecimal、Float、Double、Character、Boolean、String、java.sql.Date、java.sql.Time、java.sql.Timestamp、PGClob | attribute入参支持的类型差异见表格。 |
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 | byte[]、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、String、java.sql.Time、java.sql.Timestamp、oracle.sql.TIMESTAMP、oracle.sql.DATE | java.util.Date、java.sql.Date、java.sql.Time、java.sql.Timestamp、LocalDateTime、String | attribute入参支持的类型差异见表格。 |
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.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 | PGClob |
|
集合类型/数组类型 | ARRAY、Object | GaussArray、Object | |
RECORD类型 | STRUCT、Object[] | GaussStruct、Object[] |

- 构造Struct时,若传入元素的Java类型不符合目标类型,会进行相应的隐式转换操作,对于不同的数据库元素类型,支持传入的元素的Java类型差异见上表。
- 对于上述表格中未列举出的类型,GaussDB暂不支持。
- 构造方法需要提供属性数组,上述表格描述的是数组中每一个attribute对应的差异。

