Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用selectgivesql错误插入(SQLCODE=-803,SQLSTATE=23505)(DB2z/os)_Java_Sql_Db2 Zos - Fatal编程技术网

Java 使用selectgivesql错误插入(SQLCODE=-803,SQLSTATE=23505)(DB2z/os)

Java 使用selectgivesql错误插入(SQLCODE=-803,SQLSTATE=23505)(DB2z/os),java,sql,db2-zos,Java,Sql,Db2 Zos,我尝试将java应用程序中的值和表1中的值插入表2中。我得到以下错误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 _pr

我尝试将java应用程序中的值和表1中的值插入表2中。我得到以下错误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应用程序中生成的值插入到表2中,并从表1中插入两个值。无需将这两个值导入应用程序。我做错了什么?

您遇到的sql异常表明您试图在接受唯一值的列中插入两个相同的值。您是否多次将此插入与相同的参数值一起使用

但是,您的设计仍然很糟糕,因此我建议您将查询/语句拆分为select和insert两个查询/语句,而不仅仅是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