1. 정의

LENGTH 

 LENGTHB

 문자열 길이 반환

 문자열의 byte 반환

 공백을 포함한 문자열 길이를 반환

 영문(1byte), 공백(1byte), 한글(3byte)

 * 한글은 DB charset에 따라 다를 수 있음

 

 

2. 예시

1
2
3
4
SELECT
  LENGTH('180712 테스트') AS LENGTH1,
  LENGTHB('180712 테스트') AS LENGTHB1
FROM DUAL;
cs

같은 글자인 '180712 테스트' 라는 문자열의 길이와 byte가 어떻게 차이나는지 알아보도록 한다.

 

LENGTH와 LENGTHB의 차이를 알 수 있다.

1. 정의

CRUD중 조건에 따라 CUD가 가능한 명령어이다.

MERGE INTO 조건에 해당하는 행이 존재시 UPDATE / 없으면 INSERT 한다.

 

 

2. 구문

1
2
3
4
5
6
7
8
9
10
MERGE INTO [스키마.]테이블명
    USING (update나 insert될 데이터 원천)
        ON (update될 조건)
WHEN MATCHED THEN
    SET 컬럼1 = 값1, 컬럼2 = 값2, ...
WHERE update 조건
    DELETE WHERE update_delete 조건
WHEN NOT MATCHED THEN
    INSERT (컬럼1, 컬럼2, ...) VALUES (값1, 값2,...)
        WHERE insert 조건;
cs

 

 

3. 예시

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<insert id="mergeBoard">
    MERGE INTO BOARD_USER B1
    USING (
        SELECT USER_ID, DEPT_CD
        FROM USER
        WHERE DEPT_CD IN (
            SELECT DEPT_CD
            FROM DEPT
            START WITH DEPT_CD = #deptCd#
            CONNECT BY PRIOR DEPT_CD = UPPER_DEPT_CD
        )
    ) B2 ON (B1.BOARD_NO - #boardNo# AND B1.USER_ID = B2.USER_ID)
    WHEN MATCHED THEN
        UPDASTE SET B1.BOARD_AUTTHOR = #boardAuthor#
    WHEN NOT MATCHED THEN
        INSERT (BOARD_NO, USER_ID, BOARD_AUTHOR)
        VALUES (#boardNo#, B2.USER_ID, #boardAuthor#)        
</insert>
cs

 

 

4. 참고사항

CLOB 타입을 사용시 2000bytes가 넘을 때에는 ORA-06600 오류가 발생한다.

또한, ON 절에 기술된 컬럼이 WHEN MATCHED THEN 다음에 오는 UPDATE 행에는 올 수 없다.

UPDATE할 컬럼의 PK, UK 등을 명시하지 않으며, INSERT 시에는 PK, UK등의 값을 넣어야 한다.

1. UNION

UNION DISTRINCT이며, UNION으로 쓰인다.

모든 데이터 형식이 동일한 ROW가 있을 경우, 하나의 ROW로 합쳐서 조회된다.

두 테이블의 결합이며, 결합시에는 두 테이블의 중복되지 않는 값만 반환된다.

중복을 제거하기 위해 불가피하게 정렬한다.

자료가 많거나, 인덱스가 되어있지 않은 컬럼들을 대상으로 하면 쿼리를 수행하는 시간이 길어질 수 있다.

 

 

2. UNION ALL

두 테이블의 중복되는 값까지 함께 반환한다.

중복된 ROW가 있을 경우, 모든 ROW를 보여준다.

'BackEnd > DBMS' 카테고리의 다른 글

Oracle :: LENGTH vs LENGTHB 차이  (0) 2018.07.12
Oracle :: MERGE INTO  (0) 2018.07.06
Oracle :: Flashback (데이터 복구)  (0) 2018.03.12
Oracle :: ORDER SIBILING BY  (0) 2018.03.12
Oracle :: ORA-01861 Literal does not match format string  (0) 2018.01.25


ORDER BY로 정렬할 경우 모든 데이터를 가지고 정렬을 하지만,


ORDER SIBLINGS BY는 계층별로 정렬을 한다.


계층 구조의 그룹으로 묶어 정렬하기 위해 사용함.


*  START WITH B : 부모의 시작 조건

  CONNECT BY PRIOR A = B : 자신 키와 부모 키 비교

  ORDER SIBLINGS B Y B ASC, A ASC : 계층 내의 ORDER BY

오라클에서 날짜 형식에 대해 타입을 잘못 지정했을 경우 발생하는 에러이다.


개발 컴퓨터에서는 에러가 발생하지 않았으나, 운영 서버로 기동했을시 발생하는 경우가 종종 있다.


반드시 SELECT TO_DATE(SYSDATE, 'YYYY-MM-DD') FROM DAUL; 과 같이 분명한 날짜 형식으로 지정해줘야 다음과 같은 에러가 발생하지 않는다.


원인은 DATE 형태의 포맷이 클라이언트(Session) 마다 NLS_DATE_FORMAT에 디폴트로 설정이 되어있지만, 컴퓨터마다 환경 설정이 다르게 되어있기 떄문이다.

1. NULL

인스턴스가 생성되지 않은 상태를 말한다. List 변수가 메모리에 아무런 주소값도 창조하지 않은 상태이다.

그러므로, List에 값이 없을 경우 null로 체크하면 안된다.



2. isEmpty()

size() = 0

자바 SE 1.6 이상에서만 사용 가능하다.

인스턴스는 생성되었으나, List 안에 아무것도 없는 상태를 말한다. (값이 존재하지 않는 상태)

객체에 ""이란 값으로 들어가 있는 상태이다. (공백도 값으로 처리가 되기 때문에)

'BackEnd > Java' 카테고리의 다른 글

자바와 객체 지향  (0) 2020.11.17
객체지향 디자인 패턴1 (퍼사드, 싱글톤)  (0) 2020.11.03
LinkedHashMap  (0) 2017.06.29
RSA 암호화 구현  (0) 2017.03.14
Java :: Spring 파일 업로드 (multipart-form/data)  (2) 2017.03.14

1. NVL()

NVL(param, 1) 

모든 데이터 타입에 적용 가능한 함수.

param이 NULL일 경우 1을 반환하고, 그렇지 않은 경우 (NULL이 아닌 경우) param 값을 반환한다.



2. NVL2()

NVL2(param1, param2, param3) 

param1이 NULL이 아니면 param2를 반환하고, NULL이면 param3을 반환한다.



3. DECODE()

DECODE(param, null, "1", "2") 

param이 NULL일 경우 "1"을 반환, NULL이 아닐 경우 "2"를 반환한다.



4. NULLIF()

NULLIF(param1, param2) 

param1의 값이 param2의 값과 같으면 NULL을 반환하고 같지 않으면 param1의 값을 반환하다.

(= CASE WHEN param1 = param2 THEN NULL ELSE param1 END)



5. COALESCE()

COALESCE(param1, param2, param3... paramN) 

비교하는 데이터의 타입을 모두 통일시켜야 하는 함수.

(데이터 타입이 일치하지 않을시 => ORA-00932 : 데이터 유형이 일치하지 않습니다 에러 발생함)

모든 값이 NULL일 경우 NULL을 반환한다.

param1이 NULL이 아닐 경우 param1을 반환하나, param1이 NULL일 경우 param2의 값을 체크하고

=> param2가 NULL이 아닐 경우 param2의 값을 반환하나, param2가 NULL일 경우 param3의 값을 체크

=> ....paramN까지 반복

1. 정의

데이터 사전. Data Dictionary.

대부분 읽기 전용으로 제공되는 테이블. 뷰들의 집합이며, 데이터베이스 전반에 대한 정보를 제공한다.

오라클 DB는 명령이 실행될 때마다 데이터 사전에 접근한다. 데이터베이스 작업을 하는 동안, 오라클은 데이터 사전을 읽어 객체 존재 여부와 함께 사용자에게 적합한 접근 권한이 있는지 확인한다.


데이터 사전은 DB 생성 과정중 catalog.sql 스크립트를 수행하는 과정에서 생성되고, 모든 데이터 사전 정보는 SYSTEM 테이블 스페이스에 저장된다.



2. 데이터 사전에 저장되는 내용

1) 오라클의 사용자 정보

2) 오라클 권한, 롤 정보

3) DB 스키마 객체 정보 (ex. table, view, index, cluster, synonym, sequence 등..)

4) 무결성 제약 조건에 관한 정보

5) 오라클 DB의 함수 / 프로시저, 트리거에 관한 정보

6) 가장 일반적인 DB 정보



3. 종류

 종류

 설명

 USER_

 사용자가 소유한 객체에 관한 정보 저장

 ALL_

 사용자에게 액세스가 허용된 객체에 관한 정보 저장

 DBA_

 DBA 권한을 가진 사용자가 액세스 가능한 정보를 저장

 V$

 서버 성능과 Locking 정보를 저장. 일반적으로 DBA한테만 허용됨.



4. 기타 뷰

 종류

설명

 DICTIONARY

 모든 데이터 사전 테이블.

 뷰, 동의어가 저장되어 있다.

 TABLE_PRIVILEAGES

 사용자가 권한을 부여했거나, 부여받은 Object에 대한 권한을 표기한다.

 IND

 USER_INDEXS 동의어


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
-- "XXXX월 XX월 X째주"를 출력하는 쿼리.
-- 단, 이전달과 다음달이 이어지는 마지막 주의 경우, 평일 5일중 3일 이상이 속해있는 달로 치환되어야 하는 경우.
-- (ex. '2017-12-01' => 2017년 11월 5째주 / '2015-01-01' => 2014년 12월 5째주 로 출력되어야 함)
--
--
-- 무조건 평일 5일중 3일 이상이 속해있는 달로 치환되어야 하기 때문에, 어떤 날짜를 파라미터로 넣어도
-- 그 날짜가 속해있는 목요일의 날짜를 뽑도록 하여 기준을 잡았다.
-- => ㄱ) 해당 날짜가 속해있는 수요일의 날짜가 (DD가) 2보다 작을 때 (다음 달이 될 날짜들이 평일 5일중 3일 이상일 때)
--          다음 달의 첫번째 주차 (1주차)로 끼워넣음 
SELECT
    YYYYMM || JJA || '째주' AS WEEKLY_DT
FROM (SELECT
        CASE
            WHEN TO_CHAR(TODAY_DATE, 'DD'< 02
            THEN SUBSTR(TO_CHAR(ADD_MONTHS(TODAY_DATE, -1), 'YYYY-MM-DD'), 04|| '년 ' || SUBSTR(TO_CHAR(ADD_MONTHS(TODAY_DATE, -1), 'YYYYMMDD'), 52|| '월 '
            ELSE SUBSTR(TO_CHAR(TODAY_DATE, 'YYYY-MM-DD'), 04|| '년 ' || SUBSTR(TO_CHAR(TODAY_DATE, 'YYYYMMDD'), 52|| '월 '
        END AS YYYYMM,
        CASE
            WHEN TO_CHAR(TODAY_DATE, 'DD'< 02
            THEN TO_CHAR(TRUNC(TODAY_DATE -1'IW'), 'W')
            ELSE TO_CHAR(TODAY_DATE, 'W')
        END AS JJA
          -- 그 날짜가 속해있는 목요일의 날짜를 뽑는 쿼리
        FROM (SELECT
                TRUNC(TO_DATE(#params#, 'YYYY-MM-DD'), 'IW'+ LEVEL + 2 AS TODAY_DATE
            FROM
                DUAL
            CONNECT BY LEVEL <= 1
        ) WED_DAY
);
cs


+ Recent posts