본문 바로가기

06. Programming/iii.Python 2.x~3.x

oracle 한글 insert시 문제해결 어찌하나...ㅠㅠ;

아래는 코드

#!/usr/bin/python
# -*- coding: euc-kr -*-
import cx_Oracle
con=cx_Oracle.connect("id","passwd","SID")

f=open("oracle_sync.dat","r")
for a in f.readlines():
        c=a.strip('\n') #strip을 하지 않으면 oracle_sync.dat에서 개행이 생겨버립니다. 
        b=c.split(",") #oracle_sync.dat에서 구분자가 ","입니다
        sql="insert into V_MAIL_TBL values ('%s','%s','%s','%s');"%(b[0],b[1],b[2],b[3])
        #print sql 이건 테스트코드
        sqlim=con.cursor() #오라클 커서를 받습니다
        sqlim.execute(sql) #커서를 받은곳에서 호출~
db.commit() # db 반영하고
con.close() # db접속 끊고
f.close() #파일 닫고

===================================================================
특정 파일을 열어서 insert하는 로직인데, 문제는 b[1]이 한글로 되어진 data입니다.

이 상태에서 insert를 넣을려고 하면 oracle charset때문에 에러가 발생이 되어집니다.

에러내용은 아래와 같습니다
cx_Oracle.DatabaseError: ORA-00911: invalid character

해볼수 있던 내용은
NLS_LANG 확인하기
system locale
python의 coding
b값에 대한 encode,decode

안되더군요...-_- 동일한 에러가 계속 발생합니다.
현재까지 원인 불명 상태로 남겨두고 있습니다.

List를 다시 변수로 빼서 작업을 해야하는건지 아니면 다른짓을 해야할지 난감합니다. 혹시 해결방안을 알고 있으신분없을까요?
=================================================================
자답합니다.

#!/usr/bin/python
# -*- coding: UTF-8 -*-
import cx_Oracle
con=cx_Oracle.connect("ID","PASSWORD","SID")
sqlim=con.cursor()
sqlim.execute("delete from V_MAIL_TBL")

f=open("oracle_sync.dat","r")
for a in f.readlines():
        r=a.decode('utf8')
        c=r.strip('\n')
        b=c.split(",")
        sql="insert into V_MAIL_TBL values ('%s','%s','%s','%s')"%(b[0],b[1],b[2],b[3])
        sqlim.execute(sql)

con.commit()
con.close()
f.close()

혹시나 했었던 내용이긴한데 file을 읽은 이후에 charset decode 해버리니 해결되어지는군요..-.ㅡ;;; 쩝...

서버 환경은
oracle 10g
NLS charet = NLS_LANG=KOREAN_KOREA.KO16KSC5601
LANG=ko_KR.utf8