📄 statement.doc.html
字号:
<blockquote>
<p><a name="999856"></a></p>
<p>在该语法中,<code>yyyy</code> 为年代,<code>mm</code> 为月份,而 <code>dd</code>
则为日期。驱动程序将用等价的特定于 DBMS
的表示替换这个转义子句。例如,如果 <code>'28- FEB-99'</code>
符合基本数据库的格式,则驱动程序将用它替换 <code>{d 1999-02-28}</code>。</p>
<p><a name="999857"></a>对于 <code>TIME</code> 和 <code>TIMESTAMP</code>
也有类似的转义子句: </p>
</blockquote>
<pre><a name="999858"></a> {t `hh:mm:ss'}
<a name="999859"></a> {ts `yyyy-mm-dd hh:mm:ss.f . . .'}
</pre>
<blockquote>
<p><a name="999860"></a></p>
<code><p>TIMESTAMP</code> 中的小数点后的秒(<code>.f . . .</code>)部分可忽略。</p>
</blockquote>
<p><a name="999861"></a>
<ul>
<p><a name="999862"></a></p>
<li><code>call</code> 或 <code>? = call</code> 表示已存储过程<br>
<br>
</li>
</ul>
<p><a name="999863"></a></p>
<blockquote>
<p><a name="999864"></a></p>
<p>如果数据库支持已存储过程,则可从 JDBC 中调用它们,语法为: </p>
</blockquote>
<pre><a name="999865"></a> {call procedure_name[(?, ?, . . .)]}
</pre>
<blockquote>
<p><a name="999866"></a></p>
<p>或(其中过程返回结果参数): </p>
</blockquote>
<pre><a name="999867"></a> {? = call procedure_name[(?, ?, . . .)]}
</pre>
<blockquote>
<p><a name="999868"></a></p>
<p>方括号指示其中的内容是可选的。它们不是语法的必要部分。</p>
<p><a name="999996"></a>输入参数可以为文字或参数。有关详细信息,参见
<em>JDBC 指南</em>中第 <a href="callablestatement.doc.html#998919">7</a> 节,“CallableStatement”。</p>
<p><a name="999869"></a>可通过调用方法 <code>DatabaseMetaData.supportsStoredProcedures</code>
检查数据库是否支持已存储过程。</p>
</blockquote>
<pre><a name="999870"></a>
</pre>
<ul>
<p><a name="999871"></a></p>
<li><code>oj</code> 表示外部连接<br>
<br>
</li>
</ul>
<p><a name="999872"></a></p>
<blockquote>
<p><a name="999873"></a></p>
<p>外部连接的语法为 </p>
</blockquote>
<pre><a name="999874"></a> {oj outer-join}
</pre>
<blockquote>
<p><a name="999875"></a></p>
<p>其中 <code>outer-join</code> 形式为 </p>
</blockquote>
<pre><a name="999876"></a> table LEFT OUTER JOIN {table | outer-join} ON search-condition
</pre>
<blockquote>
<p><a name="999877"></a></p>
<p>外部连接属于高级功能。有关它们的解释可参见 SQL 语法。JDBC
提供了三种 <code>DatabaseMetaData</code>
方法用于确定驱动程序支持哪些外部连接类型:<code>supportsOuterJoins</code>、<code>supportsFullOuterJoins</code>
和 <code>supportsLimitedOuterJoins</code>。</p>
</blockquote>
<p><a name="999878"></a></p>
<blockquote>
<p><a name="999879"></a></p>
<p>方法 <code>Statement.setEscapeProcessing</code>
可打开或关闭转义处理;缺省状态为打开。当性能极为重要时,程序员可能想关闭它以减少处理时间。但通常它将出于打开状态。应注意:
<code>setEscapeProcessing</code> 不适用于 <code>PreparedStatement</code>
对象,因为在调用该语句前它就可能已被发送到数据库。有关预编译的信息,参见
<code>PreparedStatement</code>。</p>
</blockquote>
<p><a name="1000061"></a></p>
<h3>4.1.6 使用方法 execute</h3>
<code>
<p>execute</code> 方法应该仅在语句能返回多个 <code>ResultSet</code>
对象、多个更新计数或 <code>ResultSet</code>
对象与更新计数的组合时使用。当执行某个已存储过程或动态执行未知
SQL
字符串(即应用程序程序员在编译时未知)时,有可能出现多个结果的情况,尽管这种情况很少见。例如,用户可能执行一个已存储过程(使用
<code>CallableStatement</code> 对象 - 参见第 135 页的 <a
href="callablestatement.doc.html#">CallableStatement</a>),并且该已存储过程可执行更新,然后执行选择,再进行更新,再进行选择,等等。通常使用已存储过程的人应知道它所返回的内容。</p>
<p><a name="1000066"></a>因为方法 <code>execute</code>
处理非常规情况,所以获取其结果需要一些特殊处理并不足为怪。例如,假定已知某个过程返回两个结果集,则在使用方法
<code>execute</code> 执行该过程后,必须调用方法 <code>getResultSet</code>
获得第一个结果集,然后调用适当的 <code>getXXX</code>
方法获取其中的值。要获得第二个结果集,需要先调用 <code>getMoreResults</code>
方法,然后再调用 <code>getResultSet</code>
方法。如果已知某个过程返回两个更新计数,则首先调用方法 <code>getUpdateCount</code>,然后调用
<code>getMoreResults</code>,并再次调用 <code>getUpdateCount</code>。</p>
<p><a name="1000067"></a>对于不知道返回内容,则情况更为复杂。如果结果是
<code>ResultSet</code> 对象,则方法 <code>execute</code> 返回 <code>true</code>;如果结果是
Java <code>int</code>,则返回 <code>false</code>。如果返回 <code>int</code>,则意味着结果是更新计数或执行的语句是
DDL 命令。在调用方法 <code>execute</code> 之后要做的第一件事情是调用 <code>getResultSet</code>
或 <code>getUpdateCount</code>。调用方法 <code>getResultSet</code>
可以获得两个或多个 <code>ResultSet</code>
对象中第一个对象;或调用方法 <code>getUpdateCount</code>
可以获得两个或多个更新计数中第一个更新计数的内容。</p>
<p><a name="1000068"></a>当 SQL 语句的结果不是结果集时,则方法 <code>getResultSet</code>
将返回 <code>null</code>。这可能意味着结果是一个更新计数或没有其它结果。在这种情况下,判断
<code>null</code> 真正含义的唯一方法是调用方法 <code>getUpdateCount</code>,它将返回一个整数。这个整数为调用语句所影响的行数;如果为
<code>-1</code> 则表示结果是结果集或没有结果。如果方法 <code>getResultSet</code>
已返回 <code>null</code>(表示结果不是 <code>ResultSet</code>
对象),则返回值 <code>-1</code>
表示没有其它结果。也就是说,当下列条件为真时表示没有结果(或没有其它结果):
</p>
<pre><a name="1000069"></a> ((stmt.getResultSet() == null) && (stmt.getUpdateCount() == -1))
</pre>
<p>如果已经调用方法 <code>getResultSet</code> 并处理了它返回的 <code>ResultSet</code>
对象,则有必要调用方法 <code>getMoreResults</code>
以确定是否有其它结果集或更新计数。如果 <code>getMoreResults</code>
返回 <code>true</code>,则需要再次调用 <code>getResultSet</code>
来检索下一个结果集。如上所述,如果 <code>getResultSet</code> 返回 <code>null</code>,则需要调用
<code>getUpdateCount</code> 来检查 <code>null</code>
是表示结果为更新计数还是表示没有其它结果。</p>
<p><a name="1000071"></a>当 <code>getMoreResults</code> 返回 <code>false</code>
时,它表示该 SQL
语句返回一个更新计数或没有其它结果。因此需要调用方法 <code>getUpdateCount</code>
来检查它是哪一种情况。在这种情况下,当下列条件为真时表示没有其它结果:
</p>
<pre><a name="1000072"></a> ((stmt.getMoreResults() == false) && (stmt.getUpdateCount() == -1))
</pre>
<p>下面的代码演示了一种方法用来确认已访问调用方法 <code>execute</code>
所产生的全部结果集和更新计数: </p>
<pre><a name="1000074"></a>
<a name="1000075"></a> stmt.execute(<code>queryStringWithUnknownResults</code>);
<a
name="1000076"></a> while (true) {
<a name="1000077"></a> int rowCount = stmt.getUpdateCount();
<a
name="1000078"></a> if (rowCount > 0) { // 它是更新计数
<a name="1000079"></a> System.out.println("Rows changed = " + count);
<a
name="1000080"></a> stmt.getMoreResults();
<a name="1000081"></a> continue;
<a
name="1000082"></a> }
<a name="1000083"></a> if (rowCount == 0) { // DDL 命令或 0 个更新
<a
name="1000084"></a> System.out.println(" No rows changed or statement was DDL
<a
name="1000085"></a> command");
<a name="1000086"></a> stmt.getMoreResults();
<a
name="1000087"></a> continue;
<a name="1000088"></a> }
<a name="1000089"></a>
<a
name="1000090"></a> // 执行到这里,证明有一个结果集
<a name="1000091"></a> // 或没有其它结果
<a
name="1000092"></a>
<a name="1000093"></a> ResultSet rs = stmt.getResultSet;
<a
name="1000094"></a> if (rs != null) {
<a name="1000095"></a> . . . // 使用元数据获得关于结果集列的信息
<a
name="1000096"></a> while (rs.next()) {
<a name="1000097"></a> . . . // 处理结果
<a
name="1000098"></a> stmt.getMoreResults();
<a name="1000099"></a> continue;
<a
name="1000100"></a> }
<a name="1000101"></a> break; // 没有其它结果
</pre>
<blockquote>
<p><a name="1000058"></a></p>
</blockquote>
<p><br>
</p>
<hr>
<font size="-1"><a href="introTOC.doc.html">
<p>目录</a> | <a href="drivermanager.doc.html">上一页</a> | <a
href="resultset.doc.html">下一页</a> </font></p>
<hr>
<address>
<a href="mailto:jdbc@wombat.eng.sun.com">jdbc@wombat.eng.sun.com</a> 或 <a
href="mailto:jdbc-odbc@wombat.eng.sun.com">jdbc-odbc@wombat.eng.sun.com</a>
</address>
<a href="copyright.doc.html"><font size="-1"><i>
<p>版权所有 © 1996, 1997 Sun Microsystems, Inc. 保留所有权利</i></font>。</a><!-- HTML generated by dkramer on March 14, 1997 -->
</p>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -