使用高级数据类型

本节中介绍的高级数据类型使关系数据库在用作表列的值时具有更大的灵 Active。例如,一列可用于存储BLOB(二进制大对象)值,该值可将非常大量的数据存储为原始字节。列也可以是CLOB(字符大对象)类型,它能够以字符格式存储大量数据。

ANSI/ISO SQL 标准的最新版本通常称为 SQL:2003.该标准指定以下数据类型:

  • SQL92 内置类型,由熟悉的 SQL 列类型组成,例如CHARFLOATDATE

  • SQL99 内置类型,由 SQL99 添加的类型组成:

  • BOOLEAN:布尔值(正确或错误)

    • BLOB:二进制大 Bobject

    • CLOB:字符大对象

  • SQL:2003 添加的新内置类型:

  • XML:XML 对象

  • 用户定义的类型:

  • 结构化类型:用户定义类型;例如:

CREATE TYPE PLANE_POINT
AS (X FLOAT, Y FLOAT) NOT FINAL
  • DISTINCT类型:基于内置类型的用户定义类型;例如:
CREATE TYPE MONEY
AS NUMERIC(10,2) FINAL
  • 构造类型:基于给定基本类型的新类型:

  • REF(structured-type):持久地表示驻留在数据库中的结构化类型的实例的指针

    • base-type ARRAY[n]:* n *个基本类型元素的数组
  • 定位符:是指向驻留在数据库服务器上的数据的逻辑指针的实体。Client 端计算机中存在一个* locator *,它是指向服务器上数据的瞬时逻辑指针。定位器通常指的是太大而无法在 Client 端上实现的数据,例如图像或音频。 (物化视图是预先存储为架构对象或已“物化”的查询结果.)在 SQL 级别定义了一些运算符,以检索由定位符表示的随机访问的数据:

  • LOCATOR(structured-type):服务器中结构化实例的定位器

    • LOCATOR(array):服务器中阵列的定位器

    • LOCATOR(blob):服务器中二进制大对象的定位器

    • LOCATOR(clob):服务器中字符大对象的定位器

  • Datalink:用于 管理 数据源外部数据的类型。 Datalink值是 SQL MED(外部数据 管理)的一部分,SQL MED/SQL ANSI/ISO 标准规范的一部分。

Map 高级数据类型

JDBC API 为 SQL:2003 标准指定的高级数据类型提供默认 Map。以下列表提供了数据类型以及它们 Map 到的interface或类:

  • BLOBBlobinterface

  • CLOBClobinterface

  • NCLOBNClobinterface

  • ARRAYArrayinterface

  • XMLSQLXMLinterface

  • 结构化类型:Structinterface

  • REF(structured type)Refinterface

  • ROWIDRowIdinterface

  • DISTINCT:基本类型 Map 到的类型。例如,基于 Java NUMERIC类型的DISTINCT值 Map 为java.math.BigDecimal类型,因为在 Java 编程语言中NUMERICMap 为BigDecimal

  • DATALINKjava.net.URL个对象

使用高级数据类型

您以与处理其他数据类型相同的方式检索,存储和更新高级数据类型。您可以使用ResultSet.getDataTypeCallableStatement.getDataType方法来检索它们,使用PreparedStatement.setDataType方法来存储它们,并使用ResultSet.updateDataType方法来更新它们。 (变量DataType是 Map 到高级数据类型的 Java interface或类的名称.)对高级数据类型执行的大约 90%的操作涉及使用getDataTypesetDataTypeupdateDataType方法。下表显示了要使用的方法:

高级数据类型getDataType方法setDataType方法updateDataType方法
BLOBgetBlobsetBlobupdateBlob
CLOBgetClobsetClobupdateClob
NCLOBgetNClobsetNClobupdateNClob
ARRAYgetArraysetArrayupdateArray
XMLgetSQLXMLsetSQLXMLupdateSQLXML
Structured typegetObjectsetObjectupdateObject
REF(structured type)getRefsetRefupdateRef
ROWIDgetRowIdsetRowIdupdateRowId
DISTINCTgetBigDecimalsetBigDecimalupdateBigDecimal
DATALINKgetURLsetURLupdateURL

注意DISTINCT数据类型的行为与其他高级 SQL 数据类型不同。作为基于现有内置类型的用户定义类型,它没有interface作为 Java 编程语言中的 Map。因此,您将使用与DISTINCT数据类型所基于的 Java 类型相对应的方法。有关更多信息,请参见使用 DISTINCT 数据类型

例如,以下代码片段检索 SQL ARRAY值。对于此示例,假设表STUDENTS中的列SCORES包含类型ARRAY的值。变量stmtStatement对象。

ResultSet rs = stmt.executeQuery(
    "SELECT SCORES FROM STUDENTS " +
    "WHERE ID = 002238");
rs.next();
Array scores = rs.getArray("SCORES");

变量scores是指向学生002238的行中表STUDENTS中存储的 SQL ARRAY对象的逻辑指针。

如果要在数据库中存储值,请使用适当的set方法。例如,以下代码片段(其中rsResultSet对象)存储了Clob对象:

Clob notes = rs.getClob("NOTES");
PreparedStatement pstmt =
    con.prepareStatement(
        "UPDATE MARKETS SET COMMENTS = ? " +
        "WHERE SALES < 1000000");
pstmt.setClob(1, notes);
pstmt.executeUpdate();

此代码将notes设置为要发送到数据库的 update 语句中的第一个参数。 notes所指定的Clob值将存储在COMMENTS列中的值小于一百万的每一行的COMMENTS列中的表MARKETS中。