2011-12-24 141 views
0

這是用於調用存儲過程的Java代碼。我不斷收到一個錯誤說: java.lang.ClassCastException:oracle.jdbc.driver.OracleCallableStatementWrapper不符合oracle.jdbc.OracleCallableStatement從Java調用Oracle存儲過程

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(); 
} 

回答

0

看來prepareCall方法返回OracleCallableStatementWrapper對象。

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

此外,您可以用JAVA JDBC API嘗試如下:

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

顯然,這就是我試圖在第一,但我不斷收到SQL92令牌不兼容錯誤 – Bytekoder

+0

可能是與你的語法或JDBC驅動程序不支持這種語法問題。 – nayakam

0

我已經在你的COSE WSJdbcConnection,這意味着你使用的是WebSphere注意到。如果確實如此,並且如果您確實需要使用Oracle特定的分支(OracleConnection等),我建議您應該查看WSCallHelper類,該分類由websphere提供,用於對這種情況進行「乾淨」管理。它提供了兩種主要方法,分別用於在本地類型上傳遞方法和傳遞本機類型的方法,分別爲jdbcCalljdbcPass

更多信息,請本文從IBM在:http://www-01.ibm.com/support/docview.wss?uid=swg21409335