PI에서 개발 하다가 CLOB DataType을 Control 해야 할 좋지 않은 기회가 발생 할 수 있다.

어떤 다른 방법이 존재 하는지는 모르겠으나, 아래 내용은 JavaMapping에서 처리 하기 위해

테스트로 구현한 예제이다. 


찾아보니 옜날엔  insert하고 다른 작업을 해줘야 하는데 10g부터는 그냥 되는거 같다!

jar파일 버젼이 낮으면 것도 안되는거같다 테스트해보고 안되면 jar 파일 변경하자!



import java.sql.Connection; import java.sql.Date; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.util.Properties; import oracle.jdbc.OraclePreparedStatement; public class ClobTest { public static void main(String args[]) { Connection DbConn = null; String strIP = "XXX.XXX.XXX.XXX"; String strPort = "1521"; String strSERVER = "ora"; String strID = "ID"; String strPASSWORD = "PASSOWRD"; String strURL = "jdbc:oracle:thin:@" + strIP + ":" + strPort + ":" + strSERVER; Date date = new Date(null); StringBuffer sb = new StringBuffer(); String ClobTest = "한글 테스트입니다 ㅁㄴㅇㄻㄴㅇㄹ"; try{ for(int i = 0 ; i < 3000 ; i++) { sb.append(ClobTest); } Class.forName("oracle.jdbc.driver.OracleDriver"); DbConn = DriverManager.getConnection(strURL, strID, strPASSWORD); String SQL = "INSERT into AUTOMAIL_INTERFACE(AUTOCODE, LEGACYID, AUTOTYPE, EMAIL, INSERTDATE, SENDYN, FROMADDRESS, TITLE, HTMLURL)" + "values (?, ?, ?, ?, ?, ?, ?, ?, ?)"; OraclePreparedStatement psAct = null; psAct = (OraclePreparedStatement)DbConn.prepareStatement(SQL.toString()); psAct.setString(1, "1000000000000375"); psAct.setString(2, "SAP400000000633"); psAct.setString(3, "SAP"); psAct.setString(4, "aaa@naver.com"); psAct.setDate(5, new java.sql.Date(date.getDate())); psAct.setString(6, "N"); psAct.setString(7, "test@naver.com"); psAct.setString(8, "업비"); psAct.setStringForClob(9, sb.toString()); psAct.execute(); //executeUpdate DbConn.close(); }catch(Exception e) { System.out.println(e.toString()); DbConn.close(); } } }



위소스를 테스트 해보면  4000byte ~ 32765 bytes이상만 된다..

그래서 아래 소스를 참고 해서 변경 하도록 하자...

CLOB clob = CLOB.createTemporary(conn, true, oracle.sql.CLOB.DURATION_SESSION, Const.NCHAR);
clob.trim(0);
Writer writer = clob.getCharacterOutputStream();
writer.write(bigString.toCharArray());
writer.flush();
writer.close();
st.setClob(1, clob);


Posted by INSPIEN
,

공백제거

CONDENSE C3 NO-GAPS.


1. String의 길이구하기 

   i = STRLEN( string )


2. CONCATENATE F1 F2 F3 INTO G.

 - F1, F2, F3을 G에 넣는다.

 - SEPARATED BY <string>

   FI, F2, F3사이에 <string>을 넣는다.

   ex) DATA: FIRST(2)  VALUE 'BAE',

             SECOND(2) VALUE 'BYUNG',

             THIRD(2)  VALUE 'SUNG',

             NAME(20).

       CONCATENATE FIRST SECOND THIRD INTO NAME SEPARATED BY SPACE.

   결과 => 'BAE BYUNG SUNG'


3. SPLIT G AT <string> INTO F1 F2 F3.

 - G의 내용을 <string>으로 구분하여 F1, F2, F3에 나누어 넣는다.

   ex) DATA: NAME(20) VALUE ',BAE,BYUNG,SUNG',

             FIRST(2),

             SECOND(2),

             THIRD(2),

             FORTH(2),

             FIFTH(2).

       SPLIT NAME AT ',' INTO FIRST SECOND THIRD FORTH FIFTH.

   결과 => FIRST  = SPACE

           SECOND = 'BAE'

           THIRD  = 'BYUNG'

           FORTH  = 'SUNG'

           FIFTH  = SPACE


4. SHIFT

 - 변수에 들어있는 값을 이동한다. 모든 field를 type C로 간주하여 처리하기 때

   문에 type C, N, D외에는 사용할 때 주의하여야 한다.

 - Option : CIRCULAR - 잘려나간 문자를 맨뒤에 놓는다.

            RIGHT - 오른쪽으로 1칸 이동한다.

 - 좌측으로 1칸 이동한다.

 - SHIFT 문은 PERFORMANCE를 많이 요구하기 때문에 LOOP안에서는 사용을 하지 않

   는 것이 좋다.(1개의 문자를 이동하는데 5Microseconds 소요)


4-1. SHIFT c.  

 ex) DATA: FIRST(10) VALUE 'ABCEDFGHIJ'.

     SHIFT FIRST.

     결과 : FIRST = 'BCDEFGHIJ '.


4-2. SHIFT c BY n PLACES.

 - 변수 c를 자리만큼 좌측으로 이동한다. 만일 c의 length보다 n이 크면 c에는 

   blank가 들어간다.


4-3. SHIFT c UP TO c1.

 - 변수 c의 내부에 c1이라는 string을 만날 때까지 좌측으로 이동한다. 

 - c1이 없으면 아무변화도 일어나지 않는다. 

 - 이때 return value SY-SUBRC는 -4이다.


4-4. SHIFT c LEFT DELETING LEADING c1.

    SHIFT c RIGHT DELETING TRAILING c1.

 - string c의 첫 번째 혹은 마지막 character가 string c1에 포함되어 있다면 

   해당 character를 삭제하면서 이동한다. 

 - 첫 번째 혹은 마지막 character가 중복되어 있다면 다른 character가 나올 때

   까지 이동한다.

 - 같은 글자가 없다면 아무런 변화도 일어나지 않는다.


5. CONDENSE <string>.

 - string 내부 단어사이의 blank를 1개씩만 남기고 없앤다.

 - Option : NO-GAPS - 모든 blank를 없앤다.

 - type C를 제외한 다른 field를 포함한 field string을 변환시키지 말 것. 이

   상한 값이 들어갈 수 있다.


6. TRANSLATE c TO UPPER CASE.

  TRANSLATE c TO LOWER CASE.

 - 대소문자를 변환하는데 쓰인다.

 - 10byte이상의 긴 field를 변환하는 것은 performance에 좋지 않다.


7. OVERLAY c1 WITH c2.

 - c1의 character 중 blank의 자리에 c2의 character가 있다면 blank의 위치에 

   있는 c2의 character를 넣는다.

   ex) DATA: WORK(20) VALUE 'BA  B UNG-SU G',

             HELP(20) VALUE '  E AYY  - NNI'.

       OVERLAY WORK WITH HELP.

 

       결과 : WORK = 'BAE BYUNG-SUNG'.


 - Performance에 좋지 않기 때문에 많이 쓰지 않는 것이 좋다.


8. REPLACE c1 WITH c2 INTO c3.

 - string c3에 있는 c1이라는 string을 c2로 변환시킨다.


3-8. SEARCH 

3-8-1. SEARCH c1 FOR c2.

- c1에서 c2라는 string을 찾는다.

- c1의 단어사이는 blanck로 구분한다.

- c2에는 '_' , '*'를 포함하여 사용할 수 있다.

- SY-SUBRC = 0 일 때 SY-EDPOS에 찾은 단어의 위치정보가 들어 있다.


3-8-2. SEARCH itab FOR c2.

- itab이라는 internal table에서 c2라는 string을 찾는다.

- 나머지는 위와 상동

- SY-SYBRC = 0 일 때 SY-TABIX에는 internal table의 line number가 SY-EDPOS에는 위치정보가 들어 있다.



변수에서 특정 문자를 지정한 문자로 변경해주는 함수입니다. 


CALL FUNCTION 'STRING_REPLACE' 

      EXPORTING 

        pattern             = ','   " 변경할 문자열  

        substitute          = ''      " 변경될 문자열  

      CHANGING 

        text                = lv_var      "변경할 변수 

      EXCEPTIONS 

        wrong_string_length = 1 

        OTHERS              = 2. 



    REPLACE ALL OCCURRENCES OF '.' IN: LV_FROM_DATE WITH ''.

    REPLACE ALL OCCURRENCES OF '.' IN: LV_TO_DATE WITH ''.




    REPLACE ',' WITH '' INTO WA_CELL_DATA-FORMATTED_VALUE.

    CONDENSE WA_CELL_DATA-FORMATTED_VALUE NO-GAPS.

'ABAP' 카테고리의 다른 글

[ABAP / sproxy] proxy 생성 방법  (0) 2014.04.15
[ABAP] 날짜 관련 Function 모음  (0) 2013.08.12
[ABAP] Number RANGE 사용하기  (0) 2013.08.12
[ABAP] 다른 프로그램 호출 샘플  (0) 2013.08.12
[ABAP] 소스 수정하는 소스  (0) 2013.08.12
Posted by INSPIEN
,

1. RH_GET_DATE_DAYNAME   

 - 입력일자가 월요일부터 몇번째 일자인지, 입력일자 요일의 이름(MON, TUE 등)

   을 return해 줍니다.


2. DATE_COMPUTE_DAY

 - 입력일자가 월요일부터 몇번째 일자인지 return해 줍니다.


3. DATE_GET_WEEK

 - 입력일자가 해당 년도의 몇번째 주차인지 return해 줍니다.


4. HOLIDAY_CHECK_AND_GET_INFO

 - 입력일자가 공휴일인지 check해 줍니다.


5. WEEK_GET_FIRST_DAY

 - 입력주차의 월요일을 return해 줍니다.


6. RP_LAST_DAY_OF_MONTHS

 - 입력일자가 속한 월의 마지막 일자를 return해 줍니다.


7. LAST_DAY_IN_PERIOD_GET

 - 입력년도(I_GJAHR)를 구간(I_PERIV)으로 나누어서 입력한 구간(I_POPER)의

   마지막 일자를 return해 줍니다. 



날짜 차이 몇일인지

  CALL FUNCTION 'SD_DATETIME_DIFFERENCE'

          EXPORTING

              DATE1            = LV_DAT1

              TIME1            = '100000'

              DATE2            = LV_DAT2

              TIME2            = '100000'

            IMPORTING

              DATEDIFF         = LV_DIFF

            EXCEPTIONS

              INVALID_DATETIME = 1

              OTHERS           = 2.


*날짜 차이 빼거나 더하기

CALL FUNCTION 'RP_CALC_DATE_IN_INTERVAL'

  EXPORTING

    DATE      = SY-DATUM

    DAYS      = '0'

    MONTHS    = '1'

    SIGNUM    = '-'

    YEARS     = '0'

  IMPORTING

    CALC_DATE = L_FROM_DATE.

'ABAP' 카테고리의 다른 글

[ABAP / sproxy] proxy 생성 방법  (0) 2014.04.15
[ABAP] 문자열 관련 Function  (1) 2013.08.12
[ABAP] Number RANGE 사용하기  (0) 2013.08.12
[ABAP] 다른 프로그램 호출 샘플  (0) 2013.08.12
[ABAP] 소스 수정하는 소스  (0) 2013.08.12
Posted by INSPIEN
,