본문 바로가기

IT/Database

[Oracle] MSSQL을 Oracle로 컨버전 작업 시 참조

​<<Oracle 작업 시 참조>>


1. 컬러명 등 객체의 이름은 30바이트 초과 불가.
  1) 오류 코드 : ora-00972: identifier is too long
  2) 예시
    - 오류 발생 : SELECT Col1,Col2, 'A1234455' CUSTOMS_EXPORT_RECEIVE_IDENTIFY FROM TABLE_NM;
    - 오류 발생 안함 : SELECT Col1,Col2, 'A1234455' DD FROM TABLE_NM;
    - .Net 보세운송 버전에서 컬럼명이 CUSTOMS_EXPORT_RECEIVE_IDENTIFY 요렇게 생긴넘이 있었음.
      + Oracle에서 테이블 생성 시 컬럼명이 딱 30바이트가 되도록 요렇게 만들어짐 CUSTOMS_EXPORT_RECEIVE_IDENTIF 만들어짐.
  3) 조치 방안
    - 컬럼명을 30바이트 넘지 않게 생성할 것.


2. SQL문이 한문장은 한라인에 2499 바이트를 초과 할 수 없다.
  1) 오류 코드 및 메시지
    - SP2-0027: INPUT IS TOO LONG (>2499 CHARACTERS) - LINE IGNORED
  2) 예시
    - 오류 발생 : SELECT A1,A2,A3,A4,...,A2000 FROM TBL_NM;
      + 실제로 한 테이블의 컬럼이 2000개 되는 경우는 거의 없겠죠.
      + 그러나 복잡한 SQL문을 작성하는 경우에는 SQL문이 길어지는 경우가 발생함.
      + SurPlus .Net 버전
        - ntx 정의된 Select 문은 열맞추기 위해 공백을 두고 있음.
        - QP.AddService(sQuery.ToString());  ==> SQL문이 1라인으로 만들어짐.
    - 오류 발생 안함 : SELECT A1
                             ,A2
                             ,A3
                             ,A4
                             ,...
                             ,A2000
                        FROM TBL_NM;
  3) 조치 방안
    - Select 문 작성 시 중간 중간에 캐리지 리턴을 넣어주어야 함.
    -
3. 멀티 DML(Insert, Update, Delete) 처리
  1) 오류 코드 : 나중에 올릴께욧.
  2) 예시
    - 오류 발생 : Insert into tbl(AAA)Values('1');
                  Insert into tbl(AAA)Values('2');
                  Insert into tbl(AAA)Values('3');
    - 오류 발생 안함 : BEGIN  Insert into tbl(AAA)Values('1');Insert into tbl(AAA)Values('2');Insert into tbl(AAA)Values('3'); END;
  3) 조치방안
    - BEGIN (DML SQL1,DML SQL2,...,DML SQLn) END;
    - DML 문장들의 시작 부분에는 BEGIN을 끝부분에는 END;로 묶어 주면 된다.​​

    - DML SQL문 사이에 캐리지 리턴이 들어가야 하는지는 확인을 해야 할 듯 합니다.


 4. 데이터 타입이 Long인 녀석을 Varchar2로 데이터 변환을 해야 하는 상황이 발생.

 

Oracle에는 Long이라는 데이터 타입이 있습니다.

이 Long 타입이라는 녀석은 TO_CHAR() 함수가 먹질 않습니다.

TO_CHAR함수를 사용하게 되면 ORA-00932: inconsistent dattyps : expected CHAR get LON 이라는 오류가 발생하게 됩니다.

 

문제 해결을 위해서 구글링을 해서 처리를 하였습니다. 검색을 해보면 찾을 수 있겠지만 그래도 해당 내용 올립니다.

 

1. Table 정보

  - Table Name : IMPMOV_S

  - Long Type Column : MOV_REMARK

 

2. Function 생성

 

CREATE OR REPLACE FUNCTION FNC_LONG2CHAR (
   ori_rowid        ROWID,
   ori_column     VARCHAR2, -- ori_table의 LONG TYPE 컬럼명.
   ori_table        VARCHAR2  
)
   RETURN VARCHAR
AS
   longCont   VARCHAR2 (32767);
   sqlQuery   VARCHAR2 (2000);
 
BEGIN
   sqlQuery :=
         'select ' || ori_column || ' from '|| ori_table ||
         ' where rowid = '|| CHR (39)|| ori_rowid|| CHR (39);
 
   EXECUTE IMMEDIATE sqlQuery
                INTO longCont;
     
   longCont := SUBSTR (longCont, 1, 4000);
   RETURN longCont;
END;

 

3. 실제 사용 SQL

  - SELECT fnc_long2char(S.ROWID,'MOV_REMARK','IMPMOV_S') FROM IMPMOV_S;

  - Long 타입의 데이터를 Substr 해야 할 경우에도 위 Funtion을 사용하시면 됩니다.

     + ex)  SELECT SUBSTR(fnc_long2char(S.ROWID,'MOV_REMARK','IMPMOV_S'),1,200) FROM IMPMOV_S;

 

원문 출처 :  http://www.cspark.net/174