【问题标题】:Call Oracle Stored Procedure from Java从 Java 调用 Oracle 存储过程
【发布时间】:2012-01-27 06:15:11
【问题描述】:

这是我调用存储过程的 Java 代码。我不断收到错误消息: java.lang.ClassCastException: oracle.jdbc.driver.OracleCallableStatementWrapper 与 oracle.jdbc.OracleCallableStatement 不兼容

public Connection initiateDBConnection() throws NamingException,
        SQLException {

    Connection result = null;
    InitialContext initialContext = new InitialContext();

    DataSource datasource = (DataSource) initialContext
            .doLookup(Constants.DATASOURCE_CONTEXT);
    result = (Connection) WSJdbcUtil
            .getNativeConnection((WSJdbcConnection) datasource
                    .getConnection());

    return result;
}

public void callStoredProcedure(String procedureName,
        Map<Integer, Object> map) throws SQLException, NamingException {
    OracleCallableStatement statement = (OracleCallableStatement) initiateDBConnection()
            .prepareCall(procedureName);
    Iterator<Entry<Integer, Object>> params = map.entrySet().iterator();
    while (params.hasNext()) {
        Entry<Integer, Object> contents = params.next();
        statement.setNString(contents.getKey(),
                (String) contents.getValue());
        System.out.println("Key: " + contents.getKey() + "Value: "
                + contents.getValue());
    }
    statement.execute();
    statement.close();
}

【问题讨论】:

    标签: java stored-procedures oracle11g


    【解决方案1】:

    prepareCall 方法似乎返回了 OracleCallableStatementWrapper 对象。

    OracleCallableStatementWrapper statement = (OracleCallableStatementWrapper) initiateDBConnection().prepareCall(procedureName);
    

    另外,您可以尝试使用JAVA JDBC API,如下所示:

    CallableStatement statement = (CallableStatement) initiateDBConnection()
                .prepareCall(procedureName);
    

    【讨论】:

    • 显然,这就是我一开始尝试的,但我不断收到 SQL92 token not compatible 错误
    • 您的语法可能有问题,或者 JDBC 驱动程序不支持该语法。
    【解决方案2】:

    我注意到你的WSJdbcConnection 这意味着你正在使用Websphere。如果确实如此,并且您确实需要使用 Oracle 特定的类(OracleConnection 等),我建议您查看由 websphere 提供的用于此类“干净”管理的 WSCallHelper 类的情况。它提供了两个主要的方法,jdbcCalljdbcPass 分别用于调用和传递原生类型的方法。

    IBM 的这篇文章中提供了更多信息:http://www-01.ibm.com/support/docview.wss?uid=swg21409335

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-20
      • 2020-11-15
      • 1970-01-01
      • 2013-12-04
      • 2011-04-25
      • 2015-05-22
      • 2017-05-21
      相关资源
      最近更新 更多