PL/SQL 常被用于创建到数据库的连接、生成表、检索结果集和执行更新。来自使用 PL/SQL 的 SQL 查询的结果集当然是一个文本表。随着在 J2EE 应用程序中使用 XML 逐渐增多,许多 J2EE 开发人员现在需要将这种结果表示为 XML 文档,以交换数据。
包含在 Oracle JDeveloper 10g 中的 Oracle XSQL Servlet 工具支持 SQL 查询的处理以及将结果集作为 XML 输出。有可能要求 XML 输出是一种不同的格式或者可能需要修改输出,因此为了这些目的,XSQL Servlet 也支持 XSLT 转换。
XSQL 文件(.xsql 文件)利用 <xsql:query</xsql:query 标记包含 SQL 查询语句。XSQL 还可以通过 <xsql:dml</xsql:dml 标记来创建或更新数据库。XSQL 通过在 XSQL 页面中指定样式表来支持 XSLT 转换。在这篇技术说明中,我们将利用 XSQL 来查询一个包含了目录的示例数据库表。然后我们将通过 XSLT 转换将 XML 输出显示为 HTML 表。
准备安装
使用 XSQL 创建/查询的数据库表在 Oracle 数据库中创建。在这篇教程中使用了 Oracle 数据库 10g 来创建数据库表。
首先,创建和启动 Oracle 数据库的一个例程。然后与数据库连接,并且 SYS 模式(用户名)为 SYSDBA。
CONNECT SYS/<password AS SYSDBA
然后使用下面的 SQL 脚本来创建一个包含了示例 Oracle 目录的数据库表:
CREATE TABLE OracleCatalog(Journal VARCHAR(25), Publisher Varchar(25),
Edition VARCHAR(25), Title Varchar(45), Author Varchar(25));
INSERT INTO OracleCatalog VALUES('Oracle Magazine',
'Oracle Publishing',
'November-December 2003', 'Servlets and JSP Step Up', 'Budi Kurniawan');
INSERT INTO OracleCatalog VALUES('Oracle Magazine',
'Oracle Publishing',
'September-October 2003', 'Parsing XML Efficiently', 'Julie Basu');
我们将在 JDeveloper 10g 生产版中运行示例 XSQL。下载并安装 JDeveloper 10g 生产版;然后创建一个新的项目(如图 1 所示)。
创建数据库连接
XSQL 查询需要一条数据库连接。要在 JDeveloper 中创建数据库连接,请选择连接导航器中的 ConnectionsDatabase 节点(如图 2 所示)。
图 2:导航器中的数据库节点
然后显示连接向导(如图 3 所示)。
图 3:连接向导:类型
在连接向导中指定一个连接名称和连接类型,然后单击 Next 按钮。在显示的下一个框架中,指定一个用户名和口令,然后单击 Next 按钮。
在随后的 Connection 框架中指定一个 JDBC 驱动程序、主机名、JDBC 端口和数据库 SID,然后单击 Next 按钮(如图 4 所示)。
图 4:连接向导:连接
在随后的 Test 框架中,单击 Test Connection 按钮,测试 JDBC 连接(参见图 5)。单击 Finish 按钮,配置数据库连接。
图 5:连接向导:测试
如图 6 所示,您将看到在应用程序导航器中一个连接节点添加到了 ConnectionsDatabase 节点中。
图 6:连接节点
与数据库的连接还可能通过修改 <JDeveloper/jdev/system9.0.5.1.1605/XSQLConfig.xml 文件来创建。<JDeveloper 是安装 JDeveloper 10g 的目录;可能已设定了运行应用服务器的用户拥有对 XSQLConfig.xml 文件的读权限。在 XSQLConfig.xml 中的 <connectiondefs 元素中增加一个 <connection 元素,以指定要创建的连接。利用 SYSTEM 模式创建一条连接。
<connection name="dbConnection"
<usernameSYSTEM</username
<password</password
<dburljdbc:oracle:thin:@<HOST:<PORT:<SID</dburl
<driveroracle.jdbc.driver.OracleDriver</driver
</connection
属性 name 是连接名称
元素 username 是用来登录到数据库中的用户名
元素 password 是用来登录到数据库中的口令
元素 dburl 是数据库的 URL
元素 driver 是用来与数据库连接的 JDBC 驱动程序
<HOST 是 Oracle 10g 生产版的数据库主机
<PORT 是数据库端口
<SID 是数据库 SID
接下来,将 XSQLConfig.xml 拷贝到 JDeveloper 中的项目源代码目录中。我们将使用在 XSQLConfig.xml 文件中配置的连接 dbConnection 来指定 XSQL 页面的 <page 标记中连接属性的值。
XSQL 的 Oracle 10g 版本(Oracle 10g XDK 的一部分)也支持新的利用 J2EE 容器定义的 JDBC 数据源的能力,这从 XSQLConfig.xml 文件中消除了连接定义,并将连接池的管理推迟到了 J2EE 容器中。用于数据库连接的数据源在 XSQL 页面的 <page 标记的 connection 属性中指定。因为 J2EE 容器一般支持为它们的 JDBC 连接定义进行口令加密,因此这种方法在某些情况下甚至可能更安全。(请参阅 Oracle 10g XSQL 版本说明的“使用 Servlet 容器的数据源实施”一节,以获取更多的详细信息。)
在 XSQL 页面中处理 XSQL 查询
现在让我们在 JDeveloper 中创建一个 XSQL 页面 (queryDb.xsql)。要创建一个 XSQL 文件,请选择应用程序导航框架中的项目节点。在下一个框架中,选择 GeneralXML。在列出的项目中选择 XSQL Page。这将生成一个 XSQL 页面(如图 7 所示)。
图 7:XSQL 页面
接下来我们将在 XSQL 页面中添加 <xsql:query</xsql:query 标记,以处理我们的 XSQL 查询。XSQL 查询的应用程序可能需要使用绑定变量(SQL 语句中的变量)。可以使用 URL 参数、会话变量、cookie 值或页面参数的值来设置绑定变量。在我们的例子中我们将使用页面参数来设置 XSQL 查询绑定变量。
使用 <xsql:query 标记中的 bind-params 属性指定的绑定变量用于<xsql:query 标记内部的 SQL 语句。绑定变量在 SQL 语句中用 '?' 表示。绑定参数的值用 <xsql:set-page-params/ 标记指定。在本节和以下章节中,XSQL 查询中使用的数据库表的名称应该加上创建表的模式作为前缀。在本教程中,数据库表 OracleCatalog 在 SYS 模式中创建。在 XSQL 查询的 SQL 语句中用 SYS 作为 OracleCatalog 表的前缀。例如,从 FROM SYS.OracleCatalog 选择 JOURNAL、PUBLISHER、EDITION、TITLE 与 AUTHOR。
<page xmlns:xsql="urn:oracle-xsql" connection="dbConnection"
<xsql:set-page-param name="JOURNAL" value="Oracle Magazine"/
<xsql:set-page-param name="PUBLISHER" value="Oracle Publishing"/
<xsql:query xmlns:xsql="urn:oracle-xsql"
bind-params="JOURNAL
PUBLISHER"
select JOURNAL, PUBLISHER, EDITION,
TITLE, AUTHOR from OracleCatalog WHERE JOURNAL=?AND PUBLISHER=?
</xsql:query
</page
可以从 XSQL 组件板中添加 <xsql:query</xsql:query 标记(如图 8 所示)。
图 8:XSQL 组件板中的查询组件
页面标记中的属性连接指定了用来查询数据库的连接。我们的 XSQL 页面 queryDb.xsql 在图 9 中显示。
图 9:queryDb.xsql XSQL 页面
要运行 queryDb.xsql,右键单击应用程序导航器中的 queryDb.xsql 节点,并选择 Run,如图 10 所示。
图 10:运行 queryDb.xsql
XSQL 查询的结果是一个 XML 文档;XSQL 页面 queryDb.xsql 在默认的浏览器中显示 XSQL 查询的 XML 输出。我们的 XSQL 查询如下所示。
- <page
- <ROWSET
- <ROW num="1"
<JOURNALOracle Magazine</JOURNAL
<PUBLISHEROracle Publishing</PUBLISHER
<EDITIONNovember-December 2003</EDITION
<TITLEServlets and JSP Step Up</Title
<AUTHORBudi Kurniawan</AUTHOR
</ROW
- <ROW num="2"
<JOURNALOracle Magazine</JOURNAL
<PUBLISHEROracle Publishing</PUBLISHER
<EDITIONSeptember-October 2003</EDITION
<TITLEParsing XML Efficiently</Title
<AUTHORJilua Basu</AUTHOR
</ROW