如何通过hibernate访问pl / sql proc中的out参数
我有一个带有以下签名的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并在调用后访问第二个参数的值?
如何通过Hibernate调用此proc并在调用后访问第二个参数的值?
我认为你不能。 至少,这不是我对第16章的理解。官方文档的原生SQL :
16.2.2。 使用存储过程进行查询
Hibernate3通过存储过程和函数为查询提供支持。 以下大多数文档都是等效的。 存储过程/函数必须返回一个结果集作为第一个能够使用Hibernate的out参数。 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中使用此查询,您需要通过命名查询映射它。
{ ? = call selectAllEmployments() } 存储过程目前仅返回标量和实体。 不支持
和
。
16.2.2.1。 使用存储过程的规则/限制
除非遵循某些过程/函数规则,否则不能将存储过程与Hibernate一起使用。 如果他们不遵守这些规则,他们就无法使用Hibernate。 如果您仍想使用这些过程,则必须通过
session.connection()
执行它们。 每个数据库的规则都不同,因为数据库供应商具有不同的存储过程语义/语法。无法使用
setFirstResult()
/setMaxResults()
分页存储过程查询。推荐的呼叫表格是标准的SQL92:
{ ? = call functionName(
) } { ? = call functionName(
或) } { ? = call procedureName(
} { ? = call procedureName(
。不支持本机调用语法。} 对于Oracle,以下规则适用:
- 函数必须返回结果集。 过程的第一个参数必须是返回结果集的OUT。 这是通过在Oracle 9或10中使用SYS_REFCURSOR类型来完成的。在Oracle中,您需要定义REF CURSOR类型。 有关详细信息,请参阅Oracle文献。
对于Sybase或MS SQL Server,以下规则适用:
该过程必须返回结果集。 请注意,由于这些服务器可以返回多个结果集和更新计数,因此Hibernate将迭代结果并将结果集的第一个结果作为其返回值。 其他一切都将被丢弃。
如果您可以在您的过程中启用SET NOCOUNT ON,那么它可能会更有效,但这不是必需的。
总而言之,要么遵循规则,要么通过session.connection()
使用原始JDBC。