⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 statement.doc.html

📁 JDBC入门中文文档
💻 HTML
📖 第 1 页 / 共 2 页
字号:
<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&nbsp; 使用方法 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) &amp;&amp; (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) &amp;&amp; (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 &gt; 0) {    //  它是更新计数
<a name="1000079"></a>        System.out.println(&quot;Rows changed = &quot; + 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(&quot; No rows changed or statement was DDL
<a
name="1000085"></a>                                    command&quot;);
<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>版权所有 &copy; 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 + -