Обновление PreparedStatement с кейсом

import java.sql.PreparedStatement;

myQuery = "UPDATE File SET BCN = ?, BLN = ?, BID = ?, 
                  DATE2 = (CASE WHEN parmDate <> 0 AND DATE2 = 0    
                                  THEN parmDate
                                  ELSE DATE2 END) 
          WHERE ERF = " + String.valueOf(erfNr).trim();
        
db2Stmt = db2Conn.prepareStatement(myQuery);

db2Stmt.setString(1, String.format("%017d", erfNr));
db2Stmt.setInt(2, f3BLin);
db2Stmt.setInt(3, entryBufferId);
db2Stmt.setInt(4, parmDate); // <== ???

db2Stmt.executeUpdate();

Я хочу обновить поле date2 в file.

Как я должен обращаться со структурой случая?

parmDate — это переданный параметр.

Я получил усечение данных с помощью db2Stmt.setInt(8, parmDate); В файле базы данных поле десятичное 8,0.

Почему усечение?

        String myQuery = "";
    int erfNr, f3BLin, entryBufferId, parmDate ;
    
    erfNr = 11183594;
    f3BLin = 9;
    entryBufferId = 999;
    parmDate  = 19700323;
            
    // Update-Statement
    try {
        
        myQuery = "UPDATE FILE SET t_BCN = ?, t_BLN = ?, t_BZO = ?, t_BID = ?, t_AND = ?, t_ANT = ?, t_AUS = ?, " +
                  "t_DATE2 = (CASE WHEN ? <> 0 AND t_DATE2 = 0 THEN ? ELSE t_DATE2 END)"    
                + " WHERE t_ERF = ? ";

        SimpleDateFormat sdfTime = new SimpleDateFormat("HHmmss");
        SimpleDateFormat sdfDate = new SimpleDateFormat("yyyyMMdd");
        int t_AnD = Integer.valueOf(sdfDate.format(new Date()));
        int t_AnT = Integer.valueOf(sdfTime.format(new Date()));

        db2Stmt = db2Conn.prepareStatement(myQuery);

        db2Stmt.setString(1, String.format("%017d", erfNr));
        db2Stmt.setInt(2, f3BLin);
        db2Stmt.setString(3, " ");
        db2Stmt.setInt(4, entryBufferId);
        db2Stmt.setInt(5, t_AnD);
        db2Stmt.setInt(6, t_AnT);
        db2Stmt.setString(7, as400CurrentUser.trim() + "§");
        db2Stmt.setInt(8, parmDate );  <== 
        db2Stmt.setInt(9, parmDate );
        db2Stmt.setInt(10, erfNr);
        db2Stmt.executeUpdate();
        // int resultCode = db2Stmt.executeUpdate();
    }

Исключение

java.sql.DataTruncation: Data truncation
at com.ibm.as400.access.AS400JDBCPreparedStatement.testDataTruncation(AS400JDBCPreparedStatement.java:3265)
at com.ibm.as400.access.AS400JDBCPreparedStatement.setValue(AS400JDBCPreparedStatement.java:3176)
at com.ibm.as400.access.AS400JDBCPreparedStatement.setInt(AS400JDBCPreparedStatement.java:2507)
at com.hji.service.DamageService.TestUpdateFAHRZPP(DamageService.java:3359)
at com.hji.controller.DamageController.checkRestApiTest(DamageController.java:1244)

Эта часть работает:

"t_DATE2 = (CASE WHEN " + String.valueOf(parmDate) + " <> 0 AND t_DATE2 = 0 THEN "+ String.valueOf(parmDate) +" ELSE t_DATE2 END)"  

person Kay    schedule 15.07.2020    source источник
comment
Как я должен обращаться со структурой случая? что ты имеешь в виду?   -  person Federico klez Culloca    schedule 15.07.2020
comment
Я не очень силен в необработанных SQL-запросах, однако этот запрос открыт для инъекции. Этот последний ERF = ... должен быть таким же параметром, как и другие.   -  person Jason    schedule 15.07.2020
comment
используйте THEN ?, как и с другими заполнителями. Вы также должны использовать заполнитель для своего параметра where (как сказал @Json): WHERE ERF = ?   -  person Felix    schedule 15.07.2020
comment
Должно быть WHERE ERF = ?... и добавьте этот параметр,   -  person The Impaler    schedule 15.07.2020
comment
Это многострочная строка? Как это работает?   -  person The Impaler    schedule 15.07.2020
comment
Что такое сверхданный параметр?   -  person The Impaler    schedule 15.07.2020
comment
@TheImpaler, скорее всего, дословный перевод немецкого слова übergeben.   -  person Felix    schedule 15.07.2020


Ответы (1)


Если вам действительно нужно условие, как оно есть прямо сейчас, вам нужно установить параметр дважды:

import java.sql.PreparedStatement;

myQuery = "UPDATE File SET BCN = ?, BLN = ?, BID = ?,"
    + " DATE2 = (CASE WHEN ? <> 0 AND DATE2 = 0 THEN ? ELSE DATE2 END)"
    + " WHERE ERF = ?";
        
db2Stmt = db2Conn.prepareStatement(myQuery);

db2Stmt.setString(1, String.format("%017d", erfNr));
db2Stmt.setInt(2, f3BLin);
db2Stmt.setInt(3, entryBufferId);
db2Stmt.setInt(4, parmDate);
db2Stmt.setInt(5, parmDate);
db2Stmt.setInt(6, erfNr);

db2Stmt.executeUpdate();

Если вы можете сократить свое условие до простого if DATE2 = 0, вы можете переписать свой код следующим образом:

import java.sql.PreparedStatement;

myQuery = "UPDATE File SET BCN = ?, BLN = ?, BID = ?, DATE2 = IF(DATE2 = 0, ?, DATE2) WHERE ERF = ?";
        
db2Stmt = db2Conn.prepareStatement(myQuery);

db2Stmt.setString(1, String.format("%017d", erfNr));
db2Stmt.setInt(2, f3BLin);
db2Stmt.setInt(3, entryBufferId);
db2Stmt.setInt(4, parmDate);
db2Stmt.setInt(5, erfNr);

db2Stmt.executeUpdate();

Также см:

person Felix    schedule 15.07.2020
comment
Большое спасибо, это то, что я ищу. Я никогда раньше не видел IF(DATE2 = 0, ?, DATE2) - person Kay; 15.07.2020