2013-03-08 26 views
7

Ciao a tutti Sto usando il modello semplice JDBC di primavera per chiamare la procedura di Oracle il seguente è il mio codice.Stato SQL [99999]; codice di errore [17004]; Tipo di colonna non valido: 1111 con Spring SimpleJdbcCall

La procedura

classe
create or replace 
PROCEDURE get_all_system_users(
pi_client_code IN VARCHAR2, 
po_system_users OUT T_SYSTEM_USER_TAB, 
po_error_code  OUT NUMBER, 
po_error_description OUT VARCHAR2) 
IS 
ctr NUMBER; 
sysUser SYSTEM_USER_OBJ; 
BEGIN 
ctr:=0; 
po_system_users:= t_system_user_tab(); 
end 

La primavera Dao

public class ManualSaleStoredProcedureDao { 

private SimpleJdbcCall getAllSytemUsers; 

public List<SystemUser> getAllSytemUsers(String clientCode) { 

    MapSqlParameterSource in = new MapSqlParameterSource(); 
    in.addValue("pi_client_code", clientCode); 
    in.addValue("po_system_users", null, 
      OracleTypes.ARRAY, "T_SYSTEM_USER_TAB"); 

    Map<String, Object> result = getAllSytemUsers.execute(in); 

    return null; 

} 

public void setDataSource(DataSource dataSource) { 

    getAllSytemUsers = new SimpleJdbcCall(dataSource) 
      .withSchemaName("SChemaName") 
      .withProcedureName("get_all_system_users") 

      .declareParameters(

        new SqlParameter(
          "pi_client_code", 
          OracleTypes.VARCHAR, 
          "pi_client_code")); 

} 

Quando mi chiamo Map<String, Object> result = getAllSytemUsers.execute(in); Iam ottenere l'eccezione di seguito

org.springframework.jdbc.UncategorizedSQLException: CallableStatementCallback; uncategorized SQLException for SQL [{call VSC.GET_ALL_SYSTEM_USERS(?, ?, ?, ?)}]; SQL state [99999]; error code [17004]; Invalid column type: 1111; nested exception is java.sql.SQLException: Invalid column type: 1111 
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:83) 
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80) 
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80) 
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:1030) 
at org.springframework.jdbc.core.JdbcTemplate.call(JdbcTemplate.java:1064) 
at org.springframework.jdbc.core.simple.AbstractJdbcCall.executeCallInternal(AbstractJdbcCall.java:388) 
at org.springframework.jdbc.core.simple.AbstractJdbcCall.doExecute(AbstractJdbcCall.java:351) 
at org.springframework.jdbc.core.simple.SimpleJdbcCall.execute(SimpleJdbcCall.java:181) 
at com.budco.vsc.dao.ManualSaleStoredProcedureDao.getAllSytemUsers(ManualSaleStoredProcedureDao.java:30) 
at com.budco.vsc.dao.ManualSaleStoredProcedureDaoITest.getCustomerNotes(ManualSaleStoredProcedureDaoITest.java:64) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:601) 
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44) 
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) 
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41) 
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) 
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28) 
at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74) 
at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:83) 
at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72) 
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:231) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49) 
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193) 
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52) 
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191) 
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42) 
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184) 
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) 
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71) 
at org.junit.runners.ParentRunner.run(ParentRunner.java:236) 
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:174) 
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) 
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 
    Caused by: java.sql.SQLException: Invalid column type: 1111 
at oracle.jdbc.driver.OracleStatement.getInternalType(OracleStatement.java:3950) 
at oracle.jdbc.driver.OracleCallableStatement.registerOutParameterInternal(OracleCallableStatement.java:135) 
at oracle.jdbc.driver.OracleCallableStatement.registerOutParameter(OracleCallableStatement.java:304) 
at oracle.jdbc.driver.OracleCallableStatement.registerOutParameter(OracleCallableStatement.java:393) 
at oracle.jdbc.driver.OracleCallableStatementWrapper.registerOutParameter(OracleCallableStatementWrapper.java:1569) 
at org.apache.commons.dbcp.DelegatingCallableStatement.registerOutParameter(DelegatingCallableStatement.java:95) 
at org.apache.commons.dbcp.DelegatingCallableStatement.registerOutParameter(DelegatingCallableStatement.java:95) 
at org.springframework.jdbc.core.CallableStatementCreatorFactory$CallableStatementCreatorImpl.createCallableStatement(CallableStatementCreatorFactory.java:198) 
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:1008) 
... 35 more 
+1

controllo se questo aiuta http://www.coderanch.com/t/489862/Spring/Calling-Stored- Procedura-Spring-StoredProcedure. Hai provato a chiamare la procedura in SQL prompt? Ha funzionato ? – Lakshmi

+0

Non c'è nessun errore nella procedura che funziona correttamente, l'errore potrebbe essere nel lato java. – Krushna

risposta

1

Finalmente ho risolvere i problemi utilizzando il codice sottostante. Questo tipo di errore si verifica quando c'è una discrepanza tra il parametro In/Out come dichiarato nella procedura e nel codice java declareParameters. Qui abbiamo bisogno di Oracle definito scheda di ritorno

public class ManualSaleStoredProcedureDao { 

private SimpleJdbcCall getAllSytemUsers; 

public List<SystemUser> getAllSytemUsers(String clientCode) { 

    MapSqlParameterSource in = new MapSqlParameterSource(); 
    in.addValue("pi_client_code", clientCode); 
    Map<String, Object> result = getAllSytemUsers.execute(in); 
    @SuppressWarnings("unchecked") 
    List<SystemUser> systemUsers = (List<SystemUser>) result 
      .get(VSCConstants.GET_SYSTEM_USER_OUT_PARAM1); 
    return systemUsers; 

} 

public void setDataSource(DataSource dataSource) { 

    getAllSytemUsers = new SimpleJdbcCall(dataSource) 
      .withSchemaName(VSCConstants.SCHEMA) 
      .withProcedureName(VSCConstants.GET_SYSTEM_USER_PROC_NAME) 
      .declareParameters(
        new SqlParameter(
          "pi_client_code", 
          OracleTypes.NUMBER, 
          "pi_client_code"), 
        new SqlInOutParameter(
          "po_system_users", 
          OracleTypes.ARRAY, 
          "T_SYSTEM_USER_TAB", 
          new OracleSystemUser())); 

} 
+6

Perché non includi come lo hai risolto invece di incollare il codice? –

+0

Si prega di vedere le modifiche, L'errore si verificherà a causa della mancata corrispondenza del parametro IN/OUT come dichiarazione nella procedura e nel codice java – Krushna

1

Probabilmente, è necessario inserire identificativo dello schema qui:

in.addValue("po_system_users", null, OracleTypes.ARRAY, "your_schema.T_SYSTEM_USER_TAB"); 
+0

Stesso errore dopo la modifica come sopra – Krushna

+0

@ KrushnaCh.Dash - I parametri per 'new SqlParameter()' sono corretti? –

+0

Sì, l'aggiunta del parametro SQL è facoltativa poiché ho menzionato il tipo nella parte superiore – Krushna

3

Credo che il problema è con il tipo di dati dei dati si sta passando Caused by: java.sql.SQLException: Invalid column type: 1111 controllo i tipi di dati si passa con i tipi di dati delle colonne reale potrebbe essere non ci può essere qualche disallineamento o qualche violazione del vincolo con null

1

Ho una funzione che restituisce un CLOB e stavo vedendo l'errore precedente quando avevo dimenticato di dichiarare il valore di ritorno come parametro di output. Inizialmente ho avuto:

protected SimpleJdbcCall buildJdbcCall(JdbcTemplate jdbcTemplate) 
{ 
    SimpleJdbcCall call = new SimpleJdbcCall(jdbcTemplate) 
     .withSchemaName(schema) 
     .withCatalogName(catalog) 
     .withFunctionName(functionName) 
     .withReturnValue()   
     .declareParameters(buildSqlParameters()); 

    return call; 
} 

public SqlParameter[] buildSqlParameters() { 
    return new SqlParameter[]{ 
     new SqlParameter("p_names", Types.VARCHAR), 
     new SqlParameter("p_format", Types.VARCHAR), 
     new SqlParameter("p_units", Types.VARCHAR), 
     new SqlParameter("p_datums", Types.VARCHAR), 
     new SqlParameter("p_start", Types.VARCHAR), 
     new SqlParameter("p_end", Types.VARCHAR), 
     new SqlParameter("p_timezone", Types.VARCHAR), 
     new SqlParameter("p_office_id", Types.VARCHAR), 
     }; 
} 

Il metodo buildSqlParameters dovrebbe hanno incluso la SqlOutParameter:

public SqlParameter[] buildSqlParameters() { 
    return new SqlParameter[]{ 
     new SqlParameter("p_names", Types.VARCHAR), 
     new SqlParameter("p_format", Types.VARCHAR), 
     new SqlParameter("p_units", Types.VARCHAR), 
     new SqlParameter("p_datums", Types.VARCHAR), 
     new SqlParameter("p_start", Types.VARCHAR), 
     new SqlParameter("p_end", Types.VARCHAR), 
     new SqlParameter("p_timezone", Types.VARCHAR), 
     new SqlParameter("p_office_id", Types.VARCHAR), 
     new SqlOutParameter("l_clob", Types.CLOB) // <-- This was missing! 
    }; 
} 
Problemi correlati