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 등)에 맞게 조정해야 합니다.
'IT > Oracle' 카테고리의 다른 글
오라클에서 스키마 정보를 추출하는 방법 (2) | 2025.03.16 |
---|---|
오라클 데이터베이스 간 스키마를 동기화 기법 소개 (2) | 2025.03.16 |
오라클 - Standard Edition (SE) 파티션 테이블 지원 여부 (3) | 2025.03.11 |
오라클 OLAP(Online Analytical Processing)란? (1) | 2025.03.11 |
오라클 - DELETE SQL 사용시 힌트 성능 최적화 (4) | 2025.03.09 |