【问题标题】:Correctly call a stored procedure using Spring Data JPA使用 Spring Data JPA 正确调用存储过程
【发布时间】:2017-07-20 19:04:15
【问题描述】:

我在尝试从 Spring 数据存储库调用存储过程时遇到了麻烦。遵循 Spring 数据文档和 SO 上的几个答案,这似乎是正确的方法,但我一直有这个错误:

PLS-00306: wrong number or types of arguments in call to 'GET_DESCR_BDD_BDS'

这是存储过程签名

procedure GET_DESCR_BDD_BDS(PRGPVV in number,
                                COD_SEZ in number,
                                FL_BDD_BDS in number,
                                prg_doc out varchar2,
                                repo_pos out number
                                )

这就是我实现调用的方式(我可能在不同的尝试中把事情搞砸了)
型号

@NamedStoredProcedureQuery(name = "DescrBddBds.descr", 
    procedureName = "PRK_BDD.GET_DESCR_BDD_BDS",
    parameters = {
        @StoredProcedureParameter(mode = ParameterMode.IN, name = "PRGPVV", type = Integer.class),
        @StoredProcedureParameter(mode = ParameterMode.IN, name = "COD_SEZ", type = Integer.class),
        @StoredProcedureParameter(mode = ParameterMode.IN, name = "FL_BDD_BDS", type = Integer.class)
        ,
        @StoredProcedureParameter(mode = ParameterMode.OUT, name = "prg_doc", type = String.class),
        @StoredProcedureParameter(mode = ParameterMode.OUT, name = "repo_pos", type = Integer.class)
    },
    resultClasses = DescrBddBds.class
)
@Entity
public class DescrBddBds implements Serializable {
    /**
     * 
     */
    private static final long serialVersionUID = -2182033603838684233L;
    @Id
    @Column(name = "prg_doc")
    private String prgDoc;
    @Column(name = "repo_pos")
    private Integer repoPos;

    public String getPrgDoc() {
        return prgDoc;
    }
    public void setPrgDoc(String prgDoc) {
        this.prgDoc = prgDoc;
    }
    public Integer getRepoPos() {
        return repoPos;
    }
    public void setPepoPos(Integer repoPos) {
        this.repoPos = repoPos;
    }

}

存储库

@Repository
public interface HtmlProceduresRepo extends CrudRepository<DescrBddBds, String> {

    @Procedure(name = "descr", procedureName="PRK_BDD.GET_DESCR_BDD_BDS")
    DescrBddBds descr(@Param("PRGPVV") Integer codiceDoc, @Param("COD_SEZ") Integer sezione, @Param("FL_BDD_BDS") Integer flagBddBds);
}

使用我从应用程序调用它的同一个用户从 SQL Developer 调用过程工作正常

var b number;
var d number;
var e number;
exec :b:= 1;
exec :d:= 2;
exec :e:= 3;
execute PRK_BDD.GET_DESCR_BDD_BDS(:b, :d, :e, :out_param1, :out_param2);
print out_param1;
print out_param2;

【问题讨论】:

  • 您能否检查您是否有权使用您在数据库中使用的用户运行此存储过程。
  • 是的,我有访问权限,我已经检查过了
  • 可执行访问?我多次遇到这个问题,这只是因为我正在使用的当前用户的访问权限。
  • 如果我使用 SQL Developer 调用存储过程,它工作得很好。如果是权限问题,我是否应该收到与我在问题中发布的错误不同的错误?
  • 因为数字参数是正确的,并且您正确设置了“IN”参数值,所以这可能只是因为权限问题。

标签: java oracle stored-procedures spring-data-jpa


【解决方案1】:

使用多个OUT 参数、see 更新解决方案。

@NamedStoredProcedureQueries({ //
        @NamedStoredProcedureQuery(name = "User.plus1", procedureName = "plus1inout",
                parameters = { @StoredProcedureParameter(mode = ParameterMode.IN, name = "arg", type = Integer.class),
                        @StoredProcedureParameter(mode = ParameterMode.OUT, name = "res", type = Integer.class) }), //
        @NamedStoredProcedureQuery(name = "User.plus1IO2", procedureName = "plus1inout2",
                parameters = { @StoredProcedureParameter(mode = ParameterMode.IN, name = "arg", type = Integer.class),
                        @StoredProcedureParameter(mode = ParameterMode.OUT, name = "res", type = Integer.class),
                        @StoredProcedureParameter(mode = ParameterMode.OUT, name = "res2", type = Integer.class) }), //
        @NamedStoredProcedureQuery(name = "User.plus1IOoptional", procedureName = "plus1inoutoptional",
                parameters = { @StoredProcedureParameter(mode = ParameterMode.IN, name = "arg", type = Integer.class),
                        @StoredProcedureParameter(mode = ParameterMode.OUT, name = "res", type = Integer.class),
                        @StoredProcedureParameter(mode = ParameterMode.OUT, name = "res2", type = Integer.class) }) // DATAJPA-1579
})

【讨论】:

    【解决方案2】:

    最后我发现 Spring Data JPA 目前不支持具有多个输出参数的存储过程。这是该项目的一个未解决问题,自 2 年前开放以来似乎没有任何进展

    https://github.com/spring-projects/spring-data-examples/issues/80

    https://jira.spring.io/browse/DATAJPA-707

    https://jira.spring.io/browse/DATAJPA-748

    编辑:看起来问题已在 2.2 RC1 版本中解决

    【讨论】:

    • 他们刚刚发布了一个关于这个问题的拉取请求
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-03
    • 2015-12-26
    • 2021-03-15
    • 1970-01-01
    • 1970-01-01
    • 2017-03-10
    • 2015-07-26
    相关资源
    最近更新 更多