2017-06-23 2 views
1

Ich muss eine SQL Server gespeicherte Prozedur von Java aufrufen. Dies ist die gespeicherte Prozedur:Wie gespeicherte Prozedur mit mehreren Werten in Java aufrufen?

DECLARE @t_certificate v.vt_VidaDollarsCertificates 
INSERT INTO @t_certificate VALUES(1,710335,'FFRLODOLAR',363) 
INSERT INTO @t_certificate VALUES(1,710335,'FFRLODOLAR05',363) 
INSERT INTO @t_certificate VALUES(1,710335,'FFRLODOLAR06',363) 
EXEC v.vprdl_CertificateInsert @t_certificate 

Was ich tue, ist eine rohe Abfrage zu erstellen und dann mit einem PreparedStatement der Informationen hinzuzufügen.

Ich schaffe die rohe Abfrage wie folgt:

StringBuilder query = new StringBuilder(); 
query.append(
     "DECLARE @t_certificate v.vt_VidaDollarsCertificates;" 
     + "INSERT @t_certificate VALUES(?,?,?,?)"); 
for (int i = 0; i < arrCertificates.size() - 1; ++i) { 
    query.append(",(?,?,?,?) "); 
} 
query.append("; EXEC v.vprdl_CertificateInsert @t_certificate"); 

Dies ist die rohe Abfrage ist, die dann

DECLARE @t_certificate v.vt_VidaDollarsCertificates;INSERT @t_certificate VALUES(?,?,?,?),(?,?,?,?) ,(?,?,?,?) ; EXEC v.vprdl_CertificateInsert @t_certificate 

gebildet wird, schaffe ich das PreparedStatement.

PreparedStatement preparedStmt = con.prepareStatement(query.toString()); 
for (int i = 0; i < arrCertificates.size(); ++i) { 
    preparedStmt.setInt(1, arrCertificates.get(i).getCertificateTypeID()); 
    preparedStmt.setInt(2, arrCertificates.get(i).getContratoID()); 
    preparedStmt.setString(3, arrCertificates.get(i).getFolio()); 
    preparedStmt.setInt(4, Integer.parseInt(arrCertificates.get(i).getID())); 

} 

Danach verwende ich executeUpdate.

preparedStmt.executeUpdate(); 
ResultSet rs = preparedStmt.getGeneratedKeys(); 

Aber es funktioniert nicht, es löst eine Ausnahme

der Wert nicht für die Parameternummer

Antwort

2

Es Sie den falschen Index auf die prepapred Aussage scheint gesetzt wird, weil In allen Iterationen setzen Sie die gleichen Werte:

VALUES(?,?,?,?),(?,?,?,?) ,(?,?,?,?) 
     1 2 3 4 1 2 3 4 1 2 3 4 

es scheint s ist dies nicht korrekt ist, stattdessen können Sie:

int j = 1; 
for (int i = 0; i < arrCertificates.size(); ++i) { 
    preparedStmt.setInt(j++, arrCertificates.get(i).getCertificateTypeID()); 
    preparedStmt.setInt(j++, arrCertificates.get(i).getContratoID()); 
    preparedStmt.setString(j++, arrCertificates.get(i).getFolio()); 
    preparedStmt.setInt(j++, Integer.parseInt(arrCertificates.get(i).getID())); 
} 

für 3 Eingänge So sollte es gibt Ihnen:

VALUES(?, ?, ?, ?),(?, ?, ?, ?) ,(?, ?, ?, ?) 
     1 2 3 4 5 6 7 8 9 10 11 12 
+0

Danke, ich diesen Fehler sehen didn 't. – mavi

+1

Sie sind herzlich willkommen @ Mavi, können Sie es mit der neuen Möglichkeit machen, überprüfen Sie meine Bearbeitung –

+1

Großartig! Ich mag deine Lösung – mavi

Verwandte Themen