如何通过休眠访问 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>

目前只有存储过程 返回标量和实体。 &lt;return-join&gt; 和 不支持&lt;load-collection&gt;

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内存访问外设

从 PL/SQL 块中的 CASE 语句调用 Procs:面临的问题

PL/SQL Proc 性能调优

PL/SQL - 你可以通过索引访问游标中的某些记录吗?

如何修复存储过程 Oracle PL/SQL 的错误?

如何将操作系统变量加载到 PL/SQL 中?