10여년간 오라클만 쓰다가 오랜만에 MySQL 사용할려니 넘어야 할 산이 계속 생기네.


아래 주소 참고해서 해결함


http://www.mysqlkorea.com/sub.html?mcode=manual&scode=01_1&m_no=22396&cat1=753&cat2=802&cat3=938&lang=k


http://egloos.zum.com/ndba/v/3437272



아래와 같은 SQL을 실행할 때

INSERT INTO T_NAME (

    ID,        NAME, ORDER_NO

)

VALUES (

    #{id},      #{name},

    (

    SELECT IFNULL(MAX(ORDER_NO), 0) + 1

      FROM T_NAME

     WHERE ID = #{id}

    )

)


SQL 오류 (1093): Table 'T_NAME' is specified twice, both as a target for 'INSERT' and as a separate source for data 와 같은 오류가 발생한다면 ....


INSERT INTO T_NAME (

    ID,        NAME, ORDER_NO

)

VALUES (

    #{id},      #{name},

    (

    SELECT IFNULL(MAX(ORDER_NO), 0) + 1

      FROM T_NAME ALIAS_FOR_SUBQUERY

     WHERE ID = #{id}

    )

)

위와 같이 서브쿼리 대상 테이블에 별명(alias)을 주면 해결된다.


오라클에서는 동일 테이블 내에서의 서브쿼리 조합이 가능하지만 MariaDB(or MySQL)는 기본적으로 지원하지 않는 것 같다.

MyBatis + MariaDB(or MySQL) 사용 시 select 결과가 resultType으로 지정한 Class에 바인딩(맵핑)이 안된다.


<mapper namespace="_mgr">

    .... 생략 ....

    <select id="view" resultType="mgrBean" parameterType="string">

        SELECT MGR_ID AS mgrId,

                  MGR_NM AS mgrNm

                  .... 생략 ....

          FROM CO_MGR

        WHERE MGR_ID = #{mgrId}

    </select>

    

    ....


위에서 'view' id를 갖는 쿼리문의 실행결과는 resultType으로 지정한 mgrBean이라는 alias로 지정된 클래스의 멤버변수에 자동으로 바인딩(맵핑) 되어야 하는데 일부 칼럼은 되고, 일부 칼럼은 안되는 경우가 발생했다.


구글신에게 물어봐도 답을 못찾아서 이것 저것 설정 파일을 건드리다가 아래와 같이 해결했다.

(구글이 못찾을 경우의 대부분은 내가 만난 문제가 매우 지엽적인 경우이다. 따라서 내 환경에 문제가 있을 가능성이 높다)


[myBatis 설정파일]


<configuration>

    .... 생략 ....

    <setting name="useColumnLabel" value="true" />


    ....


DB 칼럼명 대신에 칼럼라벨을 대신 사용하겠다는 설정이며 디폴트 값은 true이다.


이전에 오라클을 사용하면서 저 값을 fasle로 설정한 후 문제가 없었기에 다른 DB에서도 당연히 정상 동작하는 줄 알았는데 MariaDB를 사용하니 문제가 발생했다.


JDBC 드라이버 바꿔가면서 1시간 정도 삽질한 기념으로, 본 시행착오를 글로 남겨본다.




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

+ Recent posts