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

📄 8.html

📁 写给JSP初级程序员的书
💻 HTML
📖 第 1 页 / 共 2 页
字号:
可用下列语法获得当前数据库用户名: <br>
<br>
{fn user()};<br>
<br>
<br>
标量函数可能由语法稍有不同的 DBMS 支持,而它们可能不被所有驱动程序支持。各种 DatabaseMetaData 方法将列出所支持的函数。例如,方法 getNumericFunctions 返回用逗号分隔的数值函数列表,而方法 getStringFunctions 将返回字符串函数,等等。<br>
<br>
驱动程序将转义函数调用映射为相应的语法,或直接实现该函数。<br>
<br>
<br>
d、t 和 ts 表示日期和时间文字<br>
<br>
<br>
DBMS 用于日期、时间和时间标记文字的语法各不相同。JDBC 使用转义子句支持这些文字的语法的 ISO 标准格式。驱动程序必须将转义子句转换成 DBMS 表示。<br>
<br>
例如,可用下列语法在 JDBC SQL 语句中指定日期: <br>
<br>
{d `yyyy-mm-dd'}<br>
<br>
<br>
在该语法中,yyyy 为年代,mm 为月份,而 dd 则为日期。驱动程序将用等价的特定于 DBMS 的表示替换这个转义子句。例如,如果 '28- FEB-99' 符合基本数据库的格式,则驱动程序将用它替换 {d 1999-02-28}。<br>
<br>
对于 TIME 和 TIMESTAMP 也有类似的转义子句: <br>
<br>
{t `hh:mm:ss'}<br>
{ts `yyyy-mm-dd hh:mm:ss.f . . .'}<br>
<br>
<br>
TIMESTAMP 中的小数点后的秒(.f . . .)部分可忽略。<br>
<br>
<br>
call 或 ? = call 表示已存储过程<br>
<br>
<br>
<br>
如果数据库支持已存储过程,则可从 JDBC 中调用它们,语法为: <br>
<br>
{call procedure_name[(?, ?, . . .)]}<br>
<br>
<br>
或(其中过程返回结果参数): <br>
<br>
{? = call procedure_name[(?, ?, . . .)]}<br>
<br>
<br>
方括号指示其中的内容是可选的。它们不是语法的必要部分。<br>
<br>
输入参数可以为文字或参数。有关详细信息,参见 JDBC 指南中第 7 节,“CallableStatement”。<br>
<br>
可通过调用方法 DatabaseMetaData.supportsStoredProcedures 检查数据库是否支持已存储过程。<br>
<br>
<br>
<br>
oj 表示外部连接<br>
<br>
<br>
<br>
外部连接的语法为 <br>
<br>
{oj outer-join}<br>
<br>
<br>
其中 outer-join 形式为 <br>
<br>
table LEFT OUTER JOIN {table / outer-join} ON search-condition<br>
<br>
<br>
外部连接属于高级功能。有关它们的解释可参见 SQL 语法。JDBC 提供了三种 DatabaseMetaData 方法用于确定驱动程序支持哪些外部连接类型:supportsOuterJoins、supportsFullOuterJoins 和 supportsLimitedOuterJoins。<br>
<br>
<br>
方法 Statement.setEscapeProcessing 可打开或关闭转义处理;缺省状态为打开。当性能极为重要时,程序员可能想关闭它以减少处理时间。但通常它将出于打开状态。应注意: setEscapeProcessing 不适用于 PreparedStatement 对象,因为在调用该语句前它就可能已被发送到数据库。有关预编译的信息,参见 PreparedStatement。<br>
<br>
<br>
4.1.6 使用方法 execute<br>
execute 方法应该仅在语句能返回多个 ResultSet 对象、多个更新计数或 ResultSet 对象与更新计数的组合时使用。当执行某个已存储过程或动态执行未知 SQL 字符串(即应用程序程序员在编译时未知)时,有可能出现多个结果的情况,尽管这种情况很少见。例如,用户可能执行一个已存储过程(使用 CallableStatement 对象 - 参见第 135 页的 CallableStatement),并且该已存储过程可执行更新,然后执行选择,再进行更新,再进行选择,等等。通常使用已存储过程的人应知道它所返回的内容。<br>
<br>
因为方法 execute 处理非常规情况,所以获取其结果需要一些特殊处理并不足为怪。例如,假定已知某个过程返回两个结果集,则在使用方法 execute 执行该过程后,必须调用方法 getResultSet 获得第一个结果集,然后调用适当的 getXXX 方法获取其中的值。要获得第二个结果集,需要先调用 getMoreResults 方法,然后再调用 getResultSet 方法。如果已知某个过程返回两个更新计数,则首先调用方法 getUpdateCount,然后调用 getMoreResults,并再次调用 getUpdateCount。<br>
<br>
对于不知道返回内容,则情况更为复杂。如果结果是 ResultSet 对象,则方法 execute 返回 true;如果结果是 Java int,则返回 false。如果返回 int,则意味着结果是更新计数或执行的语句是 DDL 命令。在调用方法 execute 之后要做的第一件事情是调用 getResultSet 或 getUpdateCount。调用方法 getResultSet 可以获得两个或多个 ResultSet 对象中第一个对象;或调用方法 getUpdateCount 可以获得两个或多个更新计数中第一个更新计数的内容。<br>
<br>
当 SQL 语句的结果不是结果集时,则方法 getResultSet 将返回 null。这可能意味着结果是一个更新计数或没有其它结果。在这种情况下,判断 null 真正含义的唯一方法是调用方法 getUpdateCount,它将返回一个整数。这个整数为调用语句所影响的行数;如果为 -1 则表示结果是结果集或没有结果。如果方法 getResultSet 已返回 null(表示结果不是 ResultSet 对象),则返回值 -1 表示没有其它结果。也就是说,当下列条件为真时表示没有结果(或没有其它结果): <br>
<br>
((stmt.getResultSet() == null) &amp;&amp; (stmt.getUpdateCount() == -1))<br>
<br>
如果已经调用方法 getResultSet 并处理了它返回的 ResultSet 对象,则有必要调用方法 getMoreResults 以确定是否有其它结果集或更新计数。如果 getMoreResults 返回 true,则需要再次调用 getResultSet 来检索下一个结果集。如上所述,如果 getResultSet 返回 null,则需要调用 getUpdateCount 来检查 null 是表示结果为更新计数还是表示没有其它结果。<br>
<br>
当 getMoreResults 返回 false 时,它表示该 SQL 语句返回一个更新计数或没有其它结果。因此需要调用方法 getUpdateCount 来检查它是哪一种情况。在这种情况下,当下列条件为真时表示没有其它结果: <br>
<br>
((stmt.getMoreResults() == false) &amp;&amp; (stmt.getUpdateCount() == -1))<br>
<br>
下面的代码演示了一种方法用来确认已访问调用方法 execute 所产生的全部结果集和更新计数: <br>
<br>
<br>
stmt.execute(queryStringWithUnknownResults);<br>
while (true) {<br>
int rowCount = stmt.getUpdateCount();<br>
if (rowCount &gt; 0) { // 它是更新计数<br>
System.out.println(&quot;Rows changed = &quot; + count);<br>
stmt.getMoreResults();<br>
continue;<br>
}<br>
if (rowCount == 0) { // DDL 命令或 0 个更新<br>
System.out.println(&quot; No rows changed or statement was DDL<br>
command&quot;);<br>
stmt.getMoreResults();<br>
continue;<br>
}<br>
<br>
// 执行到这里,证明有一个结果集<br>
// 或没有其它结果<br>
<br>
ResultSet rs = stmt.getResultSet;<br>
if (rs != null) {<br>
. . . // 使用元数据获得关于结果集列的信息<br>
while (rs.next()) {<br>
. . . // 处理结果<br>
stmt.getMoreResults();<br>
continue;<br>
}<br>
break; // 没有其它结果<br>
<br>
<br>

        </td>
      </tr>
    </td>
  </tr>
</div>
</body>
</html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -