Oracle - DECODE

*** 문법 ***
DECODE (컬럼명 | 표현식
                , 조건1, 결과1
                , 조건2, 결과2
                .......
                , 조건n, 결과n
                , 결과
)

*** 사용법 ***
[컬럼명 |표현식] : 이 값을 조건1부터 조건n까지 순차적으로 비교하여 같으면 해당 결과 return.
[결과] : 조건1 ~ 조건n에 모두 해당되지 않는 경우 return되는 기본값

*** 예제 ***
SELECT
DECODE ('A'
    , 'A', 'Aaa'
    , 'B', 'Bbb'
    , 'Ccc'
)
FROM DUAL;
==> Aaa

SELECT
DECODE ('B'
    , 'A', 'Aaa'
    , 'B', 'Bbb'
    , 'Ccc'
)
FROM DUAL;
==> Bbb

SELECT
DECODE ('C'
    , 'A', 'Aaa'
    , 'B', 'Bbb'
    , 'Ccc'
)
FROM DUAL;
==> Ccc

Oracle - 테이블 컬럼 변경

*** 컬럼 추가 ***
alter table [테이블명] add([컬럼명] [데이터타입]);

ex) alter table USER add(USER_NAME varchar2(50));


*** 컬럼명 변경 ***
alter table [테이블명] rename column [이전컬럼명] to [새컬럼명];

ex) alter table USER rename column USER_NAME to USER_NM;


*** 컬럼 데이터 타입 변경 ***
alter table [테이블명] modify([컬럼명] [데이터타입]);

ex) alter table USER modify(USER_NM varchar2(100));


*** 컬럼 삭제 ***
alter table [테이블명] drop([컬럼명]);

ex)  alter table USER drop(USER_NM);

Oracle - 테이블 복사하기

*** 테이블 복사 (스키미 & 데이터) ***
CREATE  TABLE 생성테이블명 AS SELECT * FROM 복사할테이블명 [WHERE 절]

*** 테이블 구조만 복사 ***

CREATE TABLE 생성테이블명 AS SELECT * FROM 복사할테이블명 WHERE 1=2

*** 데이터만 복사 ***
INSERT INTO 데이터인서트할테이블명 SELECT * FROM 복사할테이블명 [WHERE 절]

이클립스 단축키

*** 찾기 / 바꾸기 ***
Ctrl + F Find/Replace 다이얼로그 표시
Ctrl + K, Ctrl + Shift + K선택한 문자열과 동일한 다음/이전 문자열 찾기
Ctrl + J, Ctrl + Shift + J점증적 찾기 (incremental search)
Ctrl + HSearch 다이얼로그 표시

*** 소스 코드 편집 ***
Ctrl + 1 빠른 수정
Ctrl + Space컨텐트 어시스트
Ctrl + Shift + Space파라미터 힌트 표시
Ctrl + /주석 토글 ('//' 사용)
Ctrl + Shift + /, Ctrl + Shift + \블럭 주석 추가/삭제
Ctrl + Shift + F소스 코드 형식 정리
Ctrl + Shift + Oimport문 정리
Ctrl + D한 줄 삭제
Alt + Up, Alt + Down선택한 블럭을 한 줄 위(or 아래)로 이동
Alt + Shift + SSource 메뉴 표시
Alt + Shift + TRefactor 메뉴 표시
Alt + Shift + ZSurround With 메뉴 표시

*** 리팩토링 ***
Alt + Shift + RRename
Alt + Shift + VMove
Alt + Shift + CChange Method Signature
Alt + Shift + MExtract Method
Alt + Shift + LExtract Local Variable
Alt + Shift + IInline

*** 소스 코드 네비게이션 ***
Ctrl + Shift + Up, Ctrl + Shift + Down클래스의 이전(or 다음) 멤버로 이동
Ctrl + Shift + P매칭되는 괄호로 이동
F3선택한 요소가 선언된 곳으로 이동
F4현재 타입의 상속 구조 표시
Ctrl + Alt + H메서드 호출 구조 표시
Ctrl + Shift + G메소드 or 필드 or 객체 참조하는 곳 찾기
Ctrl + Shift + R리소스 검색
Ctrl + Shift + T타입 검색
Alt + Shift + B브레드크럼에 현재 요소 표시
Ctrl + O빠른 개요 보기
Ctrl + T빠른 상속 구조 보기
Ctrl + ., Ctrl + ,다음/이전 어노테이션(에러 or 경고)으로 이동
Ctrl + Q가장 최근에 편집한 위치로 이동
Ctrl + L지정한 행으로 이동
Alt + Left, Alt + Right뒤로/앞으로 이동
Ctrl + E다른 에디터로 이동
Ctrl + PgUp, Ctrl + PgDn다음/이전 에디터 활성화
Ctrl + F6, Ctrl + Shift + F6다음/이전 에디터 이동
Ctrl + F7, Ctrl + Shift + F7다음/이전 뷰 보기
Ctrl + F8, Ctrl + Shift + F8다음/이전 퍼스펙티브 보기
F12에디터 활성화
Ctrl + M현재 활성화된 뷰나 에디터 최대화

*** 실행 / 디버깅 ***
Ctrl + F11실행모드로 실행
F11디버그모드로 실행
Ctrl + Shift + B브레이크포인트 토글
F5Step Into
F6Step Over
F7Step Return
Ctrl + RRun to Line
F8Resume
Ctrl + F2프로그램 종료

Oracle - to_date 사용

*** 사용법 ***
문자열 형식을 DATE 형식으로 변환한다.
to_date ('변환할 문자열', 'DATE 포맷')

*** 예제 ***
select to_date('2015-07-21 15:33:44', 'yyyy-mm-dd hh24:mi:ss') from dual;
=> 2015-07-21 오후 3:33:44

*** 포맷 참고 ***
yyyy      : 년도. ex) 2015
yy         : 년도. ex) 15
mm       : 월.
dd         : 일.
hh,hh12 : 시간. 12시 기준으로 표시
hh24      : 시간. 24시 기준으로 표시
mi          : 분.
ss          : 초.

Linux - apache-tomcat에서 catalina.out 로그 없애기

톰캣 디렉토리 하위 bin 디렉토리에 있는
catalina.sh 파일에서

if [ -z "$CATALINA_OUT" ] ; then
  CATALINA_OUT="$CATALINA_BASE"/logs/catalina.out
fi

이부분을 찾아서

if [ -z "$CATALINA_OUT" ] ; then
  CATALINA_OUT=/dev/null
fi

로 변경

우분투 alias 설정

*** 설정 ***
사용자 홈 디렉토리에서
vi .profile 실행 후 다음과 같이 추가한다.

alias startup='/home/user/apache-tomcat-7.0.63/bin/startup.sh'


*** 적용 ***
source .profile 실행

Linux - vi 명령어

vi 시작 명령어
vi filename 파일 열기, 작성
vi +18 filename 18행으로 파일 열기
vi +/"문자열" fn "문자열"의 처음발생 단어부터 열기
vi -r filename 손상된 파일 회복
view filename 읽기 전용으로 파일 열기

vi 커서 이동 명령어
h(←) 왼쪽으로 커서 이동
j(↓) 아래로 커서 이동
k(↑) 위로 커서 이동
l(→) 오른쪽으로 커서 이동
w 오른쪽 한 단어의 끝 부분으로 커서 이동
e 오른쪽 한 단어의 앞 부분으로 커서 이동
b 왼쪽 한 단어의 앞 부분으로 커서 이동
Enter 한 행 아래로 커서 이동
Back space 한 문자 왼쪽으로 커서 이동
Space Bar 한 문자 오른쪽으로 커서 이동
^ 행의 맨 왼쪽으로 커서 이동
$ 행의 맨 오른쪽으로 커서 이동
H 화면의 맨 위로 이동
M 화면의 중간으로 이동
L 화면의 맨 아래로 이동
숫자G 숫자만큼 지정한 줄로 커서 이동
Ctrl + f 한 화면 위로 이동
Ctrl + b 한 화면 아래로 이동
Ctrl + d 반 화면 위로 이동
Ctrl + u 반 화면 아래로 이동
Ctrl + e 한 줄씩 위로 이동
Ctrl + y 한 줄씩 아래로 이동

문자,행 삽입 명령어
a (종료:ESC) 커서 오른쪽에 문자 삽입
A (종료:ESC) 커서 오른쪽, 행의 끝에 문자 삽입
i (종료:ESC) 커서 왼쪽에 문자 삽입
I (종료:ESC) 커서 왼쪽, 행의 처음에 문자 삽입
o (종료:ESC) 커서 아래에 행 삽입
O (종료:ESC) 커서 위에 행 삽입

텍스트 변경 명령어
cw (종료:ESC) 단어 변경
cc (종료:ESC) 행 변경
C (종료:ESC) 커서 오른쪽의 행 변경
s (종료:ESC) 커서가 위치한 문자열 대체
S (종료:ESC) 커서가 위치한 라인의 문자열 대체
r 커서 위치 문자를 다른 문자로 대체
r-Enter 행 분리
J 현재 행과 아래 행 결합
xp 커서 위치 문자와 오른쪽 문자 교환
~ 문자형(대,소문자) 변경
u 이전 명령 취소
U 행 변경 사항 취소
:u 이전의 최종 행 취소
. 이전 최종 명령 반복

텍스트 삭제 명령어
x 커서가 있는 문자 삭제
5x 커서가 있는 위치부터 5개의 문자를 삭제
dw 현재 커서가 있는 한단어 삭제
dd 커서가 있는 라인 삭제
5dd 커서가 있는 라인부터 5개의 라인 삭제
db 커서의 위치에서 꺼꾸로 한단어 삭제
D 커서 오른쪽 행 삭제
:5,10d 5-10번째 행 삭제

복사 및 이동 명령어
yy 행 yank 또는 복사
Y 행 yank 또는 복사
P yank되거나 삭제된 행 현재 행 위에 삽입
p yank되거나 삭제된 행 현재 행 아래에 삽입
:1,2 co 3 1-2행을 3행 다음으로 복사
:4,5 m 6 4-5행을 6행 위로 이동

행 번호 설정 명령어
:set nu 행 번호 표시
:set nonu 행 번호 숨기기

행 찾기 명령어
G 파일의 마지막 행으로 가기
21G 파일의 21번째 행으로 가기
Ctrl + G 현재의 filename과 line수를 알려줌

탐색 및 대체 명령어
/검색할 문자열/ 오른쪽 아래 방향으로 문자열 검색
?검색할 문자열? 왼쪽 위 방향으로 문자열 검색
n 문자열의 다음으로 계속 검색
N 문자열의 이전으로 계속 검색
:g/search-string/s//replace-string/gc 각 발생 탐색 후 확인하고 대체
:s/str/rep/ 현재 행의 str을 rep로 대체
:1,.s/str/rep/ 1부터 현재 행의 str을 rep로 대체
:%s/str/rep/g 파일 전체 str을 rep로 전부 대체
:.$/aaa/bbb/ 커서의 위치로부터 화일의 끝까지 있는 모든 aaa를 bbb로 대체

화면정리 명령어
Ctrl + l 불필요한 화면정리 후 다시 표시

파일 명령어
:r filename 커서 다음에 파일 삽입
:34 r filename 파일을 34번째 행 다음에 삽입


보관 및 종료 명령어
:w 변경사항 보관
:w filename 버퍼를 파일로 보관
:wq 변경사항 보관 후 vi 종료
ZZ 변경사항 보관 후 vi 종료
:q! 변경사항 보관하지 않고 종료
:q 수정한 파일을 저장하지 않고 vi 종료
:e! 수정한 것을 무시하고 다시 편집상태로


Oracle - null 값 체크 - NVL, NVL2

*** 문법 ***
NVL(Expression, Value)
  => Expression : null 여부를 체크할 컬럼 or 표현식
       Value         : Expression 값이 null인 경우 return 할 값.
                          null이 아니면 Expression 값 return

NVL2(Expression, Value1, Value2)
  => Expression : null 여부를 체크할 컬럼 or 표현식
       Value1        : Expression 값이 null이 아닌 경우 return 할 값.
       Value2        : Expression 값이 null인 경우 return 할 값.


*** 예제 ***
SELECT NVL('A', 'N') from DUAL;           -- 결과 : A
SELECT NVL(NULL, 'N') from DUAL;       -- 결과 : N

SELECT NVL2('A', 'Y', 'N') from DUAL;            -- 결과 : Y
SELECT NVL2(NULL, 'Y', 'N') from DUAL;        -- 결과 : N

Oracle - CASE

*** 문법 ***
CASE 컬럼명 | 표현식
    WHEN 조건식1 THEN 결과1
    WHEN 조건식2 THEN 결과2
    .......
    WHEN 조건식n THEN 결과n
    ELSE 결과
END

*** 사용법 ***
[결과] : WHEN 조건에 모두 해당되지 않는 경우 return되는 기본값
[컬럼명 |표현식] : 이 값이 조건식과 같은지 비교하여 같으면 해당 결과 return.
                            생략 가능하며 생략시 조건식에는 <, >, = 같은 연산식 사용.
                            만족하는 조건식이 여러 개일 경우 첫 번째 결과 return.


*** 예제 ***
SELECT
CASE 'AAA'
    WHEN 'AAA' THEN 'A'
    WHEN 'BBB' THEN 'B'
    ELSE 'C'
END NM
FROM DUAL;
 ==> A



SELECT
CASE
    WHEN 10 > 10 THEN 'A'
    WHEN 10 > 10 THEN 'B'
    ELSE 'C'
END NM
FROM DUAL;
==> C

Linux - 디스크 용량 확인하기

*** 명령어 ***
1. df   => 디스크 용량확인

ex)
root@testserver:~# df
Filesystem     1K-blocks    Used Available Use% Mounted on
/dev/sda1       18447100 4281368  13205632  25% /
none                   4       0         4   0% /sys/fs/cgroup
udev             1023452       4   1023448   1% /dev
tmpfs             206732    1072    205660   1% /run
none                5120       4      5116   1% /run/lock
none             1033656       0   1033656   0% /run/shm
none              102400       0    102400   0% /run/user
/dev/sdb1       20510332   44992  19400432   1% /data

2. df -h => 디스크 용량을 M(메가), G(기가) 단위로 환산하여 표시
ex)
root@testserver:~# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1        18G  4.1G   13G  25% /
none            4.0K     0  4.0K   0% /sys/fs/cgroup
udev           1000M  4.0K 1000M   1% /dev
tmpfs           202M  1.1M  201M   1% /run
none            5.0M  4.0K  5.0M   1% /run/lock
none           1010M     0 1010M   0% /run/shm
none            100M     0  100M   0% /run/user
/dev/sdb1        20G   44M   19G   1% /data

CentOS에서 cannot restore segment prot after reloc: Permission denied 에러

*** 현상 ***
CentOS에서 프로그램 실행시 다음과 같은 에러가 발생하면서 실행되지 않는다.

failed /home/test/jdk1.7/jdk1.7.0_17/jre/lib/i386/client/libjvm.so, because /home/test/jdk1.7/jdk1.7.0_17/jre/lib/i386/client/libjvm.so: cannot restore segment prot after reloc: Permission denied
dl failure on line 864

*** 원인 ***
SELinux(Security-Enhanced Linux) 가 설치되어활성되어 발생.

*** 해결방안 ***
root 계정으로 다음 명령어를 실행하여 SELinux를 비활성화

 /usr/sbin/setenforce 0

 (참고 : SELinux를 다시활성화하려면  /usr/sbin/setenforce1 을 실행)

Oracle - 문자열 자르기 (substr)

*** 사용법 ***
1. substr(원본문자열, 시작인덱스)
      원본문자열 시작인덱스(1부터 시작)부터 끝까지 자른다.
      ex)
        select substr('ABCDEFG', 1) from dual;      결과 : ABCDEFG
        select substr('ABCDEFG', 1) from dual;      결과 : CDEFG

2.substr(원본문자열, 시작인덱스, 길이)

    원본문자열 시작인덱스(1부터 시작)부터 길이만큼 자른다.
    ex)
      select substr('ABCDEFG', 1, 3) from dual;     결과 : ABC
      select substr('ABCDEFG', 2, 3) from dual;     결과 : BCD

Cron Expressions


*** 크론 필드 ***
NameRequiredAllowed ValuesAllowed Special Characters
SecondsY0-59, - * /
MinutesY0-59, - * /
HoursY0-23, - * /
Day of monthY1-31, - * ? / L W C
MonthY0-11 or JAN-DEC, - * /
Day of weekY1-7 or SUN-SAT, - * ? / L C #
YearNempty or 1970-2099, - * /


*** 예제 ***
0 0 12 * * ?매일 12:00 PM (정오) 에 실행
0 15 10 ? * *매일 10:15 AM 에 실행
0 15 10 * * ?매일 10:15 AM 에 실행
0 15 10 * * ? *매일 10:15 AM 에 실행
0 15 10 * * ? 20052005년 매일 10:15 AM 에 실행
0 * 14 * * ?매일 2:00 PM 에서 2:59 PM 까지 매 1분마다 실행
0 0/5 14 * * ?매일 2:00 PM 에서 2:55 PM 까지 매 5분마다 실행
0 0/5 14,18 * * ?매일 2:00 PM 에서 2:55 PM 까지, 그리고 6:00 PM 부터 6:55 PM 까지  매 5분마다 실행
0 0-5 14 * * ?매일 2:00 PM 에서 2:05 PM 까지 매 1분마다 실행
0 10,44 14 ? 3 WED매년 3월 수요일마다 2:10 PM, 2:44 PM 에 실행
0 15 10 ? * MON-FRIFire at 10:15 AM every Monday, Tuesday, Wednesday, Thursday and Friday
0 15 10 15 * ?Fire at 10:15 AM on the 15th day of every month
0 15 10 L * ?Fire at 10:15 AM on the last day of every month
0 15 10 ? * 6LFire at 10:15 AM on the last Friday of every month
0 15 10 ? * 6LFire at 10:15 AM on the last Friday of every month
0 15 10 ? * 6L 2002-2005Fire at 10:15 AM on every last friday of every month during the years 2002, 2003, 2004, and 2005
0 15 10 ? * 6#3Fire at 10:15 AM on the third Friday of every month
0 0 12 1/5 * ?Fire at 12 PM (noon) every 5 days every month, starting on the first day of the month
0 11 11 11 11 ?매년 11월 11일 11:11 AM 에 실행

Oracle - 테이블 락 확인하기

*** 락 테이블 조회 ***
SELECT
 B.OBJECT_NAME, B.OWNER, B.OBJECT_TYPE, A.XIDUSN, A.SESSION_ID, A.LOCKED_MODE
FROM
  V$LOCKED_OBJECT A, DBA_OBJECTS B
WHERE A.OBJECT_ID = B.OBJECT_ID
;

*** 특정 테이블 락 여부 확인 ***
SELECT
A.SID,  A.SERIAL#,  B.TYPE,  C.OBJECT_NAME
FROM V$SESSION A, V$LOCK B, DBA_OBJECTS C
WHERE A.SID=B.SID AND B.ID1=C.OBJECT_ID AND  B.TYPE='TM'
AND C.OBJECT_NAME = '테이블명'
;

CentOS 버전 확인하기

터미널에서 다음 명령어를 사용하여 버전을 확인할 수 있다.

*** 명령어 ***
> lsb_release -a 

*** 결과 ***
LSB Version: 1.3
Distributor ID: RedHatEnterpriseES
Description: Red Hat Enterprise Linux ES release 3 (Taroon Update 4)
Release: 3
Codename: TaroonUpdate4

MyBatis (iBatis) 특수문자 처리

쿼리에 특수문자가 있는 경우 에러가 발생하는데

<![CDATA[ ]]> 태그를 사용하면 정상적으로 실행된다.

***사용예(XML) ***
<select id="getMoney"  parameterType="map" resultMap="HashMap">
    SELECT *
        FROM USER
    WHERE MONEY <![CDATA[ < ]]> 10000
</select>

***사용예(java class) ***
@Insert(""
            + "<script><![CDATA["
            + "    INSERT INTO USER (USER_ID, USER_NM, MONEY)"
            + "        VALUES ('aaa', '&#8228;피아노', 100000)"
            + "]]></script>"
            )

Java - JAXB를 사용한 XML to Java Object

JAXB를 이용해서 XML 데이터를 자바 오브젝트로 변경할 수 있다.


*** Maven Depenendcy ***
<dependency>
    <groupId>javax.xml</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.1</version>
</dependency>

*** JAXB 사용예 ***

JAXBContext context = JAXBContext.newInstance(Cars.class);
Unmarshaller un = context.createUnmarshaller();

Cars cars = un.unmarshal(new File(a.xml)); // File, InputStream, URL 등 사용 가능


*** a.xml ***
<Cars>
    <CarList>
        <CarInfo>
            <Name>abc</Name>
            <Year>2001</Year>
        </CarInfo>
        <CarInfo>
            <Name>zzz</Name>
            <Year>1999</Year>
        </CarInfo>
    </CarList>
    <TotalCount>2</TotalCount>
</Cars>

*** Cars.java ***
@XmlRootElement(name = "Cars")
public class Cars
{
    private List<CarInfo> carList;
    private int totalCount;

    public List<CarInfo> getCarList() {
        return carList;
    }

    @XmlElementWrapper(name = "CarList") 
    @XmlElement(name = "CarInfo")
    public void setCarList(List<CarInfo> carList) {
        this.carList = carList;
    }

    public int getTotalCount() {
        return totalCount;
    }

    @XmlElement(name = "TotalCount")
    public void setTotalCount(int totalCount) {
        this.totalCount = totalCount;
    }
}

*** CarInfo.java ***
@XmlRootElement(name = "CarInfo")
public class CarInfo
{
    private String name;
    private int year;

    public String getName() {
        return name;
    }

    @XmlElement(name = "Name")
    public void setName(String name) {
        this.name = name;
    }
  
    public int getYear() {
        return year;
    }

    @XmlElement(name = "Year")
    public void setYear(int year) {
        this.year = year;
    }
}

Oracle - MERGE INTO 한 쿼리로 INSERT 혹은 UPDATE 하기

테이블에 데이터 추가시 조건에 해당하는 값이 존재하면 해당 행을 UPDATE하고,
없으면 INSERT 하는 경우 사용.

*** 문법 ***
MERGE INTO [ schema. ] { table | view } [ t_alias ]
   USING { [ schema. ] { table | view } | subquery } [ t_alias ]
   ON ( condition )
WHEN MATCHED THEN
UPDATE SET column = { expr | DEFAULT }
           [, column = { expr | DEFAULT } ]...
[ DELETE where_clause ]
WHEN NOT MATCHED THEN
INSERT [ (column [, column ]...) ]
VALUES ({ expr [, expr ]... | DEFAULT })

  • - INTO : DATA가 UPDATE되거나 INSERT 될 테이블
  • - USING : 비교할 SOURCE 테이블 혹은 서브쿼리. INTO절의 테이블과 동일하거나 다를 수 있음.
  • - ON : UPDATE나 INSERT를 하게 될 조건.  해당 조건을 만족하는 DATA가 있으면 WHEN MATCHED 절 실행
  •       , 없으면 WHEN NOT MATCHED 절 실행.
  • - WHEN MATCHED : ON 조건절이 TRUE인 ROW에 수행 할 내용. UPDATE, DELETE포함 될 수 있음.
  • - WHEN NOT MATCHED : ON 조건절에 맞는 ROW가 없을 때 수행할 내용. INSERT

*** 예제 ***
MERGE INTO USER_INFO U
USING DUAL
ON (U.USER_ID = 'abcde')
WHEN MATCHED THEN
    UPDATE SET USER_NM = 'name'
        , USE_YN = 'Y'
WHEN NOT MATCHED THEN
    INSERT (USER_ID, USER_NM, USE_YN)
        VALUES ('abcde','name', 'Y')