如果有人经历过从指定模式,包和过程名称的spring数据调用oracle存储过程的话。 我有以下实体:
@Entity
@Table(name = "ENTITY", schema = "SCHEMA_ENTITY")
@NamedStoredProcedureQueries({
@NamedStoredProcedureQuery(name = "name1",
procedureName = "packageName.procName",
parameters = {
@StoredProcedureParameter(mode = ParameterMode.IN, name = "param1", type = String.class),
@StoredProcedureParameter(mode = ParameterMode.OUT, name = "return_value", type = BigDecimal.class)
})})
public class EntityExp {
@Id
private Long keyId;
...
}
存储库:
public interface EntityRepository extends JpaRepository<EntityExp, Long> {
@Procedure(name = "name1")
BigDecimal test(@Param("param1") String param1);
}
在服务实现中,自动装配后,我调用的过程如下:
BigDecimal returnVal = entityRepository.test(param1);
oracle存储过程定义是:
create or replace PACKAGE packageName as
function procName(param1 IN VARCHAR)
RETURN NUMBER;
END packageName;
create or replace PACKAGE BODY packageName
IS
function procName (param1 IN VARCHAR)
RETURN NUMBER
IS
BEGIN
return 1;
END;
END;
如果我使用PL / Sql调用它,程序可以正常工作..
我收到以下错误:
PLS-00201: identifier 'package.procName' must be declared
我还测试了许多配置,比如在过程中指定模式:
@Procedure(name = "SCHEMA_ENTITY.name1")
BigDecimal test(@Param("param1") String param1);
但仍然失败......
在调用存储过程时,我无法找到使用schema + package + procedureName的任何示例...
有什么建议吗?
答案 0 :(得分:0)
我不太确定完全了解您的问题,但我会尝试分享一些信息,因为我最近遇到了相关问题。
第一项与调用存储过程的方式有关。看起来Spring-data当前不支持返回的存储过程类型。有关详细信息link。但是,使用void
它可以正常工作。
我通过创建一个单独的Repository
解决了这个问题,我调用了通过entityManager
返回结果的过程。举例说明link。
第二项是关于模式名称。我相信当您解决第一项时,您可以使用this问题尝试解决它。简而言之,我在procedureName
注释属性名称中设置了模式名称。
@NamedStoredProcedureQuery(
name="procName",
procedureName="<schema_name>.proc_name"
)
@Entity
@Table
public class User {
...
}
希望它有所帮助。