
# Struct
本章节描述在JDBC驱动使用java.sql.Struct类型时，Oracle与GaussDB的差异。
表1构造方法参考 
| 构造方式                                                                                                                                                        | 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); | - 构造StructDescriptor的静态方法名不一致，Oracle的方法名为createDescriptor，GaussDB的方法名为getDescriptor。  - Struct的构造方法名定义不一致，Oracle为STRUCT(StructDescriptor, Connection, Object\[\])，GaussDB为GaussStruct(StructDescriptor, Object\[\])。  - 变量说明： typeName为类型名称，且大小写敏感，通常Oracle的类型名大写，GaussDB的类型名小写。 conn为对应数据库的连接对象。 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);                                                                                                                                          | - 变量说明： typeName为类型名称，且大小写敏感，通常Oracle的类型名大写，GaussDB的类型名小写。 conn为对应数据库的连接对象。 attributes为元素数据数组。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
   
![](https://support.huaweicloud.com/distributed-compatibility-v8-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
1. 对于上述表格中未列举出的构造方式，GaussDB暂不支持。
2. 若attribute的类型为字符类型，构造传入的字符串长度大于元素类型定义的长度，Oracle会在绑定入参时报错。 GaussDB在构造或者绑定入参时不会对类型修饰符进行校验，在数据库接收Struct对象并执行SQL时，由数据库决定是否报错。
   
3. 数组元素数量大于对应类型的实际列数量，则会在创建时报错。 数组元素数量小于实际列数量时：Oracle能创建成功，在传入参执行时会报错；GaussDB会在创建时报错。
   
 
表2接口参考 
| 方法名                                                   | 返回值类型      | throws       | GaussDB数据库 |
|:---|:---|:---|:---|
| getSQLTypeName()                                      | String     | SQLException | 支持         |
| getAttributes()                                       | Object\[\] | SQLException | 支持         |
| getAttributes(java.util.Map\<String,Class\<?\>\> map) | Object\[\] | SQLException | 不支持        |
   
![](https://support.huaweicloud.com/distributed-compatibility-v8-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
getSQLTypeName接口差异参考如下说明：
1. 对于package类型，通过packageName.typeName形式构造的Struct，getSQLTypeName接口差异如下：
   - OJDBC11返回packageName.typeName。
   
   - OJDBC8返回packageName.typeName，在packageName和typeName满足以下条件时返回"packageName"."typeName"： packageName/typeName有任意名称不符合首字符为字母，其他字符为字母或者数字或者下划线。
     
   
   - GaussDB返回schemaName.packageName.typeName，在schemaName、packageName和typeName满足以下条件时返回"schemaName"."packageName"."typeName"： schemaName/packageName/typeName有任意名称不符合首字符为字母或者下划线，其他字符为字母、数字或者下划线。
     
    
2. 对于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有任意名称不符合首字符为字母或者下划线，其他字符为字母、数字或者下划线。
     
    
3. 对于非package类型，getSQLTypeName接口差异如下：
   - OJDBC11返回schemaName.typeName。
   
   - OJDBC8返回schemaName.typeName，在schemaName和typeName满足以下条件时返回"schemaName"."typeName"： schemaName/typeName有任意名称不符合首字符为字母，其他字符为字母或者数字或者下划线。
     
   
   - GaussDB返回schemaName.typeName，在schemaName和typeName满足以下条件时返回"schemaName"."typeName"： schemaName/typeName有任意名称不符合首字符为字母或者下划线，其他字符为字母、数字或者下划线。
     
    
 
表3getAttributes()接口详细差异 
| 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              |
   
![](https://support.huaweicloud.com/distributed-compatibility-v8-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
对于上述表格中未列举出的类型，GaussDB暂不支持。
表4Struct构造接口详细差异 
| 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 | 1. attribute入参支持的类型差异见表格。  2. 当入参为String时，Oracle会在字符串末尾补齐空格至字符串长度与类型定义的长度一致；GaussDB不会补空格。                                                                                                                                                                                                                                                                                                                                                                                                                            |
| 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                                                                 | 1. attribute入参支持的类型差异见表格。  2. 当入参为Float、Double、BigDecimal、String且小数点部分为0时，Oracle会舍去小数部分；GaussDB会保留小数部分。                                                                                                                                                                                                                                                                                                                                                                                                      |
| NUMERIC                  | Byte、Short、Integer、Long、Float、Double、Boolean、BigDecimal、BigInteger、String、oracle.sql.NUMBER                                                                                                                                 | Byte、Short、Integer、Long、Float、Double、Boolean、BigDecimal、BigInteger、String                                                                 | 1. attribute入参支持的类型差异见表格。  2. 当入参为Float、Double、BigDecimal、String且小数点部分为0时，Oracle会舍去小数部分；GaussDB会保留小数部分。                                                                                                                                                                                                                                                                                                                                                                                                            |
| DECIMAL                  | Byte、Short、Integer、Long、Float、Double、Boolean、BigDecimal、BigInteger、String、oracle.sql.NUMBER                                                                                                                                 | Byte、Short、Integer、Long、Float、Double、Boolean、BigDecimal、BigInteger、String                                                                 | 1. attribute入参支持的类型差异见表格。  2. 当入参为Float、Double、BigDecimal、String且小数点部分为0时，Oracle会舍去小数部分；GaussDB会保留小数部分。                                                                                                                                                                                                                                                                                                                                                                                                       |
| INTEGER                  | Byte、Short、Integer、Long、Float、Double、Boolean、BigDecimal、BigInteger、String、oracle.sql.NUMBER                                                                                                                                 | Byte、Short、Integer、Long、Float、Double、Boolean、BigDecimal、BigInteger、String                                                                 | 1. attribute入参支持的类型差异见表格。  2. 目标类型不一致，参考getAttributes()接口详细差异。  3. 当入参超过Integer范围时GaussDB会报错。                                                                                                                                                                                                                                                               |
| SMALLINT                 | Byte、Short、Integer、Long、Float、Double、Boolean、BigDecimal、BigInteger、String、oracle.sql.NUMBER                                                                                                                                 | Byte、Short、Integer、Long、Float、Double、Boolean、BigDecimal、BigInteger、String                                                                 | 1. attribute入参支持的类型差异见表格。  2. 目标类型不一致，参考getAttributes()接口详细差异。  3. 当入参超过Short范围时GaussDB会报错。                                                                                                                                                                                                                                                               |
| 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                                                                 | 1. attribute入参支持的类型差异见表格。  2. 目标类型不一致，参考getAttributes()接口详细差异。  3. 更高精度的类型转Double可能会出现精度丢失的情况。                                                                                                                                                                                                                                                      |
| FLOAT                    | Byte、Short、Integer、Long、Float、Double、Boolean、BigDecimal、BigInteger、String、oracle.sql.NUMBER                                                                                                                                 | Byte、Short、Integer、Long、Float、Double、Boolean、BigDecimal、BigInteger、String                                                                 | 1. attribute入参支持的类型差异见表格。  2. 目标类型不一致，参考getAttributes()接口详细差异。  3. 更高精度的类型转Double可能会出现精度丢失的情况。                                                                                                                                                                                                                                                        |
| REAL                     | Byte、Short、Integer、Long、Float、Double、Boolean、BigDecimal、BigInteger、String、oracle.sql.NUMBER                                                                                                                                 | Byte、Short、Integer、Long、Float、Double、Boolean、BigDecimal、BigInteger、String                                                                 | 1. attribute入参支持的类型差异见表格。  2. 目标类型不一致，参考getAttributes()接口详细差异。  3. 更高精度的类型转Float可能会出现精度丢失的情况。                                                                                                                                                                                                                                                             |
| BINARY_DOUBLE            | byte\[\]、Double、oracle.sql.BINARY_DOUBLE                                                                                                                                                                                    | Byte、Short、Integer、Long、Float、Double、Boolean、BigDecimal、BigInteger、String                                                                 | 1. attribute入参支持的类型差异见表格。  2. 目标类型不一致，参考getAttributes()接口详细差异。  3. 更高精度的类型转Double可能会出现精度丢失的情况。                                                                                                                                                                                                                                                            |
| 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                                                                 | 1. attribute入参支持的类型差异见表格。  2. 当传入数值超过Integer范围时，GaussDB会报错，Oracle会进行截断处理。                                                                                                                                                                                                                                                                                                                                                                                                                                          |
| 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                                                                 | 1. attribute入参支持的类型差异见表格。  2. 目标类型不一致，参考getAttributes()接口详细差异。  3. GaussDB目标类型为Boolean类型，仅支持1、0、"true"、"false"等输入。                                                                                                                                                                                                                                     |
| 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                                                        | 1. attribute入参支持的类型差异见表格。  2. 目标类型不一致，参考getAttributes()接口详细差异。                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
| BLOB                     | oracle.sql.BLOB、oracle.jdbc.driver.OracleBlob                                                                                                                                                                               | PGBlob                                                                                                                                    | 1. attribute入参支持的类型差异见表格。  2. 目标类型不一致，参考getAttributes()接口详细差异。                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| CLOB                     | oracle.sql.CLOB、oracle.jdbc.driver.OracleClob                                                                                                                                                                               | PGClob                                                                                                                                    | 1. attribute入参支持的类型差异见表格。  2. 目标类型不一致，参考getAttributes()接口详细差异。                                                                                                                                                                                                                                                                                                                                                                                                                                               |
| 集合类型/数组类型                | ARRAY、Object                                                                                                                                                                                                                | GaussArray、Object                                                                                                                         | 1. attribute入参支持的类型差异见表格。  2. Oracle：当attribute入参为ARRAY时，ARRAY的类型与attribute实际需要的类型不一致时不会报错。 GaussDB：当attribute入参为GaussArray时，GaussArray的类型与attribute实际需要的类型不一致时会报错。   3. 当attribute入参为Object时，参考Array构造接口差异。                |
| RECORD类型                 | STRUCT、Object\[\]                                                                                                                                                                                                           | GaussStruct、Object\[\]                                                                                                                    | 1. attribute入参支持的类型差异见表格。  2. Oracle：当attribute入参为STRUCT时，STRUCT的类型与attribute实际需要的类型不一致时不会报错。 GaussDB：当attribute入参为GaussStruct时，GaussStruct的类型与attribute实际需要的类型不一致时会报错。   3. 当attribute入参为Object\[\]时，参考Struct构造接口差异。   |
   
![](https://support.huaweicloud.com/distributed-compatibility-v8-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
1. 构造Struct时，若传入元素的Java类型不符合目标类型，会进行相应的隐式转换操作，对于不同的数据库元素类型，支持传入的元素的Java类型差异见上表。
2. 对于上述表格中未列举出的类型，GaussDB暂不支持。
3. 构造方法需要提供属性数组，上述表格描述的是数组中每一个attribute对应的差异。
 
