1. 程式人生 > >大意導致Java訪問DB2庫時匯出SQLCODE=-301, SQLSTATE=07006錯誤

大意導致Java訪問DB2庫時匯出SQLCODE=-301, SQLSTATE=07006錯誤

本人在寫一個java模組,目的是把資料插入到DB2庫中,由於自己在建模時不知何時將表中一個欄位由varchar修改成decimal,並且將此表重新建到開發庫中,為此導致以前寫好的功能模組報錯,本人很納悶,但又不知道什麼原因,雖然知道可能是自己造成的,但具體原因卻無論如何也想不起來,只能通過一個個可能的問題排查,最終找出是由於修改表的欄位型別所致,以下,是建表語句、JAVA程式碼、和丟擲的異常:


java程式碼:

            in = new FileInputStream(uploadedFile);
            pstm = con.prepareStatement("insert into TEST.YSB(XH,YSBNR,JGXH) values((select value(MAX(XH),0)+1 FROM ZJZX.ZJZX_SCYSB),?,?)",pstm.RETURN_GENERATED_KEYS);
            pstm.setBlob(1, getBlob(in));
       pstm.setNull(2, Types.VARCHAR);
            pstm.execute();

表結構如下:

create table TEST.YSB
(
   XH    DECIMAL(18)            not null      generated by default as identity,
   YSBNR BLOB(5242880),
   JGXH  DECIMAL(18),
);

以上軟體執行時,會丟擲如下異常:

com.ibm.db2.jcc.b.SqlException: DB2 SQL Error: SQLCODE=-301, SQLSTATE=07006, SQLERRMC=9, DRIVER=3.50.152
 at com.ibm.db2.jcc.b.wc.a(wc.java:55)
 at com.ibm.db2.jcc.b.wc.a(wc.java:126)
 at com.ibm.db2.jcc.b.tk.b(tk.java:1593)
 at com.ibm.db2.jcc.b.tk.c(tk.java:1576)
 at com.ibm.db2.jcc.t4.db.k(db.java:353)
 at com.ibm.db2.jcc.t4.db.a(db.java:59)
 at com.ibm.db2.jcc.t4.t.a(t.java:50)
 at com.ibm.db2.jcc.t4.tb.b(tb.java:200)
 at com.ibm.db2.jcc.b.uk.Gb(uk.java:2355)
 at com.ibm.db2.jcc.b.uk.e(uk.java:3129)
 at com.ibm.db2.jcc.b.uk.Bb(uk.java:1842)
 at com.ibm.db2.jcc.b.uk.execute(uk.java:1826)
 at com.pdcss.court.zjzx.servlet.UploadExcelServlet.saveZip(UploadExcelServlet.java:318)
 at com.pdcss.court.zjzx.servlet.UploadExcelServlet.saveYsb(UploadExcelServlet.java:294)
 at com.pdcss.court.zjzx.servlet.UploadExcelServlet.processRequest(UploadExcelServlet.java:94)
 at com.pdcss.court.zjzx.servlet.UploadExcelServlet.doPost(UploadExcelServlet.java:143)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
 at filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:124)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
 at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
 at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:174)
 at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
 at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
 at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
 at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:151)
 at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:834)
 at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:640)
 at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1286)
 at java.lang.Thread.run(Thread.java:619)

如果將上述java程式碼的第4行修改為

pstm.setNull(2, Types.DECIMAL);

就可以正確無誤了,當然解決辦法你也可以將表的欄位型別修改回varchar。