【问题标题】:Error with calling stored proc in Hibernate在 Hibernate 中调用存储过程时出错
【发布时间】:2015-09-02 19:13:01
【问题描述】:

我遇到了一个问题,我尝试使用 Hibernate 调用 Oracle 存储过程,如下面的 sn-ps 所示。

我的 DAO 课程:

Query q = session.createSQLQuery(" {call PKG.PROC_GET_DATA_SET(?, :parameter1, :parameter2) }")
            .setParameter(0, OracleTypes.CURSOR)
            .setParameter("parameter1", "fDate")
            .setParameter("parameter2", "tDate");
resultSet = q.list();

程序:

CREATE OR REPLACE PACKAGE BODY schema.PKG
AS
PROCEDURE PROC_GET_DATA_SET(
   P_CURSOR    OUT    SYS_REFCURSOR,
   P_STRING1   IN     VARCHAR2,
   P_STRING2   IN     VARCHAR2
)
AS
BEGIN
 OPEN P_CURSOR FOR
    .
    .
    .

但是当我在 DAO 类中调用 proc 时,出现如下错误。

错误:

PLS-00306: wrong number or types of arguments in call to 'PROC_GET_DATA_SET'
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored

努力找出原因。有人可以在这里发光吗?

TIA,

【问题讨论】:

  • setParameter 这是用于 IN、OUT 还是 IN OUT 参数?为什么不给所有的参数命名呢?
  • 对于OUT,你应该使用registerOutParameter的唯一参数。
  • '?'用于 ref 游标,这是我的 OUT 参数,其余的都是用值给出的 IN 参数。
  • 抱歉,不知道。我可以将registerOutParametercreateSQLQuery 一起使用吗? @ibre5041
  • 我不确定。我只知道您遇到的错误通常是由 IN 和 OUT 参数之间的不匹配引起的。同时按位置(顺序)和名称绑定参数也不是好的做法。

标签: java oracle hibernate stored-procedures


【解决方案1】:

您不能使用此代码来调用使用休眠的过程。见docs

推荐的调用形式是标准的SQL92:{? = 打电话 函数名() } 或 { ? = 打电话 procedureName(}。不支持本机调用语法。

对于 Oracle,适用以下规则:

函数必须返回结果集。 a的第一个参数 过程必须是返回结果集的 OUT。这是由 在 Oracle 9 或 10 中使用 SYS_REFCURSOR 类型。在 Oracle 中,您需要 定义一个 REF CURSOR 类型。请参阅 Oracle 文献了解更多信息 信息。

我建议试试这个:

{? = call PKG.PROC_GET_DATA_SET(?, ?) }

如果这不起作用,请使用session.connection()

【讨论】:

    猜你喜欢
    • 2012-05-18
    • 2011-04-10
    • 2013-12-18
    • 1970-01-01
    • 2014-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多