通过Hibernate获取PL / SQL函数的返回值

时间:2009-07-01 12:44:21

标签: oracle hibernate plsql

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

FUNCTION copy_entity(id IN NUMBER)返回号码

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

的命名创建命名SQL查询

CALL copy_entity(:id)

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

SELECT copy_entity(:id)AS newEntityId

使用newEntityId作为列名称使用“return-scalar”,但是这也没有用,因为Oracle会抛出一个我无法在SELECT中调用INSERT(保存副本)的异常。

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

2 个答案:

答案 0 :(得分:1)

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

开始   :myresult = copy_entity(:id); 端;

现在你的结果是'列名'myresult。

我从未使用过hibernate,所以我希望它有效。我不知道Hibernate有多灵活。

答案 1 :(得分:1)

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

  

对于Oracle,以下规则适用:

     

函数必须返回结果集。   过程的第一个参数   必须是返回结果的OUT   组。这是通过使用a来完成的   Oracle 9或10中的SYS_REFCURSOR类型。   在Oracle中,您需要定义REF   CURSOR类型。请参阅Oracle文献   进一步的信息。

由于此函数接受一个数字并返回一个数字,因此您对Hibernate没有好处,并且可能最好不要创建一个简单的JDBC CallableStatement