大意導致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。