Вставить с помощью Select, чтобы дать sql-ошибку (SQLCODE=-803, SQLSTATE=23505)(дБ2 z/os)

Я пытаюсь вставить значения из моего приложения 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, в TABLE2 и два значения из TABLE1. Без импорта эти два значения в приложение. Что я делаю не так?

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);
         ....

Вам нужно будет указать имена столбцов в вашем запросе (выберите a, b, c из T, где 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
Другие вопросы по тегам