如何通过 hibernate 访问 pl/sql 过程中的输出参数

发布于 2024-09-18 13:46:36 字数 236 浏览 7 评论 0原文

我有一个具有以下签名的 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 调用此过程并在调用后访问第二个参数的值?

I have a pl/sql procedure with the following signature

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);

How can i make a call to this proc via Hibernate and access the value of the second parameter after the call?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

忘东忘西忘不掉你 2024-09-25 13:46:36

如何通过 Hibernate 调用此过程并在调用后访问第二个参数的值?

我认为你不能。至少,这不是我对 官方文档第16章.Native SQL

16.2.2。使用存储过程进行查询

Hibernate3提供了支持
通过存储过程查询和
功能。以下大部分
两者的文档是等效的。
存储过程/函数必须
返回结果集作为第一个
能够使用的外参数
冬眠。此类存储的一个示例
Oracle 9 及更高版本中的函数如下
如下:

创建或替换函数 selectAllEmployments
    返回 SYS_REFCURSOR
作为
    st_cursor SYS_REFCURSOR;
开始
    打开 st_cursor FOR
 选择雇员、雇主、
 开始日期、结束日期、
 区域代码、EID、价值、货币
 来自就业;
      返回 st_cursor;
 结尾;

要在 Hibernate 中使用此查询,您
需要通过命名查询来映射它。


    
        >
        
        >
        ;
        >
        
        
            <返回列名称=“VALUE”/>
            >;
        
    
    {? = 调用 selectAllEmployments() }

当前仅存储过程
返回标量和实体。

不支持

16.2.2.1。使用存储过程的规则/限制

您不能将存储过程与
休眠,除非你遵循一些
程序/功能规则。如果他们这样做
不遵守他们不遵守的规则
可与休眠一起使用。如果你还
想使用您拥有的这些程序
通过执行它们
session.connection()。规则是
每个数据库都不同,因为
数据库供应商有不同的存储
过程语义/语法。

存储过程查询不能
分页与
setFirstResult()/setMaxResults()

推荐的通话形式是标准的
SQL92: <代码>{ ? = 打电话
functionName() } 或 { ?
= call procedureName(}
。不支持本机调用语法。

对于 Oracle,适用以下规则:

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

对于 Sybase 或 MS SQL 服务器
以下规则适用:

  • 该过程必须返回一个结果集。请注意,由于这些服务器可以
    返回多个结果集并更新
    计数,Hibernate 将迭代
    结果并取第一个结果
    是一个结果集作为其返回值。
    其他一切都将被丢弃。

  • 如果您可以在程序中启用 SET NOCOUNT ON,则可能是
    效率更高,但这不是
    要求。

总而言之,要么遵循规则,要么通过 session.connection() 使用原始 JDBC。

How can i make a call to this proc via Hibernate and access the value of the second parameter after the call?

I don't think you can. At least, that's not my understanding of the Chapter 16. Native SQL of the official documentation:

16.2.2. Using stored procedures for querying

Hibernate3 provides support for
queries via stored procedures and
functions. Most of the following
documentation is equivalent for both.
The stored procedure/function must
return a resultset as the first
out-parameter to be able to work with
Hibernate. An example of such a stored
function in Oracle 9 and higher is as
follows:

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;

To use this query in Hibernate you
need to map it via a named query.

<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>

Stored procedures currently only
return scalars and entities.
<return-join> and
<load-collection> are not supported.

16.2.2.1. Rules/limitations for using stored procedures

You cannot use stored procedures with
Hibernate unless you follow some
procedure/function rules. If they do
not follow those rules they are not
usable with Hibernate. If you still
want to use these procedures you have
to execute them via
session.connection(). The rules are
different for each database, since
database vendors have different stored
procedure semantics/syntax.

Stored procedure queries cannot be
paged with
setFirstResult()/setMaxResults().

The recommended call form is standard
SQL92: { ? = call
functionName(<parameters>) }
or { ?
= call procedureName(<parameters>}
. Native call syntax is not supported.

For Oracle the following rules apply:

  • A function must return a result set. The first parameter of a procedure
    must be an OUT that returns a result
    set. This is done by using a
    SYS_REFCURSOR type in Oracle 9 or 10.
    In Oracle you need to define a REF
    CURSOR type. See Oracle literature for
    further information.

For Sybase or MS SQL server the
following rules apply:

  • The procedure must return a result set. Note that since these servers can
    return multiple result sets and update
    counts, Hibernate will iterate the
    results and take the first result that
    is a result set as its return value.
    Everything else will be discarded.

  • If you can enable SET NOCOUNT ON in your procedure it will probably be
    more efficient, but this is not a
    requirement.

To sum up, either follow the rules or use raw JDBC via session.connection().

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文