📄 jdbc-spec.frame11.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="600">
<tr>
<td><font size="-1"><a href="jdbc-spec.frame.html">目录</a> | <a
href="jdbc-spec.frame10.html">上一页</a> | <a href="jdbc-spec.frame12.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="7105"></a> </p>
<h2>11 SQL 扩展</h2>
<p>某些超越 SQL-2 入门级的 SQL 功能已得到广泛支持,因此值得放在
JDBC 兼容定义中,以便应用程序能利用这些功能的可移值性。但是,ANSI
定义的下一个更高级 SQL 兼容标准(即 SQL-2
过渡级)却只得到小范围的支持。在 DBMS 中过渡级语义<em>得到</em>支持的地方,语法通常各不相同。
</p>
<p><a name="36101"></a>因此我们为 SQL-2 入门级定义了两类必须能被
JDBC-Compliant(TM) 驱动程序支持的扩展:
<ul>
<p><a name="36102"></a></p>
<li>选择性过渡级语法和语义是必须得到支持的。我们目前只要求一种这样的功能:为和
JDBC 兼容,需要 DROP TABLE 命令。<br>
<br>
<a name="36034"></a> </li>
<li>选择性过渡级语义必须得到转义语法的支持。驱动程序可以容易地将该转义语法扫描并解释成
DBMS 特定的语法。我们将在<a href="jdbc-spec.frame11.html#7105">第 11 节</a>的剩余部分讨论这些转义语法。注意:只有在基本数据库支持相应过渡级语义的地方才需支持这些转义。
<br>
<br>
</li>
</ul>
<p><a name="36086"></a></p>
<p>由 Microsoft 定义的、支持 ODBC 核心 SQL 的 ODBC
驱动程序与本节定义的 JDBC SQL 一致。 </p>
<p><a name="36019"></a> </p>
<h3>11.1 SQL 转义语法</h3>
<p>对于存储过程、标量函数、日期、时间和外部连接,JDBC 和 ODBC
一样都支持 DBMS 无关转义语法。驱动程序将此转义语法映射为 DBMS
特定的语法,从而使需要这些功能的应用程序具有可移植性。DBMS
无关语法基于由大括号和关键字界定的转义子句: </p>
<pre><code>{ 关键字 ... 参数 ...}
</code></pre>
<p><a name="25513"></a>该符合 ODBC 标准的转义语法一般来说<em>不</em>同于
ANSI 在 SQL-2 过渡级中所采用的同功能转义语法。如果所有想要的 DBMSs
都支持标准 SQL-2 语法,则建议用户使用标准 SQL-2
语法而不是这些转义语法。当有足够的 DBMSs 支持更高级的 SQL-2
语法和语义时,这些转义语法将不再有用。 </p>
<p><a name="16957"></a> </p>
<h3>11.2 存储过程</h3>
<p>调用 JDBC 中存储过程的语法是: </p>
<pre><code>{call procedure_name[(argument1, argument2, ...)]}
</code></pre>
<p>或者,也可返回结果参数,其语法是: </p>
<pre><code>{?= call procedure_name[(argument1, argument2, ...)]}
</code></pre>
<p><a name="16998"></a>输入变量既可以是文字也可以是参数。要确定是否支持存储过程,可调用
DatabaseMetaData.supportsStoredProcedure。 </p>
<p><a name="16992"></a> </p>
<p><a name="16922"></a> </p>
<h3>11.3 时间和日期文字</h3>
<p>DBMS 用于日期、时间和时间戳文字方面的语法各不相同。JDBC
支持这些文字语法的 ISO
标准格式,而所利用的就是驱动程序必须将其转换成 DBMS
表示形式的转义子句。 </p>
<p><a name="17040"></a>例如,可以利用该语法在 JDBC SQL
语句指定日期的表示形式为: </p>
<pre><code>{d `yyyy-mm-dd'}
</code></pre>
<p><a name="17014"></a>其中 yyyy-mm-dd 给出年月日,例如 1996-02-28。驱动程序将用等价的
DBMS 特定表示形式代替该转义子句(例如对于 Oracle 为“Feb 28, 1996”)。
</p>
<p><a name="17002"></a>TIME 和 TIMESTAMP 的转义子句有相似之处: </p>
<pre><code>{t `hh:mm:ss'}
</code></pre>
<p> </p>
<pre><code>{ts `yyyy-mm-dd hh:mm:ss.f...'}
</code></pre>
<p><a name="20739"></a>TIMESTAMP 秒 (.f...) 的小数部分可以略去。 </p>
<p><a name="17045"></a> </p>
<h3>11.4 标量函数</h3>
<p>JDBC
在标量值方面支持数值型、字符串、时间、日期、系统和转换函数。这些函数的表示法是:关键字“
fn ”+ 函数名及其参数。例如,连接两个字符串的函数 concat: </p>
<pre><code>{fn concat("Hot", "Java")}
</code></pre>
<p>当前用户名可用下面语法获得: </p>
<pre><code>{fn user()}
</code></pre>
<p>请参见 X/Open CLI 或 ODBC
规范中有关标量函数语义的规范。这里所列的受支持函数仅供参考,某些驱动程序可能不完全支持这些函数。要确定支持哪些函数,请使用下列
DatabaseMe tadata 方法:getNumericFunctions()
返回一个逗号分隔的、所支持的数值型函数名的列表。getStringFunctions()
与前者相同,只是针对的是字符串函数,如此类推。 </p>
<p>受支持的数值型函数有:ABS(number), ACOS(float), ASIN(float), ATAN(float),
ATAN2(float1, float2), CEILING(number), COS(float), COT(float), DEGREES(number),
EXP(float), FLOOR(number), LOG(float), LOG10(float), MOD(integer1, integer2), PI(),
POWER(number, power), RADIANS(number), RAND(integer), ROUND(number, places), SIGN(number),
SIN(float), SQRT(float), TAN(float) 和 TRUNCATE(number, places)。 </p>
<p>受支持的字符串函数有:ASCII(string), CHAR(code), CONCAT(string1, string2),
DIFFERENCE(string1, string2), INSERT(string1, start, length, string2), LCASE(string),
LEFT(string, count), LENGTH(string), LOCATE(string1, string2, start), LTRIM(string),
REPEAT(string, count), REPLACE(string1, string2, string3), RIGHT(string, count),
RTRIM(string), SOUNDEX(string), SPACE(count), SUBSTRING(string, start, length) 和
UCASE(string)。 </p>
<p><a name="17144"></a>受支持的时间函数有:CURDATE(), CURTIME(), DAYNAME(date),
DAYOFMONTH(date), DAYHOFWEEK(date), DAYOFYEAR(date), HOUR(time), MINUTE(time),
MONTH(time), MONTHNAME(date), NOW(), QUARTER(date), SECOND(time), TIMESTAMPADD(interval,
count, timestamp), TIMESTAMPDIFF(interval, timestamp1, timpestamp2), WEEK(date) 和
YEAR(date)。 </p>
<p><a name="17147"></a>受支持的系统函数有:DATABASE(), IFNULL(expression, value)
和 USER()。 </p>
<p><a name="17148"></a>此外还包括 CONVERT(value, SQLtype)
表达式,其中类型可以是:BIGINT, BINARY, BIT, CHAR, DATE, DECIMAL, DOUBLE,
FLOAT, INTEGER, LONGVARBINARY, LONGVARCHAR, REAL, SMALLINT, TIME, TIMESTAMP, TINYINT,
VARBINARY 和 VARCHAR。 </p>
<p><a name="17127"></a>另外,DBMS
也支持这些函数,只是语法略为不同。驱动程序的任务不是将它们映射到合适的语法就是直接在驱动程序中实现这些函数。
</p>
<p><a name="25549"></a> </p>
<h3>11.5 LIKE 转义符</h3>
<p>字符“%”和“_”在 SQL LIKE 子句中有特殊含义(“%”匹配 0
个或更多的字符,“-”只匹配一个字符)。如果要引用这些字符的原意,则需要在字符串中这些字符的前面加上专门的转义字符,如“\”。为指定用于引用这些字符原意的转义符,可在查询语句的末尾加上下列语法:
</p>
<pre><code>{escape `<em>escape-character</em>'}
</code></pre>
<p>例如,查询语句 </p>
<pre><code>SELECT NAME FROM IDENTIFIERS WHERE ID LIKE `\_%' {escape `\'}
</code></pre>
<p><a name="25577"></a>将查找以下划线开头的标识符名称。 </p>
<p><a name="25527"></a> </p>
<h3>11.6 外部连接</h3>
<p>外部连接的语法是: </p>
<pre><code>{oj outer-join}
</code></pre>
<p><a name="17191"></a>其中的 outer-join 与下述语法中 outer-join
的形式一致: </p>
<pre><code>table LEFT OUTER JOIN {table | outer-join} ON search-condition
</code></pre>
<p><a name="25489"></a>有关外部连接的详细说明,参见 SQL
语法。我们提供了三种布尔 DatabaseMetaData
方法,可用于确定驱动程序所支持的外部连接类型。 </p>
<p><br>
</p>
<hr>
<font size="-1"><a href="jdbc-spec.frame.html">
<p>目录</a> | <a href="jdbc-spec.frame10.html">上一页</a> | <a
href="jdbc-spec.frame12.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="../../../relnotes/SMICopyright.html"><font size="-1"><i>
<p>版权所有© 1996 1997 Sun Microsystems, Inc. 保留所有权利。</i></font></a>
<!-- HTML generated by Suzette Pelouch on April 10, 1998 --></p>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -