본문 바로가기

IT/Oracle

PL/SQL에서 커서(Cursor) 이용한 SELECT INSERT 하는 프로시저 설명

반응형

PL/SQL에서 커서(Cursor) 를 사용하여 SELECT 문으로 데이터를 조회한 후, 다른 테이블에 INSERT 하는 프로시저 예제입니다.

예제 시나리오

• source_table에서 데이터를 조회하여 target_table에 삽입하는 프로시저 작성
• source_table의 id, name, value 컬럼을 가져와 target_table에 저장

CREATE OR REPLACE PROCEDURE insert_from_cursor IS
    -- 커서 선언
    CURSOR cur_source IS
        SELECT id, name, value
        FROM source_table;
    
    -- 커서 데이터를 저장할 변수 선언
    v_id    source_table.id%TYPE;
    v_name  source_table.name%TYPE;
    v_value source_table.value%TYPE;

BEGIN
    -- 커서를 열고 데이터를 반복하여 삽입
    OPEN cur_source;
    LOOP
        FETCH cur_source INTO v_id, v_name, v_value;
        EXIT WHEN cur_source%NOTFOUND;  -- 더 이상 데이터가 없으면 종료

        -- 대상 테이블에 삽입
        INSERT INTO target_table (id, name, value)
        VALUES (v_id, v_name, v_value);
        
        -- 커밋 (필요 시 사용)
        -- COMMIT;
    END LOOP;
    CLOSE cur_source;
    
    DBMS_OUTPUT.PUT_LINE('Data Inserted Successfully');

EXCEPTION
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('Error: ' || SQLERRM);
        -- ROLLBACK; -- 오류 발생 시 롤백 가능

END insert_from_cursor;
/

 

설명

1. 커서(cur_source) 선언
  • source_table에서 id, name, value 데이터를 조회하는 커서를 선언합니다.
2. 커서를 열고 데이터를 한 행씩 가져옴
  • OPEN cur_source; → 커서를 엽니다.
  • FETCH cur_source INTO v_id, v_name, v_value; → 한 행씩 데이터를 가져옵니다.
  • EXIT WHEN cur_source%NOTFOUND; → 더 이상 데이터가 없으면 루프를 종료합니다.
3. INSERT 실행
  • 가져온 데이터를 target_table에 삽입합니다.
4. 예외 처리 (EXCEPTION)
  • 오류 발생 시 SQLERRM을 출력합니다.
  • 필요하면 ROLLBACK;을 추가하여 트랜잭션을 되돌릴 수 있습니다.

추가 고려 사항


 • 대량 데이터 삽입 시 BULK COLLECT와 FORALL을 사용하면 성능이 향상될 수 있습니다.
 • 트랜잭션 관리 (COMMIT, ROLLBACK)는 필요에 따라 조정할 수 있습니다.
 • target_table의 제약 조건(Primary Key, Unique 등)에 맞게 조정해야 합니다.

반응형