Python을 배워보자

오라클에서 테이블의 SELECT 결과를 그대로 INSERT문으로 변환

_Blue_Sky_ 2025. 3. 3. 16:12
728x90
 

 
오라클에서 테이블의 SELECT 결과를 그대로 INSERT문으로 변환해주는 Python 코드를 작성해드릴게요. 이 코드는 poe-api-wrapper와는 별개로, 오라클 데이터베이스에 접속해서 데이터를 읽고 INSERT문을 생성하는 예제입니다. 오라클 접속을 위해 cx_Oracle 라이브러리를 사용하며, 아래는 구체적인 사례와 함께 작성된 코드입니다.

 
 
요구사항
  • 입력: 오라클 테이블에서 SELECT한 결과.
  • 출력: 해당 결과를 기반으로 한 INSERT INTO SQL 문.
  • 상황 예시: employees 테이블에서 데이터를 읽고, 그 데이터를 그대로 employees_backup 테이블에 넣는 INSERT문을 생성.

사전 준비
  1. Oracle Client 설치: cx_Oracle을 사용하려면 Oracle Instant Client가 필요합니다. 공식 사이트에서 다운로드 후 설치하세요.
  2. Python 패키지 설치:
    bash
     
    pip install cx_Oracle

코드
python
 
import cx_Oracle

# 오라클 DB 접속 정보
username = "your_username"  # 오라클 사용자 이름
password = "your_password"  # 오라클 비밀번호
dsn = "localhost:1521/your_service_name"  # 예: localhost:1521/ORCL

# 테이블 이름 설정
source_table = "employees"  # 원본 테이블
target_table = "employees_backup"  # 데이터를 넣을 테이블

try:
    # 오라클 DB에 연결
    connection = cx_Oracle.connect(username, password, dsn)
    cursor = connection.cursor()

    # 원본 테이블에서 데이터 조회
    query = f"SELECT * FROM {source_table}"
    cursor.execute(query)

    # 컬럼 이름 가져오기
    columns = [desc[0] for desc in cursor.description]
    column_list = ", ".join(columns)

    # 데이터 행을 읽고 INSERT 문 생성
    insert_statements = []
    for row in cursor:
        # 각 값을 문자열로 변환하고, 문자열이면 따옴표로 감쌈
        values = []
        for val in row:
            if val is None:
                values.append("NULL")
            elif isinstance(val, str):
                values.append(f"'{val.replace('\'', '\'\'')}'")  # 작은따옴표 이스케이프 처리
            else:
                values.append(str(val))

        value_list = ", ".join(values)
        insert_sql = f"INSERT INTO {target_table} ({column_list}) VALUES ({value_list});"
        insert_statements.append(insert_sql)

    # 생성된 INSERT 문 출력
    for statement in insert_statements:
        print(statement)

except cx_Oracle.DatabaseError as e:
    print(f"오라클 오류 발생: {e}")

finally:
    # 연결 종료
    if 'cursor' in locals():
        cursor.close()
    if 'connection' in locals():
        connection.close()

코드 설명
  1. DB 연결:
    • cx_Oracle.connect: 사용자 이름, 비밀번호, 데이터베이스 서비스 이름으로 오라클에 연결.
    • 예: dsn = "localhost:1521/ORCL"은 로컬 오라클 서버의 기본 포트와 서비스 이름입니다.
  2. 데이터 조회:
    • SELECT * FROM employees: employees 테이블의 모든 데이터를 가져옴.
    • cursor.description: 테이블의 컬럼 이름을 추출.
  3. INSERT 문 생성:
    • 각 행의 데이터를 읽고, 값에 따라 처리:
      • NULL이면 "NULL"로.
      • 문자열이면 작은따옴표로 감싸고, 내부 작은따옴표는 이스케이프 처리(' -> '').
      • 숫자 등은 그대로 문자열로 변환.
    • 예: INSERT INTO employees_backup (emp_id, name, salary) VALUES (1, '홍길동', 5000);
  4. 예외 처리:
    • 연결 오류나 쿼리 오류가 발생하면 메시지를 출력.
    • 작업 후 연결을 안전하게 종료.
728x90

실행 예시
가정
  • employees 테이블:
     
    EMP_ID  NAME       SALARY
    1       홍길동     5000
    2       김영희     6000
출력 결과
 
INSERT INTO employees_backup (EMP_ID, NAME, SALARY) VALUES (1, '홍길동', 5000);
INSERT INTO employees_backup (EMP_ID, NAME, SALARY) VALUES (2, '김영희', 6000);

사용 방법
  1. 접속 정보 수정:
    • username, password, dsn을 자신의 오라클 환경에 맞게 변경하세요.
    • 예: dsn = "192.168.1.100:1521/mydb"
  2. 테이블 이름 변경:
    • source_tabletarget_table을 원하는 테이블 이름으로 수정.
  3. 실행:
    • Python 파일로 저장 후 실행하거나, Python 콘솔에서 바로 실행.

추가 팁
  • 파일로 저장하고 싶을 때:
    python
     
    with open("insert_statements.sql", "w", encoding="utf-8") as f:
        for statement in insert_statements:
            f.write(statement + "\n")
    이 코드를 추가하면 insert_statements.sql 파일에 결과가 저장됩니다.
  • 특정 컬럼만 선택: SELECT * 대신 SELECT emp_id, name FROM employees처럼 원하는 컬럼만 조회할 수도 있어요. 그러면 INSERT도 해당 컬럼만 포함됩니다.

이 코드는 오라클에서 SELECT 결과를 INSERT문으로 바꿔주는 간단하면서도 실용적인 도구입니다. 더 궁금한 점이나 수정할 부분이 있으면 말씀해주세요!
728x90