簡體   English   中英

插入並選擇Select Give sql-error(SQLCODE = -803,SQLSTATE = 23505)(db2 z / os)

[英]Insert with Select give sql-error (SQLCODE=-803, SQLSTATE=23505)(db2 z/os)

我嘗試將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注入)

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM