java - 使用 Select 插入给出 sql 错误(SQLCODE=-803,SQLSTATE=23505)(db2 z/os)

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

最佳答案

您得到的 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 中选择 a、b、c,其中 x=?)。如果需要动态获取它们,您可以使用字符串连接(如果您不清理用户输入等,这可能容易导致 SQL 注入(inject))

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

关于java - 使用 Select 插入给出 sql 错误(SQLCODE=-803,SQLSTATE=23505)(db2 z/os),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39637102/

相关文章:

java - 如何使用 like 和 % 进行 Hibernate 查询?

mysql - 检查上一步状态是否完成并显示下一步是否完成

CICS 中的 Java - 类型 2 JDBC 连接给出错误 SQLCODE = -922,SQLSTATE = 42505,错误标记 = PLAN ACCESS;00F30034

db2 - 如何在 z/OS 中编写 DB2 命令脚本?

java - 在 Android 中将纪元时间转换为日期并将日期转换为纪元时间

java - 如何将所有子项及其值添加到 ListView (firebase 数据库)

java - 实例化新的数组双端队列以保持通用

java 。读取文件,按某列排序并打印

java - 运行复杂查询

sql - 如何使用 SQL 在 IBM DB2 Z/OS 中显示表的当前权限