Javaコードからストアドプロシージャを呼び出すコードから、次のエラーを受け取りました。
例外トレース{} org.springframework.jdbc.UncategorizedSQLException:CallableStatementCallback; SQLの未分類SQLException [{call test.usp_xxx_GetCompanyDetails(?、?、?、?、?、、?、、?、?、?、?、?)}]; SQL状態[null];エラーコード[0];パラメータ番号11には値が設定されていません。ネストされた例外はcom.Microsoft.sqlserver.jdbc.SQLServerExceptionです。値はパラメータ番号11に設定されていません。org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.Java:84)atorg.springframework.jdbc。 support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.Java:81)at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.Java:81)at org.springframework.jdbc.core.JdbcTemplate.execute(Jdbc org.springframework.jdbc.core.JdbcTemplate.call(JdbcTemplate.Java:1131)で
アプリケーションはWAS8.5.5にデプロイされ、jdbcドライバーバージョン4.2を使用します。サーバーを再起動すると、この問題は再発しませんでした。生成された次のcallステートメントは正しくないようです。 ?なしの連続したコンマがありますそれらの間の。
{test.usp_xxx_GetCompanyDetails(?、?、?、?、?、、?、、?、?、?、?、?)を呼び出す}
ストアドプロシージャには10個のパラメータがあります。ストアドプロシージャの定義は次のとおりです。
CREATE PROCEDURE [test].[usp_xxx_GetCompanyDetails]
(
@ANumber int,
@CompanyId int,
@UserRole varchar(15),
@RequestId varchar(100),
@CompanyCode varchar(5),
@BaseSystem varchar(5),
@PType varchar(20),
@PId varchar(40),
@IsActive bit,
@responseData xml OUT
)
以下は、ストアドプロシージャを呼び出すJavaコードです。これは、Springデータを使用して呼び出しを行います。
private String executeProc(Integer aNumber,Integer companyId, String baseSystem,
String role,String companyCode,String requestId, String pType,String pId,
boolean isActive ) throws SQLException {
SQLXML responseData=null;
Map<String,Object> inputParams= new HashMap<>();
inputParams.put("ANumber", aNumber);
inputParams.put("CompanyId", companyId);
inputParams.put("UserRole", role);
inputParams.put("RequestId", requestId);
inputParams.put("CompanyCode", companyCode);
inputParams.put("BaseSystem", baseSystem);
inputParams.put("PType", pType);
inputParams.put("PId", pId);
inputParams.put("IsActive", isActive);
inputParams.put("ResponseData", responseData);
Map<String, Object> result = this.execute(inputParams);
String responseXMLString = ((SQLXML) result.get("ResponseData")).getString();
return responseXMLString;
}
何がうまくいかなかったのか。
11個のバインディングパラメータ(?)と空のパラメータがあります, ,
。これを削除して、9つの入力パラメーターと1つの出力パラメーターを持つプロシージャーを操作します。
{call test.usp_xxx_GetCompanyDetails(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)}
Outパラメータを登録する必要があります。次のように試すことができます
cs.registerOutParameter("ResponseData", Java.sql.Types.VARCHAR);