如何使用 JDBC 获取数据库函数返回的 XMLTYPE 值
日期:2003 年 5 月 21 日
目标
在读完本文档后,您应该能够:
- 使用 JDBC 获取数据库函数返回的 XMLTYPE 值并且,
- 使用所提供的指示运行示例 java 类
软件需求
- JDK1.3.x 或更高版本。可从此处下载。
- Oracle9i Database Release 2 或更新版本。可从 此处下载。
注意:与本文档一起提供的示例 java 类将使用 JDBC 驱动程序 classes12.jar、Oracle XML DB jar:xdb.jar 和 xmlparserv2.jar 进行编译和运行。所有这些都可以在 Oracle 数据库安装中找到。如果您已经安装了数据库,您不需要分别下载这些软件;否则您必须从 OTN 下载它们。xdb.jar 和 xmlparserv2.jar 包含在 Oracle XDK for Java 下载中。
此示例通过了 Linux Red Hat Advanced Server 2.1 的测试和认证。
说明
假设有一个数据库函数,它具有一个 XMLTYPE 类型的返回值。要通过 JDBC 获取这个 XMLTYPE 值,
- 调用一个数据库函数,使用 CallableStatement。
- 必须使用一个绑定参数以获取数据库函数的返回值。使用方法 CallableStatement.registerOutParameter() 将值绑定到参数,将 OracleTypes.OPAQUE 作为数据库函数的 XMLTYPE 输出参数的数据类型
- 使用 oracle.sql.XMLTYPE 类创建 XMLTYPE 对象并使用方法:getOPAQUE() 获取返回值。
下面是一个示例代码段: 使用了底层的数据库对象:
-- An example table of XMLTYPE
CREATE TABLE PURCHASEORDER OF XMLTYPE;
-- Insert a record to the XMLTYPE table.
INSERT INTO purchaseorder VALUES(XMLTYPE('
<PurchaseOrder> <Reference>ADAMS-20011127121040988PST</Reference> <Actions> <Action> <User>SCOTT</User> <Date>2002-03-31</Date> </Action> </Actions> </PurchaseOrder>'));
-- Create a database function that returns the inserted record as XMLTYPE.
CREATE OR REPLACE FUNCTION getPurchaseOrder(reference VARCHAR2) RETURN XMLTYPE AS xml XMLTYPE; BEGIN SELECT VALUE(p) INTO xml FROM PURCHASEORDER p WHERE EXTRACTVALUE(VALUE(p),'/PurchaseOrder/Reference') = reference; RETURN xml; END;
/
commit;
|
|
现在我们来考察使用可调用语句从 JDBC 调用此数据库函数并获取 XMLTYPE 的方法。下面是实现同一目的的代码:
JDBC 类中用来获取从数据库函数返回的 XMLTYPE 的代码:
.............
............. import oracle.jdbc.OracleTypes; .......... import oracle.xdb.XMLType;
........... import oracle.jdbc.OracleCallableStatement;
..........
// Variable to hold the XMLTYPE value returned from the database function.
XMLType xml = null; ............ .............
// Create a string that has the SQL statement that calls the function. String SQLTEXT = "{? = call getPurchaseOrder('ADAMS-20011127121040988PST')}"; System.out.println("SQL := " + SQLTEXT);
// Call the database procedure. stmt = (OracleCallableStatement)conn.prepareCall(SQLTEXT);
// Register the parameter as OracleTypes.OPAQUE that corresponds to XMLTYPE. stmt.registerOutParameter (1, OracleTypes.OPAQUE,"SYS.XMLTYPE");
stmt.execute();
// Get the XMLTYPE value returned from database function. xml = XMLType.createXML(stmt.getOPAQUE(1)); System.out.println(((XMLType)xml).getStringVal());
............. .............
|
|
源代码:
点击此处查看完整的可运行源代码。
运行 Java 类
- 将完整的源代码复制到一个目录中并存储为 GetXMLTypeVal.java
- 在数据库中,以用户 SCOTT 的身份运行上面列出的 SQL 脚本创建表和数据库函数。
- 编辑 GetXMLTypeVal.java 并在类构造器中使用您自己的数据库参数。
// 连接到数据库。 conn = DriverManager.getConnection ("jdbc:oracle:thin:@<hostname>:<port>:<sid>", "scott", "tiger");
- 在被复制的目录中,从命令行提示符设置 classpath 以包含:
- Oracle JDBC 驱动程序类:classes12.zip 或 classes12.jar 可以从 Oracle 数据库安装中获取,位于 /jdbc/lib 目录。
注意:<ORACLE_HOME> 是安装 Oracle 数据库的目录。 示例:D:\oracle 在 Windows 环境,/opt/oracle 在 Linux 环境。
- Oracle XML DB jar:xdb.jar 可以从 Oracle 数据库安装中获取,位于 <ORACLE_HOME>/rdbms/jlib 目录。
- xmlparserv2.jar 可以从 Oracle 数据库安装中获取,位于 <ORACLE_HOME>/lib 目录。
- 编译 GetXMLTypeVal 类。
例如: javac -d .GetXMLTypeVal.java
- 通过向参数赋值运行该类。
java GetXMLTypeVal
- 运行下面的查询,检查输出是否与数据库内的 purchase XML 文档相同:
SQL> SELECT VALUE(t) FROM purchaseorder t;
资源
总结
本文档试图解释和举例说明如何在 JDBC 中获取由数据库函数返回的 XMLTYPE 值。
请将关于此示例的评论意见输入 OTN 示例代码论坛。
|