Oracle에서 REFCURSOR 타입을 사용하는 StoreProcedure를 OUT parameter로 사용하는 경우에는 2가지 제약 사항이 있다.
1. Table Cursor를 사용하는 것이 아닌, SYS_REFCURSOR 를 사용해야지 된다.
2. 1개의 Cursor만 return되는 것을 지원하며, in parameter의 순서가 중요하다. 반드시 SYS_REFCURSOR를 처음에 return시켜줘야지 된다.
이와 같은 규칙을 따르면 다음과 같은 StoreProcedure를 사용하는 경우 다음과 같이 HBM이 구성 가능하다.
이렇게 구성된 hbm을 이용해서 다음과 같이 StoreProcedure를 호출 할 수 있다.
1. Table Cursor를 사용하는 것이 아닌, SYS_REFCURSOR 를 사용해야지 된다.
2. 1개의 Cursor만 return되는 것을 지원하며, in parameter의 순서가 중요하다. 반드시 SYS_REFCURSOR를 처음에 return시켜줘야지 된다.
이와 같은 규칙을 따르면 다음과 같은 StoreProcedure를 사용하는 경우 다음과 같이 HBM이 구성 가능하다.
01.
CREATE
OR
REPLACE
PROCEDURE
FWKUSER.sp_XMMenu_MenuName_Test_q
02.
(
03.
spcur
OUT
sys_refcursor,
04.
p_menu_name
IN
VARCHAR2)
IS
05.
BEGIN
06.
OPEN
spcur
FOR
07.
select
08.
*
09.
10.
from
xm_menu
11.
where
menu_name
like
'%'
|| p_menu_name ||
'%'
12.
and
fold_yn =
'N'
13.
and
hidden_yn =
'N'
14.
and
use_yn =
'Y'
15.
and
del_yn =
'N'
16.
order
by
instr(menu_name, p_menu_name, 1, 1), menu_name;
17.
END
;
18.
/
01.
<
hibernate-mapping
namespace
=
"NHibernate.First.Domain"
assembly
=
"NHibernate.First"
xmlns
=
"urn:nhibernate-mapping-2.2"
>
02.
<
sql-query
name
=
"GetMenus"
>
03.
<
return
class
=
"NHibernate.First.Domain.XmMenu, NHibernate.First"
>
04.
<
return-property
name
=
"MenuId"
column
=
"MENU_ID"
>
05.
<
return-property
name
=
"ChildYn"
column
=
"`CHILD_YN`"
>
06.
<
return-property
name
=
"ColumnNm"
column
=
"`COLUMN_NM`"
>
07.
<
return-property
name
=
"DelYn"
column
=
"`DEL_YN`"
>
08.
<
return-property
name
=
"FoldYn"
column
=
"`FOLD_YN`"
>
09.
<
return-property
name
=
"HelpUrl"
column
=
"`HELP_URL`"
>
10.
<
return-property
name
=
"HelpYn"
column
=
"`HELP_YN`"
>
11.
<
return-property
name
=
"HiddenYn"
column
=
"`HIDDEN_YN`"
>
12.
<
return-property
name
=
"ImgCode"
column
=
"`IMG_CODE`"
>
13.
<
return-property
name
=
"ImgYn"
column
=
"`IMG_YN`"
>
14.
<
return-property
name
=
"MenuCode"
column
=
"`MENU_CODE`"
>
15.
<
return-property
name
=
"MenuFile"
column
=
"`MENU_FILE`"
>
16.
<
return-property
name
=
"MenuLevel"
column
=
"`MENU_LEVEL`"
>
17.
<
return-property
name
=
"MenuName"
column
=
"`MENU_NAME`"
>
18.
<
return-property
name
=
"MenuType"
column
=
"`MENU_TYPE`"
>
19.
<
return-property
name
=
"MenuUrl"
column
=
"`MENU_URL`"
>
20.
<
return-property
name
=
"RegDate"
column
=
"`REG_DATE`"
>
21.
<
return-property
name
=
"RegUser"
column
=
"`REG_USER`"
>
22.
<
return-property
name
=
"Remark"
column
=
"`REMARK`"
>
23.
<
return-property
name
=
"ScrollYn"
column
=
"`SCROLL_YN`"
>
24.
<
return-property
name
=
"Sort"
column
=
"`SORT`"
>
25.
<
return-property
name
=
"TableNm"
column
=
"`TABLE_NM`"
>
26.
<
return-property
name
=
"UpdtDate"
column
=
"`UPDT_DATE`"
>
27.
<
return-property
name
=
"UpdtUser"
column
=
"`UPDT_USER`"
>
28.
<
return-property
name
=
"UpmenuId"
column
=
"`UPMENU_ID`"
>
29.
<
return-property
name
=
"UseYn"
column
=
"`USE_YN`"
>
30.
</
return-property
></
return-property
></
return-property
></
return-property
></
return-property
></
return-property
></
return-property
></
return-property
></
return-property
></
return-property
></
return-property
></
return-property
></
return-property
></
return-property
></
return-property
></
return-property
></
return-property
></
return-property
></
return-property
></
return-property
></
return-property
></
return-property
></
return-property
></
return-property
></
return-property
></
return-property
></
return
>
31.
<!--[CDATA[{call sp_XMMenu_MenuName_Test_q(:menuName)}]]-->
32.
</
sql-query
>
33.
</
hibernate-mapping
>
이렇게 구성된 hbm을 이용해서 다음과 같이 StoreProcedure를 호출 할 수 있다.
01.
using
(var session = sessionFactory.OpenSession())
02.
{
03.
var query = session.GetNamedQuery(
"GetMenus"
);
04.
query.SetParameter(
"menuName"
,
"%"
);
05.
var output = query.List<xmmenu>();
06.
07.
foreach
(var p
in
output)
08.
{
09.
Console.WriteLine(p.MenuName);
10.
}
11.
}
12.
</xmmenu>