从Java调用Oracle存储过程

从Java调用Oracle存储过程,java,stored-procedures,oracle11g,Java,Stored Procedures,Oracle11g,下面是我调用存储过程的Java代码。我不断听到一个错误,说: java.lang.ClassCastException:oracle.jdbc.driver.OracleCallableStatementWrapper与oracle.jdbc.OracleCallableStatement不兼容 public Connection initiateDBConnection() throws NamingException, SQLException { Connect

下面是我调用存储过程的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();
}
public Connection initiateDBConnection()引发NamingException,
SQLException{
连接结果=null;
InitialContext InitialContext=新的InitialContext();
DataSource DataSource=(DataSource)initialContext
.doLookup(Constants.DATASOURCE_CONTEXT);
结果=(连接)WSJdbcUtil
.getNativeConnection((WSJdbcConnection)数据源
.getConnection());
返回结果;
}
public void callStoredProcedure(字符串procedureName,
映射)抛出SQLException、NamingException{
OracleCallableStatement=(OracleCallableStatement)initiateDBConnection()
.prepareCall(程序重命名);
迭代器参数=map.entrySet().Iterator();
while(params.hasNext()){
条目内容=params.next();
语句.setNString(contents.getKey(),
(字符串)contents.getValue());
System.out.println(“键:”+contents.getKey()+“值:”
+contents.getValue());
}
语句。execute();
语句。close();
}

出现prepareCall方法返回OracleCallableStatementWrapper对象

OracleCallableStatementWrapper statement = (OracleCallableStatementWrapper) initiateDBConnection().prepareCall(procedureName);
此外,您还可以尝试以下方法:

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

我注意到在您的cose
WSJdbcConnection
中,这意味着您正在使用Websphere。如果确实如此,并且如果您确实需要使用Oracle特定的类(
OracleConnection
,等等),我建议您应该研究websphere提供的用于“干净”管理此类情况的
WSCallHelper
类。它提供了两种主要方法,
jdbcCall
jdbccass
,分别用于在本机类型上调用和传递方法


IBM的这篇文章中提供了更多信息:

显然,这是我最初尝试的,但我一直得到SQL92令牌不兼容错误可能是您的语法有问题,或者JDBC驱动程序不支持该语法。