SOME과 ANY는 명칭만 다를 뿐, 동일한 기능을 하는 연산자라고 생각하면 된다.

ANY, ALL은 서브쿼리와 함께 사용하는 다중 행 연산자이며, ANY는 조건을 만족하는 값이 하나라도 있으면 결과를 보여주고 ALL은 모든 값이 조건을 만족해야 결과를 보여준다.

 

ANY (SOME)

WHERE 100 = ANY (100, 200, 300) : ANY 값과 동일한 데이터인 100만 조회된다

WHERE 100 > ANY (100, 200, 300) : ANY의 최소값 100보다 큰 데이터인 200, 300이 조회된다

WHERE 100 >= ANY (100, 200, 300) : ANY의 최소값 100보다 크거나 같은 데이터인 100, 200, 300이 전부 조회된다

WHERE 100 < ANY (100, 200, 300) : ANY의 최대값 300보다 작은 데이터인 100, 200이 조회된다

WHERE 100 <= ANY (100, 200, 300) : ANY의 최대값 300보다 작거나 같은 데이터인 100, 200, 300이 전부 조회된다

WHERE 100 <> ANY (100, 200, 300) : ANY 값 중 모두 일치하지 않는 데이터가 조회된다

                                                 ANY의 값이 2개 이상인 경우, 해당 조건 의미 없이 모든 데이터가 조회된다

 

 

 

ALL

WHERE STUDENT > ALL (100, 200, 300) : ALL의 최대값 300보다 큰 데이터만 조회된다

WHERE STUDENT >= ALL (100, 200, 300) : ALL의 최대값 300보다 크거나 같은 데이터만 조회된다

WHERE STUDENT < ALL (100, 200, 300) : ALL의 최소값 100보다 작은 데이터만 조회된다

WHERE STUDENT <= ALL (100, 200, 300) : ALL의 최소값 100보다 작거나 같은 데이터만 조회된다

WHERE STUDENT = ALL (100, 200, 300) : ALL의 모든 값을 만족해야 데이터가 조회된다

                                                                      ALL 값이 2개 이상인 경우, 조건을 만족할 수 없어 사용할 수 없다

WHERE STUDENT <> ALL (100, 200, 300) : ALL의 모든 값과 일치하지 않는 데이터만 조회된다

나누기 연산 중 분모가 0일 때 발생하는 오류.

 

1. NVL(분자 / DECODE(분모, 0, NULL, 분모), 0) 사용

 

2. CASE WHEN NVL(분모, 0) > 0 THEN 연산식~ ELSE 0 END AS ~

 

두 방법으로 해결 가능.

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

Oracle :: SOME, ANY, ALL 연산자  (0) 2020.11.18
Oracle :: 배수 출력 쿼리  (0) 2020.02.17
Oracle :: Procedure (프로시저)  (0) 2019.08.08
Oracle :: DB Function vs Procedure vs Package  (0) 2019.04.10
Oracle :: DB Link (Database Link)  (0) 2019.04.09
1
2
3
4
SELECT * 
FROM 
SELECT LEVEL AS NO FROM DUAL CONNECT BY LEVEL <= 50) BBB
WHERE MOD(NO, 5= 0;

N의 배수를 출력하기 위한 배수 출력 쿼리이다.

LEVEL 값을 어디까지 반복하느냐에 따라 배수를 조절하여 출력할 수 있다.

1. 정의

- SQL 문장에서 변수정의, 조건처리(IF), 반복처리(LOOP, WHILE, FOR)를 지원

- 오라클에 내장되어 있는 Procedure Language

- PL/SQL 문은 블록 구조로 되어있고, PL/SQL 자신이 컴파일 엔진을 가지고 있음

- DECLARE문을 이용하여 정의됨(선언문의 사용은 선택 사항)

 

 

2. 생성

 

3. 실행

 

 

4. 제거

1. Function (함수)

- 값을 계산한 후 결과값을 반환하기 위해 주로 사용

- 프로시져와의 차이점

  ㄱ) IN 파라미터만 사용 가능

  ㄴ) 반환될 데이터 타입을 반드시 RETURN문에 선언해야 함 (값 없이는 RETURN문을 포함할 수 없음)

  ㄷ) PL / SQL 블록 내에서 RETURN문을 통해 반드시 값을 반환해야 함

- 코딩을 클라이언트 상에서 함

  (화면단~클라이언트~에서 함수에게 값을 호출하면, 함수는 서버에서 필요한 값들을 가지고 와

   함수 내에서 작업하여 얻어낸 값을 호출했던 클라이언트에게 넘겨줌

 

 

2. Procedure (프로시져)

- 지정된 특정 처리를 시행하는 서브 프로그램의 한 유형

- 단독으로 실행되거나, 다른 프로시져나 다른 틀 또는 다른 환경 등에서 호출되어 실행됨

- 처음 생성 후 컴파일 할 때 오브젝트로서 데이터베이스 내에에 저장되며

  이후로 반복적으로 호출되어 실행 될 때 별도의 컴파일 없이 생성된 코드로 바로 실행

- 명칭이 있는 PL / SQL 블록

- 매개 변수를 받을 수 있고, 반복적으로도 사용 가능

- 보통은 연속 실행, 구현이 복잡한 트랜잭션을 수행하는 PL / SQL 블록을 DB에 저장하기 위해 생성

- 코딩을 서버(DB)상에서 함

  (화면단~클라이언트~에서 프로시져에게 값을 호출하면, 프로시져는 받은 값을 가지고

  서버에서 작업하여 얻어낸 값을 호출했던 클라이언트에게 넘겨줌)

- 값 없이 RETURN문을 포함할 수 있음

- 함수보다 속도가 빠름

 

 

3. Package (패키지)

- Oracle DB에 저장되어 있는, 서로 관련 있는 PL / SQL 프로시져, 함수의 집합

- 선언부 / 본문. 두 부분으로 나눠짐

 

* Package > Procedure > Function

1. 정의

- 물리적으로 다른 위치에 있는 DB를 마치 자신의 DB에 있는 것처럼 사용할 수 있도록 링크를 거는 것

- 현재의 DB에서 네트워크 상의 다른 DB에 접속하기 위한 접속 설정

- Oracle DB만이 가진 특징

 

 

2. 조건

- 오라클 인스턴스 (DBMS가 작업을 하는 공간)가 2개 이상이어야 함

- 연결할 두 DB의 Host Name과 Oracle SID가 달라야 함

- NLS_CHARACTER SET은 동일해야 함

 

 

3. 예시

 

 

 

 

해당 페이지를 들어갔을 경우

org.springframework.jdbc.UncategorizedSQLException: SqlMapClient operation; uncategorized SQLException for SQL []; SQL state[null]; error code [0]; iBatis "The error happend wile setting a property on the result object."

라는 에러가 발생했다.

 

쿼리에서 조회하는 값이 NULL일 경우, resultMap과 VO에 선언된 값이 매핑되지 않아 발생한 오류였다.

 

iBatis에서 resultMap이 선언된 부분에 nullValue를 추가로 기입하여 해결했다.

1
2
3
4
<!-- result property를 선언하는 부분에 nullValue를 추가로 기입한다.
     0이든 공백이든 null일 떄의 값을 처리하는 방식이니 둘 다 가능하다. -->
<result property="viewCount" column="VIEW_COUNT" nullvalue="0" />
<result property="viewCount" column="VIEW_COUNT" nullvalue="" />
cs
1
2
3
4
5
6
<select id="" resultClass="egovMap">
    SELECT
        TO_CHAR(WN_CONCAT(STUDENT)) AS STUDENT
    FROM
        SCHOOL
</select>
cs

 

이와 비슷한 쿼리를 출력하여 json으로 출력해야 하는 일이 있었는데, 자꾸 버전이 맞지 않는다는 JSON 오류가 났었다.

 

오라클에서 WN_CONCAT을 사용시 해당 컬럼을 단일 컬럼으로 합쳐 출력하지만, egovMap에서는 해당 컬럼을 배열로 받아온다는 사실을 깨닳았고 WN_CONCAT으로 단일 컬럼화한 것을 한 번 더 TO_CHAR() 로 문자화 해줬더니 오류가 해결되었다.

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등의 값을 넣어야 한다.

+ Recent posts