[ Oracle - Procedure 문법_Cursor_SubQuery ]

 

Cursor_SubQuery 문

커서 서브 쿼리

 

커서 서브 쿼리는 Oracle8 이후부터 SQL 엔진에서 지원되어 온 기능이며, Oracle9i는 이러한 지원을  PL/SQL 엔진으로 확대하였습니다.  

커서 서브 쿼리는 커서 수식에 대한 매 평가마다 중첩된 커서를 오픈합니다.

부모 쿼리의 각각의 행에 대해, 해당 커서 수식에 대응하는 SELECT 리스트의 커서를 반환합니다.

서브 쿼리의 결과를 추출하기 위한 인출이 수행되어야 합니다.

 

사용)

PL/SQL에서, 커서 서브 쿼리는 다음과 같은 문맥에서 허용됩니다.

Ref 커서

명시적 커서

다음의 경우에는 허용되지 않습니다.

묵시적 커서

 

예: Ref 커서에서의 커서 서브 쿼리)

    DECLARE

        TYPE refcursortype IS REF CURSOR;

        n NUMBER;

        emprow employees%rowtype;

        empcur1 refcursortype;

        empcur2 refcursortype;

 

    BEGIN

        OPEN empcur1 FOR

            SELECT cursor(SELECT *

                              FROM   employees e

                              WHERE  d.deptno = e.deptno ), d.deptno

            FROM departments d;

        LOOP

            FETCH empcur1 INTO empcur2, n;

            LOOP

                FETCH empcur2 INTO emprow;

                …

            END LOOP;

        END LOOP;

        ...

    END;

 

예: 명시적 커서에 대한 커서 서브 쿼리)

    DECLARE

        TYPE refcursortype IS REF CURSOR;

        n NUMBER;

        emprow employees%rowtype;

        empcur1 refcursortype;

 

        CURSOR c1 is

            SELECT CURSOR ( SELECT *

                               FROM employees e

                                WHERE d.deptno = e.deptno ), d.deptno

            FROM departments d;

 

    BEGIN

        OPEN c1;

        LOOP        

            FETCH c1 INTO empcur1, n;

            ...

            LOOP

                FETCH empcur1 INTO emprow;

                  …

            END LOOP;

        END LOOP;

        ...

    END;

 

Posted by 농부지기
,

[ Oracle - Procedure 문법_Cursor_For ]

 

Cursor FOR문

--장점 : open, fetch 등을 하지 않아도 됨

--단점 : ??

--질문 : 만약, 한건도 없을 경우 for loop 가 수행 되는지 궁금??

 

CREATE OR REPLACE PROCEDURE HRMS.Op_Odm_Shift_Work_Daily_Update (

    in_yyyymm                           IN  VARCHAR2,   -- 작업년월

    in_emp_id           IN  VARCHAR2,   -- 사번

    in_apply_ym_m       IN  VARCHAR2,   -- 소급계산 처리시 수정처리년월

    in_mod_emp_id                    IN  VARCHAR2,   -- 작업자사번

    out_return                            OUT VARCHAR2    -- return 변수

)

IS

    CURSOR cur1 IS

        SELECT a.apply_ymd,

              a.shift_work_cd,

              a.data_type,

              a.sta_hm, a.end_hm

         FROM  ODM_SHIFT_WORK_DAILY a,

                      ODM_SHIFT_WORK_CODE b,

                    ODM_CALENDAR c

         WHERE a.shift_work_cd = b.cd

           AND     a.apply_ymd = c.cal_ymd

           AND    b.idx_id = '1109'

           AND    a.emp_id = in_emp_id

           AND    a.apply_ymd LIKE in_yyyymm || '%' ;

 

BEGIN

   ......

FOR eItem IN  cur1  LOOP

    ..........

 

   -- 이때 eItem 변수는 정의하지 않아도 사용가능하다.

    변수1 := eItem.apply_ymd;

    변수2 := eItem.shift_work_cd;

 

     .........

END LOOP;

    .........

END;

Posted by 농부지기
,

[ Oracle - Procedure 문법_Cursor_Fetch ]

 

CREATE OR REPLACE PROCEDURE HRMS.Op_Odm_Shift_Work_Daily_Update (

    in_yyyymm                           IN  VARCHAR2,   -- 작업년월

    in_emp_id           IN  VARCHAR2,   -- 사번

    in_apply_ym_m       IN  VARCHAR2,   -- 소급계산 처리시 수정처리년월

    in_mod_emp_id                    IN  VARCHAR2,   -- 작업자사번

    out_return                            OUT VARCHAR2    -- return 변수

)

IS

    CURSOR cur1 IS

        SELECT a.apply_ymd,

              a.shift_work_cd,

              a.data_type,

              a.sta_hm, a.end_hm

         FROM  ODM_SHIFT_WORK_DAILY a,

                      ODM_SHIFT_WORK_CODE b,

                       ODM_CALENDAR c

         WHERE a.shift_work_cd = b.cd

            AND     a.apply_ymd = c.cal_ymd

           AND    b.idx_id = '1109'

           AND    a.emp_id = in_emp_id

           AND    a.apply_ymd LIKE in_yyyymm || '%' ;

 

BEGIN

 

   --이때 cur1에 있는  in_emp_id 변수를 활용해서 sql 문이 실행 된다.

    OPEN cur1;

    LOOP

 

    FETCH cur1 INTO     v_f_apply_ymd,

            v_f_shift_work_cd,

            v_f_data_type,

            v_f_sta_hm,

            v_f_end_hm;

    EXIT WHEN cur1%NOTFOUND;

 

        ............... business logic ..........

    END LOOP;

    CLOSE cur1;

END;

 

 

Posted by 농부지기
,