使用高级数据类型
本节中介绍的高级数据类型使关系数据库在用作表列的值时具有更大的灵 Active。例如,一列可用于存储BLOB
(二进制大对象)值,该值可将非常大量的数据存储为原始字节。列也可以是CLOB
(字符大对象)类型,它能够以字符格式存储大量数据。
ANSI/ISO SQL 标准的最新版本通常称为 SQL:2003.该标准指定以下数据类型:
-
SQL92 内置类型,由熟悉的 SQL 列类型组成,例如
CHAR
,FLOAT
和DATE
-
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或类:
-
BLOB
:Blob
interface -
CLOB
:Clob
interface -
NCLOB
:NClob
interface -
ARRAY
:Array
interface -
XML
:SQLXML
interface -
结构化类型:
Struct
interface -
REF(structured type)
:Ref
interface -
ROWID
:RowId
interface -
DISTINCT
:基本类型 Map 到的类型。例如,基于 JavaNUMERIC
类型的DISTINCT
值 Map 为java.math.BigDecimal
类型,因为在 Java 编程语言中NUMERIC
Map 为BigDecimal
。 -
DATALINK
:java.net.URL
个对象
使用高级数据类型
您以与处理其他数据类型相同的方式检索,存储和更新高级数据类型。您可以使用ResultSet.getDataType
或CallableStatement.getDataType
方法来检索它们,使用PreparedStatement.setDataType
方法来存储它们,并使用ResultSet.updateDataType
方法来更新它们。 (变量DataType
是 Map 到高级数据类型的 Java interface或类的名称.)对高级数据类型执行的大约 90%的操作涉及使用getDataType
,setDataType
和updateDataType
方法。下表显示了要使用的方法:
高级数据类型 | getDataType 方法 | setDataType 方法 | updateDataType 方法 |
---|---|---|---|
BLOB | getBlob | setBlob | updateBlob |
CLOB | getClob | setClob | updateClob |
NCLOB | getNClob | setNClob | updateNClob |
ARRAY | getArray | setArray | updateArray |
XML | getSQLXML | setSQLXML | updateSQLXML |
Structured type | getObject | setObject | updateObject |
REF(structured type) | getRef | setRef | updateRef |
ROWID | getRowId | setRowId | updateRowId |
DISTINCT | getBigDecimal | setBigDecimal | updateBigDecimal |
DATALINK | getURL | setURL | updateURL |
注意 :DISTINCT
数据类型的行为与其他高级 SQL 数据类型不同。作为基于现有内置类型的用户定义类型,它没有interface作为 Java 编程语言中的 Map。因此,您将使用与DISTINCT
数据类型所基于的 Java 类型相对应的方法。有关更多信息,请参见使用 DISTINCT 数据类型。
例如,以下代码片段检索 SQL ARRAY
值。对于此示例,假设表STUDENTS
中的列SCORES
包含类型ARRAY
的值。变量stmt
是Statement
对象。
ResultSet rs = stmt.executeQuery(
"SELECT SCORES FROM STUDENTS " +
"WHERE ID = 002238");
rs.next();
Array scores = rs.getArray("SCORES");
变量scores
是指向学生002238
的行中表STUDENTS
中存储的 SQL ARRAY
对象的逻辑指针。
如果要在数据库中存储值,请使用适当的set
方法。例如,以下代码片段(其中rs
是ResultSet
对象)存储了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
中。