[Oracle] 오라클 커서 (PL/SQL)

HanSamDul·2022년 11월 22일
0

CURSOR?

  • 특정 SQL 문장을 처리한 결과를 담고있는 메모리 영역을 가리키는 일종의 포인터이다. 대부분의 SQL문 결과 ROW는 여러개인데 커서를 사용하면 이 ROW에 순차적으로 접근이 가능합니다. 커서의 종류에는 묵시적 커서와 명시적 커서가 있습니다. 묵시적 커서는 오라클 내부에서 자동으로 생성되어 SQL문장이 실행될때마다 자동으로 만들어져 실행되는 커서이고, 명시적 커서는 사용자가 직접 정의해서 사용하는 커서를 말합니다. 이번 포스팅에서는 사용자가 직접 만드는 명시적 커서를 만들어보고 사용하는 방법에대해 알아보도록 하겠습니다.

단계

  • 커서 선언 -> 커서 열기 -> 패치 단계에서 커서 사용 -> 커서 닫기로 분류할 수 있다.

CURSOR 선언

  • 커서는 선언은 DECLEAR부분에 이름을 부여하면 됩니다.
CURSOR 커서명(매개변수1, 매개변수2...)
IS
SELECT문;

CURSOR 열기

  • 선언한 커서를 사용하려면 선언한 커서를 열어주는 작업이 필요
OPEN 커서명 (매개변수1, 매개변수2...);

CURSOR 사용

  • 정의한 커서를 열었으면 패치단계에서 커서를 사용하면 된다. 커서는 SQL 결과 집합이 여러개 이상에서 순차적으로 접근하기 위해 사용하는 방식이므로 거의 필수적으로 LOOP를 비롯한 반복문과 같이 사용하게된다.
LOOP
FETCH 커서명  INTO 변수1, 변수2...
EXIT WHEN 커서명%NOTFOUND;
END LOOP;

CURSOR 닫기

  • 커서를 사용한 모든 동작이 끝났으면 커서를 닫아한다.
CLOSE 커서명; 

CURSOR 사용예제

DECLARE
     CURSOR cur  IS
         SELECT *
         from PMS_PJT_TASK_XLS;

 BEGIN
       for rec in cur loop
            if rec.node_type = 'Task' then
                update PMS_PJT_TASK_XLS
                set node_type_cd = '0000000126'
                where pjt_sn = rec.pjt_sn;  
            elsif rec.node_type = 'Activity' then
                update PMS_PJT_TASK_XLS
                set node_type_cd = '0000000123'
                where pjt_sn = rec.pjt_sn;  
            else 
                update PMS_PJT_TASK_XLS
                set node_type_cd = '0000003847'
                where pjt_sn = rec.pjt_sn;  
            end if;
       end loop;

 END;
DECLARE
     CURSOR cur  IS
         SELECT *
         from PMS_PJT_TASK_XLS;

 BEGIN
       for rec in cur loop
--        dbms_output.put_line(rec.node_type_cd);
            if rec.GATE_GUBN_NM = 'GATE1' then
                update PMS_PJT_TASK_XLS
                set GATE_GUBN_CD = '0000003992'
                where pjt_sn = rec.pjt_sn;  
            elsif rec.GATE_GUBN_NM = 'GATE2' then
                update PMS_PJT_TASK_XLS
                set GATE_GUBN_CD = '0000003993'
                where pjt_sn = rec.pjt_sn;  
            elsif rec.GATE_GUBN_NM = 'GATE3' then
                update PMS_PJT_TASK_XLS
                set GATE_GUBN_CD = '0000003994'
                where pjt_sn = rec.pjt_sn;
            elsif rec.GATE_GUBN_NM = 'GATE4' then
                update PMS_PJT_TASK_XLS
                set GATE_GUBN_CD = '0000003995'
                where pjt_sn = rec.pjt_sn;  
            elsif rec.GATE_GUBN_NM = 'GATE5' then
                update PMS_PJT_TASK_XLS
                set GATE_GUBN_CD = '0000003996'
                where pjt_sn = rec.pjt_sn;  
            end if;
       end loop;
 END;

0개의 댓글