오라클, ROWNUM 및 NULL이란, , NLS Parameters, NLS_DATE_FORMAT, NLS_LANGUAGE, NLS_TERRITORY,
http://ojc.asia/bbs/board.php?bo_table=LecSQLnPlSql&wr_id=607
3.3 ROWNUM 및 NULL값, NLS_DATE_FORMAT
3.3.1 ROWNUM
ROWNUM은 의사 칼럼으로 참조만 될 뿐 데이터베이스에 저장되지 않는다. (DESC 명령으로 보이지 않는 의사 칼럼). SELECT절에 의해 추출되는 데이터(ROW)에 붙는 순번이다. 다시 말해 WHERE절까지 만족 시킨 자료에 1부터 붙는 순번이다. WHERE절에 ROWNUM을 이용하여 조건을 주면 다른 조건을 만족시킨 결과에 대해 조건이 반영된다. SELECT 리스트에 ROWNUM을 이용하는 것도 물론 가능하다. ORDER BY를 사용한다면 WHERE절까지 만족 시킨 결과에 ROWNUM이 붙은 상태로 ORDER BY가 반영된다. 즉 ROWNUM은 ORDER BY전에 부여되며, ORDER BY는 맨 나중에 실행된다.
- ROWNUM을 변경하기 위해 DML을 사용할 수 없다.
- 주로 <, <= 사용하며 >, >= 인 경우 ROWNUM은 동작하지 않는다.
- ROWNUM = 1은 사용 가능 하지만 ROWNUM=2 인 경우는 데이터가 추출되지 않는다. (ROWNUM은 WHERE절을 만족하는 레코드에 붙이는 순번이므로 해석해 보면, 처음 한 건 추출해서 ROWNUM이 2인지 비교한다. 처음 레코드는 ROWNUM이 1, 조건에 맞지 않으므로 버리고 다른 다음 레코드 선택 후 또 ROWNUM이 2인지 비교하지만 역시 새로 추출되는 레코드는 ROWNUM이 1이므로 버리고 새로운 레코드를 추출한다, 이 과정을 반복해 보면 ROWNUM = 2는 도달할 수 없는 값이 됨을 알 수 있다.)
3.3.2 NULL이란?
NULL은 공백이나 0과는 다른 값이 비어있다는 것을 의미한다. EMP 테이블에서 COMM 칼럼이 NULL이라는 것은 아직 수당이 정해지지 않거나 해서 값이 없음을 나타내는 것이지 수당이 0임을 나타내는 것은 아니다. 즉 아직 값이 적용되지 않았음을 의미한다. 오라클에서 칼럼에 아무런값이 없는 경우에 “칼럼이 널 값을 가졌다” 라고 하며 널 값은 칼럼이 NOT NULL로 설계되지 않았다면 어떤 데이터 타입에도 나타날 수 있고 길이가 0 으로 DATA를 위한 물리적 공간을 차지하지 않는다.
모든 오라클 스칼라 함수들은 NULL을 입력 받으면 널값을 리턴하며(NVL, REPLACE, CONCAT함수는 제외), 집합/집계 함수의 경우 NULL은 연산 대상에서 빠진다. 널 값하고 하는 모든 사칙연산은 모두 NULL이다. 예를 들자면 세 명의 학생이 있는데 국어 점수가 NULL, 100, 200 이라고 하자. 오라클 집계함수 AVG를 이용하게 되면 NULL인 데이터는 연산 대상에서 빠져 평균은 150 이된다. 흔히 세명 이니 평균이 100이라고 볼 수 있지만 널 값을 가진 칼럼 이기에 연산 대상에서 제외 된 것이다.
NULL값을 가진 칼럼에 대해 WHERE절에 NULL인지 확인 하기 위해서는 반드시 IS NULL, IS NOT NULL을 사용해야 한다. (= 또는 != 사용하지 말라!)
NULL값을 처리하는 함수는 NVL, NVL2, NULLIF, COALESC 등이 있으니 SQL함수에서 확인하자.
3.3.3 NLS Parameters
NLS(National Language Support)는 언어 지원과 관련된 파라미터를 지칭하며
SQL*PLUS등에서 확인 하려면 다음과 같이 조회한다.
NLS_DATE_FORMAT이란?
테이블의 날짜형 칼럼에 값을 입력 시 DATE형으로 만들어 입력을 하거나 NLS_DATE_FORMAT에 맞는 문자열이라면 문자열로 입력이 가능하다. 가끔 날짜형에 문자를 넣을 때 FORMAT이 맞지 않아 애로사항이 있을 수 있으니 NLS_DATE_FORMAT 값을 알고 그 형식대로 문자열을 입력하면 된다.
실제 날짜 표기(TO_CHAR, TO_DATE 실행시) “월요일”, “MON” 으로 표시를 좌우하는 NLS_DATE_FORMAT 값은 NLS_LANGUAGE 을 따른다.
NLS_DATE_FORMAT은 현재 시스템의 기본 날짜 입출력 형태를 지정하는 파라미터 이며 TO_CHAR, TO_DATE 함수의 기본 DATE FORMAT이다.
NLS_LANG, NLS_LANGUAGE, NLS_TERRITORY
NLS_LANG : 오라클 데이터베이스의 환경변수 값이 아니라 사용자 환경을 Oracle DB 알려주는 역할을 하는 환경변수.
NLS_LANG = [언어]_[영역].[문자셋]
<language>_<Territory>.<client characterset>
예) AMERICAN_AMERICA.KO16KSC5601, AMERICAN_AMERICA.UTF8, KOREAN_KOREA.KO16KSC5601
언어 :현재 사용자가 사용하는 언어적 특성을 결정짓는 값
문자셋, 정렬방식, 날짜 표기에 사용되는 기호(년/월/일, YYYY/MM/DD)
Default 값은 AMERICAN 이다.
실제 날짜 표기(TO_CHAR,TO_DATE 실행시 - 월요일, MON 으로 표시를 좌우하는 NLS_DATE_FORMAT 값은 NLS_LANGUAGE 을 따른다.
영역 :현재 사용자 언어의 영역의 특성을 결정짓는 값
Language 값만 설정하면, Language 값을 따른다. ( KOREAN ==> KOREA )
문자셋 :현재 사용자의 시스템이 인식할 수 있는 문자셋의 값
만약에 Windows Client에서 한국어 환경을 사용하는 경우 NLS_LANG 값을′KOREAN_KOREA.KO16MSWIN949′로
유닉스 Client에서 한국어를 입출력한다면 다음과 같이 NLS_LANG을 ′KOREAN_KOREA.KO16KSC5601′로 설정 할 수 있다.
[NLS관련 주요 변수]
NLS_TERRITORY : 영역 설정 - NLS_LANG 변수값에 의해 자동 설정
설정 방법예 : ALTER SESSION SET NLS_TERRITORY = 'KOREA'
NLS_LANGUAGE : 언어 설정- NLS_LANG 변수값에 의해 자동 설정 초기화변수
설정 방법예 : ALTER SESSION SET NLS_LANGUAGE = 'KOREAN'
NLS_LANG : 언어,영역, 캐릭터셋 설정 - 기본값은 ′AMERICAN_AMERICA.US7ASCII′
설정 방법예 : OS 환경변수로 설정
NLS_COMP : SQL에서의 비교 방식(<,>,=) 설정 - BINARY값으로 비교
설정 방법예 : ALTER SESSION SET NLS_COMP =''
NLS_SORT : 문자열의 정렬방법 설정 - NLS_LANGUAGE값에 따라 결정
설정 방법예 : ALTER SESSION SET NLS_SORT = 'KOREAN_M'
[NLS_LANG 지정 방법]
1. SESSION LEVEL
- select * from nls_session_parameters 로 확인 가능
- 변경 방법1.
-- 변경
SQL> ALTER SESSION SET NLS_LANGUAGE='KOREAN';
- 변경 방법2.
UNIX, WINDOWS 환병변수에서 NLS_LANG 값을 변경한다.
UNIX - export NLS_LANG=American_America.US7ASCII 설정
Windows - SET NLS_LANG=American_America.US7ASCII 설정
2. INSTANCE LEVEL
- SELECT * FROM NLS_INSTANCE_PARAMETERS ; 를 통해서 확인 가능
- SELECT NAME, VALUE FROM V$PARAMETER WHERE NAME LIKE '%NLS%';
3. DB LEVEL
- SELECT * FROM NLS_DATABASE_PARAMETERS ;
- SELECT NAME, VALUE$ FROM SYS.PROPS$ WHERE NAME LIKE '%NLS%' ;
- SELECT * FROM V$NLS_PARAMETERS 에서 확인 가능
댓글 없음:
댓글 쓰기