How do i access an out parameter in a pl/sql proc via 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开发者_JAVA百科 via Hibernate and access the value of the second parameter after the call?
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()
.
精彩评论