【问题标题】:Insert with Select give sql-error (SQLCODE=-803, SQLSTATE=23505)(db2 z/os)Insert with Select 给出 sql-error (SQLCODE=-803, SQLSTATE=23505)(db2 z/os)
【发布时间】:2016-09-22 10:55:20
【问题描述】:

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

【问题讨论】:

    标签: java sql db2-zos


    【解决方案1】:

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

    但是,您的设计仍然很糟糕,因此我建议您将查询/语句拆分为一个选择和一个插入(2 个查询/语句,而不仅仅是 1 个)。这将使代码更具可读性并且更易于调试。 其次,您不应该在 PreparedStatement 中使用列名作为参数 (?)(PreparedStatement 意味着可重用,但是,如果列名被参数化,则数据库无法重用该语句)。

    这意味着这样做是错误的

              String sql = "SELECT ?, ?, ?, ?, column5, column6 FROM DB2T.TABLE1 WHERE column1 = ? column2 = ? 
    
             _prep.setString(1, colName1);
             _prep.setString(2, colName2);
             ....
    

    您必须在查询中指定列名(从 T where x=? 中选择 a、b、c)。如果需要动态获取它们,您可以使用字符串连接(如果您不清理用户输入等,这可能容易发生 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
    

    【讨论】:

      猜你喜欢
      • 2015-05-03
      • 2015-09-24
      • 2017-04-01
      • 2014-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-20
      • 1970-01-01
      相关资源
      最近更新 更多