2013-03-08 314 views
7

嗨我所有使用弹簧简单JDBC模板来调用oracle程序下面是我的代码。SQL状态[99999];错误代码[17004];无效的列类型:1111 With Spring SimpleJdbcCall

过程

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 

Spring的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")); 

} 

当我打电话Map<String, Object> result = getAllSytemUsers.execute(in); 荫,提示以下例外

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

检查,如果这有助于http://www.coderanch.com/t/489862/Spring/Calling-Stored- Procedure-Spring-StoredProcedure。您是否尝试在sql提示符下调用过程?它有用吗? – Lakshmi 2013-03-08 11:15:38

+0

它在正常工作的过程中没有错误,错误可能在java端。 – Krushna 2013-03-08 11:45:59

回答

1

最后的数据的数据类型我使用下面的代码解决问题。这种类型的错误发生在In/Out参数与声明程序中和java代码declareParameters之间不匹配时。在这里我们需要定义甲骨文回报标签

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

为什么你不包括你如何解决它,而不是粘贴代码? – 2014-06-26 13:06:14

+0

请参阅编辑,由于IN/OUT参数不匹配而导致错误发生,如在过程和java代码中声明 – Krushna 2015-10-24 08:11:05

1

也许,你需要插入模式标识符这里:

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

像上面那样修改后出现同样的错误 – Krushna 2013-03-08 11:46:58

+0

@ KrushnaCh.Dash - 新的SqlParameter()参数是否正确? – 2013-03-08 12:05:18

+0

是的,加入SQL参数是可选的,因为我已经提到顶部的类型 – Krushna 2013-03-08 12:11:45

3

我认为这个问题是你逝去Caused by: java.sql.SQLException: Invalid column type: 1111检查你通过实际列数据类型的数据类型可以是可以有一些不匹配或一些违反约束与null

1

我有它返回一个CLOB和我看到上面的错误,当我忘了申报的返回值作为输出参数的函数。起初我:

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

的buildSqlParameters方法应该包括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! 
    }; 
} 
相关问题