【问题标题】:Getting the return value of a PL/SQL function via Hibernate通过 Hibernate 获取 PL/SQL 函数的返回值
【发布时间】:2009-07-01 12:44:21
【问题描述】:

我在 Oracle 数据库中有一个无法更改的 PL/SQL 函数。此函数接受一个标识实体的参数,创建该实体的副本,然后返回副本的 ID。这看起来像

FUNCTION copy_entity(id IN NUMBER) 返回号码

我需要从 Hibernate 调用这个函数。我尝试使用类似于

的内容创建命名 SQL 查询

调用copy_entity(:id)

作为查询,但从中我似乎无法获得函数的返回值。 Hibernate 的“返回标量”和类似选项需要返回列名,而我没有列名。这导致我

选择 copy_entity(:id) AS newEntityId

使用 newEntityId 作为列名的“return-scalar”,但这也不起作用,因为 Oracle 随后会引发我无法在 SELECT 中调用 INSERT(以保存副本)的异常。

有没有什么办法可以得到这样一个PL/SQL函数的返回值呢?该函数实际上要复杂得多,并且在应用程序的其他部分仍然需要,因此重新编写它并不是一个真正的选择。

【问题讨论】:

  • 不会“从 DUAL 中选择 copy_entity(id) 作为 rtnID”吗?
  • 否,这会导致 ORA-14551 异常,因为不允许从 SELECT 插入或更新。

标签: oracle hibernate plsql


【解决方案1】:

我希望/认为您可以使用匿名 PL/SQL 块:

开始 :myresult = copy_entity(:id); 结束;

现在你有了'列名' myresult 和结果。

我从来没有使用过休眠,所以我希望它能工作。我不知道 Hibernate 有多灵活。

【讨论】:

  • 我认为你在正确的轨道上。在纯 JDBC 中,您将有一个带有 ? 的可调用语句的 out 参数。保存返回的值。 Hibernate 应该允许类似的东西。
【解决方案2】:

我认为您无法使用直接的 JDBC。 Hibernate 文档在 Oracle 的限制部分中有这个:

对于 Oracle,适用以下规则:

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

由于此函数接受一个数字并返回一个数字,因此您在使用 Hibernate 时运气不佳,最好创建一个简单的 JDBC CallableStatement

【讨论】:

    猜你喜欢
    • 2013-05-06
    • 2013-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-02
    • 2014-06-20
    • 1970-01-01
    相关资源
    最近更新 更多