如何通过休眠访问 pl/sql proc 中的 out 参数
Posted
技术标签:
【中文标题】如何通过休眠访问 pl/sql proc 中的 out 参数【英文标题】:How do i access an out parameter in a pl/sql proc via hibernate 【发布时间】:2010-09-10 16:35:05 【问题描述】:我有一个带有以下签名的 pl/sql 过程
PROCEDURE pr_log_process_started (
p_process_id IN log_process_status.process_id%TYPE,
p_run_id IN OUT log_process_status.run_id%TYPE);
如何通过 Hibernate 调用此 proc 并在调用后访问第二个参数的值?
【问题讨论】:
【参考方案1】:如何通过 Hibernate 调用此 proc 并在调用后访问第二个参数的值?
我不认为你可以。至少,这不是我对官方文档的Chapter 16. Native SQL的理解:
16.2.2。使用存储过程进行查询
Hibernate3 支持 通过存储过程查询和 职能。以下大部分 两者的文档是等效的。 存储过程/函数必须 返回一个结果集作为第一个 能够使用的输出参数 休眠。这种存储的一个例子 Oracle 9 及更高版本中的功能为 如下:
CREATE OR REPLACE FUNCTION selectAllEmployments RETURN SYS_REFCURSOR AS st_cursor SYS_REFCURSOR; BEGIN OPEN st_cursor FOR SELECT EMPLOYEE, EMPLOYER, STARTDATE, ENDDATE, REGIONCODE, EID, VALUE, CURRENCY FROM EMPLOYMENT; RETURN st_cursor; END;
要在 Hibernate 中使用此查询,您 需要通过命名查询对其进行映射。
<sql-query name="selectAllEmployees_SP" callable="true"> <return alias="emp" class="Employment"> <return-property name="employee" column="EMPLOYEE"/> <return-property name="employer" column="EMPLOYER"/> <return-property name="startDate" column="STARTDATE"/> <return-property name="endDate" column="ENDDATE"/> <return-property name="regionCode" column="REGIONCODE"/> <return-property name="id" column="EID"/> <return-property name="salary"> <return-column name="VALUE"/> <return-column name="CURRENCY"/> </return-property> </return> ? = call selectAllEmployments() </sql-query>
目前只有存储过程 返回标量和实体。
<return-join>
和 不支持<load-collection>
。16.2.2.1。使用存储过程的规则/限制
您不能将存储过程与 休眠,除非你遵循一些 程序/功能规则。如果他们这样做 不遵守那些他们不遵守的规则 可用于休眠。如果你还 想要使用你拥有的这些程序 通过执行它们
session.connection()
。规则是 每个数据库都不同,因为 数据库供应商有不同的存储 过程语义/语法。存储过程查询不能 与
setFirstResult()
/setMaxResults()
.推荐的调用形式是标准的 SQL92:
? = call functionName(<parameters>)
或? = call procedureName(<parameters>
。不支持本机调用语法。对于 Oracle,适用以下规则:
函数必须返回结果集。过程的第一个参数 必须是返回结果的 OUT 放。这是通过使用 Oracle 9 或 10 中的 SYS_REFCURSOR 类型。 在 Oracle 中,您需要定义一个 REF 光标类型。请参阅 Oracle 文献 更多信息。对于 Sybase 或 MS SQL 服务器 以下规则适用:
过程必须返回结果集。请注意,由于这些服务器可以 返回多个结果集并更新 计数,Hibernate 将迭代 结果并取第一个结果 是一个结果集作为它的返回值。 其他所有内容都将被丢弃。
如果您可以在您的程序中启用 SET NOCOUNT ON,它可能是 效率更高,但这不是 要求。
综上所述,要么遵循规则,要么通过session.connection()
使用原始 JDBC。
【讨论】:
认为你是对的,最后我们提供了 proc 的一个版本作为一个函数并调用一个 select from dual。不是最干净的,但它可以工作并将配置保存在正确的位置。以上是关于如何通过休眠访问 pl/sql proc 中的 out 参数的主要内容,如果未能解决你的问题,请参考以下文章
C2内核模块,分配设备号,字符驱动,/设备节点,设备读写,/同步和互斥,ioctl函数,进程休眠,时间和延时,延缓,/proc文件系统,内存分配,数据类型,/内核中断,通过IO内存访问外设