在存储过程中设置INOUT参数时出现数据截断错误

时间:2016-10-25 16:59:03

标签: java stored-procedures jdbc db2 ibm-midrange

我正在调用具有INOUT参数的存储过程。数据库是AS400 DB2。类型是CHARACTER。注册和设置变量时,我收到数据截断错误。如果我将字符串直接设置为列,则没有问题。如果我在变量中设置相同的字符串并使用它来设置列,则会引发数据截断错误。能不能让我知道我出错的地方以及如何使用变量设置列的值而不会导致异常? 有关详细信息,请参阅错误堆栈跟踪的结尾。

try{
     String cstmt_str = "CALL " + storedProcName + "(?)";
     String status="REJ"; 
     cstmt = conn.prepareCall(cstmt_str);
     cstmt.registerOutParameter("5506STS", Types.CHAR);
     //cstmt.setString("5506STS","REJ"); does not give a problem
     cstmt.setString("5506STS",status); //Data truncation Exception occurs here.
     cstmt.execute();
     }catch (DataTruncation de) {
          logger.error("DatatruncationException error:", de );
            displayError(de);
            de.printStackTrace();           
     }

public static void displayError(DataTruncation dataTruncation) {
    logger.info("Data truncation error: ");
    logger.info("dataTruncation.getDataSize():"+dataTruncation.getDataSize() + " number of bytes of data that should have been transferred.");
    if (!dataTruncation.getRead()) 
       logger.info("dataTruncation.getRead() is False. Its Written (Error:). ");
   logger.info("dataTruncation.getTransferSize():"+dataTruncation.getTransferSize()
    + " number of bytes of data actually transferred.");
  }

Stored Procedure Signature:
Number Mode   Name     DataType  Length
1      INOUT  5506STS  CHARACTER 3

I tried to find out the length of the string status:

int len = status.getBytes().length; // Output: 5

我没有选择。请告诉我如何在变量" status"中成功设置值。进入" 5506STS"。

错误追踪:

DatatruncationException error:
java.sql.DataTruncation: Data truncation
    at com.ibm.as400.access.AS400JDBCPreparedStatement.testDataTruncation(AS400JDBCPreparedStatement.java:3450)
    at com.ibm.as400.access.AS400JDBCPreparedStatement.setValue(AS400JDBCPreparedStatement.java:3361)
    at com.ibm.as400.access.AS400JDBCPreparedStatement.setString(AS400JDBCPreparedStatement.java:2999)
    at com.ibm.as400.access.AS400JDBCCallableStatement.setString(AS400JDBCCallableStatement.java:3082)
    at org.jboss.jca.adapters.jdbc.WrappedCallableStatement.setString(WrappedCallableStatement.java:1563)
    at com.ssss.ssjtracdbws.dao.SSJTracDBWSDAO.submitNewRequestJSON(SSJTracDBWSDAO.java:699)
    at com.ssss.ssjtracdbws.webservices.SSJTracDBService.submitNewRequestJSON(SSJTracDBService.java:163)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:167)
    at org.jboss.resteasy.core.ResourceMethod.invokeOnTarget(ResourceMethod.java:269)
    at org.jboss.resteasy.core.ResourceMethod.invoke(ResourceMethod.java:227)
    at org.jboss.resteasy.core.ResourceMethod.invoke(ResourceMethod.java:216)
    at org.jboss.resteasy.core.SynchronousDispatcher.getResponse(SynchronousDispatcher.java:542)
    at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:524)
    at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:126)
    at org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:208)
    at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:55)
    at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:50)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:847)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:295)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:231)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:149)
    at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:169)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:145)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:97)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:559)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:102)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:340)
    at org.apache.coyote.http11.Http11NioProcessor.process(Http11NioProcessor.java:353)
    at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:911)
    at org.apache.tomcat.util.net.NioEndpoint$ChannelProcessor.run(NioEndpoint.java:920)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
 Data truncation error: 
 dataTruncation.getDataSize():5 number of bytes of data that should have been transferred.
 dataTruncation.getRead() is False. Its Written (Error:). 
 dataTruncation.getTransferSize(): 3 number of bytes of data actually transferred.

1 个答案:

答案 0 :(得分:0)

好吧,我自己发现了。 "状态"传递给函数的单引号围绕它。(' APP')这使得长度为5而不是3.现在我删除了单引号。它工作正常。