잊지 않겠습니다.

Oracle에서 REFCURSOR 타입을 사용하는 StoreProcedure를 OUT parameter로 사용하는 경우에는 2가지 제약 사항이 있다.

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>
Posted by Y2K
,