当前位置: 首页 > 面试题库 >

Java:从StoredProcedure返回XMLType数据,使用ojdbc6.jar xdb6.jarxmlparserv2.jar进行Java与PLSQL交互

暨成双
2023-03-14
问题内容

我正在按照下面的教程从存储过程中检索XMLType数据

http://docs.oracle.com/cd/B19306_01/appdev.102/b14259/xdb11jav.htm#g1039140


示例13-4 XMLType Java:返回XMLType数据

运行代码时,出现此 错误

Exception in thread "main" java.lang.NoClassDefFoundError: oracle/xml/parser/v2/XMLParseException
    at oracle.xdb.XMLTypeFactory.create(XMLTypeFactory.java:67)
    at oracle.sql.OPAQUE.toClass(OPAQUE.java:328)
    at oracle.sql.OPAQUE.toJdbc(OPAQUE.java:278)
    at oracle.sql.OPAQUE.toJdbc(OPAQUE.java:259)
    at oracle.jdbc.driver.NamedTypeAccessor.getObject(NamedTypeAccessor.java:190)
    at oracle.jdbc.driver.NamedTypeAccessor.getObject(NamedTypeAccessor.java:117)
    at oracle.jdbc.driver.OracleCallableStatement.getObject(OracleCallableStatement.java:1579)
    at oracle.jdbc.driver.OracleCallableStatementWrapper.getObject(OracleCallableStatementWrapper.java:815)
    at com.example.TestXMLDAO.main(TestXMLDAO.java:48)
Caused by: java.lang.ClassNotFoundException: oracle.xml.parser.v2.XMLParseException
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    ... 9 more

Java代码段:

import java.io.IOException;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

import oracle.jdbc.OracleTypes;
import oracle.xdb.XMLType;

.............

            // Prepare to call the stored procedure get_group_details.

            String sql = "{call mypackage.get_records(?,?,?,?,?,?,?,?)}";

            callableStatement = conn.prepareCall(sql);

            callableStatement.setString(1, "");
            callableStatement.setString(2, "");
            callableStatement.setString(3, "");
            callableStatement.setString(4, "");
            callableStatement.setString(5, "abb%");
            callableStatement.setString(6, "F");
            callableStatement.setString(7, "F");
            callableStatement.registerOutParameter(8, OracleTypes.OPAQUE,
                    "SYS.XMLTYPE");

            // execute get_group_details
            // callableStatement.executeQuery();

            callableStatement.executeQuery();

            callableStatement.getObject(8);

            // get cursor and cast it to ResultSet
            xml = (XMLType) callableStatement.getObject(8);

            System.out.println(xml.getStringVal());

        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            // Close the statement
            callableStatement.close();
            // Close the connection
            conn.close();
        }

PLSQL过程片段

PROCEDURE get_records
   (
      grp1     IN a.name%TYPE DEFAULT NULL
     ,grp2 IN a.name%TYPE DEFAULT NULL
     ,grp3        IN a.name%TYPE DEFAULT NULL
     ,grp4          IN a.name%TYPE DEFAULT NULL
     ,grp5               IN a.name%TYPE DEFAULT NULL
     ,flag1     IN a.flag%TYPE DEFAULT 'F'
     ,flag2       IN a.flag%TYPE DEFAULT 'F'
     ,xml_type_out        OUT xmltype
   );

包含的Jar:ojdbc6.jar,xdb.jar

知道我缺少什么吗?


问题答案:

通过添加所需的罐子修复了问题

在类路径中需要以下三个罐,[我仍然有这些罐,由于罐的版本错误,我得到了错误]

ojdbc6.jar,xdb6.jar,xmlparserv2-11.1.1.jar

即使您有这些罐子,当包含错误版本的xmlparserv2.jar时,也可能会遇到错误。

因此,重要的是要注意这些jar的版本和兼容性。

适用于我的服务器[我的Oracle数据库版本:11.2.0.4.0]

ojdbc6.jar; xdb6.jar:

http://www.oracle.com/technetwork/database/enterprise-
edition/jdbc-112010-090769.html

xmlparserv2-11.1.1.jar 可在此处获得:(SQL
Developer)(在sqldeveloper \ modules \ oracle.xdk_12.1.2中)

[已删除@Lukas Eder建议的第三方参考链接,谢谢]



 类似资料:
  • 问题内容: 我注意到以下差异,但没有在任何地方看到它的记载。我想知道其他人是否注意到了同一件事,或者可以指出一些证明相同的文档。 信封:- 场景: ojdbc14.jar :如果pl / sql返回类型为变量的变量,而我尝试将其放入java.sql.Date变量中,则一切正常。例: ojdbc6.jar :如果pl / sql返回类型为变量的变量,而我尝试将其放入java.sql.Date变量中,

  • 问题内容: 我有一个返回记录类型的函数。 我想从Java代码中调用此函数,并在Java中获取该记录类型。请指导我如何做。谢谢 问题答案: 首先让我们从更正您的代码开始。我可以看到您发布的代码无法编译,并且会引发问题。正确的代码如下: 执行此代码时,您可能会遇到类似的问题。这是因为a 仅限在中使用。 ORA-00902:无效的数据类型 最好的方法是先创建一个对象的a 和a ,然后在您的函数中创建它:

  • 问题内容: 嗨,我正在使用elasticsearchSpring数据。我项目的领域结构不断变化,因此我必须删除索引才能每次更改映射。为了克服这个问题,我使用了别名。我使用以下方法创建了别名: 我有一个测试课: TestRepository类: 我的问题是如何从别名而不是索引本身读取?是否对别名也进行写操作。我看过以下链接:https : //www.elastic.co/guide/en/elas

  • 问题内容: 我绝对不知道为什么这段代码不会返回数组…我觉得我的编译器有问题: 该代码什么也不返回。这让我疯狂! 问题答案: 它正在返回数组,但是所有返回的东西(包括Array)所做的只是听起来像:返回值。在您的情况下,您将获得的值,它恰好是一个数组(可以是任何数组,您仍然会遇到此问题),然后将其放在那里。 当函数返回任何内容时,它实际上是用返回值替换调用它的行(在您的情况下:)。因此,您的方法实际

  • 我在Java中有一个与MySQL连接的多类项目,我可以与这个SQL数据库建立连接,但当我试图将它读入数组时,它得到的是废话,而不是所请求的信息。我做错了什么? 它在sql定义下面出现了一条弯曲的线条,说它们从来没有被读取过,但我就是不明白为什么会这样!它构建得很好,可以看到数据库中有行,但它返回以下内容: 显示“java2assignment3.dvd@5e0010bc”和“java2assign

  • 问题内容: 在过去的两年中,我一直在编写Java,现在,我开始用python(另外)进行编写。 问题是,当我查看我的Python代码时,似乎有人试图将Java代码转换为python格式,但结果却很糟糕,因为- python不是Java。 关于如何摆脱“用Python编写Java”模式的任何技巧? 谢谢! 问题答案: 您可能会考虑将自己沉浸在Python范例中。最好的方法是首先了解他们的知识,然后通