我尝试将java应用程序的值和table1的值插入到table2中。我得到以下错误(db2 z/os):
Exception in thread "main" com.ibm.db2.jcc.am.SqlIntegrityConstraintViolationException: DB2 SQL Error: SQLCODE=-803, SQLSTATE=23505, SQLERRMC=1;DB2T.TSOZ360_WV_AUSGANG, DRIVER=3.66.46
PreparedStatement _prep = con.prepareStatement("INSERT INTO DB2T.TABLE2 (column1, column2, column3 , column4, column5, column6) SELECT ?, ?, ?, ?, column5, column6 FROM DB2T.TABLE1 WHERE column1 = ? column2 = ? AND column3 = ?");
_prep.setString(1,"HELLO");
_prep.setString(2,"H");
_prep.setString(3,"1234567890");
_prep.setString(4,"Hsdfdsffdssdfsdfd");
_prep.setLong(5,9876543210l);
_prep.setInt(6,1);
_prep.setInt(7,12345678);
Table1:
column1, column2, column3 , column4, column5, column6
Table2
column1, column2, column3 , column4, column5, column6
因此,我希望将在java应用程序中生成的值插入到TABLE2中,以及从TABLE1中插入两个值。而不将这两个值导入应用程序。我做错什么了?
发布于 2016-09-22 11:15:33
您得到的sql异常表明,您试图将两个相同的值插入到一个接受唯一值的列中(是否多次使用相同的参数值?)。
但是,您的设计仍然很糟糕,因此我建议您将查询/语句拆分为select和insert (2个查询/语句,而不是仅1个)。这将使代码更易读,也更易于调试。第二,不应该使用列名作为参数(?)在PreparedStatement中( PreparedStatement意味着可重用,但是,如果列名被参数化,数据库就不能重用语句)。
这意味着做这样的事是不对的
String sql = "SELECT ?, ?, ?, ?, column5, column6 FROM DB2T.TABLE1 WHERE column1 = ? column2 = ?
_prep.setString(1, colName1);
_prep.setString(2, colName2);
....
您必须在查询中指定列名(从T中选择a,b,c,x=?)。如果需要动态获取它们,则可以使用字符串连接(如果不对用户输入进行清理,这可能会导致sql注入)。
String dynamicColNames = getColumnNames();//just some method to get the names as one string
String sql = "SELECT "+dynamicColNames + " FROM ....";//
//dynamicColNames may contain col1, col2, col3 etc
https://stackoverflow.com/questions/39637102
复制相似问题