2017-06-23 10 views
1

JavaからSQL Serverストアドプロシージャを呼び出す必要があります。これはストアドプロシージャです:複数の値を持つストアドプロシージャをJavaで呼び出す方法

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 

私が行うのは、生のクエリを作成し、PreparedStatementを使用して情報を追加することです。

私はこのような生のクエリを作成:

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

これは、その後、私はPreparedStatementを作成

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

が形成されている生のクエリです。

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

} 

その後、私はexecuteUpdateを使用します。

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

しかし、それは動作していない、それは例外

をスロー値がパラメータ番号

答えて

2

のために設定されていないことがあるためprepapredステートメントに間違ったインデックスを設定しているようですすべての繰り返しで同じ値を設定します:

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

Sこれは正しくない、代わりにあなたが使用することができます。

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())); 
} 

だから、3つの入力のために、それはあなたに与えられるべきである。

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

おかげで、私はそのエラーを参照してくださいdidn'tの。 – mavi

+1

あなたは大歓迎です@ mavi、あなたは新しい方法でそれを作ることができます、私の編集を確認してください –

+1

素晴らしい!私はあなたのソリューションが好きです – mavi