?? jdbc2.0.frame8.html
字號:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<html>
<head>
<meta HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=gb2312">
<title></title>
</head>
<body bgcolor="#ffffff">
<table width="100%">
<tr>
<td><font size="-1"><a href="jdbc2.0.frame.html">目錄</a> | <a
href="jdbc2.0.frame7.html">上一頁</a> | <a href="jdbc2.0.frame9.html">下一頁</a> </font></td>
<td align="right"><i>JDBC<sup><font size="-2">TM</font></sup> 指南:入門</i></td>
</tr>
</table>
<hr>
<p><br>
<a name="297135"></a> </p>
<h2>8 新的 SQL 類型</h2>
<p>以下兩章討論了 JDBC 2.0 API 的附加部分,它們可以使 Java
應用程序能訪問新的 SQL
數據類型,例如二進制大型對象和結構化類型。不支持新的 SQL
類型的 JDBC 驅動程序不需要實現這兩章中所述的方法和接口。</p>
<p><a name="293160"></a> </p>
<h3>8.1 SQL 類型的分類</h3>
<p>通常將 ANSI/ISO SQL 標準的下一個版本稱為 <em>SQL3</em>。詳細說明該標準的工作文檔稱為
<em>SQL3 草案</em>。該草案現在正處于標準化過程的階段,不會有較大的增加或變化
— 只作較小的變化和修改。SQL3
中所含的數據類型的基本種類不會在標準化過程的最后階段發生變化。</p>
<p><a name="297011"></a>JDBC 2.0 API 融入了新 SQL3
類型的模型,其中只包括了在 Java
應用程序和數據庫之間交換數據所需的屬性。在本草案成為正式標準之前,即使改變新
SQL3 類型的語法和服務器端語義的部分細節,也不應該影響 JDBC 2.0 API。</p>
<p>SQL3 草案定義了以下數據類型:
<ul>
<p><a name="288854"></a></p>
<li>SQL2 內嵌類型 — 熟悉的 SQL“列類型” <br>
<br>
<ul>
<p><a name="288856"></a></p>
<li>CHAR <br>
<br>
<a name="297071"></a> </li>
<li>FLOAT <br>
<br>
<a name="288858"></a> </li>
<li>DATE <br>
<br>
<a name="288859"></a> </li>
<li>等等。<br>
<br>
</li>
</ul>
<p><a name="300249"></a> </p>
</li>
<li>新的內嵌類型 — SQL3 新增的類型 <br>
<br>
<ul>
<p><a name="300250"></a></p>
<li>BLOB- Binary Large OBject(二進制大型對象) <br>
<br>
<a name="300251"></a> </li>
<li>CLOB- Character Large OBject(字符大型對象) <br>
<br>
</li>
</ul>
<p><a name="297069"></a> </p>
</li>
<li>結構化類型,例如: <br>
<br>
<ul>
<p><a name="297070"></a></p>
<li>CREATE TYPE PLANE_POINT (X FLOAT, Y FLOAT) <br>
<br>
</li>
</ul>
<p><a name="288860"></a> </p>
</li>
<li>Distinct 類型 — 基于內嵌類型的表示,例如: <br>
<br>
<ul>
<p><a name="297022"></a></p>
<li>CREATE TYPE MONEY AS NUMERIC(10,2) <br>
<br>
</li>
</ul>
<p><a name="288869"></a> </p>
</li>
<li>構造的類型 — 基于給定的基準類型:<br>
<br>
<ul>
<p><a name="288871"></a></p>
<li>REF(structured-type) — 指定包含結構化類型實例的行 <br>
<br>
<a name="300162"></a> </li>
<li>base-type ARRAY[n] — 具有 n 個基準類型元素的數組 <br>
<br>
</li>
</ul>
<p><a name="300161"></a> </p>
</li>
<li>Locator types — 指定駐留在服務器上的數據 <br>
<br>
<ul>
<p><a name="288881"></a></p>
<li>LOCATOR(structured-type) — 指向服務器中的結構化實例的定位符 <br>
<br>
<a name="288883"></a> </li>
<li>LOCATOR(array) —指向服務器中的數組的定位符 <br>
<br>
<a name="297826"></a> </li>
<li>LOCATOR(blob) — 指向服務器中的二進制大型對象的定位符 <br>
<br>
<a name="297827"></a> </li>
<li>LOCATOR(clob) — 指向服務器中的字符大型對象的定位符 <br>
<br>
</li>
</ul>
</li>
</ul>
<p><a name="297058"></a></p>
<p><a name="297830"></a><code>REF</code>
值仍表示駐留在數據庫中的結構化類型的實例。<code>LOCATOR</code>
只存在于客戶機環境下,
而且是指向駐留在數據庫服務器上的數據的瞬態邏輯指針。定位符通常用來引用因太大而不能在客戶機上實現的數據,例如圖像和音頻。在
SQL 級中所定義的操作符可以檢索定位符所表示的隨機存取數據塊。</p>
<p><a name="297868"></a>本章的其余部分討論了 JDBC 2.0 API
所提供的缺省機制,可用來訪問以上所提及的每種新 SQL 類型。JDBC
2.0 API 還提供了一種方法,可以自定義從 SQL distinct 和結構化類型到
Java 類的映射方式。在第 <a href="jdbc2.0.frame9.html#298134">9</a>
章中討論了這種機制。</p>
<p><a name="297904"></a> </p>
<h3>8.2 Blob 和 clob</h3>
<h4>8.2.1 檢索 blob 和 clob</h4>
<p>對二進制大型對象 (blob) 和字符大型對象 (clob)
數據類型的處理類似于現有的內嵌 JDBC 類型。通過調用出現在 <code>ResultSet</code>
和 <code>CallableStatement</code> 接口上的 <code>getBlob()</code> 和 <code>getClob()</code>
方法可以檢索這些類型的值。例如, </p>
<p><a name="297894"></a> </p>
<blockquote>
<pre>Blob blob = rs.getBlob(1);
Clob clob = rs.getClob(2);
</pre>
</blockquote>
<p><a name="297897"></a></p>
<p>從結果集的第一列檢索 blob 值而從第二列檢索 clob 值。<code>Blob</code>
接口所含的操作可以返回 blob 的長度、blob 中特定的一段字節等。<code>Clob</code>
接口所含的相應操作是基于字符的。詳細信息,參見附帶的 API
文檔。</p>
<p>JDBC 應用程序并不直接處理在 SQL 中定義的 LOCATOR(blob) 和 LOCATOR(clob)
類型。缺省情況下,JDBC 驅動程序應該使用適當的 locator(定位符)類型來實現
<code>Blob</code> 和 <code>Clob</code> 接口。同樣,在缺省情況下,<code>Blob</code>
和 <code>Clob</code> 對象只是在創建它們的<strong>事務處理</strong>過程中保持有效。JDBC
驅動程序可能允許改變這些缺省值。例如,可以將 <code>Blob</code> 和 <code>Clob</code>
對象的壽命更改為在會話作用域內。然而,JDBC 2.0 API
并沒有規定具體的操作步驟。</p>
<p><a name="297911"></a> </p>
<h4>8.2.2 存儲 blob 和 clob</h4>
<p>通過分別調用 <code>setBlob()</code> 和 <code>setClob()</code>
方法,用戶即可象對待其它 JDBC 數據類型一樣將 <code>Blob</code> 或 <code>Clob</code>
值作為輸入參數傳給 <code>PreparedStatement</code> 對象。可以使用 <code>setBinaryStream()</code>
和 <code>setObject()</code> 方法來將流值作為 blob 輸入。可以使用 <code>setAsciiStream()</code>、<code>setUnicodeStream()</code>
和 <code>setObject()</code> 方法來將流值作為 clob 輸入。</p>
<p><a name="297913"></a> </p>
<h4>8.2.3 元數據增加部分</h4>
<p>在 <code>java.sql.Types </code>中增加了兩種新的類型代碼,即 <code>BLOB</code>
和 <code>CLOB </code>。當 JDBC 支持這兩種數據類型時,由諸如 <code>DatabaseMetaData.getTypeInfo()</code>
和 <code>DatabaseMetaData.getColumns() </code>的方法返回這些值。</p>
<p><a name="297937"></a> </p>
<h3>8.3 數組</h3>
<h4>8.3.1 檢索數組</h4>
<p>通過調用 <code>ResultSet </code>和 <code>CallableStatement</code> 接口的 <code>getArray()</code>
方法可以檢索 SQL 類型數組的數據。例如, </p>
<p><a name="297945"></a> </p>
<blockquote>
<pre>Array a = rs.getArray(1);
</pre>
</blockquote>
<p><a name="298046"></a></p>
<p>從結果集的第一列檢索 <code>Array</code> 值。缺省情況下,JDBC
驅動程序應該在內部使用 SQL LOCATOR(array) 來實現 <code>Array</code>
接口。同樣,缺省情況下,<code>Array </code>對象只是在創建它的<strong>事務處理</strong>過程中保持有效。對于
<code>Blob</code> 和 <code>Clob</code>
類型來說,可以改變這些缺省值,但是 JDBC 2.0 API
沒有規定具體的操作步驟。</p>
<p><a name="297952"></a><code>Array</code>
接口提供了幾種方法可以將數組內容作為已實現的 Java 數組或 <code>ResultSet
</code>對象返回給客戶機。這些方法分別為 <code>getArray() </code>和 <code>getResultSet()</code>。詳細信息,參見單獨的
API 文檔。</p>
<p><a name="297960"></a> </p>
<h4>8.3.2 存儲數組</h4>
<p>可以調用 <code>PreparedStatement.setArray()</code> 方法將 <code>Array</code>
值作為輸入參數傳遞給預先準備好的語句。通過調用 <code>PreparedSatement.setObject()</code>
可以將 Java 編程語言數組作為輸入參數進行傳遞。</p>
<p><a name="297950"></a> </p>
<h4>8.3.3 元數據增加部分</h4>
<p>在 <code>java.sql.Types </code>中增加了新的類型代碼,即 <code>ARRAY</code>。當
JDBC 支持 <code>Array</code> 數據類型時,由諸如 <code>DatabaseMetaData.getTypeInfo()</code>
和 <code>DatabaseMetaData.getColumns() </code>的方法返回該值。</p>
<p><a name="297962"></a> </p>
<h3>8.4 Ref</h3>
<h4>8.4.1 檢索 ref</h4>
<p>通過調用 <code>ResultSet</code> 和 <code>CallableStatement</code> 接口的 <code>getRef()</code>
方法可以檢索 SQL 引用。例如, </p>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -