web-dev-qa-db-ja.com

JDBC SQL Server:パラメータ番号に値が設定されていません

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

何がうまくいかなかったのか。

13
pawinder gupta

11個のバインディングパラメータ(?)と空のパラメータがあります, ,。これを削除して、9つの入力パラメーターと1つの出力パラメーターを持つプロシージャーを操作します。

{call test.usp_xxx_GetCompanyDetails(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)}
7
user7294900

Outパラメータを登録する必要があります。次のように試すことができます

cs.registerOutParameter("ResponseData", Java.sql.Types.VARCHAR);
4
Sathish