插入时选择给出sql-error(SQLCODE = -803,SQLSTATE = 23505)(db2 z / os)

时间:2016-09-22 10:55:21

标签: java sql db2-zos

我尝试将我的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中的两个值。没有将这两个值导入应用程序。我做错了什么?

1 个答案:

答案 0 :(得分:2)

您获得的sql异常表明您尝试将2个相同的值插入到接受唯一值的列中(您是否多次使用具有相同参数值的插入?)。

但是,您的设计仍然很糟糕,所以我建议您将查询/语句拆分为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