|
Hello,
I'm not having much luck in getting NHibernate to query a stored procedure in Oracle 9i and return me the results. Searched through the forums but there doesn't seem to be too many working solutions. In fact, I'm banging my head against the wall here and my faith in NHibernate is rapidly eroding.
The error I get is:
===============================
could not execute query
[ { CALL SP_VOLUMEIMPORT(?, ?, ?, ?) } ]
Name: p_grp_code - Value: REVTYPE
Name: p_to_date - Value: 2008-02-10
Name: p_from_date - Value: 2007-02-10
Name: p_volumes - Value: System.Collections.ArrayList
[SQL: { CALL SP_VOLUMEIMPORT(?, ?, ?, ?) }]
with an inner exception of ORA-00911: invalid character.
===============================
The details for my set-up are as follows:
NHibernate version: 1.2.1.4000
Oracle version: Oracle9i Enterprise Edition Release 9.2.0.8.0 - 64bit Production
Mapping document:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-access="property">
<sql-query name="SP_VOLUMEIMPORT">
<return-scalar column="GROUP_CODE" type="String" />
<return-scalar column="ACTVY_DATE" type="Date" />
<return-scalar column="ACCT_DATE" type="Date" />
<return-scalar column="VOLUME" type="Double" />
<return-scalar column="UNITS" type="Double" />
<return-scalar column="ENTITY_CODE" type="String" />
<return-scalar column="LEVEL_CODE" type="String" />
<return-scalar column="PARENT_ENTITY_CODE" type="String" />
<return-scalar column="PARENT_LEVEL_CODE" type="String" />
<return-scalar column="PROD_CODE" type="String" />
<return-scalar column="HIERARCHY_CODE" type="String" />
{ CALL SP_VOLUMEIMPORT(:p_volumes, :p_from_date, :p_to_date, :p_grp_code) }
</sql-query>
</hibernate-mapping>
.NET Code, i.e. method body for making the query:
string groupCode = "REVTYPE"
IQuery query = session.GetNamedQuery("SP_VOLUMEIMPORT");
query.SetParameter("p_volumes", new ArrayList());
query.SetParameter("p_from_date", dateRange.LowBound.ToString("yyyy-MM-dd"));
query.SetParameter("p_to_date", dateRange.HighBound.ToString("yyyy-MM-dd"));
query.SetParameter("p_grp_code", groupCode);
//query.SetResultTransformer(Transformers.AliasToBean(typeof(IVolumeDataRow)));
return MapTo(query.List());
Do I even set a parameter for output parameter for the stored procedure and if so which is the value object it is expecting?
The input parameter dateRange is simply a pair of dates (.NET DateTime), lowbound and highbound. I'm expecting the method to return an IList<IIVolumeDataRow>. The MapFrom method should map an IList of objects to IList<IIVolumeDataRow>. Once I get any resultset that is.
IIVolumeDataRow is a simple object that mirrors excatly the return-scalar properties shown in the mapping file. The stored procedure joins data from five data tables and is essentially:
create or replace PROCEDURE sp_VolumeImport
(
p_volumes OUT SYS_REFCURSOR,
p_from_date DATE,
p_to_date DATE,
p__grp_code VARCHAR2
)
AS
BEGIN
OPEN p_volumes FOR
SELECT...
FROM...
WHERE...(including join clauses)
GROUP BY...
END;
I'd be gratefully of any pointers to getting this running and will certainly share anything I find in getting this working.
Many thanks,
Gavin
Last edited by gavinmcl on Fri Apr 11, 2008 6:07 pm, edited 3 times in total.
|