ORA-01861: literal does not match format string


로컬 PC에서는 잘 돌아가는게 실서버에 배포하면 위와 같은 에러가 발생한다. 


오라클 TO_DATE 함수 부분에서 발생하는 에러로 추측된다.


이와 같은 경우 대부분 최신의 jdbc 드라이버로 교체해주면 해결되지만, 드라이버 교체로도 해결이 안될 경우에는 OS 환경변수의 언어셋 설정값을 확인해 보고 아래와 같이 변경해준다.


export LANG=ko_kr.UTF-8


또는


export NLS_LANG=KOREAN_KOREA.UTF-8


LANG 설정값을 변경해주면 WAS만 재기동 하면 되지만 NLS_LANG 값을 변경해주면 오라클을 재기동해야 할 수도 있어서 전자를 추천한다.


언어셋 설정값에 따라 오라클이 내부적으로 날짜변환을 판단하는 것으로 보여지는데 왜 굳이 이렇게 했는지는 만든 사람만이 알겠지.


이번에도 역시 구글신이 아니었다면 원인 찾느라 고생 좀 했을 것 같다.



SELECT  REGEXP_REPLACE(REGEXP_REPLACE(TRIM(LOWER(TARGET_COLUMN)),'[^A-Z,A-Z,0-9,ㄱ-ㅎ,가-힐]',''),'[[:SPACE:]]{1,}',' ') CONVERT_STR       

   FROM TARGET_TABLE


이걸 이제서야 찾다니 ㅠㅠ


http://community-downloads.quest.com/toadsoft/toadextensions/eclipse/freeware/


기존에 생성된 테이블의 테이블스페이스를 다른 걸로 변경하는 방법이다.

이게 가능한 작업인지 몰라서 처음에는 exp, imp를 통해 테이블 스페이스를 변경했다.

ALTER TABLE 대상_테이블명 MOVE TABLESPACE 옮길_TS명;

ALTER INDEX 대상_인덱스명 REBUILD TABLESPACE  옮길_TS명;

 참고로 아래는 접속 계정에 해당하는 모든 테이블과 인덱스의 테이블 스페이스를 변경하는 구문을 추출하는 쿼리이다.

/* 테이블 */
SELECT 'ALTER TABLE ' || TNAME ||' MOVE TABLESPACE TARGET_TS;' FROM TAB WHERE TABTYPE = 'TABLE';

/* 인덱스 */
SELECT 'ALTER INDEX ' || INDEX_NAME ||' REBUILD TABLESPACE TARGET_TS;' FROM USER_INDEXES;


오라클에서 varchar2 자료유형을 아래와 같이 CLOB으로 변경할 경우 ORA-22858: 데이터유형의 변경이 부적당합니다. 에러메시지를 만나게 된다.

ALTER TABLE 대상_테이블명 MODIFY (대상_컬럼명 CLOB); 

해결 방법은 아래와 같다.

/*
* MEMO 칼럼을 varchar2에서 clob으로 바꾸는 경우 샘플
*/

ALTER TABLE 대상_테이블명 ADD MEMO_NEW CLOB;

UPDATE  대상_테이블명 SET MEMO_NEW = MEMO;

COMMIT;

ALTER TABLE  대상_테이블명 DROP COLUMN MEMO;

ALTER TABLE  대상_테이블명 RENAME COLUMN MEMO_NEW TO MEMO;



/* 10분 */
SELECT SEQ, TITLE

  FROM TABLE_NAME

 WHERE TRUNC( MOD( (SYSDATE - TO_DATE(REG_DT, 'YYYYMMDDHH24MISS'))*24*60, 24*60 ) ) = 10


/* 2시간 */
SELECT SEQ, TITLE

  FROM TABLE_NAME

 WHERE TRUNC( MOD( (SYSDATE - TO_DATE(REG_DT, 'YYYYMMDDHH24MISS'))*24*1, 24*1 ) ) = 2


/* 1일 */
SELECT SEQ, TITLE

  FROM TABLE_NAME

 WHERE TRUNC( MOD( (SYSDATE - TO_DATE(REG_DT, 'YYYYMMDDHH24MISS'))*24*1, 24*1 ) ) = 24


Which JDBC drivers support which versions of Oracle Database?
  • JDBC 9.0.1 drivers can talk to RDBMS
    • 11.1.0
    • 10.2.0
    • 10.1.0
    • 9.2.0
    • 9.0.1
    • 8.1.7
    • 8.1.6
    • 8.1.5
    • 8.0.6
    • 8.0.5
    • 8.0.4
    • 7.3.4
  • JDBC 9.2.0 drivers can talk to RDBMS
    • 11.2.0
    • 11.1.0
    • 10.2.0
    • 10.1.0
    • 9.2.0
    • 9.0.1
    • 8.1.7
  • JDBC 10.1.0 drivers can talk to RDBMS
    • 11.2.0
    • 11.1.0
    • 10.2.0
    • 10.1.0
    • 9.2.0
    • 9.0.1
    • 8.1.7
  • JDBC 10.2.0 drivers can talk to RDBMS
    • 11.2.0
    • 11.1.0
    • 10.2.0
    • 10.1.0
    • 9.2.0
    • 9.0.1
    • 8.1.7
  • JDBC 11.1.0 drivers can talk to RDBMS
    • 11.2.0
    • 11.1.0
    • 10.2.0
    • 10.1.0
    • 9.2.0
    • 9.0.1
  • JDBC 11.2.0 drivers can talk to RDBMS
1. 시스템 환경변수 설정
export NLS_LANG='KOREAN_KOREA.AL32UTF8'


2. Oracle DB에 sys 계정으로 접속

-- 현재 설정 조회
select * from nls_database_parameters;

-- 캐릭터셋 업데이트
update sys.props$ set value$='AL32UTF8' where name='NLS_CHARACTERSET';

update sys.props$ set value$='AL32UTF8' where name='NLS_NCHAR_CHARACTERSET';

update sys.props$ set value$='KOREAN_KOREA.AL32UTF8' where name='NLS_LANGUAGE';

-- DB 캐릭터셋 반영
sql> startup mount;
sql> alter system enable restricted session;
sql> alter system set job_queue_process=0;
sql> alter system set aq_tm_processes=0;
sql> alter database open;
sql> alter database character set AL32UTF8;
sql> shutdown immediate;
sql> startup;

모르면 장시간 삽질을 유발하지만 원인을 알면 해결은 초간단한다.

원인
Toad 설치경로에 특수문자가 포함된 경우 발생한다.

해결법
다른 경로에 재설치

$ sqlplus "sys/password as sysdba"

SQL> alter system set processes=150 scope=spfile;
System altered.

SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.

SQL> startup
ORACLE instance started.

Total System Global Area  603979776 bytes
Fixed Size                  1260292 bytes
Variable Size             163579132 bytes
Database Buffers          436207616 bytes
Redo Buffers                2932736 bytes
Database mounted.
Database opened.

+ Recent posts