【问题标题】:JPA Stored Procedure throwing exception: could not extract ResultSetJPA 存储过程抛出异常:无法提取 ResultSet
【发布时间】:2022-01-23 04:04:32
【问题描述】:

我正在尝试从 azure sql 调用一个基本存储过程,它只返回数字 1,看起来像这样

CREATE PROCEDURE [dbo].[testProc]
@TableName varchar(100)
AS
BEGIN 
SET NOCOUNT ON
SELECT 1
END

我有一个 Spring Boot 应用程序尝试使用 @Query 注释调用存储过程

@Repository
@Transactional
public interface TestDAO extends JpaRepository<TestEntity, Long> {

     @Query(value = "CALL testProc(:TableName)", nativeQuery = true)
     Long invokeTestProc(@Param("TableName") String TableName);

}

但是,我得到一个例外,上面写着 “'@P0' 附近的语法不正确” 和 SQLGrammarException:无法提取 ResultSet。

我不知道如何解决这个问题,我尝试将 @Procedure 与 @NamedStoredProcedureQueries 注释一起使用,但它引发了另一个异常,提示“无法将位置参数与命名参数注册混合;”

【问题讨论】:

    标签: java sql spring-boot jpa stored-procedures


    【解决方案1】:

    根据 Azure Sql 的documentation,您必须使用以下内容调用存储过程

    执行 HumanResources.uspGetEmployeesTest2 N'Ackerman', N'Pilar';
    -- 或者
    EXEC HumanResources.uspGetEmployeesTest2 @LastName = N'Ackerman', @FirstName = N'Pilar';

    所以在你的情况下,这将被翻译为

     @Query(value = "EXECUTE testProc :TableName", nativeQuery = true)
     Long invokeTestProc(@Param("TableName") String TableName);
    

     @Query(value = "EXEC testProc @TableName = :TableName", nativeQuery = true)
     Long invokeTestProc(@Param("TableName") String TableName);
    

    所以考虑到您使用本机查询,

    异常提示“'@P0' 附近的语法不正确”和 SQLGrammarException: 无法提取 ResultSet。

    指不使用execute或exec的错误使用sql语法,并且还以Azure SQL不期望的方式传递参数。

    【讨论】:

    • 是的,就是这样。谢谢!!!!
    猜你喜欢
    • 2014-07-20
    • 2015-05-27
    • 2020-09-08
    • 2010-12-21
    • 2012-02-26
    • 2023-03-05
    • 2014-01-17
    • 2013-03-28
    相关资源
    最近更新 更多