Oracle

게시글 보기
작성자 유건데이타 등록일 2015-05-18
제목 (V2.3) HANDLING NULL VALUE IN PL/SQL
(V2.3) HANDLING NULL VALUE IN PL/SQL
====================================

PURPOSE
-------

이 자료는 NULL value가 PL/SQL 내에서 사용될 때 알아두면 편리한 내용으
로 기본적으로 기억해야 할 몇 가지 rule을 소개하고자 한다.


Explanation & Example
---------------------

1. NULL value와 어떤 다른 value 와의 비교 연산 결과는 항상 NULL이다.

<예제>

x := 5;
y := NULL;
...
IF x != y THEN -- yields NULL, not TRUE
sequence_of_statements; -- not executed
END IF;

위의 예제에서 x 값과 y 값이 다르기 때문에 조건문 내의 statement가
수행되리라고 예상할 수 있다. 그러나, NULL은 indeterminate한 값이므로,
IF 조건문의 반환 결과는 NULL이고, 그 이하의 문장들은 수행되지 않는다.

<예제>

a := NULL;
b := NULL;
...
IF a = b THEN -- yields NULL, not TRUE
sequence_of_statements; -- not executed
END IF;

위의 예제에서 a 값과 b 값이 같기 때문에 조건문 내의 statement가
수행되리라고 예상할 수 있다. 그러나, NULL은 결정되어진 값이 아니므로,
IF 조건문의 반환 결과 역시 NULL이고, 그 이하의 문장들은 수행되지 않는다.


2. NULL value에 논리 연산자인 NOT operator를 적용하면 NULL을 반환한다.

<예제>

1) IF x > y THEN
high := x;
ELSE
high := y;
END IF;

2) IF NOT x > y THEN
high := y;
ELSE
high := x;
END IF;

이 예제는 NULL value에 NOT operator를 적용하게 되면 NULL을 return하므로,
위 두 개의 예제의 결과가 항상 같지는 않다는 것을 의미한다.
IF 조건문의 결과가 FALSE 또는 NULL 일 경우 ELSE 절 내의 문장들이 수행된다.
만약, x나 y 둘 중의 하나 또는 x, y 둘 다 모두 NULL 일 경우,
1) 번에서는 y 값이 high 라는 변수에 assign 되지만,
2) 번에서는 x 값이 high 라는 변수에 assign 된다.

그러나, x, y 모두 어느 것도 NULL이 아니라면 같은 값이 high에 assign된다.


3. 위의 경우에서처럼 조건 제어문에서 만약 그 조건이 NULL을 반환한다면,
그 조건의 결과에 연관된 일련의 statement들은 수행되지 못한다.


4. Zero-Length Strings

PL/SQL에서는 character function이나 boolean expression에 의해 반환된
Zero-Length String을 NULL 처럼 다룬다.
예를 들어, 다음 문장들은 NULL을 target 변수에 assign한다.

<예>
null_string := TO_VARCHAR2('');
zip_code := SUBSTR(address, 25, 0);
valid := (name != '');

어떤 문자열이 NULL인지 아닌지를 확인하기 위해서는 IS NULL operator를
사용하면 된다.
LIKE '' 와 같은 용법은 허용되지 않는다.

<예>
IF my_string IS NULL THEN ...


5. Concatenation Operator

Concatenation Operator는 NULL인 피연산자를 무시한다.

<예>
'apple' || NULL || NULL || 'sauce'

위와 같은 표현식은 'applesauce' 를 반환한다.


6. Built-in function에 NULL argument가 들어갈 때, NULL이 아닌 다른
값을 반환받고자 할 때 사용되는 함수를 알아보기로 한다.

1) DECODE
: DECODE 함수는 그 첫번째 인자의 값을 그 뒤에 이어지는 하나 또는 그 이상
의 search expression과 비교하여 그에 상응하는 결과값을 반환한다.

<예>
SELECT DECODE(rating, NULL, 1000, 'C', 2000, 'B', 4000, 'A', 5000)
INTO credit_limit
FROM accts WHERE acctno = my_acctno;

컬럼 rating의 값이 NULL이면 DECODE 함수는 1000을 반환한다.


2) NVL
: NVL 함수는 그 첫번째 인자의 값이 NULL이면 두번째 인자의 값을 반환한다.

<예>
start_date := NVL(hire_date, SYSDATE);

위 예에서 hire_date 값이 NULL이면 SYSDATE를 반환하고, NULL이 아니면
hire_date를 반환한다.


3) REPLACE(char, search_string [, replacement_string])
: REPLACE 함수는 그 첫번째 인자의 값을 읽어서 search_string의 문자열을
replacement_string 의 값으로 대체해 준다.

<예>
만약, replacement_string의 값이 생략되거나 NULL이면 search_string 에
나타난 string들은 모두 제거된다.

syllabified_name := 'Gold-i-locks';
name := REPLACE(syllabified_name, '-', NULL);

name의 값은 'Goldilocks'이다.

<예>
만약, search_string이 NULL이면 첫번째 인자인 char가 그대로 반환된다.
세번째 인자는 옵션이므로, 세번째 인자의 존재 여부에 상관없이
첫번째 인자의 value를 반환한다.
search_string과 replacement_string의 값이 모두 NULL 이라 할지라도
첫번째 인자인 char를 반환한다.

new_string := REPLACE(old_string, NULL, my_string);

위와 같은 경우 old_string과 new_string의 value는 같다는 것이다.


Reference Documents
-------------------
Oracle 7 PL/SQL Developer's Guide
Comment
등록된 코멘트가 없습니다.