更新时间:2025-04-09 GMT+08:00

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为元素数据数组。

  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

不支持

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有任意名称不符合首字符为字母或者下划线,其他字符为字母、数字或者下划线。

表3 getAttributes()接口详细差异

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暂不支持。

表4 Struct构造接口详细差异

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