2016-10-06 7 views
1

のために定義されていませんでした。私は間違いがない。私は次のエラーを取得する手順エラー:私は、このストアドプロシージャを呼び出すときに、パラメータアウトは、ストアドプロシージャ

procedure [dbo].[pTest] 
    @ReportData varbinary(max) out 
    ,@Date varchar(max) =null 
as 
begin 
select * from test 
end 

に別のパラメータを追加するときしかし:私は@Dateパラメータを削除し、それに応じてコードを変更した場合

2016-10-06 15:50:16.283 DEBUG 32604 --- [   main] c.m.s.jdbc.internals.SQLServerException : *** SQLException:SQLServerCallableStatement:9 com.microsoft.sqlserver.jdbc.SQLServerException: Parameter out was not defined for stored procedure pTest. Parameter out was not defined for stored procedure pTest. 
2016-10-06 15:50:16.289 DEBUG 32604 --- [   main] o.h.engine.jdbc.spi.SqlExceptionHelper : Error preparing CallableStatement [pTest] 

com.microsoft.sqlserver.jdbc.SQLServerException: Parameter out was not defined for stored procedure pTest. 
    at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:191) ~[sqljdbc-4.2.jar:na] 

、私はエラーを取得していません。 @Dateパラメータを2つのパラメータに追加すると、エラーが再び表示されます。どうして?問題を発見

@RunWith(SpringRunner.class) 
@SpringBootTest 
@Transactional(transactionManager="transactionManager") 
public class TestRepositoryTest { 

    @Autowired 
    private TestRepository testRepository; 

    @Test 
    public void testGet() throws SQLException { 

     byte[] blob = testRepository.get("hi"); 
     //error occurs 
    } 

} 
+0

私はのjTDSを使用している場合は、私がエラー 'プロシージャまたは関数 'PTESTが' パラメータ期待し得る '@ReportData'、Iをsupplied.'なかったので、これを変更しますSQL Server 2005を使用していますが、SQL Server 2008でも同じ動作をしているようです。 – James

+0

パラメータの順序をインポートすることができます。パラメータの順序を狂わせて試してみましたので、 '@NamedStoredProcedureQuery '定義、またはストアドプロシージャDDLの' OUT'秒? –

+0

'@ NamedStoredProcedureQuery'で' OUT'が最初になるように順番を変更しました。私はまだ同じエラーが表示されます。私はこの問題の解決策を見つけ出しました。私はそれを投稿しますが、OPのコードがうまくいかない理由を理解することは素晴らしいことです。 – James

答えて

1

:)の属性名を次のように

2つのparamsのためのコードは次のとおりです。

@Entity 
@NamedStoredProcedureQuery(name = "Test.getTest", procedureName = "pTest", parameters = { 
     @StoredProcedureParameter(mode = ParameterMode.IN, name = "Date", type = String.class), 
     @StoredProcedureParameter(mode = ParameterMode.OUT, name = "ReportData", type = byte[].class) 
      }) 
public class Test { 

    // serves no purpose other than to meet 
    // JPA requirement 
    @Id 
    private byte[] reportData; 
} 

春データリポジトリ:

public interface TestRepository extends Repository<Test, Long> { 
    @Procedure("pTest") 
    byte[] get(@Param("Date") String date); 
} 

テストコード@NamedStoredProcedureQueryはリポジトリメソッド名と一致する必要があります。これに

@Entity 
@NamedStoredProcedureQuery(name = "Test.getTest", procedureName = "pTest", parameters = { 
     @StoredProcedureParameter(mode = ParameterMode.IN, name = "Date", type = String.class), 
     @StoredProcedureParameter(mode = ParameterMode.OUT, name = "ReportData", type = byte[].class) 
      }) 

@Entity 
@NamedStoredProcedureQuery(name = "Test.get", procedureName = "pTest", parameters = { 
     @StoredProcedureParameter(mode = ParameterMode.IN, name = "Date", type = String.class), 
     @StoredProcedureParameter(mode = ParameterMode.OUT, name = "ReportData", type = byte[].class) 
      }) 
関連する問題