반응형

ORA-22835: 버퍼가 너무 작아 CLOB를 CHAR 또는 BLOB에서 RAW로 변환할 수 없습니다(실제: 7692, 최대: 4000).


22835. 00000 -  "Buffer too small for CLOB to CHAR or BLOB to RAW conversion (actual: %s, maximum: %s)"

*Cause:    An attempt was made to convert CLOB to CHAR or BLOB to RAW, where

           the LOB size was bigger than the buffer limit for CHAR and RAW

           types.

           Note that widths are reported in characters if character length

           semantics are in effect for the column, otherwise widths are

           reported in bytes.

*Action:   Do one of the following

           1. Make the LOB smaller before performing the conversion,

           for example, by using SUBSTR on CLOB

           2. Use DBMS_LOB.SUBSTR to convert CLOB to CHAR or BLOB to RAW.



주로 일반 문자열을 처리하는 함수를 LOB에 적용할 때 발생하는 오류로 보입니다.


일반적인 해결 방법으로는 dbms_lob.substr 함수를 통해서 4000자씩 잘라서 해결하는 방법입니다.


하지만 LOB 타입의 데이터를 일반 문자열의 함수로 처리하는 것은 처음부터 뭔가 잘못된 거겠죠.

반응형
반응형

java에서 대소문자 구분없이 치환하는 코드 입니다.


앞에 (?i) 를 넣어 주면 됩니다.


1
2
3
  public static void main(String[] args) {
    System.out.println("ONCLICK".replaceAll("(?i)onclick""noclick"));
  }
cs


결과 입니다.



noclick
 
cs


반응형
반응형

ini 파일 최상단에 -clean 추가하면 해결이 된다고 합니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
-clean
-startup
plugins/org.eclipse.equinox.launcher_1.3.201.v20161025-1711.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.win32.win32.x86_64_1.1.401.v20161122-1740
-product
org.springsource.sts.ide
--launcher.defaultAction
openFile
-vm
C:/Program Files/Java/jdk1.8.0_144/bin/javaw.exe
-vmargs
-Dosgi.requiredJavaVersion=1.8
-Xms1200m
-Dosgi.module.lock.timeout=10
-Xverify:none
-Dorg.eclipse.swt.browser.IEVersion=10001
-Xmx1200m
 
cs


반응형
반응형


개발하다보면 랜덤 한글이름이 필요한 경우가 있습니다.

뭐 유니코드니 아스키코드니 복잡하게 하지 않고 단순무식하게 한글이름 랜덤하게 생성해주는 함수를 만들어 보았습니다.


성은 우리나라 많이쓰는 성 순위 100위 이고, 이름은 대충 이름에 많이 들어가는 글자들 정리해 봤습니다.

경우에 맞춰서 조금 수정해서 쓰시면 쓸만한 랜덤 한글 이름을 뽑아 쓰실 수 있을 겁니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public static String randomHangulName() {
    List<String> 성 = Arrays.asList("김""이""박""최""정""강""조""윤""장""임""한""오""서""신""권""황""안",
        "송""류""전""홍""고""문""양""손""배""조""백""허""유""남""심""노""정""하""곽""성""차""주",
        "우""구""신""임""나""전""민""유""진""지""엄""채""원""천""방""공""강""현""함""변""염""양",
        "변""여""추""노""도""소""신""석""선""설""마""길""주""연""방""위""표""명""기""반""왕""금",
        "옥""육""인""맹""제""모""장""남""탁""국""여""진""어""은""편""구""용");
    List<String> 이름 = Arrays.asList("가""강""건""경""고""관""광""구""규""근""기""길""나""남""노""누""다",
        "단""달""담""대""덕""도""동""두""라""래""로""루""리""마""만""명""무""문""미""민""바""박",
        "백""범""별""병""보""빛""사""산""상""새""서""석""선""설""섭""성""세""소""솔""수""숙""순",
        "숭""슬""승""시""신""아""안""애""엄""여""연""영""예""오""옥""완""요""용""우""원""월""위",
        "유""윤""율""으""은""의""이""익""인""일""잎""자""잔""장""재""전""정""제""조""종""주""준",
        "중""지""진""찬""창""채""천""철""초""춘""충""치""탐""태""택""판""하""한""해""혁""현""형",
        "혜""호""홍""화""환""회""효""훈""휘""희""운""모""배""부""림""봉""혼""황""량""린""을""비",
        "솜""공""면""탁""온""디""항""후""려""균""묵""송""욱""휴""언""령""섬""들""견""추""걸""삼",
        "열""웅""분""변""양""출""타""흥""겸""곤""번""식""란""더""손""술""훔""반""빈""실""직""흠",
        "흔""악""람""뜸""권""복""심""헌""엽""학""개""롱""평""늘""늬""랑""얀""향""울""련");
    Collections.shuffle(성);
    Collections.shuffle(이름);
    return 성.get(0+ 이름.get(0+ 이름.get(1);
  }
 
  public static void main(String[] args) {
    for (int i = 0; i < 100; i++) {
      if (i % 10 == 0) {
        System.out.println();
      }
      System.out.print(randomHangulName() + ", ");
    }
  }
cs



아래는 100개 돌려본 결과 입니다.


1
2
3
4
5
6
7
8
9
10
11
 
권래다, 전량운, 강덕봉, 채원조, 모여잎, 오서찬, 채려열, 유비철, 정한새, 용배란, 
오걸두, 구항탁, 엄숭강, 백월해, 진혜들, 임출석, 길더얀, 설손무, 연문희, 최탁더, 
위빈상, 편운신, 조진빈, 곽옥석, 용담현, 백혜의, 임권조, 이천비, 길요흥, 박회휴, 
남심가, 인솜길, 기리용, 하선송, 여열울, 황시송, 한의혜, 맹묵보, 주디변, 용양번, 
염지묵, 성덕동, 탁조옥, 주더형, 허휘주, 송다회, 옥상평, 성도울, 우희덕, 주추형, 
옥래삼, 옥린재, 추바후, 남모율, 방향용, 황엽번, 조병바, 박순자, 주하소, 나동길, 
신웅직, 신강뜸, 남은길, 어산묵, 왕직만, 길항훈, 강미헌, 황견채, 탁엽설, 모영판, 
함백자, 최고덕, 백일시, 배고문, 설리미, 홍만엄, 탁하달, 임영애, 양으자, 전훔늘, 
허을율, 이별솜, 문설타, 길술잎, 어길도, 심언자, 주섭중, 차더익, 박술늬, 선인정, 
표흥바, 강학경, 길손애, 노훈단, 표건새, 곽회라, 방향석, 남묵현, 임헌춘, 신고봉, 
cs


반응형
반응형

개발하다 보면 알파벳 포함한 문자열을 KEY로 잡으면서 시퀀셜하게 증가 시켜야하는 경우가 있습니다.


이럴 때 사용할 수 있는 알파벳 증가 시키키 함수 입니다.


아래 함수를 쓰시면 됩니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
  public static String nextAlphabet(String source) {
    int length = source.length();
    char lastChar = source.charAt(length - 1);
    if (lastChar == 'Z') {
      if (length == 1) {
        return source = "AA";
      }
      source = nextAlphabet(source.substring(0length - 1));
      source += "A";
      return source;
    }
    return source.substring(0length - 1+ String.valueOf((char) (lastChar + 1));
  }
 
  public static void main(String[] args) {
    String source = "A";
    for (int i = 1; i < 1000; i++) {
      if (i % 26 == 0) {
        System.out.println();
      }
      source = nextAlphabet(source);
      System.out.print(source + ",");
 
    }
  }
cs



결과 화면은 아래와 같습니다.

Z까지 되면 자릿수가 늘어 납니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,
AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,AM,AN,AO,AP,AQ,AR,AS,AT,AU,AV,AW,AX,AY,AZ,
BA,BB,BC,BD,BE,BF,BG,BH,BI,BJ,BK,BL,BM,BN,BO,BP,BQ,BR,BS,BT,BU,BV,BW,BX,BY,BZ,
CA,CB,CC,CD,CE,CF,CG,CH,CI,CJ,CK,CL,CM,CN,CO,CP,CQ,CR,CS,CT,CU,CV,CW,CX,CY,CZ,
DA,DB,DC,DD,DE,DF,DG,DH,DI,DJ,DK,DL,DM,DN,DO,DP,DQ,DR,DS,DT,DU,DV,DW,DX,DY,DZ,
EA,EB,EC,ED,EE,EF,EG,EH,EI,EJ,EK,EL,EM,EN,EO,EP,EQ,ER,ES,ET,EU,EV,EW,EX,EY,EZ,
FA,FB,FC,FD,FE,FF,FG,FH,FI,FJ,FK,FL,FM,FN,FO,FP,FQ,FR,FS,FT,FU,FV,FW,FX,FY,FZ,
GA,GB,GC,GD,GE,GF,GG,GH,GI,GJ,GK,GL,GM,GN,GO,GP,GQ,GR,GS,GT,GU,GV,GW,GX,GY,GZ,
HA,HB,HC,HD,HE,HF,HG,HH,HI,HJ,HK,HL,HM,HN,HO,HP,HQ,HR,HS,HT,HU,HV,HW,HX,HY,HZ,
IA,IB,IC,ID,IE,IF,IG,IH,II,IJ,IK,IL,IM,IN,IO,IP,IQ,IR,IS,IT,IU,IV,IW,IX,IY,IZ,
JA,JB,JC,JD,JE,JF,JG,JH,JI,JJ,JK,JL,JM,JN,JO,JP,JQ,JR,JS,JT,JU,JV,JW,JX,JY,JZ,
KA,KB,KC,KD,KE,KF,KG,KH,KI,KJ,KK,KL,KM,KN,KO,KP,KQ,KR,KS,KT,KU,KV,KW,KX,KY,KZ,
LA,LB,LC,LD,LE,LF,LG,LH,LI,LJ,LK,LL,LM,LN,LO,LP,LQ,LR,LS,LT,LU,LV,LW,LX,LY,LZ,
MA,MB,MC,MD,ME,MF,MG,MH,MI,MJ,MK,ML,MM,MN,MO,MP,MQ,MR,MS,MT,MU,MV,MW,MX,MY,MZ,
NA,NB,NC,ND,NE,NF,NG,NH,NI,NJ,NK,NL,NM,NN,NO,NP,NQ,NR,NS,NT,NU,NV,NW,NX,NY,NZ,
OA,OB,OC,OD,OE,OF,OG,OH,OI,OJ,OK,OL,OM,ON,OO,OP,OQ,OR,OS,OT,OU,OV,OW,OX,OY,OZ,
PA,PB,PC,PD,PE,PF,PG,PH,PI,PJ,PK,PL,PM,PN,PO,PP,PQ,PR,PS,PT,PU,PV,PW,PX,PY,PZ,
QA,QB,QC,QD,QE,QF,QG,QH,QI,QJ,QK,QL,QM,QN,QO,QP,QQ,QR,QS,QT,QU,QV,QW,QX,QY,QZ,
RA,RB,RC,RD,RE,RF,RG,RH,RI,RJ,RK,RL,RM,RN,RO,RP,RQ,RR,RS,RT,RU,RV,RW,RX,RY,RZ,
SA,SB,SC,SD,SE,SF,SG,SH,SI,SJ,SK,SL,SM,SN,SO,SP,SQ,SR,SS,ST,SU,SV,SW,SX,SY,SZ,
TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR,TS,TT,TU,TV,TW,TX,TY,TZ,
UA,UB,UC,UD,UE,UF,UG,UH,UI,UJ,UK,UL,UM,UN,UO,UP,UQ,UR,US,UT,UU,UV,UW,UX,UY,UZ,
VA,VB,VC,VD,VE,VF,VG,VH,VI,VJ,VK,VL,VM,VN,VO,VP,VQ,VR,VS,VT,VU,VV,VW,VX,VY,VZ,
WA,WB,WC,WD,WE,WF,WG,WH,WI,WJ,WK,WL,WM,WN,WO,WP,WQ,WR,WS,WT,WU,WV,WW,WX,WY,WZ,
XA,XB,XC,XD,XE,XF,XG,XH,XI,XJ,XK,XL,XM,XN,XO,XP,XQ,XR,XS,XT,XU,XV,XW,XX,XY,XZ,
YA,YB,YC,YD,YE,YF,YG,YH,YI,YJ,YK,YL,YM,YN,YO,YP,YQ,YR,YS,YT,YU,YV,YW,YX,YY,YZ,
ZA,ZB,ZC,ZD,ZE,ZF,ZG,ZH,ZI,ZJ,ZK,ZL,ZM,ZN,ZO,ZP,ZQ,ZR,ZS,ZT,ZU,ZV,ZW,ZX,ZY,ZZ,
AAA,AAB,AAC,AAD,AAE,AAF,AAG,AAH,AAI,AAJ,AAK,AAL,AAM,AAN,AAO,AAP,AAQ,AAR,AAS,AAT,AAU,AAV,AAW,AAX,AAY,AAZ,
ABA,ABB,ABC,ABD,ABE,ABF,ABG,ABH,ABI,ABJ,ABK,ABL,ABM,ABN,ABO,ABP,ABQ,ABR,ABS,ABT,ABU,ABV,ABW,ABX,ABY,ABZ,
ACA,ACB,ACC,ACD,ACE,ACF,ACG,ACH,ACI,ACJ,ACK,ACL,ACM,ACN,ACO,ACP,ACQ,ACR,ACS,ACT,ACU,ACV,ACW,ACX,ACY,ACZ,
ADA,ADB,ADC,ADD,ADE,ADF,ADG,ADH,ADI,ADJ,ADK,ADL,ADM,ADN,ADO,ADP,ADQ,ADR,ADS,ADT,ADU,ADV,ADW,ADX,ADY,ADZ,
AEA,AEB,AEC,AED,AEE,AEF,AEG,AEH,AEI,AEJ,AEK,AEL,AEM,AEN,AEO,AEP,AEQ,AER,AES,AET,AEU,AEV,AEW,AEX,AEY,AEZ,
AFA,AFB,AFC,AFD,AFE,AFF,AFG,AFH,AFI,AFJ,AFK,AFL,AFM,AFN,AFO,AFP,AFQ,AFR,AFS,AFT,AFU,AFV,AFW,AFX,AFY,AFZ,
AGA,AGB,AGC,AGD,AGE,AGF,AGG,AGH,AGI,AGJ,AGK,AGL,AGM,AGN,AGO,AGP,AGQ,AGR,AGS,AGT,AGU,AGV,AGW,AGX,AGY,AGZ,
AHA,AHB,AHC,AHD,AHE,AHF,AHG,AHH,AHI,AHJ,AHK,AHL,AHM,AHN,AHO,AHP,AHQ,AHR,AHS,AHT,AHU,AHV,AHW,AHX,AHY,AHZ,
AIA,AIB,AIC,AID,AIE,AIF,AIG,AIH,AII,AIJ,AIK,AIL,AIM,AIN,AIO,AIP,AIQ,AIR,AIS,AIT,AIU,AIV,AIW,AIX,AIY,AIZ,
AJA,AJB,AJC,AJD,AJE,AJF,AJG,AJH,AJI,AJJ,AJK,AJL,AJM,AJN,AJO,AJP,AJQ,AJR,AJS,AJT,AJU,AJV,AJW,AJX,AJY,AJZ,
AKA,AKB,AKC,AKD,AKE,AKF,AKG,AKH,AKI,AKJ,AKK,AKL,AKM,AKN,AKO,AKP,AKQ,AKR,AKS,AKT,AKU,AKV,AKW,AKX,AKY,AKZ,
ALA,ALB,ALC,ALD,ALE,ALF,ALG,ALH,ALI,ALJ,ALK,ALL,
cs


반응형
반응형

오라클 다중 업데이트 입니다.


두 테이블을 조인해서 업데이트를 하는 방법에는 두가지가 있는데 예제를 통해서 확인해 봅시다.


1. 일단 테이블을 생성합니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

create table 사람
  사람이름 varchar2(200),
  계급 varchar2(200),
  constraint pk_사람 primary key(사람이름)
);
 
create table 재산
  사람이름 varchar2(200),
  재산이름 varchar2(200),
  constraint pk_재산 primary key(사람이름, 재산이름)
);
 
cs


2.  적당한 데이터를 넣고


1
2
3
4
5
6
7
8
9
insert into 사람 (사람이름) values ('임꺽정');
insert into 사람 (사람이름) values ('홍길동');
insert into 사람 (사람이름) values ('김선달');
 
insert into 재산( 사람이름, 재산이름) values('임꺽정''자전거');
insert into 재산 (사람이름, 재산이름) values('홍길동''자동차');
insert into 재산 (사람이름, 재산이름) values('김선달''자전거');
insert into 재산 (사람이름, 재산이름) values('김선달''자동차');
insert into 재산 (사람이름, 재산이름) values('김선달''집');
cs



3. 첫번째 멀티 조인 업데이트 입니다. 업데이트 절에서 조인하고 set 절에서 조인한 컬럼 끼리 매칭 시켜주면 됩니다.


1
2
3
4
5
6
7
UPDATE (
  SELECT a.계급 before, 
         '부자' AS after
    FROM 사람 a INNER JOIN 재산 b ON a.사람이름 = b.사람이름
   WHERE b.재산이름 = '집'
) t
SET t.before = t.after;
cs


* 이 때 ORA-01779 키보존 오류가 날 수 있는데, b.사람이름=pk 를 만족해야 합니다. 만약 multi pk 라 하더라도 모두 명시해주시면 됩니다.



4. 두번째 멀티 조인 업데이트 입니다. 보통의 업데이트 구문처럼 사용하면서 SET 절과 WHERE 절에 각각 서브쿼리를 통해 조인을 합니다.


1
2
3
4
UPDATE 사람 a
   SET a.계급 = (SELECT '평민' FROM 재산 b WHERE a.사람이름 = b.사람이름 AND b.재산이름 = '자동차')
 WHERE a.계급 is null
   AND EXISTS (SELECT 1 FROM 재산 b WHERE a.사람이름 = b.사람이름 AND b.재산이름 = '자동차');
cs



5. 결과는 이렇습니다.

1
select * from 사람;
cs


사람이름계급
임꺽정(null)
홍길동평민
김선달부자


여기서 실행 및 테스트 해볼 수 있습니다.


http://sqlfiddle.com/#!4/6432f/4

반응형
반응형

크롬에서 http -> https 로 리다이렉트 된 경우 브라우저에 캐시가 됩니다.


예를 들어, http://test.test -> https://test.test 로 리다이렉트(301, 307) 된 적이 있다면 캐시를 지우기 전까진 http://test.test 에 접속할 수가 없습니다.


이럴 때 캐시를 삭제하기 위한 방법입니다.


크롬 주소창에 chrome://net-internals 이라고 칩니다.


그럼 아래 화면이 나오는데 오른쪽 상단 화살표를 눌러서 Clear cache 를 선택하면 캐시가 삭제 됩니다.



반응형
반응형

C:\Users\{사용자이름}\AppData\Roaming\npm 를 고급 시스템 설정 > 환경 변수 에서 시스템 변수 'Path'에 추가해 준다.

반응형
반응형

SpringSecurity 에서 자동로그인 RememberMe 를 사용하면 해당 쿠키를 찾지 못하는 경우 CookieTheftException 예외가 발생합니다.

이 예외를 잡아서 처리하고 싶을 때 아래처럼 필터를 이용하신면 됩니다.


1
2
3
4
5
6
7
8
9
10
11
 
@Configuration
@EnableWebSecurity
public class MultiHttpSecurityConfig extends WebSecurityConfigurerAdapter {
  @Override
  protected void configure(HttpSecurity http) throws Exception {
        ...
        http.addFilterAfter(new ExceptionHandlerFilter(), SecurityContextHolderAwareRequestFilter.class);
        ...
  }
}
cs



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
 
import java.io.IOException;
 
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.security.web.authentication.rememberme.CookieTheftException;
import org.springframework.web.filter.GenericFilterBean;
 
import kr.go.seoul.scc.mobile.web.config.Url.HOME;
 
public class ExceptionHandlerFilter extends GenericFilterBean {
 
  private static Logger logger = LoggerFactory.getLogger(ExceptionHandlerFilter.class);
  /**
   * Default AJAX request Header
   */
  private String ajaxHaeder = "AJAX";
 
  public void destroy() {
  }
 
  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
      throws IOException, ServletException {
    HttpServletRequest req = (HttpServletRequest) request;
    HttpServletResponse res = (HttpServletResponse) response;
 
    if (isAjaxRequest(req)) {
      try {
        chain.doFilter(req, res);
      } catch (CookieTheftException e) {
        logger.error("쿠키바뀜1", e);
        res.sendError(HttpServletResponse.SC_FORBIDDEN);
      }
    } else
      try {
        chain.doFilter(req, res);
      } catch (CookieTheftException e) {
        logger.error("쿠키바뀜2", e);
        res.sendRedirect(HOME.INTRO_EXPIRED);
      }
  }
 
  private boolean isAjaxRequest(HttpServletRequest req) {
    return req.getHeader(ajaxHaeder) != null && req.getHeader(ajaxHaeder).equals(Boolean.TRUE.toString());
  }
 
  /**
   * Set AJAX Request Header (Default is AJAX)
   * 
   * @param ajaxHeader
   */
  public void setAjaxHaeder(String ajaxHeader) {
    this.ajaxHaeder = ajaxHeader;
  }
}
cs


반응형
반응형

오라클 11g 부터 사용할 수 있는 listagg 는 여러 row 데이터를 하나의 row로 문자열을 합쳐서 보여줄 수 있는 함수 입니다.

사용법은 아래와 같습니다.

 

테이블 생성.

 

 

데이터 삽입

 

 

listagg 예제 입니다.

 
 

결과

USER_NAME HOBBYS
아이유 노래,멍때리기,멍때리기,멍때리기,잠,

 

같은 데이터가 중복으로 있는 경우에 하나만 나오게 하고 싶습니다.

아래와 같이 정규식 치환을 이용하면 중복 데이터를 제거할 수 있습니다.

 
 

 

결과

USER_NAME HOBBYS
아이유 노래,멍때리기,잠,

 

위 모든 예제는 http://sqlfiddle.com/#!4/c0b427/6 에서 실행해 보실 수 있습니다.

반응형

+ Recent posts