如何使用 JDBC 获取数据库函数返回的 XMLTYPE 值

日期:2003 年 5 月 21 日

目标

在读完本文档后,您应该能够:

  • 使用 JDBC 获取数据库函数返回的 XMLTYPE 值并且,
  • 使用所提供的指示运行示例 java 类

软件需求

  • JDK1.3.x 或更高版本。可从此处下载。
  • Oracle9i Database Release 2 或更新版本。可从 此处下载。

注意:与本文档一起提供的示例 java 类将使用 JDBC 驱动程序 classes12.jar、Oracle XML DB jar:xdb.jarxmlparserv2.jar 进行编译和运行。所有这些都可以在 Oracle 数据库安装中找到。如果您已经安装了数据库,您不需要分别下载这些软件;否则您必须从 OTN 下载它们。xdb.jarxmlparserv2.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.zipclasses12.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 示例代码论坛。
寄送此页面
Printer View 打印机视图