네이버는 POST방식도 허용 하던데 구글은 POST로 넘기면 오류메세지에 관련된 XML만 넘어오더군요
그래서 그냥 GET방식으로 처리하니 정상적인 XML값이 넘어오네요..ㅋㅋ
Java로 작업하고 나서 테스트 해볼려고 함 만들었네요..~~
vKey는 구글에서 생성하고 적용하십시요

==> 본인의 글 입니다. 이 글을 다른곳에 게재하는 경우 본문의 출처를 밝혀주시기 바람니다.
/**
  * 구글맵 키 생성 URL
  * http://code.google.com/intl/ko-KR/apis/maps/signup.html
  *
 **/

DECLARE
	vRequest		UTL_HTTP.req;
	vResponse		UTL_HTTP.resp;
	vResponseText	VARCHAR2(4000);
	vErrorText		VARCHAR2(4000);
	vTxt			VARCHAR2(10);
	vAddress		VARCHAR2(1000);
	vCoordinateX	VARCHAR2(100);
	vCoordinateY	VARCHAR2(100);
	vCoordinates	VARCHAR2(100);
	vXml			XMLType;
	i				BINARY_INTEGER	:= 0;
	
	--구글관련 설정내용
	vUrl			VARCHAR2(200) := 'http://maps.google.com/maps/geo';
	vKey			VARCHAR2(300) := 'ABQIAAAApvInj0M12LgrKqPVykdiShTRzhAzSQ3u4E7LYXha2CwyHvWJ_RTAzTyv3xCX_ja0mBuaI1HJQ9QLgQ';
	vQuery			VARCHAR2(200) := '서울구로구구로동222-12';
	vXmlns			VARCHAR2(100) := 'xmlns="http://earth.google.com/kml/2.0';

	--SPLIT 함수호출
	CURSOR STR_SPLIT(str IN VARCHAR2, sp IN VARCHAR2)
	IS
		SELECT COLUMN_VALUE FROM TABLE(SPLIT(str, sp));
		TYPE TABLE_SPLIT IS TABLE OF VARCHAR2(100) INDEX BY BINARY_INTEGER;
	
	aCoordinates	TABLE_SPLIT;

BEGIN

	--vQuery    := convert(vQuery, 'KO16MSWIN949', 'UTF8');
	vUrl      := vUrl || '?q=' || vQuery || CHR(38) || 'gl=KR' || CHR(38) || 'output=xml' || CHR(38) || 'key=' || vKey;

	DBMS_OUTPUT.put_line('===================================================================');
	DBMS_OUTPUT.put_line('                         전송한 URL                                ');
	DBMS_OUTPUT.put_line('===================================================================');
	DBMS_OUTPUT.put_line(vUrl);
	
	vRequest := UTL_HTTP.begin_request(vUrl,  'GET', 'HTTP/1.1');
	UTL_HTTP.set_header(vRequest, 'Accept-Language',  'ko');
	UTL_HTTP.set_header(vRequest, 'Accept',           'text/xml');
	UTL_HTTP.set_header(vRequest, 'User-Agent',       'Mozilla/4.0');
	UTL_HTTP.set_body_charset('utf8');

	vResponse := UTL_HTTP.get_response(vRequest);

	IF vResponse.status_code = '200'
	THEN
		UTL_HTTP.read_text(vResponse, vResponseText);

		IF vResponseText NOT LIKE 'Result=OK%'
		THEN
			vXml     := XMLType.createXML(TRIM(vResponseText));
			vAddress := NULL;
			i        := 0;

			SELECT vXml.extract('//Response/Placemark/address/text()',           vXmlns).getstringval() INTO vAddress     FROM dual;
			SELECT vXml.extract('//Response/Placemark/Point/coordinates/text()', vXmlns).getstringval() INTO vCoordinates FROM dual;

			IF vAddress IS NOT NULL
			THEN
				FOR COLNAME_LIST IN STR_SPLIT(vCoordinates, ',')
				LOOP
					i := i + 1;
					aCoordinates(i) := COLNAME_LIST.COLUMN_VALUE;
				END LOOP;
				
				IF i > 1 THEN
					vCoordinateX := aCoordinates(1);
					vCoordinateY := aCoordinates(2);
					DBMS_OUTPUT.put_line(CHR(13) || CHR(13));
					DBMS_OUTPUT.put_line('===================================================================');
					DBMS_OUTPUT.put_line('                         주소/좌표 추출                            ');
					DBMS_OUTPUT.put_line('===================================================================');
					DBMS_OUTPUT.put_line('주소   >> ' || vAddress);
					DBMS_OUTPUT.put_line('X 좌표 >> ' || vCoordinateX);
					DBMS_OUTPUT.put_line('Y 좌표 >> ' || vCoordinateY);
				END IF;

			END IF; -- IF vAddress IS NOT NULL End.

			vErrorText := vResponseText;

		END IF; -- IF vResponseText NOT LIKE 'Result=OK%' End.

	ELSE
		vErrorText := 'HTTP status: '||vResponse.status_code||'-'||vResponse.reason_phrase;
	END IF; -- IF vResponse.status_code = '200' End.

	DBMS_OUTPUT.put_line(CHR(13) || CHR(13));
	DBMS_OUTPUT.put_line('===================================================================');
	DBMS_OUTPUT.put_line('                         전송받은 XML                              ');
	DBMS_OUTPUT.put_line('===================================================================');
	DBMS_OUTPUT.put_line(vErrorText);


	UTL_HTTP.end_response(vResponse);
END;
블로그 이미지

유효하지않음

,

ORA-08002: 시퀀스 **.CURRVAL은 이 세션에서는 정의 되어 있지 않습니다

NEXTVAL 하기 전까지는 CURRVAL을 동일세션에서 사용할 수 없습니다

굳이 필요하다면 다음과 같이 해야합니다

 SELECT  LAST_NUMBER
 FROM    USER_SEQUENCES
 WHERE  SEQUENCE_NAME = '시퀀스명(대문자)'

블로그 이미지

유효하지않음

,
 . exporting table NG01_REPORT_INFO
EXP-00056: ORACLE error 24801 encountered
ORA-24801: illegal parameter value in OCI lob function
. . exporting table NG01_REPORT_LINK 0 rows exported
. . exporting table NG01_SCORE_OF_INFO 72 rows exported
EXP-00002: error in writing to export file
EXP-00056: ORACLE error 1403 encountered
ORA-01403: no data found
. . exporting table NG01_SMS_LOG_INFO
EXP-00015: error on row 96 of table NG01_SMS_LOG_INFO, column SLI_TEXTMSG, datatype 1
EXP-00002: error in writing to export file
EXP-00002: error in writing to export fileerror closing export file 20081120_qes_bsc.dmp
EXP-00000: Export terminated unsuccessfully
$ . . exporting table NG01_PROTEST 142 rows exported
ksh: .: not found
$ . . exporting table NG01_QNA 0 rows exported
ksh: .: not found
$ . . exporting table NG01_REPORT_COMMENT 20138 rows exported
ksh: .: not found
$ . . exporting table NG01_REPORT_INFO
ksh: .: not found



exp qes_bsc/qes_bsc file=(qes_bsc1.dmp,qes_bsc2.dmp,qes_bsc3.dmp) filesize=2G

데이터량이 많은 DB에 대해 export시 다음과 같은 오류가 발생하면 위처럼 dump파일을 여러개 만들면 된다.

블로그 이미지

유효하지않음

,
Inside Oracle Database 10g

정규 표현식을 이용한 SQL 구문의 개선

저자 - Alice Rischert

Oracle Database 10g의 정규 표현식 기능을 텍스트 데이터 처리를 위한 강력한 도구로 활용할 수 있습니다.

Oracle Database 10g에 추가된 새로운 기능을 이용하여 문자 데이터의 검색, 처리 능력을 극적으로 개선할 수 있습니다. 정규 표현식(regular expression)이라 불리는 이 기능은, 텍스트 패턴을 기술하기 위한 일종의 표기법으로, 이미 오래 전부터 다양한 프로그래밍 언어와 UNIX 유틸리티를 통해 지원되어 왔습니다.

오라클의 정규 표현식은 SQL 함수와 WHERE절 연산자의 형태로 제공됩니다. 정규 표현식에 익숙하지 않은 독자라면, 이 문서를 통해 전혀 새롭고 강력한 기능을 체험하실 수 있을 것입니다. 또 정규 표현식에 이미 친숙한 독자분들은, Oracle SQL 언어의 문맥에 이 기능을 적용하는 방법을 이해하는 기회로 활용하실 수 있습니다.

정규 표현식이란?

정규 표현식은 하나 또는 그 이상의 문자열과 메타문자(metacharacter)로 구성됩니다. 가장 단순한 형태의 정규 표현식은 cat과 같은 단 하나의 문자열로만 구성될 수 있습니다. 이 정규 표현식은 문자 c와 문자 a, 문자 t의 순서를 갖는 패턴 매치 문자열로 cat, location, catalog 등의 문자열과 매치됩니다. 메타문자는 정규 표현식을 구성하는 문자들을 처리하는 방법을 명시하기 위한 알고리즘을 제공합니다. 다양한 메타문자의 의미를 이해한다면, 정규 표현식이 텍스트 데이터를 비교하고 대체하는 용도로 매우 유용하게 활용될 수 있음을 금방 깨닫게 되실 것입니다.

데이터의 검증, 중복 단어의 확인, 불필요한 공백의 제거, 문자의 파싱(parsing) 등 정규 표현식의 활용 방법은 실로 다양합니다. 정규 표현식을 이용하여 전화 번호, 우편 번호, 이메일 주소, 주민등록번호, IP 주소, 파일 이름, 경로 이름 등을 검증할 수도 있습니다. 또 HTML 태그, 숫자, 날짜, 기타 특정 텍스트 데이터와 일치하는 패턴을 확인하고 다른 패턴으로 대체하는 것이 가능합니다.

Oracle Database 10g에서 정규 표현식 사용하기

오라클에 새로 추가된 기능으로 Oracle SQL REGEXP_LIKE 연산자, REGEXP_INSTR, REGEXP_SUBSTR, REGEXP_REPLACE 함수 등이 있습니다. 이 함수와 연산자는 기존의 LIKE 연산자와 INSTR, SUBSTR, REPLACE 함수를 보완하는 효과를 제공합니다. 실제로 새로운 기능들은 기존 연산자 및 함수와 유사하지만 훨씬 강력한 패턴 매칭 환경을 구현하고 있습니다. 검색의 기준이 되는 데이터는 간단한 문자열일 수도 있고 데이터베이스 테이블의 문자 컬럼에 저장된 대량의 텍스트일 수도 있습니다. 정규 표현식을 이용하면 이전에는 생각도 못했던 유연한 방법으로 데이터를 검색, 대체, 검증할 수 있습니다.

정규 표현식의 기본적 예제

새로운 기능을 사용해 보기기 전에, 몇 가지 메타문자의 의미를 이해해 보기로 합시다. 마침표(.)는 정규 표현식에 존재하는 모든 문자(newline 제외)와 매칭됩니다. 예를 들어 정규 표현식 a.b는 문자 a, (newline을 제외한) 임의의 단일 문자, 그리고 문자 b의 순서로 구성된 문자열과 매칭됩니다. 문자열 axb, xaybx, abba는 모두 이 정규표현식에 정의된 패턴을 포함하고 있으므로 매치가 가능합니다. 라인이 a로 시작하여 b로 끝나는, 3 개 문자로 구성된 문자열을 매칭하고자 하는 경우에는 앵커(anchor)가 사용되어야 합니다. 캐럿(^) 메타문자는 라인의 시작을, 달러($) 기호는 라인의 끝을 의미합니다 (표 1 참고). 따라서 정규 표현식 ^a.b$aab, abb, axb와 같은 문자열과 매칭됩니다. LIKE 연산자에서 이와 동일한 기능을 수행하려면 a_b 패턴을 사용해야 합니다. 여기서 밑줄 기호(_)는 단문자 와일드카드를 의미합니다.

기본적으로, 정규 표현식의 개별 문자 또는 문자 리스트는 단 한 번만 매칭됩니다. 정규 표현식은 문자가 여러 번 반복 출현되는 조건을 지정하기 위한? 반복 연산자(repetition operator)를 제공합니다("quantifier"라 부르기도 합니다). 문자 a로 시작해서 b로 끝나는 문자열 매칭을 위한 정규 표현식이 아래와 같습니다: ^a.*b$. * 메타문자는 임의의 메타문자(.)가 0 번, 한 번, 또는 여러 번 반복되는 조건에 매칭됩니다. LIKE 연산자에서는 이와 동일한 연산자로 a%b를 지원합니다. 여기서 퍼센트(%) 기호는 임의 문자가 0 번, 한 번, 또는 여러 번 반복됨을 의미합니다.

표 2는 반복 연산자의 전체 목록을 보여 주고 있습니다. 이 표에 제시된 예를 통해 정규 표현식이 기존의 LIKE와일드카드 문자보다 훨씬 뛰어난 유연성을 제공함을 확인할 수 있습니다. 표현식에 괄호를 씌우는 경우, 서브표현식(subexpression)으로 활용됩니다. 서브표현식은 임의의 횟수만큼 반복될 수 있습니다. 예를 들어, 정규 표현식 b(an)*aba, bana, banana, yourbananasplit등과 매치됩니다.

오라클의 정규 표현식은 POSIX(Portable Operating System Interface) 문자 클래스를 지원합니다(표 3 참고). 따라서 검색하는 문자의 유형을 세부적으로 정의하는 것이 가능합니다. 알파벳이 아닌 문자를 검색하는 조건을 LIKE 연산자로 작성한다면, WHERE 절이 훨씬 복잡한 형태로 구현되어야 할 것입니다.

POSIX 문자 클래스는 반드시 대괄호([])로 묶여 져야 합니다. 예를 들어, 정규 표현식 [[:lower:]]는 소문자와 매치되며 d [[:lower:]]{5}는 5 개의 연속적인 소문자와 매치됩니다.

POSIX 문자 클래스와 별도로, 개별 문자를 문자 리스트(character list)에 포함시키는 기능이 제공됩니다. 예를 들어 정규 표현식 ^ab[cd]ef$는 문자열 abcef , abdef와 매치됩니다. 여기서 c 또는 d 두 개의 문자 중 하나가 사용되고 있어야 합니다.

문자 리스트 내부에 위치하는 대부분의 메타문자는 일반 문자로 인식됩니다. 그 예외가 캐럿 (^) 기호와 하이픈 (-)기호입니다. 일부 메타문자는 문맥에 따라 다른 의미를 갖습니다. 이 때문에 정규 표현식이 무척 복잡해 보일 수도 있습니다. 캐럿 ^이 그 한 가지 예입니다. 이 기호를 문자 리스트의 첫 번째 문자로 사용되는 경우에는, 문자 리스트의 반대 조건(negation)을 의미합니다. 따라서[^[:digit:]]은  숫자가 아닌 문자로 구성된 패턴과 매칭되는 반면 ^[[:digit:]] 은  숫자로 시작되는 패턴과 매칭됩니다. 하이픈 (-)은 영역(range)을 의미합니다. 정규 표현식 [a-m]am 사이의 임의의 문자와 매칭됩니다. 하지만 [-afg]의 경우처럼 하이픈이 문자 리스트의 첫 번째 문자로 사용된 경우에는 실제 하이픈 문자를 의미합니다

앞에서 괄호를 사용하여 서브표현식을 구현하는 방법을 예시한 바 있습니다. 서브표현식에서는 수직 기호(|)메타문자를 사용하여 여러 개의 대체 문자를 지정할 수 있습니다.

예를 들어, 정규 표현식 t(a|e|i)n은 문자 tn 사이에 오는 3 개의 대체 문자를 지정하고 있습니다. tan, ten, tin, Pakistan 등의 문자열은 매치되지만 teen, mountain, tune 등은 매치되지 않습니다. 또 정규 표현식 t(a|e|i)n을 문자 리스트 t[aei]n으로 표현할 수도 있습니다. 표 4는 이러한 메타문자들을 요약하고 있습니다. 지금까지 설명한 것 말고도 다양한 메타문자가 있지만, 여기에서는 본 문서에서 예제로 사용되는 정규 표현식을 이해할 수 있는 정도만 이해하고 넘어가기로 합니다.

REGEXP_LIKE연산자

REGEXP_LIKE오라클 데이터베이스에 적용 가능한 정규 표현식 기능을 제공합니다. 표 5REGEXP_LIKE의 문법을 보여주고 있습니다

아래 SQL 쿼리의 WHERE 절에서 사용된 REGEXP_LIKE 연산자는 정규 표현식 [^[:digit:]]을 만족하는 패턴의 ZIP 컬럼을 검색하고 있습니다. 이 조건절을 이용하여, ZIPCODE 테이블로부터 숫자가 아닌 문자를 포함하는 ZIP 컬럼이 포함된 모든 로우를 가져올 수 있습니다.

SELECT zip
  FROM zipcode
 WHERE REGEXP_LIKE(zip, '[^[:digit:]]')
ZIP
-----
ab123
123xy
007ab
abcxy

이 정규 표현식은 메타문자, 좀 더 정확히 말하면 콜론과 대괄호로 묶인 POSIX 문자 클래스 digit만을 사용하고 있습니다. [^[:digit:]]에서 두 번째로 사용된 대괄호는  문자 클래스 리스트를 묶는 용도로 사용됩니다. 앞에서 설명한 것처럼 POSIX는 문자 리스트를 구성하는 용도로만 사용되므로 이와 같은 처리가 필요합니다.

REGEXP_INSTR 함수

이 함수는 패턴의 시작 위치를 반환하며, 따라서 INSTR 함수와 유사한 형태로 동작합니다. REGEXP_INSTR함수의 사옹 방법은 표 6에서 확인할 수 있습니다. 두 함수의 가장 중요한 차이는 REGEXP_INSTR를 이용하는 경우 특정 문자열이 아닌 패턴을 지정할 수 있으며, 따라서 훨씬 유연한 검색이 가능하다는 사실입니다. 다음 예에서는 REGEXP_INSTR을 사용하여 Joe Smith, 10045 Berry Lane, San Joseph, CA 91234문자열에서 5 개의 숫자로 구성된 우편 번호 패턴의 시작 부분을 반환하고 있습니다. 정규 표현식 [[:digit:]]{5}를 사용하는 경우 우편 번호가 아닌 집 주소 번호의 시작 위치를 얻게 됩니다 (처음으로 검색되는 5 개 연속 숫자 패턴이 10045이기 때문입니다). 따라서 $ 메타문자를 사용하여 표현식의 앵커를 라인 끝부분으로 지정해야 합니다. 이렇게 하면 집 주소 번호에 관계없이 우편 번호의 시작 위치를 얻을 수 있습니다.

SELECT REGEXP_INSTR('Joe Smith, 10045 Berry Lane, San Joseph, CA 91234',
       '[[:digit:]]{5}$')
       AS rx_instr
  FROM dual
  RX_INSTR
----------
        45

좀 더 복잡한 패턴의 작성

앞의 예의 우편 번호 패턴을 확장하여 네 가지 숫자를 포함하는 패턴을 만들어 보기로 합시다. 새로 작성된 패턴이 아래와 같습니다:

[[:digit:]]{5}(-[[:digit:]]{4})?$.

소스 문자열이 5 개 숫자로 종료되든, 또는 "5 개 숫자 + 4 자리 우편 번호" 포맷을 갖든, 패턴의 시작 위치를 얻을 수 있습니다.

SELECT REGEXP_INSTR('Joe Smith, 10045 Berry Lane, San Joseph, CA 91234-1234',
       ' [[:digit:]]{5}(-[[:digit:]]{4})?$')
    AS starts_at
  FROM dual
 STARTS_AT
----------
        44

위의 예에서 괄호로 묶인 서브표현식 (-[[:digit:]]{4})는 반복 연산자 ?로 지정된 조건에 따라 0 회 또는 1 회 반복됩니다. 다시 말하지만, 기존의 SQL 함수를 이용하여 같은 결과를 얻어 내려면 아무리 SQL 전문가라 해도 쉽지 않은 작업이 될 것입니다. 표 7은 정규 표현식을 구성하는 각 문자와 메타문자의 의미를 설명하고 있습니다.

REGEXP_SUBSTR함수

REGEXP_SUBSTR 함수는 SUBSTR 함수와 마찬가지로 문자열의 일부를 추출합니다. 표 8은 새로운 함수의 사용법을 설명하고 있습니다. 아래 예제에서는 [^,]*, 패턴에 매치되는 문자열이 반환됩니다. 정규 표현식은 공백에 이어 사용된 쉼표를 검색하고, 쉼표가 아닌 문자가 0 회 또는 그 이상 반복되는 패턴을 검색([^,]*)한 후 마지막으로 또 다른 쉼표를 검색합니다. 이 패턴은 쉼표로 구분된 문자열(comma-separated values)과 유사한 배열을 갖습니다.

SELECT REGEXP_SUBSTR('first field, second field , third field',
       ', [^,]*,')
  FROM dual
REGEXP_SUBSTR('FIR
------------------
, second field   ,

REGEXP_REPLACE 함수

특정 문자열을 다른 문자열로 대체하는 기존의 REPLACE SQL 함수의 기능을 잠시 되짚어 보겠습니다. 데이터의 텍스트에 필요 이상의 공백 기호가 존재하는 상황에서, 이를 단일 공백 기호로 대체하는 경우를 가정해 봅시다 REPLACE 함수를 사용할 때에는 대체할 공백 기호의 숫자를 정확하게 지정해야 합니다. 하지만, 필요 없는 공백의 수가 일정하리라는 보장은 없습니다. 아래 예는 JoeSmith사이에 3 개의 공백 기호가 존재하는 경우를 검색하고 있습니다. REPLACE 함수의 매개변수는 두 개의 공백 기호를 하나의 공백 기호로 대체할 것을 명시하고 있습니다. 하지만 JoeSmith 사이에 3 개의 공백 기호가 존재하는 경우에는 여전히 필요 없는 공백이 하나 남게 됩니다.

SELECT REPLACE('Joe   Smith','  ', ' ')
       AS replace
  FROM dual
REPLACE
---------
Joe Smith

REGEXP_REPLACE 한층 개선된 문자열 대체 기능을 제공합니다. 그 사용법은 표 9에서 설명되고 있습니다. 아래 쿼리는 두 개 또는 그 이상의 공백 기호를 하나의 공백 기호로 대체합니다. ( )서브표현식은 하나의 공백 기호를 포함하며 {2,}의 조건에 의해 지정된 대로 2 회 또는 그 이상 반복되는 조건을 명시합니다.

SELECT REGEXP_REPLACE('Joe   Smith',
       '( ){2,}', ' ')
       AS RX_REPLACE
  FROM dual
RX_REPLACE
----------
Joe Smith

 

백레퍼런스(Backreference)

정규 표현식의 유용한 기능의 하나로 재활용을 위해 서브표현식을 저장하는 기능이 제공됩니다. 이 기능을 백레퍼런스(backreferencing)라 부릅니다(상세한 설명은 표 10 참고). 백레퍼런스를 이용하여 패턴을 새로운 위치에 맞교체하거나 반복적인 단어 또는 문자를 검색하는 등의 고급 대체 기능을 구현할 수 있습니다. 서브표현식과 일치하는 문자열은 임시 버퍼에 저장됩니다. 이 버퍼에는 왼쪽에서 오른쪽 순서로 숫자가 매겨지며 \digit 형태로 표현됩니다. 여기서 digit은 1과 9 사이의 숫자를 의미하며 각 숫자에 해당하는 서브표현식과 매치됩니다.

아래 예제는 서브익스프레션에 대한 백레퍼런스를 이용하여 Ellen Hildi Smith라는 이름을 Smith, Ellen Hildi로 변환하고 있습니다.

SELECT REGEXP_REPLACE(
       'Ellen Hildi Smith',
       '(.*) (.*) (.*)', '\3, \1 \2')
  FROM dual
REGEXP_REPLACE('EL
------------------
Smith, Ellen Hildi

위의 SQL 구문은 각각 괄호로 묶인 3 개의 서브표현식을 사용하고 있습니다. 각 서브표현식은 임의의 단일 문자와 매치되는 메타문자(.)와, 임의의 문자(newline 제외)와 0 회 또는 그 이상 매치되는 * 메타문자를 연이어 사용하고 있습니다. 각 서브표현식 사이에 사용된 공백 기호 역시 매치되어야 합니다. 괄호로 묶인 서브표현식에 의해 캡처된 값은 \digit에 의해 참조할 수 있습니다. 따라서 첫 번째 서브표현식에는 \1이, 두 번째 표현식에는\2이 할당됩니다. 이 백레퍼런스들은 함수의 마지막 매개변수 (\3, \1 \2)로 사용되어, 서브문자열을 대체하고 (쉼표와 공백을 포함하는) 포맷으로 표현하는 용도로 활용되고 있습니다. 표 11은 정규 표현식의 개별 컴포넌트에 대한 상세 정보를 설명하고 있습니다.

백레퍼런스는 값을 대체, 포맷하는 용도로 유용하게 활용되며, 서로 인접한 값을 찾기 위해 이용할 수도 있습니다. 다음 예제는 REGEP_SUBSTR 함수를 이용하여 공백 기호로 구분된 알파벳/숫자 값의 중복 사례를 검색하고 있습니다. 이 함수가 반환된 서브문자열을 통해 is 문자열이 반복되고 있음을 알 수 있습니다.

SELECT REGEXP_SUBSTR(
       'The final test is is the implementation',
       '([[:alnum:]]+)([[:space:]]+)\1') AS substr
  FROM dual
SUBSTR
------
is is

매치 매개변수 옵션

앞에서 예시한 예제들을 통해 정규 표현식 연산자와 함수에 매치 매개변수(match parameter)를 추가적으로 활용할 수 있음을 눈치 채셨을 것입니다. 이 매개변수는 대소문자 구분, newline 문자의 매치, 멀티라인 입력의 보존 등을 지원합니다.

정규 표현식의 활용 사례

Y정규 표현식은 단순 쿼리 이외에도 PL/SQL 언어처럼 SQL 연산자, 함수가 사용되는 경우라면 언제든 적용이 가능합니다. 또 정규 표현식을 이용하여 값의 검증, 생성, 추출을 위한 기능을 트리거 형태로 구현할 수 있습니다.

다음 예제는 입력된 데이터에 대해 컬럼 제약 조건을 검증하기 위해 REGEXP_LIKE 연산자를 사용하는 방법을 예시하고 있습니다. 이 쿼리는 INSERT, UPDATE 작업이 발생하는 경우 입력이 사회보장번호의 포맷과 일치하는지 확인합니다. 123-45-6789 또는 123456789과 같은 포맷으로 표현된 사회보장번호는 컬럼의 제약 조건을 만족합니다. 데이터는 3 개의 숫자로 시작하여 하이픈으로 연결된 후, 다시 두 개의 숫자, 하이픈, 마지막으로 4 개의 숫자로 표현됩니다. 또는 사회보장번호를 9 개의 연속적 숫자로 표현하는 것도 가능합니다. 수직 기호(|)는 두 가지 옵션 중 선택이 가능함을 의미합니다.

ALTER TABLE students
  ADD CONSTRAINT stud_ssn_ck CHECK
  (REGEXP_LIKE(ssn,
  '^([[:digit:]]{3}-[[:digit:]]{2}-[[:digit:]]{4}|[[:digit:]]{9})$'))
      

^, $. 기호는 가장 앞에 또는 가장 뒤에 오는 문자를 무시할 것을 지정하고 있습니다. 정규 표현식이 두 개 이상의 라인으로 분절되거나 표현식에 불필요한 공백 기호가 포함되지 않도록 주의하시기 바랍니다. 표 12는 위 정규 표현식 예제에서 사용된 각각의 컴포넌트에 대해 설명하고 있습니다.

정규 표현식과 기존 SQL 기능의 비교

정규 표현식은 기존에 사용되던 LIKE 연산자와 INSTR, SUBSTR, and REPLACE 함수와 비교했을 때 여러 가지 이점을 제공하고 있습니다. 기존의 SQL 함수는 패턴 매칭을 전혀 지원하지 않고 있습니다. 문자의 매칭을 지원하는 컴포넌트는 LIKE연산자가 유일하며 % , _와일드카드 문자가 지원됩니다. 하지만 LIKE 연산자는 표현식의 반복, 복잡한 대체 패턴, 문자 영역, 문자 리스트, POSIX 문자 클래스 등을 지원하지 않습니다. 또 새로운 정규 표현식 함수는 반복 단어와 패턴의 맞교환(swap)을 지원한다는 장점이 있습니다. 본 문서에서 제시된 예제들이 정규 표현식의 개념과 활용 방법을 이해하는데 도움이 되었기 바랍니다.

툴킷 확장을 위한 유용한 도구

정규 표현식은 복잡한 문제의 해결을 가능하게 하는 매우 강력한 기능입니다. 정규 표현식은 기존 SQL 함수로는 흉내내기 어려운 다양한 기능을 지원합니다. 정규 표현식의 사용법이 다소 복잡해 보이기는 하지만, 그 기본적인 구성 요소만 익혀도 SQL뿐 아니라 다른 프로그래밍 언어에서도 유용한 도구로 활용하실 수 있을 것입니다. 원하는 패턴을 얻기 위해서는 여러 차례의 시행착오가 불가피할 수도 있습니다. 하지만 어느 누구도 정규 표현식의 우아함과 강력한 기능을 결코 무시할 수 없을 것입니다.

Alice Rischert (ar280@yahoo.com)는 콜럼비아 대학 컴퓨터 테크놀로지/애플리케이션 프로그램의 데이터베이스 애플리케이션 개발/설계 트랙 담당 회장입니다. 그녀는 <Oracle SQL Interactive Workbook 2nd edition(Prentice Hall, 2002)>과 조만간 출판 예정인 <Oracle SQL by Example(Prentice Hall, 2003)>의 저자이기도 합니다. Rischert 는 포춘 100대 기업에서 데이터베이스 설계, DBA, 프로젝트 리더로 15 년 간의 경력을 보유하고 있으며 오라클 데이터베이스는 버전 5부터 사용해 온 베테랑입니다.

표 1: 메타문자의 앵커(anchor) 적용

Metacharacter 설명
^ 라인의 시작 부분에 표현식을 적용
$ 라인의 끝부분에 표현식을 적용

표 2: 반복 연산자(Repetition Operator, Quantifier)

Quantifier 설명
* 0 회 또는 그 이상 횟수로 매치
? 0 회 또는 1 회 매치
+ 1 회 또는 그 이상 횟수로 매치
{m} 정확히 m 회 매치
{m,} 최소한 m 회 매치
{m, n} 최소 m 회, 최대 n 회 매치

표 3: 사전정의된 POSIX 문자 클래스

Character Class 설명
[:alpha:] 알파벳 문자
[:lower:] 소문자 알파벳 문자
[:upper:] 대문자 알파벳 문자
[:digit:] 숫자
[:alnum:] 알파벳/숫자
[:space:] 출력되지 않는 공백 문자(예: carriage return, newline, vertical tab, form feed 등
[:punct:] 구두점 기호
[:cntrl:] (출력되지 않는) 컨트롤 문자
[:print:] 출력 가능한 문자

표 4: 대체 매칭 및 표현식의 그룹화

Metacharacter 설명
| Alternation 대체 문자를 구분 (그룹핑 연산자 ()와 함께 사용하기도 함)
( ) Group 반복 연산자 또는 백레퍼런스(backreference)를 위해 대체 유닛을 서브표현식으로 그룹화 ("백레퍼런스" 섹션 참고)
[char] Character list I문자 리스트. 문자 리스트 내부에 위치하는 대부분의 메타문자는 일반 문자로 인식됨. 그 예외가 캐럿(^) 기호와 하이픈(-) 기호

표 5: REGEXP_LIKE 연산자

문법 설명
REGEXP_LIKE(source_string, pattern
[, match_parameter])
source_string은 문자 데이터타입 지원 (CHAR, VARCHAR2, CLOB, NCHAR, NVARCHAR2, NCLOB LONG 은 제외). pattern매개변수는 정규 표현식을 참조하는 또 다른 이름. 옵션으로 제공되는 match_parameter를 이용하여 newline 문자의 처리, 멀티라인 포맷의 유지, 대소문자 구분 등을 처리할 수 있음.

표 6: REGEXP_INSTR 함수

문법 설명
REGEXP_INSTR(source_string, pattern
[, start_position
[, occurrence
[, return_option
[, match_parameter]]]])
pattern을 검색하여 패턴의 첫 번째 위치를 반환. 필요한 경우 start_position y을 이용하여 검색을 시작할 위치를 지정할 수 있음. occurrence매개변수는 같은 패턴을 여러 번 검색하고자 하는 경우에 사용(디폴트는 1). return_option은 패턴의 시작 위치를 반환(디폴트 값은 0). 1로 설정되는 경우 매치된 패턴의 다음 문자 위치를 반환.

표 7: 5 자리 숫자 + 4 자리 Zip-Code 표현식에 대한 설명

문법 설명
  매치되어야 하는 빈 공백
[:digit:] POSIX "numeric digit" 클래스
] 문자 리스트(character list)의 끝
{5} 문자 리스트에 대해 정확히 5 회 반복
( 서브표현식(subexpression)의 시작 부분
- 하이픈(-) 문자 (문자 리스트 내의 range 메타문자로 사용되지 않았음에 주의)
[ 문자 리스트의 시작 부분
[:digit:] POSIX [:digit:] 클래스
[ 문자 리스트의 시작 부분
] 문자 리스트의 끝 부분
{4} 문자 리스트를 정확히 4 회 반복
) 서브표현식을 묶는 괄호 기호
? ? 반복 연산자는 그룹핑된 서브표현식을 0 회 또는 1 회 매치하여 옵션으로 4 자리 코드를 사용할 수 있게 함
$ 검색 위치를 라인의 끝부분으로 지정하기 위한 앵커 메타문자

표 8: The REGEXP_SUBSTR 함수

문법 설명
REGEXP_SUBSTR(source_string, pattern
[, position [, occurrence
[, match_parameter]]])
REGEXP_SUBSTR 함수는 패턴애 매치되는 서브문자열을 반환.

표 9: TheREGEXP_REPLACE 함수

문법 설명
REGEXP_REPLACE(source_string, pattern
[, replace_string [, position
[,occurrence, [match_parameter]]]])
매치된 패턴을 지정된 replace_string으로 대체하고, 복잡한 검색/대체 작업을 가능하게 하는 함수.

표 10: 백레퍼런스 메타문자 (Backreference Metacharacter)

Metacharacter 설명
\digit Backslash 백슬래시 뒤에 1-9 사이의 숫자를 명시하여, 괄호 처리된 N 번째 서브표현식을 참조하기 위해 사용.
(참고: 백슬래시는 정규 표현식에서 다른 의미로 사용되기도 함. 문맥에 따라 Escape 문자를 의미할 수도 있음.

표 11: 패턴-스왑(Pattern-Swap) 정규 표현식의 설명

정규 표현식 아이템 설명
( 첫 번째 서브표현식의 시작
. (newline을 제외한) 임의의 단일 문자와 매치
* 반복 연산자 - 앞의 . 메타문자와 0 회에서 n 회까지 매치
) 첫 번째 서브표현식의 마지막. 매치 결과는 \1
에 캡처됨(예제에서는 Ellen을 캡처)
  공백 기호
( 두 번째 서브표현식의 시작
. newline을 제외한 임의의 단일 문자와 매치
* 반복 연산자 - 앞의 . 메타문자와 0 회에서 n 회까지 매치
) 두 번째 서브표현식의 마지막; 매치 결과는 \2
에 캡처됨(예제에서는 Hildi를 저장).
  공백 기호
( 세 번째 서브표현식의 시작
. newline을 제외한 임의의 단일 문자와 매치
* 반복 연산자 - 앞의 . 메타문자와 0 회에서 n 회까지 매치
) 세 번째 서브표현식의 끝 부분. 매치 결과는 \3
에 캡처(예제에서는 Smith를 저장).

표 12: Social Security Number 정규 표현식의 설명

정규 표현식 아이  템 설명
^ 라인 문자의 시작(정규 표현식은 매치되기 이전의 문자를 가져 올 수 없음.)
( 서브표현식을 시작하고 | 메타문자를 이용하여 대체 목록을 제공
[ 문자 리스트(character list)의 시작
[:digit:] POSIX "numeric digit" 클래스
] 문자 리스트의 끝 부분
{3} 문자 리스트를 정확하게 3 회 반복 적용
- 하이픈
[ 문자 리스트의 시작
[:digit:] POSIX numeric digit 클래스
] 문자 리스트의 끝 부분
{2} 문자 리스트를 정확하게 2 회 반복 적용
- 또 다른 하이픈 기호
[ 문자 리스트의 시작
[:digit:] POSIX numeric digit 클래스
] 문자 리스트의 끝 부분
{4} 문자 리스트를 정확하게 4 회 반복 적용
| 대체(alternation) 메타문자 - 첫 번째 선택을 종료하고 두 번째 대체 표현식을 시작
[ 문자 리스트의 시작
[:digit:] POSIX numeric digit 클래스.
] 문자 리스트의 끝 부분
{9} 문자 리스트를 정확하게 9 회 반복
) 대체를 위해 사용된 서브표현식 그룹을 종료하는 괄호 기호
$ 라인의 끝부분을 의미하는 앵커 메타문자 (매치된 패턴 이후에 어떤 문자도 뒤따라 올 수 없음)

 

오라클 정규표현식 예제

REGEXP_SUBSTR

  1. STUDYUNITCODE를 숫자와 문자를 분리하여 나타낸다. (맨 앞에 0은 삭제한다.)
    SELECT  
        STUDYUNITCODE,
        REGEXP_SUBSTR(REGEXP_REPLACE(STUDYUNITCODE,'^\0',''),'[[:digit:]]{1,2}') TAPE,
        REGEXP_SUBSTR(STUDYUNITCODE,'[[:alpha:]]{1}') SIDE
    FROM TB_STUDYUNIT 
    ORDER BY KWON,STUDYUNITCODE
  2. 결과값
    STUDYUNITCODE	TAPE	SIDE
    
    01A	        1	A
    10B	       10	B
    12A      	12	A
    02B     	 2	B
    23A     	23	A
    30B     	30	B
    
  1. 페이지정보에서 첫페이지를 찾아서 알려준다.
    SELECT SOURCE, REPLACE(REGEXP_SUBSTR(SOURCE,'p[[:digit:]]{1,3}'),'p','') PAGE
    FROM QUESTION WHERE ROWNUM < 10;
  2. 결과값
    SOURCE	                 PAGE
    
    b1: p24	                  24
    b1: p19, 24, 32, 46	    19
    b3: p5	                   5
    b3: p29	                  29
    b3: p10-11	           10
    b2: p22	                  22
    b1: p20 b2: p15 b4: p40  20
    b2: p8-9, 30	            8
    b3: p16-17	           16
    
블로그 이미지

유효하지않음

,

SELECT REGEXP_REPLACE(TEST,'(ire_v0[0-2][0-9]*)', 'decode(\1, null, 0, \1)') REG_REP
FROM
(
SELECT '((ire_v001/ire_v002*100)*0.5+(ire_v003/ire_v020*100)*0.5)' TEST
FROM dual
)

--> 결과
((decode(ire_v001, null, 0, ire_v001)/decode(ire_v002, null, 0, ire_v002)*100)*0.5+(decode(ire_v003, null, 0, ire_v003)/decode(ire_v020, null, 0, ire_v020)*100)*0.5)





-- 정규식 테스트(위 내용과 관계없음.)
WITH tmp AS
(
    SELECT 1 idx, '(90)abcdefg' txt   FROM DUAL UNION ALL
    SELECT 2, '(80) abcdefg'          FROM DUAL UNION ALL
    SELECT 3, '70맒ㄴ;람낢ㄴ'         FROM DUAL UNION ALL
    SELECT 4, '60 ㄻㅇㄴㄻㄴㅇㄹ'     FROM DUAL UNION ALL
    SELECT 5, '50 ㅁㄴㄻㄴㄴㅁ 40'    FROM DUAL UNION ALL
    SELECT 6, 'ㅎㅎㅎㅎㅎㅎㅎㅎ'      FROM DUAL UNION ALL
    SELECT 7, 'ㅋㅋㅋㅋㅋㅋㅋ 40'     FROM DUAL
)
SELECT  idx, txt, regexp_replace(txt, '^(\([0-9\)]+)(.*)', '\1점 \2')
FROM    tmp
WHERE   regexp_like(txt, '^(\([0-9\)])');


ELECT oi_sub_linkedcode, oi_sub_linkedcodename
FROM
(
    SELECT  REGEXP_SUBSTR(oi_sub_linkedcodes,     '[^,]+', 1, LEVEL) oi_sub_linkedcode
           ,REGEXP_SUBSTR(oi_sub_linkedcodenames, '[^,]+', 1, LEVEL) oi_sub_linkedcodename
    FROM (SELECT oi_sub_linkedcodes, oi_sub_linkedcodenames FROM NG02_ORGAN_INFO WHERE oi_code = 57)
    CONNECT BY LEVEL <= LENGTH(REGEXP_REPLACE(oi_sub_linkedcodes, '[^,]+'))  + 1
)
WHERE oi_sub_linkedcode = '50901240003'



SELECT  TRIM(COLUMN_VALUE) str 
FROM    (SELECT 'aaaa,bbbb,cccc,dddd' str FROM DUAL)
       ,XMLTABLE(('"' || REPLACE(str, ',', '","') || '"'))


SELECT COLUMN_VALUE oi_sub_linkedcodes
FROM   TABLE(SPLIT((SELECT REGEXP_REPLACE(REGEXP_REPLACE('50901240001,50901240002,50901240003,50901240004,50901240005,50901240006,50901240007', '(50901240001|50901240002|50901240004|50901240005|50901240008)', ','), '([^0-9],)', '') FROM DUAL)))

SELECT oi_sub_linkedcodes
FROM
(
       SELECT COLUMN_VALUE oi_sub_linkedcodes FROM TABLE(SPLIT('50901240001,50901240002,50901240003,50901240004,50901240005,50901240006,50901240007', ','))
       MINUS
       SELECT COLUMN_VALUE oi_sub_linkedcodes FROM TABLE(SPLIT('50901240001,50901240002,50901240004,50901240005,50901240008', ','))
)

그 밖에
REGEXP_LIKE
REGEXP_INSTR
REGEXP_SUBSTR 등이 존재하니 참고하시기 바랍니다.

http://www.psoug.org/reference/regexp.html

http://www.adminschool.net/wiki/doku.php?id=dbms:oracle:devel:regexp

블로그 이미지

유효하지않음

,

9i EXP-00003

Database/Oracle 2008. 10. 8. 13:44

Full Link: http://www.anysql.net/en/oracle/oracle_bug_exp00003.html

    When you use old version of exp to export tables with LOB column from Oracle 9.2.0.5 or higher version, you will get an error "EXP-00003 : no storage definition found for segment .....", actually this is an Oracle bug, you could temporary get it resolved by replace a view "exu9tne", as following:

    Before exporting, run the following SQL under sys:

CREATE OR REPLACE VIEW exu9tne (
tsno, fileno, blockno, length) AS
SELECT ts#, segfile#, segblock#, length
FROM sys.uet$
WHERE ext# = 1
UNION ALL
SELECT * FROM SYS.EXU9TNEB
/

    After exporting, run the following to restore the view definition according to Metalink Notes.

CREATE OR REPLACE VIEW exu9tne (
tsno, fileno, blockno, length) AS
SELECT ts#, segfile#, segblock#, length
FROM sys.uet$
WHERE ext# = 1
블로그 이미지

유효하지않음

,

조치방법: (다음과 같이 조치후 서버 restart)
sqlplus “/as sysdba”
alter system set "_kgl_large_heap_warning_threshold"=8388608 scope=spfile ;
shutdown immediate
startup
 
원인: (Cause 항목 참조)
해당 오류메시지는 Error 가 아닌 Warning 입니다.
이는 shared pool 영역중 libraray cache 영역의 단편화가 심해 Free Memory를 찾는데 오랜 시간이 걸릴 때
위와 같은 오류가 발생합니다.
새로운 트랜잭션이 발생시 SQL의 파싱결과 등이 저장되는 library cache영역에 단편화로 인한 메시지로
10g R2의 메모리 관리 메커니즘에 따른 메시지로 보시면됩니다.
 
 
=======================================================================
Applies to:
Oracle Server - Enterprise Edition - Version:
This problem can occur on any platform.
Symptoms
The following messages are reported in alert.log after 10g Release 2 is installed.
       Memory Notification: Library Cache Object loaded into SGA
       Heap size 2294K exceeds notification threshold (2048K)
Changes
Installed / Upgraded to 10g Release 2
Cause
These are warning messages that should not cause the program
responsible for these errors to fail. 
They appear as a result of new event messaging mechanism
and memory manager in 10g Release 2. The meaning is that the
process is just spending a lot of time in finding free memory
extents during an allocate as the memory may be heavily fragmented.
Real memory messages should be ORA-403x when  a real memory allocation problem
occurs.
Solution
In 10g we have a new undocumented parameter that sets the KGL heap size
warning threshold.   This parameter was not present in 10gR1.
Warnings are written if heap size exceeds this threshold.
  
Set  _kgl_large_heap_warning_threshold  to a reasonable high value or zero
to prevent these warning messages. Value needs to be set in bytes.
If you want to set this to 8192 (8192 * 1024) and are using an spfile:
(logged in as "/ as sysdba")
SQL> alter system set "_kgl_large_heap_warning_threshold"=8388608 scope=spfile ;
SQL> shutdown immediate SQL> startup
SQL> show parameter _kgl_large_heap_warning_threshold
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
_kgl_large_heap_warning_threshold integer 8388608
If using an "old-style" init parameter,
Edit the init parameter file and add
_kgl_large_heap_warning_threshold=8388608
In 10.2.0.2,  the threshold is increased to 50MB after regression tests, so this should be a reasonable and recommended value.
References
블로그 이미지

유효하지않음

,

1. 문자 함수

 1-1) CHR

 1-2) CONCAT 함수

 1-3) INITCAP 함수

 1-4) LOWER 함수

 1-5) LPAD 함수

 1-6) LTRIM 함수

 1-7) NLS_INITCAP 함수

 1-8) NLS_LOWER 함수

 1-9) NLSSORT 함수

 1-10) NLS_UPPER 함수

 1-11) REPLACE 함수

 1-12) RPAD 함수

 1-13) RTRIM 함수

 1-14) SOUNDEX 함수

 1-15) SUBSTR 함수

 1-16) TRANSLATE 함수

 1-17) TREAT 함수

 1-18) TRIM 함수

 1-19) UPPER 함수

 1-20) ASCII 함수

 1-21) INSTR 함수

 1-22) LENGTH 함수

 

2. 날짜 처리함수(datetime function)

 2-1) ADD_MONTHS 함수

 2-2) CURRENT_DATE 함수

 2-3) URRENT_TIMESTAMP 함수

 2-4) DBTIMEZONE 함수

 2-5) EXTRACT(datetime) 함수

 2-6) FROM_TZ 함수

 2-7) LAST_DAY 함수

 2-8) LOCALTIMESTAMP 함수 

 2-9) MONTHS_BETWEEN 함수

 2-10) NEW_TIME 함수

 2-11) NEXT_DAY 함수

 2-12) NUMTODSINTERVAL 함수

 2-13) NUMTOYMINTERVAL 함수

 2-14) ROUND(date) 함수

 2-15) SESSIONTIMEZONE 함수

 2-16) SYS_EXTRACT_UTC 함수

 2-17) SYSDATE 함수

 2-18) SYSTIMESTAMP 함수

 2-19) TO_DSINTERVAL 함수

 2-20) TO_TIMESTAMP 함수

 2-21) TO_TIMESTAMP_TZ 함수

 2-22) TO_YMINTERVAL 함수

 2-23) TRUNC(date) 함수

 2-24) TZ_OFFSET 함수

 

3.데이터 형 변환 함수(conversion function)

 3-1) ASCIISTR 함수

 3-2) BIN_TO_NUM 함수

 3-3) CAST 함수

 3-4) CHARTOROWID 함수

 3-5) COMPOSE 함수 

 3-6) CONVERT 함수

 3-7) HEXTORAW 함수

 3-8) NUMTODSINTERVAL 함수

 3-9) NUMTOYMINTERVAL 함수

 3-10) RAWTOHEX 함수

 3-11) RAWTONHEX 함수

 3-12) ROWIDTOCHAR 함수

 3-13) ROWIDTONCHAR 함수

 3-14) TO_CHAR(character) 함수

 3-15) TO_CLOB 함수

 3-16) TO_DSINTERVAL 함수

 3-17) TO_LOB 함수

 3-18) TO_MULTI_BYTE 함수

 3-19) TO_NCHAR(character) 함수

 3-20) TO_NCHAR(datetime) 함수

 3-21) TO_NCHAR(number) 함수

 3-22) TO_NCLOB 함수

 3-23) TO_NUMBER 함수

 3-24) TO_SINGLE_BYTE 함수

 3-25) TO_YMINTERVAL 함수

 3-26) TRANSLATE ... USING 함수

 3-27) UNISTR 함수

 

4. 기타함수(miscellaneous single row function)

 4-1) BFILENAME 함수

 4-2) COALESCE 함수

 4-3) DECODE 함수

 4-4) DEPTH 함수

 4-5) DUMP 함수

 4-6) EMPTY_BLOB 함수

 4-7) EMPTY_CLOB 함수

 4-8) EXISTSNODE 함수

 4-9) EXTRACT(XML) 함수

 4-10) EXTRACTVALUE 함수

 4-11) GREATEST 함수

 4-12) LEAST 함수

 4-13) NLS_CHARSET_DECL_LEN 함수

 4-14) NLS_CHARSET_ID 함수

 4-15) NLS_CHARSET_NAME 함수

 4-16) NULLIF 함수

 4-17) NVL2 함수

 4-18) PATH 함수

 4-19) SYS_CONNECT_BY_PATH 함수

 4-20) SYS_CONTEXT 함수

 4-21) SYS_DBURIGEN 함수

 4-22) SYS_EXTRACT_UTC 함수

 4-23) SYS_GUID 함수

 4-24) SYS_XMLAGG 함수

 4-25) SYS_XMLGEN 함수

 4-26) UID 함수

 4-27) USER 함수

 4-28) USERENV 함수

 4-29) VSIZE 함수

 4-30) XMLAGG 함수

 4-31) XMLCOLATTVAL 함수

 4-32) XMLCONCAT 함수

 4-33) XMLFOREST 함수

 4-34) XMLELEMENT 함수

 

5.그룹함수  Aggregate 함수

 5-1) AVG* 함수

 5-2) CORR* CORR* 함수

 5-3) COUNT* 함수

 5-4) COVAR_POP 함수

 5-5) COVAR_SAMP 함수

 5-6) CUME_DIST 함수

 5-7) DENSE_RANK 함수

 5-8) FIRST 함수

 5-9) GROUP_ID 함수

 5-10) Grouping 함수

 5-11) GROUPING_ID 함수

 5-12) LAST 함수

 5-13) MAX 함수

 5-14) MIN 함수

 5-15) PERCENTILE_CONT 함수

 5-16) PERCENTILE_DISC 함수

 5-17) PERCENT_RANK 함수

 5-18) RANK 함수

 5-19) REGR_(linear regression) function* 함수

 5-20) STDDEV 함수

 5-21) STDDEV_POP 함수

 5-22) STDDEV_SAMP 함수

 5-23) SUM 함수

 5-24) VAR_POP 함수

 5-25) VAR_SAMP 함수

 5-26) VARIANCE 함수

 5-27) Grouping sets 함수

 

6. Analytic 함수

 6-1) AVG* 함수

 6-2) CORR* CORR* 함수

 6-3) COUNT* 함수

 6-4) COVAR_SAMP 함수

 6-5) CUME_DIST 함수

 6-6) DENSE_RANK 함수

 6-7) FIRST 함수

 6-8) FIRST_VALUE 함수

 6-9) LAG 함수

 6-10) LAST_VALUE 함수

 6-11) LEAD 함수

 6-12) NTILE 함수

 6-13) RATIO_TO_REPORT 함수

 6-14) ROW_NUMBER 함수

 

7. 객체 참조 함수

 7-1) REF 타입

 

8. PseudoColumn을 의미하는 것

 8-1) ROWID 컬럼

 8-2) ROWNUM 컬럼

 

 

 

 

 

 

 

 

 

 

 

 

1-1) CHR 함수

--------------------------------------------------------------------------------

 

입력된 수의 바이너리 코드에 해당하는 문자를 반환한다.

 

【예제】

SQL> select chr(75)||chr(79)||chr(82)||chr(69)||chr(65)

   2    from dual;

 

CHR(7

-----

KOREA

 

SQL>

 

1-2) CONCAT 함수

--------------------------------------------------------------------------------

 

 입력되는 두 문자열을 연결하여 반환한다.

 입력되는 두 문자열의 타입이 다를 경우 다음과 같이 반환된다.

 

첫 번째 문자열 타입  두 번째 문자열 타입  반환되는 문자열 타입 CLOB  NCLOB  NCLOB NCLOB  NCHAR  NCLOB NCLOB  CHAR  NCLOB NCHAR  CLOB  NCLOB

 

 

【예제】

SQL> select concat('Republic of',' KOREA') from dual;

 

CONCAT('REPUBLICO

-----------------

Republic of KOREA

 

SQL> 

 

 

1-3) INITCAP 함수

--------------------------------------------------------------------------------

 

initcap('string) 함수는 입력 문자열 중에서

각 단어의 첫 글자를 대문자로 나머지는 소문자로 변환한 스트링을 반환한다

 

【예제】

SQL> select initcap('beautiful corea') from dual;

 

INITCAP('BEAUTI

---------------

Beautiful Corea

 

SQL>

 

 

1-4) LOWER 함수

--------------------------------------------------------------------------------

 

lower(string) 함수는 입력된 문자열을 소문자로 반환한다.

 

【예제】

SQL> select lower('Beautiful COREA') from dual;

 

LOWER('BEAUTIFU

---------------

beautiful corea

 

SQL> 

 

 

1-5) LPAD 함수

--------------------------------------------------------------------------------

 

lpad(char1,n,char2) 함수는

지정된 길이 n에서 문자 char1으로 채우고

남은 공간은 왼쪽부터 char2로 채워서 출력한다.

 

【형식】

lpad (char1, n [, char2] )

 

【예제】

SQL> select lpad ('Corea', 12, '*') from dual;

 

LPAD('COREA'

------------

*******Corea

 

SQL>

 

 

1-6) LTRIM 함수

--------------------------------------------------------------------------------

 

 LTRIM(문자열, 문자)함수는 문자열중

좌측으로부터 특정문자와 일치하는 문자를 제거하고 출력한다.

 

【형식】

ltrim(char [,set] )

 

【예제】

SQL> select LTRIM('xyxXxyLAST WORD','xy') from dual;

 

LTRIM('XYXXX

------------

XxyLAST WORD

 

SQL>

 

 

 

1-7) NLS_INITCAP 함수

--------------------------------------------------------------------------------

 

nls_initcap(string) 함수는 입력 문자열 중에서

 각 단어의 첫 글자를 대문자로

           나머지는 소문자로 변환한 스트링을 반환한다.

 단어의 white space character가 알파뉴메릭이 아니더라도 상관없다.

nlsparam는 ‘nls_sort = sort'와 같은 형식을 가지며,

 여기서 sort linguistic sort sequence binary중의 하나이다.

 

【형식】

nls_initcap ( char [,'nlsparam'] )

 

【예제】

SQL> select nls_initcap('beautiful corea', 'nls_sort=binary')

  2  from dual;

 

NLS_INITCAP('BE

---------------

Beautiful Corea

 

SQL> select nls_initcap('beautiful corea','nls_sort=XDutch')

  2  from dual;

 

NLS_INITCAP('BE

---------------

Beautiful Corea

 

SQL>

 

 

1-8) NLS_LOWER 함수

--------------------------------------------------------------------------------

 

nls_lower(string) 함수는 입력 문자열을 모두 소문자로 변환한 스트링을 반환한다. 

 단어의 white space character가 알파뉴메릭이 아니더라도 상관없다.

nlsparam는 ‘nls_sort = sort'와 같은 형식을 가지며,

 여기서 sort linguistic sort sequence binary중의 하나이다.

 

【형식】

nls_lower ( char [,'nlsparam'] )

 

【예제】

SQL> select nls_lower('CITTA''','nls_sort=XGerman') from dual;

 

NLS_LO

------

citta'

 

SQL>

 

 

1-9) NLSSORT 함수

--------------------------------------------------------------------------------

 

nlssort(string) 함수는 입력 문자열을 소팅하여 스트링을 반환한다.

  단어의 white space character가 알파뉴메릭이 아니더라도 상관없다.

nlsparam는 ‘nls_sort = sort'와 같은 형식을 가지며,

 여기서 sort linguistic sort sequence binary중의 하나이다.

 

【형식】

nlssort ( char [,'nlsparam'] )

 

【예제】

SQL> select * from emp

  2    order by nlssort(name, 'nls_sort=XDanish');

 

        ID NAME           SALARY      BONUS

---------- ---------- ---------- ----------

      1101 Cho               250        125

      1102 Joe               240        100

      1104 jijoe             220        100

      1103 kim               250        100

 

SQL>

 

 

 

1-10) NLS_UPPER 함수

--------------------------------------------------------------------------------

 

nls_upper(string) 함수는 입력 문자열을 모두 소문자로 변환한 스트링을 반환한다.

  단어의 white space character가 알파뉴메릭이 아니더라도 상관없다.

nlsparam는 ‘nls_sort = sort'와 같은 형식을 가지며,

 여기서 sort linguistic sort sequence binary중의 하나이다.

 

【형식】

nls_upper ( char [,'nlsparam'] )

 

【예제】

SQL> select nls_upper('gro?e') from dual;

 

NLS_U

-----

gro?e

 

SQL> select nls_upper('gro?e','nls_sort=XGerman')

  2  from dual;

 

NLS_UP

------

grosse

 

SQL>

 

 

 

1-11) REPLACE 함수

--------------------------------------------------------------------------------

 

이 함수는 문자열에서 지정한 문자를 다른 문자로 치환한다.

  치환될 문자를 지정하지 않으면 해당 문자를 삭제한다.

 

【형식】

replace (char, search_string [, replacement_string] )

 

【예제】

SQL> select replace('aaabb','a','b') from dual;

 

REPLA

-----

bbbbb

 

SQL> select replace('aaabb','a') from dual;

 

RE

--

bb

 

SQL>

 

 

1-12) RPAD 함수

--------------------------------------------------------------------------------

 

rpad(char1,n,char2) 함수는 지정된 길이 n에서 문자 char1으로 채우고

남은 공간은 오른쪽부터 char2로 채워서 출력한다.

 

【형식】

rpad (char1, n [, char2] )

 

【예제】

SQL> select rpad('Corea',12,'*') from dual;

 

RPAD('COREA'

------------

Corea*******

 

SQL>

 

 

 

1-13) RTRIM 함수

--------------------------------------------------------------------------------

 

 RTRIM(문자열, 문자)함수는 문자열중

 우측으로부터 특정문자와 일치하는 문자를 제거하고 출력한다.

 

【형식】

rtrim(char [,set] )

 

【예제】

SQL> select RTRIM('BROWINGyxXxy','xy') "RTRIM example" from dual;

 

RTRIM exam

----------

BROWINGyxX

 

SQL>

 

 

1-14) SOUNDEX 함수

--------------------------------------------------------------------------------

 

soundex(char) 함수는 char과 같은 발음의 이름을 표현한다.

 

【예제】

SQL> select name from emp;

 

NAME

----------

Cho

Joe

kim

jijoe

 

SQL> select name from emp

  2  where soundex(name) = soundex('jo');

 

NAME

----------

Joe

 

SQL>

 

 

 

1-15) SUBSTR 함수

--------------------------------------------------------------------------------

 

substr(str,m,n) 함수는 문자열 str 중에서 특정 위치 m으로부터 특정 길이n 만큼의 문자를 출력한다.

  m 0이나 1이면 문자열의 첫글자를 의미하고,

  n이 생략되면 문자열의 끝까지를 의미한다.

  m이 음수이면 뒤쪽으로부터의 위치를 의미한다.

 

 SUBSTRB character 대신 byte를 사용하고,

 SUBSTDC unicode를 사용하며,

 SUBSTR2 UCS2 codepoint를 사용하고,

 SUBSTR4 UCS4 codepoint를 사용한다.

 

【형식】

{SUBSTR|SUBSTRB|SUBSTRC|SUNBSTD2|SUBSTR4}

  ( string, position [,substring_length] )

 

【예제】

SQL> select substr('abcdesfg', 3,2) from dual;

 

SU

--

cd

 

SQL> select substr('abcdefg',3) from dual;

 

SUBST

-----

cdefg

 

SQL> select substr('abcdefg', -3,2) from dual; ☜ 뒤에서 3번째부터 2글자를 의미한다.

SU

--

ef

 

SQL>

 

 

 

1-16) TRANSLATE 함수

--------------------------------------------------------------------------------

 

TRANSLATE (char,from_string,to_string) 함수는

 char 내에 포함된 문자중 from_string에 지정한 모든 각각의 문자를

                         to_string문자로 각각 변경한다.

 

【형식】

TRANSLATE ('char','from_string','to_string')

 

【예제】

SQL> select translate('ababccc','c','d') from dual;

 

TRANSLA

-------

ababddd

 

SQL> select translate('2KRW229',

  2  '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ',

  3  '9999999999XXXXXXXXXXXXXXXXXXXXXXXXXX') from dual;

 

TRANSLA

-------

9XXX999

 

SQL> select translate('2KRW229',

  2  '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ','0123456789')

  3  from dual;

 

TRAN

----

2229

 

SQL>

 

 

 

1-17) TREAT 함수

--------------------------------------------------------------------------------

 

TREAT 함수는 선언된 타입을 변경함으로써, 수퍼타입을 서브타입인 것처럼 처리할 수 있도록 한다.

 

【형식】

TREAT ( expr AS [ REF] [schema . ] type )

 

【예제】

SQL> select x.p.empno from person_table p;

select x.p.empno from person_table p

       *

ERROR at line 1:

ORA-00904: "X"."P"."EMPNO": invalid identifier

 

SQL> select treat(x.p as employee).empno empno,

  2               x.p.last_name last_name

  3   from person_table x;

 

     EMPNO LAST_NAME

---------- --------------------

           Seoul

      1234 Inchon

      5678 Arirang

 

SQL>

 

【예제】

SQL> select name, TREAT(VALUE(p) AS employee_t).salary salary

  2   FROM person p;

 

NAME                        SALARY

----------------------   ---------

Bob   

Joe                         100000

Tim                           1000

 

SQL>

 

 

 

1-18) TRIM 함수

--------------------------------------------------------------------------------

 

 이 함수는 LTRIM RTRIM 함수를 결합한 형태로

  문자값의 왼쪽 또는 오른쪽 부분에 정의한 문자를 절삭하여 출력한다.

LEADING LTRIM처럼 문자열 왼쪽의 문자를 지정하여 절삭하고,

 TRAILING RTRIM처럼 문자열 오른쪽 문자를 지정하여 절삭한다.

 BOTH는 왼쪽과 오른쪽 문자를 지정하여 절삭한다.

 

【형식】

TRIM ([{{{LEADING|TRAILING|BOTH} [trim_char] } | trim_char} FROM]

      trim_source )

 

【예제】

SQL> select trim (0 from 000123400) from dual;

 

TRIM

----

1234

 

SQL> select trim(trailing 'a' from 'abca') from dual;

 

TRI

---

abc

 

SQL> select trim(leading 'a' from 'abca') from dual;

 

TRI

---

bca

 

SQL> select trim(both 'a' from 'abca') from dual;

 

TR

--

bc

 

SQL>

 

 

1-19) UPPER 함수

--------------------------------------------------------------------------------

 

upper(string) 함수는 입력된 문자열을 대문자로 반환한다.

 

【예제】

SQL> select upper('Beautiful COREA') from dual;

 

UPPER('BEAUTIFU

---------------

BEAUTIFUL COREA

 

SQL>

 

 

 

1-20) ASCII 함수

--------------------------------------------------------------------------------

 

ASCII

ascii(char) 함수는 주어진 char의 첫 글자의 아스키 값을 반환한다.

 char의 타입은 char, varchar2, nchar, nvarchar2중의 하나이어야 한다.

 

【예제】

SQL> select ascii('Korea') from dual;

 

ASCII('KOREA')

--------------

            75

 

SQL> select ascii('K') from dual;

 

ASCII('K')

----------

        75

 

SQL>

 

 

 

1-21) INSTR 함수

--------------------------------------------------------------------------------

 

이 함수는 문자 스트링 중에서

지정한 문자가 가장 처음 나타나는 위치를 숫자로 출력한다.

 

【형식】

{INSTR|INSTRB|INSTRC|INSTR2|INSTR4}

  ( string, substring [, position [,occurrence] ] )

 

【예제】

SQL> select instr('Corea','e') from dual;

 

INSTR('COREA','E')

------------------

                 4

 

SQL> select instr('corporate floor','or',3,2) from dual;

 

INSTR('CORPORATEFLOOR','OR',3,2)

--------------------------------

                              14

 

SQL> select instrb('corporate floor','or',5,2) from dual;

 

INSTRB('CORPORATEFLOOR','OR',5,2)

---------------------------------

                               14

 

SQL>

 

 

1-22) LENGTH 함수

--------------------------------------------------------------------------------

 

 LENGTH(char) 함수는 char의 길이를 반환한다.

LENGTHB character 대신 byte를 사용하고,

LENGTHC unicode를 사용하며,

LENGTH2 UCS2 codepoint를 사용하고,

LENGTH4 UCS4 codepoint를 사용한다.

 

【형식】

{LENGTH| LENGTHB| LENGTHC| LENGTH2| LENGTH4} (char)

 

【예제】

SQL> select length('Corea') from dual;

 

LENGTH('COREA')

---------------

              5

 

SQL> select lengthb('Corea') from dual;

 

LENGTHB('COREA')

----------------

               5

 

SQL>

 

 

 

 

2-1) ADD_MONTHS 함수

--------------------------------------------------------------------------------

 

ADD_MONTHS

 ADD_MONTHS(d, n)는 날짜 d n 개월을 더한 일자를 반환한다.

 

【예제】

SQL> select current_date today, add_months(current_date,1) "next month"

  2  from dual;

 

TODAY     next mont

--------- ---------

29-JUL-04 29-AUG-04

 

SQL>

 

 

 

2-2) CURRENT_DATE 함수

--------------------------------------------------------------------------------

 

 

 이 함수는 현재 session의 날짜 정보를 반환한다.

【예제】

SQL> select current_date from dual;

 

CURRENT_D

---------

31-JUL-04

 

SQL> select sessiontimezone from dual;

 

SESSIONTIMEZONE

--------------------------------------------------------------------------

+09:00

 

SQL> alter session set NLS_DATE_FORMAT='DD-MON-YYYY HH24:MI:SS';

 

Session altered.

 

SQL> select current_date from dual;

 

CURRENT_DATE

--------------------

31-JUL-2004 09:31:57

 

SQL> alter session set time_zone='-5:0';

 

Session altered.

 

SQL> select sessiontimezone from dual;

 

SESSIONTIMEZONE

--------------------------------------------------------------------------

-05:00

 

SQL>

 

 

 

2-3) URRENT_TIMESTAMP 함수

--------------------------------------------------------------------------------

 

 이 함수는 현재 session의 날짜와 시간 정보를 반환한다.

 current_timestamp time zone까지 출력되지만,

 localtimestamp time zone은 출력되지 않는다.

【예제】

SQL> select current_timestamp, localtimestamp,

  2  current_date from dual;

 

CURRENT_TIMESTAMP

--------------------------------------------------------------------------

LOCALTIMESTAMP

--------------------------------------------------------------------------

CURRENT_D

---------

04-AUG-04 11.17.40.768776 AM +09:00

04-AUG-04 11.17.40.768776 AM

04-AUG-04

 

SQL>

 

 

 

2-4) DBTIMEZONE 함수

--------------------------------------------------------------------------------

 

 

데이터베이스 timezone을 반환한다.

【예제】

SQL> select dbtimezone from dual;

 

DBTIME

------

-07:00

 

SQL> select sessiontimezone from dual;

 

SESSIONTIMEZONE

--------------------------------------------------------------------------

+09:00

 

SQL>

 

 

 

2-5) EXTRACT(datetime) 함수

--------------------------------------------------------------------------------

 

특정 날짜/시간 값이나 날짜 값을 가진 표현식으로부터

  원하는 날짜 영역을 추출하여 출력한다.

 

【형식】

EXTRACT ({year|month|day|hour|minute|second|

         timezone_hour|timezone_minute|

         timezone_region|timezone_abbr}

 FROM {datetime_value_expr|interval_value_rxpr})

 

【예제】

SQL> select extract(year from date '2004-8-2') from dual;

 

EXTRACT(YEARFROMDATE'2004-8-2')

-------------------------------

                           2004

 

SQL>

 

 

 

2-6) FROM_TZ 함수

--------------------------------------------------------------------------------

 

이 함수는 timestamp 값을 timestamp with time zone 값으로 변환한다.

 

【형식】

FROM_TZ ( timestamp_value, time_zone_value)

 

【예제】

SQL> select from_tz(timestamp '2004-8-11 08:00:00','3:00') from dual;

 

FROM_TZ(TIMESTAMP'2004-8-1108:00:00','3:00')

--------------------------------------------------------------------------

11-AUG-04 08.00.00.000000000 AM +03:00

 

SQL>

 

 

 

2-7) LAST_DAY 함수

--------------------------------------------------------------------------------

 

 이 함수는 지정한 달의 마지막 날을 출력한다.

 

【형식】

LAST_DAY ( date )

 

【예제】

SQL> select sysdate, last_day(sysdate) "last day",

  2  last_day(sysdate)- sysdate "Days Left"

  3  from dual;

 

SYSDATE   last day   Days Left

--------- --------- ----------

04-AUG-04 31-AUG-04         27

 

SQL>

 

 

 

2-8) LOCALTIMESTAMP 함수

--------------------------------------------------------------------------------

 

이 함수는 timestamp의 현재 날짜와 시각을 출력한다.

 current_timestamp time zone까지 출력되지만,

 localtimestamp time zone은 출력되지 않는다.

 

【형식】

localtimestamp [(timestamp_precision)]

 

【예제】

SQL> select current_timestamp, localtimestamp,

  2  current_date from dual;

 

CURRENT_TIMESTAMP

--------------------------------------------------------------------------

LOCALTIMESTAMP

--------------------------------------------------------------------------

CURRENT_D

---------

04-AUG-04 11.17.40.768776 AM +09:00

04-AUG-04 11.17.40.768776 AM

04-AUG-04

 

SQL>

 

【예제】오류가 발생하는 이유를 잘 이해하자.

SQL> CREATE TABLE local_test(col1 TIMESTAMP WITH LOCAL TIME ZONE);

 

Table created.

 

SQL> INSERT INTO local_test VALUES

  2  (TO_TIMESTAMP(LOCALTIMESTAMP, 'DD-MON-RR HH.MI.SSXFF'));

(TO_TIMESTAMP(LOCALTIMESTAMP, 'DD-MON-RR HH.MI.SSXFF'))

              *

ERROR at line 2:

ORA-01830: date format picture ends before converting entire input string

 

SQL> INSERT INTO local_test VALUES

  2  (TO_TIMESTAMP(LOCALTIMESTAMP, 'DD-MON-RR HH.MI.SSXFF PM'));

 

1 row created.

 

SQL> select * from local_test;

 

COL1

--------------------------------------------------------------------------

04-AUG-04 11.33.58.183398 AM

 

SQL>

 

 

 

 

2-9) MONTHS_BETWEEN 함수

--------------------------------------------------------------------------------

 

 MONTHS_BETWEEN(date1,date2) 함수는 date1 date로 나타내는

 날짜와 날짜 사이의 개월 수를 출력한다.

 

【예제】

SQL> select months_between

  2  (to_date('02-02-2004','MM-DD-YYYY'),

  3   to_date('01-01-2003','MM-DD-YYYY') ) "Months"

  4  FROM dual;

 

    Months

----------

13.0322581

 

SQL>

 

 

 

2-10) NEW_TIME 함수

--------------------------------------------------------------------------------

 

NEW_TIME(date,zone1,zone2) 함수는 date, zone1 시간대를 zone2 시간대로 출력한다.

여기서 사용되는 zone은 다음 중의 하나이다.

 

 AST,ADT : Atlantic Standard or Daylight Time

 BST,BDT : Bering Standard or Daylight Time

 CST,CDT : Central Standard or Daylight Time

 EST,EDT : Eastern Standard or Daylight Time

 GMT : Greenwich Mean Time

 HST,HDT : Alaska-Hawaii Standard or Daylight Time

 MST,MDT : Mountain Standard or Daylight Time

 NST : Newfoundland Standard Time

 PST,PDT : Pacific Standard or Daylight Time

 YST,YDT : Yukon Standard or Daylight Time

 

【예제】

SQL> alter session set nls_date_format =

  2  'DD-MON-YYYY HH24:MI:SS';

 

Session altered.

 

SQL> select NEW_TIME(TO_DATE(

  2  '11-10-04 01:23:33', 'MM-DD-YY HH24:MI:SS'),

  3  'AST', 'PST') FROM DUAL;

 

NEW_TIME(TO_DATE('11

--------------------

09-NOV-2004 21:23:33

 

SQL>

 

 

 

 

2-11) NEXT_DAY 함수

--------------------------------------------------------------------------------

 

NEXT_DAY(date,char) 함수는 date로부터 char로 명시한 가장 최근의 날짜를 출력한다.

 

【예제】

SQL> select next_day('02-AUG-2004','MONDAY') from dual;

 

NEXT_DAY('02-AUG-200

--------------------

09-AUG-2004 00:00:00

 

SQL>

 

 

 

 

2-12) NUMTODSINTERVAL 함수

--------------------------------------------------------------------------------

 

 NUMTODSINTERVAL(n,'char_expr') 함수는 n interval day to second로 변환하여 출력한다.

 char_expr은 다음 중의 하나이다.

  ‘DAY’

  ‘HOUR’

  ‘MINUTE’

  ‘SECOND’

 

【예제】

SQL> select numtodsinterval(100,'MINUTE') from dual;

 

NUMTODSINTERVAL(100,'MINUTE')

--------------------------------------------------------------------------

+000000000 01:40:00.000000000

 

SQL>

 

【예제】

SQL> connect scott/tiger

Connected.

SQL> select ename, hiredate,

  2  numtodsinterval(100,'day')+hiredate from emp;

 

ENAME      HIREDATE  NUMTODSIN

---------- --------- ---------

SMITH      17-DEC-80 27-MAR-81

ALLEN      20-FEB-81 31-MAY-81

WARD       22-FEB-81 02-JUN-81

JONES      02-APR-81 11-JUL-81

MARTIN     28-SEP-81 06-JAN-82

BLAKE      01-MAY-81 09-AUG-81

CLARK      09-JUN-81 17-SEP-81

SCOTT      19-APR-87 28-JUL-87

KING       17-NOV-81 25-FEB-82

TURNER     08-SEP-81 17-DEC-81

ADAMS      23-MAY-87 31-AUG-87

JAMES      03-DEC-81 13-MAR-82

FORD       03-DEC-81 13-MAR-82

MILLER     23-JAN-82 03-MAY-82

 

14 rows selected.

 

SQL>

 

 

 

2-13) NUMTOYMINTERVAL 함수

--------------------------------------------------------------------------------

 

NUMTOYMINTERVAL(n,'char_expr') 함수는 n interval year to month로 변환하여 출력한다.

 char_expr은 다음 중의 하나이다.

  ‘YEAR’

  ‘MONTH’

 

【예제】

SQL> select numtoyminterval(30,'month') from dual;

 

NUMTOYMINTERVAL(30,'MONTH')

---------------------------------------------------------------------------

+000000002-06

 

SQL>

 

【예제】

SQL> connect scott/tiger

Connected.

SQL> select ename,hiredate,

  2  numtoyminterval(30,'month')+hiredate from emp;

 

ENAME      HIREDATE  NUMTOYMIN

---------- --------- ---------

SMITH      17-DEC-80 17-JUN-83

ALLEN      20-FEB-81 20-AUG-83

WARD       22-FEB-81 22-AUG-83

JONES      02-APR-81 02-OCT-83

MARTIN     28-SEP-81 28-MAR-84

BLAKE      01-MAY-81 01-NOV-83

CLARK      09-JUN-81 09-DEC-83

SCOTT      19-APR-87 19-OCT-89

KING       17-NOV-81 17-MAY-84

TURNER     08-SEP-81 08-MAR-84

ADAMS      23-MAY-87 23-NOV-89

JAMES      03-DEC-81 03-JUN-84

FORD       03-DEC-81 03-JUN-84

MILLER     23-JAN-82 23-JUL-84

 

14 rows selected.

 

SQL>

 

 

 

 

2-14) ROUND(date) 함수

--------------------------------------------------------------------------------

 

이 함수는 날짜를 주어진 형식으로 반올림하는 함수이다.

 날짜 형식이 없으면 가장 가까운 날을 출력한다.

 

【형식】

ROUND( date [,fmt] )

 

【예제】

SQL> select localtimestamp, round(sysdate,'year') from dual;

 

LOCALTIMESTAMP

--------------------------------------------------------------------------

ROUND(SYS

---------

04-AUG-04 01.26.24.197977 PM

01-JAN-05

 

SQL> select localtimestamp,round(sysdate,'day') from dual;

 

LOCALTIMESTAMP

--------------------------------------------------------------------------

ROUND(SYS

---------

04-AUG-04 01.29.57.839269 PM

08-AUG-04

 

SQL> select localtimestamp,round(sysdate) from dual;

 

LOCALTIMESTAMP

--------------------------------------------------------------------------

ROUND(SYS

---------

04-AUG-04 01.30.11.552050 PM

05-AUG-04

 

SQL>

 

 

 

2-15) SESSIONTIMEZONE 함수

--------------------------------------------------------------------------------

 

이 함수는 현재 세션의 시간대역을 출력한다.

 

【예제】

SQL> select sessiontimezone, current_timestamp from dual;

 

SESSIONTIMEZONE

--------------------------------------------------------------------------

CURRENT_TIMESTAMP

--------------------------------------------------------------------------

+09:00

04-AUG-04 01.37.13.355873 PM +09:00

 

SQL> select sessiontimezone, tz_offset(sessiontimezone) from dual;

 

SESSIONTIMEZONE

--------------------------------------------------------------------------

TZ_OFFS

-------

+09:00

+09:00

 

SQL>

 

 

 

2-16) SYS_EXTRACT_UTC 함수

--------------------------------------------------------------------------------

 

sys_extract_utc(datetime_with_timezone) 함수는

UTC(coordinated universal time: Greenwich mean time) 시각을 반환한다.

 

【예제】

SQL> select systimestamp, sys_extract_utc(systimestamp) from dual;

 

SYSTIMESTAMP

--------------------------------------------------------------------------

SYS_EXTRACT_UTC(SYSTIMESTAMP)

--------------------------------------------------------------------------

06-AUG-04 02.41.39.258976 PM +09:00

06-AUG-04 05.41.39.258976 AM

 

 

SQL>

 

 

 

2-17) SYSDATE 함수

--------------------------------------------------------------------------------

 

이 함수는 오늘 현재 날짜와 시각을 출력한다.

 

【예제】

SQL> select sysdate, current_timestamp from dual;

 

SYSDATE

---------

CURRENT_TIMESTAMP

--------------------------------------------------------------------------

04-AUG-04

04-AUG-04 01.51.39.767156 PM +09:00

 

SQL> select to_char

  2  (sysdate, 'MM-DD-YYYY HH24:MI:SS') from dual;

 

TO_CHAR(SYSDATE,'MM

-------------------

08-04-2004 13:53:18

 

SQL>

 

 

 

2-18) SYSTIMESTAMP 함수

--------------------------------------------------------------------------------

 

이 함수는 시스템의 날짜를 출력한다.

 

【예제】

SQL> select sysdate,systimestamp,localtimestamp from dual;

 

SYSDATE

---------

SYSTIMESTAMP

--------------------------------------------------------------------------

LOCALTIMESTAMP

--------------------------------------------------------------------------

04-AUG-04

04-AUG-04 01.58.06.346528 PM +09:00

04-AUG-04 01.58.06.346552 PM

 

SQL>

 

 

 

2-19) TO_DSINTERVAL 함수

--------------------------------------------------------------------------------

 

이 함수는 문자열을 interval day to second 형식으로 변환하는 함수이다.

 

【형식】

to_dsinterval ( char [ ‘nlsparam’] )

 

【예제】

SQL> select sysdate,

  2  sysdate+to_dsinterval('003 17:00:00') as "3days 17hours later"

  3  from dual;

 

SYSDATE   3days 17h

--------- ---------

04-AUG-04 08-AUG-04

 

SQL>

 

 

 

2-20) TO_TIMESTAMP 함수

--------------------------------------------------------------------------------

 

이 함수는 문자열을 timestamp 형식으로 변환하여 출력한다

 

【형식】

to_timestamp ( char [,fmt ['nlsparam'] ] )

 

【예제】

SQL> select to_timestamp('2004-8-20 1:30:00', 'YYYY-MM-DD HH:MI:SS')

  2  from dual;

 

TO_TIMESTAMP('2004-8-201:30:00','YYYY-MM-DDHH:MI:SS')

--------------------------------------------------------------------------

20-AUG-04 01.30.00.000000000 AM

 

SQL>

 

 

 

 

2-21) TO_TIMESTAMP_TZ 함수

--------------------------------------------------------------------------------

 

이 함수는 문자열을 timestamp with time zone 형식으로 변환하여 출력한다.

 

【형식】

to_timestamp_tz ( char [,fmt ['nlsparam'] ] )

 

【예제】

SQL> select to_timestamp_tz('2004-8-20 1:30:00 -3:00',

  2  'YYYY-MM-DD HH:MI:SS TZH:TZM') from dual;

 

TO_TIMESTAMP_TZ('2004-8-201:30:00-3:00','YYYY-MM-DDHH:MI:SSTZH:TZM')

--------------------------------------------------------------------------

20-AUG-04 01.30.00.000000000 AM -03:00

 

SQL>

 

 

 

2-22) TO_YMINTERVAL 함수

--------------------------------------------------------------------------------

 

TO_YMINTERVAL ( char ) 함수는 문자열을 interval year to month 형식으로 변환하는 함수이다.

 

【예제】

SQL> select sysdate,

  2  sysdate+to_yminterval('01-03') "15Months later"

  3  from dual;

 

SYSDATE   15Months

--------- ---------

04-AUG-04 04-NOV-05

 

SQL>

 

 

 

2-23) TRUNC(date) 함수

--------------------------------------------------------------------------------

 

이 함수는 날짜를 절삭하여 출력한다.

 

【형식】

TRUNC ( date [.fmt] )

 

【예제】

SQL> select trunc(to_date('27-AUG-04','DD-MON-YY'), 'YEAR')

  2  from dual;

 

TRUNC(TO_

---------

01-JAN-04

 

SQL>

 

 

 

2-24) TZ_OFFSET 함수

--------------------------------------------------------------------------------

 

이 함수는 time zone offset 값을 출력한다.

 

【형식】

TZ_OFFSET ( {‘time_zone_name’ | SESSIONTIMEZONE | DBTIMEZONE |

             ‘{+|-} hh:mi’ } )

 

【예제】

SQL> select sessiontimezone, tz_offset('ROK') from dual;

 

SESSIONTIMEZONE

---------------------------------------------------------------------------

TZ_OFFS

-------

+09:00

+09:00

 

SQL>

 

 

 

 

3-1) ASCIISTR 함수

--------------------------------------------------------------------------------

 

 asciistr('string') string의 아스키 문자로 반환한다.

A

【예제】

SQL> select ascii('ABACDE') from dual;

ABACDE의 두번째 A A에 움라우트(Umlaut)가 붙은 글씨이다.

 

ASCIIS

------

ABDCDE

           

SQL>

 

 

 

 

3-2) BIN_TO_NUM 함수

--------------------------------------------------------------------------------

 

 이 함수는 2진수 벡터를 10진수로 변환한다.

 

SQL> select bin_to_num(1,0,1,0) from dual;

 

BIN_TO_NUM(1,0,1,0)

-------------------

                 10

 

SQL>

 

 

 

3-3) CAST 함수

--------------------------------------------------------------------------------

 

 데이터형식이나 collection 형식을 다른 데이터형식이나 다른 collection 형식으로 변환한다.

 

【예제】데이터형식인 경우

SQL> select current_date from dual;

 

CURRENT_D

---------

30-JUL-04

 

SQL> select cast(current_date as timestamp) from dual;

 

CAST(CURRENT_DATEASTIMESTAMP)

---------------------------------------------------------------------------

30-JUL-04 12.29.15.000000 PM

 

SQL>

 

 

 

3-4) CHARTOROWID 함수

--------------------------------------------------------------------------------

 

 이 함수는 char, varchar2, nchar, ncharvar2형 데이터 타입을 rowid 형 데이터 타입으로 변경한다.

【예제】

SQL> select name from emp

  2  where rowid = chartorowid('AAAHZ+AABAAAMWiAAF');

 

NAME

----------

jijoe

 

SQL> select rowid,name from emp;

 

ROWID              NAME

------------------ ----------

AAAHZ+AABAAAMWiAAA Cho

AAAHZ+AABAAAMWiAAB Joe

AAAHZ+AABAAAMWiAAC kim

AAAHZ+AABAAAMWiAAF jijoe

 

SQL>

 

 

여기서 rowid의 의미는 다음과 같다.

AAAHZ+  AAB  AAAMWi  AAA 객체번호  테이블스페이스번호  블록번호  행번호

 

 

 

 

3-5) COMPOSE 함수

--------------------------------------------------------------------------------

 

 입력된 스트링을 unicode로 나타낸다.

 

【예제】

SQL> select compose('aa' || unistr('\0308') ) from dual;

 

CO

--

aa

 

SQL>

 

 

 

3-6) CONVERT 함수

--------------------------------------------------------------------------------

 

입력된 문자열을 지정한 코드로 변환한다.

공용 문자셋은 살펴보자.

US7ASCII  US 7-bit ASCII 문자 WE8DEC  서유럽 8비트 문자 WE8HP  HP 서유럽 레이져젯 8비트 문자 F7DEC  DEC 프랑스 7비트 문자 WE8EBCDIC500  IBM 서유럽 EBCDIC 코드 페이지 500 WE8PC850  IBM PC 코드 페이지 850 WE8ISO8859P1  ISO 8859 서유럽 8비트 문자

 

【예제】

SQL> select convert('arirang','we8pc850') from dual;

 

CONVERT

-------

arirang

 

SQL>

 

 

 

3-7) HEXTORAW 함수

--------------------------------------------------------------------------------

 

HEXTORAW(char) 함수는 char, varchar2, nchar, nvarchar2 따위의 문자로 주어지는

 hexadecimal digit raw 값으로 변환한다.

 

【예제】

SQL> create table test(raw_col RAW(10));

 

Table created.

 

SQL> insert into test VALUES (HEXTORAW('7D'));

 

1 row created.

 

SQL> select * from test;

 

RAW_COL

--------------------

7D

 

SQL>

 

 

 

 

3-8) NUMTODSINTERVAL 함수

--------------------------------------------------------------------------------

 

 NUMTODSINTERVAL(n,'char_expr') 함수는 n interval day to second로 변환하여 출력한다.

 char_expr은 다음 중의 하나이다.

  ‘DAY’

  ‘HOUR’

  ‘MINUTE’

  ‘SECOND’

 

【예제】

SQL> select numtodsinterval(100,'MINUTE') from dual;

 

NUMTODSINTERVAL(100,'MINUTE')

--------------------------------------------------------------------------

+000000000 01:40:00.000000000

 

SQL>

 

【예제】

SQL> connect scott/tiger

Connected.

SQL> select ename, hiredate,

  2  numtodsinterval(100,'day')+hiredate from emp;

 

ENAME      HIREDATE  NUMTODSIN

---------- --------- ---------

SMITH      17-DEC-80 27-MAR-81

ALLEN      20-FEB-81 31-MAY-81

WARD       22-FEB-81 02-JUN-81

JONES      02-APR-81 11-JUL-81

MARTIN     28-SEP-81 06-JAN-82

BLAKE      01-MAY-81 09-AUG-81

CLARK      09-JUN-81 17-SEP-81

SCOTT      19-APR-87 28-JUL-87

KING       17-NOV-81 25-FEB-82

TURNER     08-SEP-81 17-DEC-81

ADAMS      23-MAY-87 31-AUG-87

JAMES      03-DEC-81 13-MAR-82

FORD       03-DEC-81 13-MAR-82

MILLER     23-JAN-82 03-MAY-82

 

14 rows selected.

 

SQL>

 

 

 

 

3-9) NUMTOYMINTERVAL 함수

--------------------------------------------------------------------------------

 

NUMTOYMINTERVAL(n,'char_expr') 함수는 n interval year to month로 변환하여 출력한다.

 char_expr은 다음 중의 하나이다.

  ‘YEAR’

  ‘MONTH’

 

【예제】

SQL> select numtoyminterval(30,'month') from dual;

 

NUMTOYMINTERVAL(30,'MONTH')

---------------------------------------------------------------------------

+000000002-06

 

SQL>

 

【예제】

SQL> connect scott/tiger

Connected.

SQL> select ename,hiredate,

  2  numtoyminterval(30,'month')+hiredate from emp;

 

ENAME      HIREDATE  NUMTOYMIN

---------- --------- ---------

SMITH      17-DEC-80 17-JUN-83

ALLEN      20-FEB-81 20-AUG-83

WARD       22-FEB-81 22-AUG-83

JONES      02-APR-81 02-OCT-83

MARTIN     28-SEP-81 28-MAR-84

BLAKE      01-MAY-81 01-NOV-83

CLARK      09-JUN-81 09-DEC-83

SCOTT      19-APR-87 19-OCT-89

KING       17-NOV-81 17-MAY-84

TURNER     08-SEP-81 08-MAR-84

ADAMS      23-MAY-87 23-NOV-89

JAMES      03-DEC-81 03-JUN-84

FORD       03-DEC-81 03-JUN-84

MILLER     23-JAN-82 23-JUL-84

 

14 rows selected.

 

SQL>

 

 

 

 

 

 

3-10) RAWTOHEX 함수

--------------------------------------------------------------------------------

 

RAWTOHEX(raw) 함수는 raw 값을 hexadecimal 값으로 변환한다.

 

【예제】

SQL> create table test(raw_col RAW(10));

 

Table created.

 

SQL> insert into test VALUES (HEXTORAW('7D'));

 

1 row created.

 

SQL> select * from test;

 

RAW_COL

--------------------

7D

 

SQL> select rawtohex(raw_col) from test;

 

RAWTOHEX(RAW_COL)

--------------------

7D

 

SQL>

 

 

 

3-11) RAWTONHEX 함수

--------------------------------------------------------------------------------

 

RAWTONHEX(raw) 함수는 raw 값을 nvarchar2 hexadecimal 값으로 변환한다.

 

【예제】

SQL> create table test(raw_col RAW(10));

 

Table created.

 

SQL> insert into test VALUES (HEXTORAW('7D'));

 

1 row created.

 

SQL> select * from test;

 

RAW_COL

--------------------

7D

 

SQL> select rawtonhex(raw_col) from test;

 

RAWTONHEX(RAW_COL)

--------------------

7D

 

SQL>

 

 

 

3-12) ROWIDTOCHAR 함수

--------------------------------------------------------------------------------

 

RAWIDTOCHAR(rowid) 함수는 rowid 값을 varchar2 형식의 데이터로 변환한다.

 

【예제】

SQL> select rowid from test;

 

ROWID

------------------

AAAHbHAABAAAMXCAAA

 

SQL> select rowid from test

  2  where rowidtochar(rowid) like '%AABAA%';

 

ROWID

------------------

AAAHbHAABAAAMXCAAA

 

SQL>

 

여기서 rowid의 의미는 다음과 같다.

AAAHbH  AAB  AAAMXC  AAA 객체번호  테이블스페이스번호  블록번호  행번호

 

 

 

 

3-13) ROWIDTONCHAR 함수

--------------------------------------------------------------------------------

 

RAWIDTONCHAR(rowid) 함수는 rowid 값을 nvarchar2 형식의 데이터로 변환한다.

 

【예제】

SQL> select rowid from test;

 

ROWID

------------------

AAAHbHAABAAAMXCAAA

 

SQL> select rowid from test

  2  where rowidtochar(rowid) like '%AABAA%';

 

ROWID

------------------

AAAHbHAABAAAMXCAAA

 

SQL> select lengthb(rowidtonchar(rowid)), rowidtonchar(rowid)

  2  from test;

 

LENGTHB(ROWIDTONCHAR(ROWID)) ROWIDTONCHAR(ROWID

---------------------------- ------------------

                          36 AAAHbHAABAAAMXCAAA

 

SQL>

 

 

여기서 rowid의 의미는 다음과 같다.

AAAHbH  AAB  AAAMXC  AAA 객체번호  테이블스페이스번호  블록번호  행번호

 

 

 

 

3-14) TO_CHAR(character) 함수

--------------------------------------------------------------------------------

 

 이 함수는 nchar, nvarchar2, clob, nclob 형식의 데이터를

데이터베이스 character set으로 변환한다. , 문자로 변환한다.

 

【형식】

 TO_CHAR( nchar| clob | nclob)

 

【예제】

SQL> select to_char('01110') from dual;

 

TO_CH

-----

01110

 

SQL>

 

 

 

 

3-15) TO_CLOB 함수

--------------------------------------------------------------------------------

 

이 함수는 LOB 컬럼에 있는 NCLOB나 또는 다른 문자 스트링을 CLOB로 변환한다.

 

【형식】

 TO_CLOBR({ lob_column | char})

 

【예제】

SQL> select to_clob('corea') from dual;

 

TO_CLOB('COREA')

--------------------------------------------------------------------------

corea

 

SQL>

 

 

 

 

3-16) TO_DSINTERVAL 함수

--------------------------------------------------------------------------------

 

이 함수는 문자열을 interval day to second 형식으로 변환하는 함수이다.

 

【형식】

to_dsinterval ( char [ ‘nlsparam’] )

 

【예제】

SQL> select sysdate,

  2  sysdate+to_dsinterval('003 17:00:00') as "3days 17hours later"

  3  from dual;

 

SYSDATE   3days 17h

--------- ---------

04-AUG-04 08-AUG-04

 

SQL>

 

 

 

3-17) TO_LOB 함수

--------------------------------------------------------------------------------

 

 TO_LOB(long_column) 함수는 LONG, LONG RAW 컬럼의 데이터를 LOB 값으로 변환한다.

 

【예제】

SQL> create table test2(zz clob);

 

Table created.

 

SQL> insert into test2

  2  (select to_lob(p.raw_col) from test p);

 

SQL>

 

 

 

3-18) TO_MULTI_BYTE 함수

--------------------------------------------------------------------------------

 

TO_MULTI_BYTE(char) 함수는 싱글 바이트 문자를 포함한 모든 문자열을 다중바이트 문자열로 변환한다.

 

【예제】

SQL> select dump(to_multi_byte('Corea')) from dual;

 

DUMP(TO_MULTI_BYTE('COREA'))

-----------------------------------------------------

Typ=1 Len=10: 163,195,163,239,163,242,163,229,163,225

 

SQL>

 

 

 

 

3-19) TO_NCHAR(character) 함수

--------------------------------------------------------------------------------

 

 이 함수는 문자스트링, clob, nclob 형식의 데이터를 national character set,

  nchar으로 변환한다. 이는 translate ... using 문의 경우와 같다.

 

【형식】

TO_NCHAR({char|clob|nclob} [,fmt [,'nlsparam']])

 

【예제】

SQL> select to_nchar('Corea') from dual;

 

TO_NC

-----

Corea

 

SQL>

 

 

 

3-20) TO_NCHAR(datetime) 함수

--------------------------------------------------------------------------------

 

 이 함수는 date, timestamp, timestamp with time zone, timestamp with local time zone,

 interval month to year, interval day to second 형식의 데이터를

 nchar 형식의 데이터로 변환한다.

 

【형식】

TO_NCHAR({datetime|interval} [,fmt [,'nlsparam']])

 

【예제】

SQL> select to_nchar(sysdate) from dual;

 

TO_NCHAR(SYSDATE)

------------------------------

05-AUG-04

 

SQL>

 

 

 

 

3-21) TO_NCHAR(number) 함수

--------------------------------------------------------------------------------

 

 이 함수는 숫자를 nvarchar2 형식의 데이터로 변환한다.

 

【형식】

TO_NCHAR(n [,fmt [,'nlsparam']])

 

【예제】

SQL> select to_nchar(1234) from dual;

 

TO_N

----

1234

 

SQL> select to_nchar(rownum) from test;

 

TO_NCHAR(ROWNUM)

----------------------------------------

1

 

SQL>

 

 

 

 

3-22) TO_NCLOB 함수

--------------------------------------------------------------------------------

 

이 함수는 clob, 문자열 형식의 데이터를 nclob 형식의 데이터로 변환한다.

 

【형식】

TO_NCLOB({char|lob_column})

 

【예제】

SQL> select to_nclob('Corea') from dual;

 

TO_NCLOB('COREA')

--------------------------------------------------------------------------

Corea

 

SQL>

 

 

 

 

3-23) TO_NUMBER 함수

--------------------------------------------------------------------------------

 

이 함수는 숫자를 포함하는 char, varchar2, nchar, nvarchar2 형식의

 문자 데이터를 number 형식의 숫자 데이터로 변환한다.

 

【형식】

TO_NUMBER(char [,fmt [,'nlsparam']])

 

【예제】

SQL> select to_number('1234') from dual;

 

TO_NUMBER('1234')

-----------------

             1234

 

SQL>

 

 

 

3-24) TO_SINGLE_BYTE 함수

--------------------------------------------------------------------------------

 

TO_SINGLE_BYTE(char) 함수는 다중 바이트 문자열을 single byte 문자로 변환한다.

 

【예제】

SQL> select dump(to_multi_byte('Corea')) from dual;

 

DUMP(TO_MULTI_BYTE('COREA'))

-----------------------------------------------------

Typ=1 Len=10: 163,195,163,239,163,242,163,229,163,225

 

SQL> select dump(to_single_byte('Corea')) from dual;

 

DUMP(TO_SINGLE_BYTE('COREA'))

------------------------------

Typ=1 Len=5: 67,111,114,101,97

 

SQL> select to_single_byte(chr(65)) from dual;

 

T

-

A

 

SQL>

 

 

 

 

3-25) TO_YMINTERVAL 함수

--------------------------------------------------------------------------------

 

TO_YMINTERVAL ( char ) 함수는 문자열을 interval year to month 형식으로 변환하는 함수이다.

 

【예제】

SQL> select sysdate,

  2  sysdate+to_yminterval('01-03') "15Months later"

  3  from dual;

 

SYSDATE   15Months

--------- ---------

04-AUG-04 04-NOV-05

 

SQL>

 

 

 

3-26) TRANSLATE ... USING 함수

--------------------------------------------------------------------------------

 

이 함수는 텍스트 형식의 데이터를 지정한 문자 형식의 데이터로 변환한다.

 

【형식】

TRANSLATE ( text USING {CHAR_CS|NCHAR_CS} )

 

【예제】

SQL> select translate('Corea' USING char_cs) from dual;

 

TRANS

-----

Corea

 

SQL> select to_nchar('Corea') from dual;

 

TO_NC

-----

Corea

 

SQL>

 

 

 

3-27) UNISTR 함수

--------------------------------------------------------------------------------

 

UNISTR('string') 함수는 스트링 형식의 데이터를 nchar 형식의 데이터로 변환한다.

 

【예제】

SQL> select unistr('abc\00e5\00f1\00f6') from dual;

 

UNISTR

------

abc??o

 

SQL> select unistr('Corea') from dual;

 

UNIST

-----

Corea

 

SQL>

 

 

 

 

4-1) BFILENAME 함수

--------------------------------------------------------------------------------

 

 서버 파일 시스템 상에 실제로 위치한 LOB 바이너리 파일의 위치한 BFILE locator를 반환한다.

【형식】

bfilename ('디렉토리‘,’파일이름‘)

 

【예제】BFILE insert하는 예

SQL> connect system/manager

 

SQL> host mkdir /export/home/oracle/bfile

 

SQL> create directory bfile_dir as '/export/home/oracle/bfile';

 

Directory created.

 

SQL> grant read on directory bfile_dir to jijoe;

 

Grant succeeded.

 

SQL> connect jijoe/joe_password

 

SQL> create table bfile_doc (id number, doc bfile);

 

SQL> insert into bfile_doc

 

   1    values(1111,bfilename('bfile_dir','unix.hwp'));

 

1 row created.

 

SQL>

 

 

 

4-2) COALESCE 함수

--------------------------------------------------------------------------------

 

이 함수는 나열된 값 중에서 NULL이 아닌 첫 번째 값을 반환한다. 

 

【예제】

SQL> select coalesce('','','arirang','kunsan') from dual;

 

COALESC

-------

arirang

 

SQL>

 

 

 

 

4-3) DECODE 함수

--------------------------------------------------------------------------------

 

DECODE는 일반적인 프로그래밍 언어의 IF문을 SQL 문자 또는 PL/SQL 안으로 끌어들여 사용하기 위하여 만들어진 오라클 함수이다.

따라서 일반 프로그래밍 언어의 IF문이 수행 할 수 있는 기능을 포함하고 있다.

  select시의 decode 사용은 from 절만 빼고 어디에서나 사용할 수 있다.

  일반 프로그래밍과 decode 함수를 서로 비교하여 보자.

IF Decode 함수 IF A=B THEN RETURN 'T';END IF; DECODE(A,B,'T') IF A=B THENRETURN 'T';ELSIF A=C THENRETURN 'F';ELSERETURN 'X';END IF; DECODE(A,B,'T',C,'F','X')

【형식】

DECODE(검색컬럼,조건1,결과값1,

                  조건2,결과값2,...,기본값);

 

【예제】

SQL> connect jijoe/jijoe_password

SQL> create table aa(

  2  pid        number(12) primary key,

  3  addr varchar2(20),

  4  name varchar2(10));

 

SQL> insert into aa values(1234,'kunsan','jijoe')

SQL> insert into aa values(3456,'seoul','sunny')

 

SQL> select * from aa;

 

       PID ADDR                 NAME

---------- -------------------- ----------

      1234 kunsan               jijoe

      3456 seoul                sunny

 

SQL> select decode(pid,1234,name) name from aa;

 

NAME

----------

jijoe

 

 

SQL>

【예제】

SQL> desc ddd

 Name                                      Null?    Type

 ----------------------------------------- -------- ----------------------------

 NO                                                 NUMBER(4)

 NAME                                               VARCHAR2(10)

 HIRDATE                                            DATE

 DEPTNO                                             NUMBER(5)

 

SQL> select * from ddd;

 

        NO NAME       HIRDATE       DEPTNO

---------- ---------- --------- ----------

         1 student1   01-JAN-04         10

         2 student2   01-FEB-04         10

         3 student3   01-MAR-04         20

         4 student4   01-MAY-04         30

 

SQL> select count(decode(to_char(hirdate,'MM'),'01',1)) "JAN",

  2         count(decode(to_char(hirdate,'MM'),'02',1)) "FEB",

  3         count(decode(to_char(hirdate,'MM'),'03',1)) "MAR",

  4         count(*) "Total"

  5  from ddd

  6  where to_char(hirdate,'MM') >= '01' AND

  7        to_char(hirdate,'MM') <= '06';

 

       JAN        FEB        MAR      Total

---------- ---------- ---------- ----------

         1          1          1          4

 

SQL>

 

 

 

 

4-4) DEPTH 함수

--------------------------------------------------------------------------------

 

DEPTH( correlation_integer) 함수는 UNDER_PATH EQUALS_PATH 조건과 함께 사용되는 보조함수이다.

 이 함수는 UNDER_PATH 조건에 상관관계의 수치를 반환한다.

 

【예제】

SQL> select * from resource_view;

SQL> select path(1), depth(2)

  2  from resource_view

  3  where under_path(res, '/sys/schemas/PUBLIC/www.w3.org/2001', 1)=1

  4    and under_path(res, '/sys/schemas/PUBLIC/www.w3.org/2001', 2)=1;

 

PATH(1)                                      DEPTH(2)

------------------------------------------ ----------

/xml.xsd                                            1

        

 

SQL>

 

 

 

4-5) DUMP 함수

--------------------------------------------------------------------------------

 

지정한 데이터의 위치와 길이 따위를 지정한 형식으로 반환한다.

【형식】

DUMP(expr [,반환형식[,시작위치[,길이]]] )

 

【예제】

SQL> select dump('Corea', 1016) from dual;

 

DUMP('COREA',1016)

-----------------------------------------------------

Typ=96 Len=5 CharacterSet=KO16KSC5601: 43,6f,72,65,61

 

SQL> select dump('Corea', 8,3,2) "Octal" from dual;

 

Octal

---------------------

Typ=96 Len=5: 162,145

 

SQL> select dump('Corea',16,3,2) "ASCII" from dual;

 

ASCII

-------------------

Typ=96 Len=5: 72,65

 

SQL>

 

 

 

4-6) EMPTY_BLOB 함수

--------------------------------------------------------------------------------

 

EMPTY_BLOB () 함수는 LOB 변수를 초기화하기 위하여 쓰이거나,

 또는 INSERT 문이나 UPDATE 문에서 empty LOB 위치를 반환한다.

 

【예시】

UPDATE print_media SET ad_photo = EMPTY_BLOB();

 

 

 

4-7) EMPTY_CLOB 함수

--------------------------------------------------------------------------------

 

EMPTY_CLOB () 함수는 LOB 변수를 초기화하기 위하여 쓰이거나,

 또는 INSERT 문이나 UPDATE 문에서 empty LOB 위치를 반환한다.

 

【예시】

UPDATE print_media SET ad_photo = EMPTY_CLOB();

 

 

 

4-8) EXISTSNODE 함수

--------------------------------------------------------------------------------

 

이 함수는 node의 존재여부를 확인하여 그 결과를 반환한다.

 0은 노드가 남아 있지 않은 경우이고,

 1은 아직 노드가 존재하는 경우이다.

 

【형식】

EXISTSNODE(XMLType_instance, XPath_string [,namespace_string] )

 

【예제】

SQL> select * from resource_view;

SQL> select res,any_path

  2  from resource_view

  3  where existsnode(res, 'xdbconfig.xml') =0;

 

26 rows selected.

SQL>

 

 

 

 

4-9) EXTRACT(XML) 함수

--------------------------------------------------------------------------------

 

이 함수는 existsnode와 유사한 함수이다.

 

【형식】

EXTRACT(XMLType_instance, XPath_string [,namespace_string] )

 

【예제】

SQL> select * from resource_view;

SQL> select extract(res,'xdbconfig.xml')

  2  from resource_view;

 

26 rows selected.

SQL>

 

 

 

 

4-10) EXTRACTVALUE 함수

--------------------------------------------------------------------------------

 

이 함수는 existsnode와 유사한 함수로써 node의 스칼라 값을 반환한다.

 

【형식】

EXTRACTVALUE(XMLType_instance, XPath_string [,namespace_string] )

 

【예제】

SQL> select * from resource_view;

SQL> select extractvalue(res,'xdbconfig.xml')

  2  from resource_view;

 

26 rows selected.

SQL>

 

 

 

4-11) GREATEST 함수

--------------------------------------------------------------------------------

 

GREATEST (expr,...) 함수는 expr 중에서 가장 큰 값을 반환한다.

 

【예제】

SQL> select greatest(20,10,30) from dual;

 

GREATEST(20,10,30)

------------------

                30

 

SQL>

 

 

 

4-12) LEAST 함수

--------------------------------------------------------------------------------

 

LEAST (expr,...) 함수는 expr 중에서 가장 작은 값을 반환한다.

 

【예제】

SQL> select least(20,10,30) from dual;

 

GREATEST(20,10,30)

------------------

                10

 

SQL> select least('bb','aa','cc') from dual;

 

GR

--

aa

 

SQL>

 

 

 

4-13) NLS_CHARSET_DECL_LEN 함수

--------------------------------------------------------------------------------

 

NLS_CHARSET_DECL_LEN (byte_count , char_set_id) 함수는 nchar로 선언된 폭을 반환한다.

 

【예제】

SQL> select nls_charset_decl_len

  2  (200, nls_charset_id('ja16eucfixed')) from dual

 

NLS_CHARSET_DECL_LEN(200,NLS_CHARSET_ID('JA16EUCFIXED'))

--------------------------------------------------------

                                                     100

 

SQL>

 

 

 

 

4-14) NLS_CHARSET_ID 함수

--------------------------------------------------------------------------------

 

nls_charset_id('text') 함수는 문자셋 이름에 대응하는 ID 번호를 반환한다.

 여기서 text는 서버에서 지원되는 CHAR_CS NCHAR_CS이다.

 

【예제】

SQL> select nls_charset_id('ja16euc') from dual;

 

NLS_CHARSET_ID('JA16EUC')

-------------------------

                      830

 

SQL>

 

 

 

4-15) NLS_CHARSET_NAME 함수

--------------------------------------------------------------------------------

 

nls_charset_name('number') 함수는 문자섹 ID 번호에 대응하는 문자의 이름을 반환한다.

 

【예제】

SQL> select nls_charset_name(830) from dual;

 

NLS_CHA

-------

JA16EUC

 

SQL> select nls_charset_name(1) from dual;

 

NLS_CHAR

--------

US7ASCII

 

SQL>

 

 

 

 

4-16) NULLIF 함수

--------------------------------------------------------------------------------

 

NULLIF(expr1, expr2) 함수는

 expr1 expr2를 비교하여

       같으면 null을 반환하고,

       같지 않으면 expr1을 반환한다.

 

이는 CASE 문으로 쓰면 다음과 같다.

  CASE WHEN expr1 = expr2 THEN NULL ELSE expr1 END

 

【예제】

SQL> select nullif('aa','AA') from dual;

 

NU

--

aa

 

SQL> select nullif('aa','aa') from dual;

 

NU

--

 

 

SQL>

 

 

 

 

4-17) NVL2 함수

--------------------------------------------------------------------------------

 

NVL2(expr1, expr2, expr3) 함수는

   expr1 null이 아니면 expr2를 반환하고,

   expr1 null이면 expr3을 반환한다.

 

【예제】

SQL> select nvl2('','Corea','Korea') from dual;

 

NVL2(

-----

Korea

 

SQL> select nvl2('aa','Corea','Korea') from dual;

 

NVL2(

-----

Corea

 

SQL>

 

 

 

 

4-18) PATH 함수

--------------------------------------------------------------------------------

 

PATH(correlation_path) 함수는 under_path equals_path의 보조함수로서,

 자원의 관계경로를 반환한다.

 

【예제】

SQL> select * from resource_view;

SQL> select path(1), depth(2)

  2  from resource_view

  3  where under_path(res, '/sys/schemas/PUBLIC/www.w3.org/2001', 1)=1?

  4    and under_path(res, '/sys/schemas/PUBLIC/www.w3.org/2001', 2)=1;

 

PATH(1)                                      DEPTH(2)

------------------------------------------ ----------

/xml.xsd                                            1

        

 

SQL>

 

 

 

 

4-19) SYS_CONNECT_BY_PATH 함수

--------------------------------------------------------------------------------

 

SYS_CONNECT_BY_PATH(column, char) 함수는 계층적 쿼리에서만 유효하며,

 column의 절대 경로를 char로 지정한 문자로 분리하여 반환한다.

 

【예제】

SQL> select sys_connect_by_path(name, '/') from emp

  2  start with name='jijoe'

  3  connect by prior id=1101;

 

SYS_CONNECT_BY_PATH(NAME,'/')

-----------------------------

/jijoe

 

SQL> select * from emp;

 

        ID NAME           SALARY      BONUS

---------- ---------- ---------- ----------

      1101 Cho               250        125

      1102 Joe               240        100

      1103 kim               250        100

      1104 jijoe             220        100

 

SQL>

 

 

 

4-20) SYS_CONTEXT 함수

--------------------------------------------------------------------------------

 

 이 함수는 namespace와 관계되는 parameter의 값을 반환한다.

 

【형식】

SYS_CONTEXT('namespace','parameter' [,length])

 

【예제】

SQL> select sys_context('userenv','session_user') from dual;

 

SYS_CONTEXT('USERENV','SESSION_USER')

-------------------------------------

JIJOE

 

SQL> select sys_context('userenv','lang') from dual;

 

SYS_CONTEXT('USERENV','LANG')

-----------------------------

US

 

SQL>

 

 userenv에서 사용될 parameter는 다음과 같다.

AUDITED_CURSORID AUTHENTICATION_DATA BG_JOB_ID

CLIENT_IDENTIFIER CLIENT_INFO  CURRENT_SCHEMA

CURRENT_SCHEMAID CURRENT_SQL  CURRENT_USER

CURRENT_USERID  DB_DOMAIN  DB_NAME

ENTRY_ID  EXTERNAL_NAME  FG_JOB_ID

GLOBAL_CONTEXT_MEMORY HOST   INSTANCE

IP_ADDRESS  ISDBA   LANG

LANGUAGE  NETWORK_PROTOCOL NLS_CALENDAR

NLS_CURRENCY  NLS_DATE_FORMAT  NLS_DATE_LANGUAGE

NLS_SORT  NLS_TERRITORY  OS_USER

PROXY_USER  PROXY_USERID  SESSION_USER

SESSION_USERID  SESSIONID  TERMINAL

 

 

 

 

4-21) SYS_DBURIGEN 함수

--------------------------------------------------------------------------------

 

이 함수는 입력된 argument에 대한 DBURIType URL을 반환한다.

 

【형식】

SYS_DBURIGEN({column|attribute} [rowid],... [,'text()'])

 

【예제】

SQL> select sys_dburigen(id,name) from emp

  2  where name='jijoe';

 

SYS_DBURIGEN(ID,NAME)(URL, SPARE)

------------------------------------------------------------------------

DBURITYPE('/PUBLIC/EMP/ROW[ID=''1104'']/NAME', NULL)

 

SQL> select * from emp;

 

        ID NAME           SALARY      BONUS

---------- ---------- ---------- ----------

      1101 Cho               250        125

      1102 Joe               240        100

      1103 kim               250        100

      1104 jijoe             220        100

 

SQL>

 

 

 

4-22) SYS_EXTRACT_UTC 함수

--------------------------------------------------------------------------------

 

sys_extract_utc(datetime_with_timezone) 함수는

UTC(coordinated universal time: Greenwich mean time) 시각을 반환한다.

 

【예제】

SQL> select systimestamp, sys_extract_utc(systimestamp) from dual;

 

SYSTIMESTAMP

--------------------------------------------------------------------------

SYS_EXTRACT_UTC(SYSTIMESTAMP)

--------------------------------------------------------------------------

06-AUG-04 02.41.39.258976 PM +09:00

06-AUG-04 05.41.39.258976 AM

 

 

SQL>

 

 

 

4-23) SYS_GUID 함수

--------------------------------------------------------------------------------

 

sys_guid() 함수는 globally unique identifier를 반환한다.

 

【예제】

SQL> select sys_guid() from dual;

 

SYS_GUID()

--------------------------------

E0F6C6D5767C01ADE034080020B588F4

 

SQL>

 

 

 

4-24) SYS_XMLAGG 함수

--------------------------------------------------------------------------------

 

이 함수는 sys_xmlgen 문에서 만든 XML 문을 기본적으로 ROWSET 태그를 새로 추가 시킨다.

 

【형식】

SYS_XMLAGG( expr [fmt] )

 

【예제】

SQL> select sys_xmlagg(sys_xmlgen(name)) from emp

  2  where name like 'j%';

 

SYS_XMLAGG(SYS_XMLGEN(NAME))

--------------------------------------------------------------------------

<ROWSET>

  <NAME>jijoe</NAME>

</ROWSET>

 

 

SQL>

 

 

 

4-25) SYS_XMLGEN 함수

--------------------------------------------------------------------------------

 

이 함수는 지정한 행이나 열을 XML 문으로 만들어 반환한다.

 

【형식】

SYS_XMLGEN( expr [fmt] )

 

【예제】

SQL> select sys_xmlgen(name) from emp

  2  where name like 'j%';

 

SYS_XMLGEN(NAME)

--------------------------------------------------------------------------

<NAME>jijoe</NAME>

 

SQL>

 

 

 

4-26) UID 함수

--------------------------------------------------------------------------------

 

UID 함수는 사용자의 유일한 ID를 정수로 반환한다.

 

【예제】

SQL> select uid from dual;

 

       UID

----------

        93

 

SQL>

 

 

 

4-27) USER 함수

--------------------------------------------------------------------------------

 

이 함수는 사용자의 이름을 반환한다.

 

【예제】

SQL> select user,uid from dual;

 

USER                                  UID

------------------------------ ----------

JIJOE                                  93

 

SQL>

 

 

 

 

4-28) USERENV 함수

--------------------------------------------------------------------------------

 

USERENV('parameter') 함수는 사용자의 환경에 관한 정보를 반환한다.

 

 parameter는 다음과 같은 것이 있다.

CLIENT_INFO ENTRYID  ISDBA  LANG

LANGUAGE SESSIONID TERMINAL

 

【예제】

SQL> select userenv('language') from dual;

 

USERENV('LANGUAGE')

----------------------------------------------------

AMERICAN_AMERICA.KO16KSC5601

 

SQL>

 

 

 

 

 

4-29) VSIZE 함수

--------------------------------------------------------------------------------

 

VSIZE('expr') 함수는 expr이 표시되는 바이트 수를 반환한다.

 

【예제】

SQL> select name, vsize(name) from emp

  2  where name like 'jijoe';

 

NAME       VSIZE(NAME)

---------- -----------

jijoe                5

 

SQL>

 

$ cat .profile

..........

NLS_LANG=AMERICAN_AMERICA.KO16KSC5601  ☜ 한글 문자셋으로 설정

export NLS_LANG

NLS_LANG=AMERICAN_AMERICA.UTF8  UNICODE로 설정

export NLS_LANG

$

 

 

테이블에서 저장된 데이터가 한글 문자셋인지 유니코드인지 식별하려면 다음과 같이 확인해 볼 수 있다.

 

    select 한글컬럼명, vsize(한글컬럼명) from 테이블명;

 

여기서 한글 컬럼에 한글이 3글자라면, vsize 결과가

    9이면 unicode이고,

    6이면 한글 문자셋으로 저장된 것임을 알 수 있다.

 

【예제】

SQL> select * from test;

 

        ID NAME

---------- ----------------------------------------

      1113 아리랑

      1112 쓰리랑

 

SQL> select name, vsize(name) from test;

 

NAME                                     VSIZE(NAME)

---------------------------------------- -----------

아리랑                                             6

쓰리랑                                             6

 

SQL>

 

 

 

 

4-30) XMLAGG 함수

--------------------------------------------------------------------------------

 

이 함수는 xmlelement에 의해서 XML 태그를 만든 문장을 모으는 기능이다.

 

【형식】

XMLAGG( XMLType_instance [order_by_clause])

 

【예제】

 SQL> select xmlagg(xmlelement("name",e.name)) from emp e;

 

XMLAGG(XMLELEMENT("NAME",E.NAME))

--------------------------------------------------------------------------

<name>Cho</name>

<name>Joe</name>

<name>kim</name>

<name>jijoe</name>

 

SQL>

 

 

 

 

4-31) XMLCOLATTVAL 함수

--------------------------------------------------------------------------------

 

이 함수는 XML fragment를 만드는 기능이다

 

【형식】

XMLCOLATTVAL( value_expr [AS c_alias],...)

 

【예제】

SQL> select xmlcolattval(e.name,e.id,e.salary) from emp e;

 

XMLCOLATTVAL(E.NAME,E.ID,E.SALARY)

--------------------------------------------------------------------------

<column name="NAME">Cho</column>

<column name="ID">1101</column>

<column name="S

 

<column name="NAME">Joe</column>

<column name="ID">1102</column>

<column name="S

 

<column name="NAME">kim</column>

<column name="ID">1103</column>

<column name="S

 

<column name="NAME">jijoe</column>

<column name="ID">1104</column>

<column name=

 

 

SQL> select * from emp;

 

        ID NAME           SALARY      BONUS

---------- ---------- ---------- ----------

      1101 Cho               250        125

      1102 Joe               240        100

      1103 kim               250        100

      1104 jijoe             220        100

 

SQL>

 

 

 

 

4-32) XMLCONCAT 함수

--------------------------------------------------------------------------------

 

XMLCONCAT( XMLType_instance,...) 함수는 XMLType instance series로 넣어 만드는 기능이다.

 

【예제】

SQL> select xmlconcat(

  2    xmlelement("name",e.name),xmlelement("bonus",e.bonus))

  3  from emp e;

 

XMLCONCAT(XMLELEMENT("NAME",E.NAME),XMLELEMENT("BONUS",E.BONUS))

--------------------------------------------------------------------------

<name>Cho</name>

<bonus>125</bonus>

 

<name>Joe</name>

<bonus>100</bonus>

 

<name>kim</name>

<bonus>100</bonus>

 

<name>jijoe</name>

<bonus>100</bonus>

 

SQL>

 

 

 

4-33) XMLFOREST 함수

--------------------------------------------------------------------------------

 

이 함수는 각각의 argument parameter  XML로 변환한다.

 

【형식】

XMLFOREST( value_expr [AS c_alias],...)

 

【예제】

SQL> select xmlelement("emp",

  2  xmlforest(e.id, e.name, e.bonus)) from emp e;

 

XMLELEMENT("EMP",XMLFOREST(E.ID,E.NAME,E.BONUS))

--------------------------------------------------------------------------

<emp>

  <ID>1101</ID>

  <NAME>Cho</NAME>

  <BONUS>125</BONUS>

</emp>

 

<emp>

  <ID>1102</ID>

  <NAME>Joe</NAME>

  <BONUS>100</BONUS>

</emp>

 

<emp>

  <ID>1103</ID>

  <NAME>kim</NAME>

  <BONUS>100</BONUS>

</emp>

 

<emp>

  <ID>1104</ID>

  <NAME>jijoe</NAME>

  <BONUS>100</BONUS>

 

</emp>

 

SQL> select * from emp;

 

        ID NAME           SALARY      BONUS

---------- ---------- ---------- ----------

      1101 Cho               250        125

      1102 Joe               240        100

      1103 kim               250        100

      1104 jijoe             220        100

 

SQL>

 

 

 

 

4-34) XMLELEMENT 함수

--------------------------------------------------------------------------------

 

이 함수는 XML 태그를 붙이는 기능이다

 

【예제】

SQL> select xmlelement("name",e.name) from emp e

  2  where name like 'j%';

 

XMLELEMENT("NAME",E.NAME)

--------------------------------------------------------------------------

<name>jijoe</name>

 

SQL>

 

 

 

 

5-1) AVG* 함수

--------------------------------------------------------------------------------

 

조건을 만족하는 행(row)의 평균을 값을 반환하며,

 aggregate 함수나

 analytic 함수로 사용된다.

 

【형식】

AVG( [DISTINCT | ALL] 컬럼명)

   [ [OVER] (analytic )]

 

【예제】aggregate

SQL> select * from emp;

 

        ID NAME           SALARY      BONUS

---------- ---------- ---------- ----------

      1101 Cho               250        125

      1102 Joe               240        100

      1103 kim               250        100

      1104 jijoe             220        100

 

SQL> select avg(salary) from emp;

 

AVG(SALARY)

-----------

        240

 

SQL>

【예제】analytic

SQL> select avg(distinct salary) over(partition by bonus)

  2  from emp;

 

AVG(DISTINCTSALARY)OVER(PARTITIONBYBONUS)

-----------------------------------------

                               236.666667

                               236.666667

                               236.666667

                                      250

 

 

SQL> select avg(salary) over(partition by bonus order by id

    2 rows between 1 preceding and 1 following) as avg  from emp;

 

       AVG

----------

       245

236.666667

       235

       250

 

SQL>

 

 

 

 

5-2) CORR* CORR* 함수

--------------------------------------------------------------------------------

 

집합 쌍의 상관관계 계수를 반환한다.

 

【형식】

CORR( expr1, expr2 ) [ [OVER] (analytic )]

 

【예제】

SQL> select corr(avg(bonus),max(bonus))

  2  from employees

  3  group by dept_no;

 

CORR(AVG(BONUS),MAX(BONUS))

---------------------------

                          1

 

SQL>

 

 

 

5-3) COUNT* 함수

--------------------------------------------------------------------------------

 

 

 쿼리한 행의 수를 반환한다.

【형식】

COUNT([*|DISTINCT|ALL] 컬럼명) [ [OVER] (analytic )]

 

【예제】

SQL> select count(*) from emp;

 

  COUNT(*)

----------

         4

 

SQL> select count (distinct dept_no) from employees;

 

COUNT(DISTINCTDEPT_NO)

----------------------

                     2

 

SQL> select count (all dept_no) from employees;

 

COUNT(ALLDEPT_NO)

-----------------

                4

 

SQL> select salary,count(*)

  2  over (order by salary)

  3  from emp;

 

    SALARY COUNT(*)OVER(ORDERBYSALARY)

---------- ---------------------------

       220                           1

       240                           2

       250                           4

       250                           4

 

SQL>

 

 

 

 

5-4) COVAR_POP 함수

--------------------------------------------------------------------------------

 

이 함수는 number 쌍의 집합에 대한 population covariance를 반환한다.

 

【형식】

COVAR_POP(expr1, expr2 [ OVER (analytic )] )

 

【예제】

SQL> select covar_pop(bonus,salary) from emp;

 

COVAR_POP(BONUS,SALARY)

-----------------------

                   62.5

 

SQL> select * from emp;

 

        ID NAME           SALARY      BONUS

---------- ---------- ---------- ----------

      1101 Cho               250        125

      1102 Joe               240        100

      1103 kim               250        100

      1104 jijoe             220        100

 

SQL>

 

 

 

5-5) COVAR_SAMP 함수

--------------------------------------------------------------------------------

 

이 함수는 number 쌍의 집합에 대한 sample covariance를 반환한다.

 

【형식】

COVAR_SAMP(expr1, expr2 [ OVER (analytic )] )

 

【예제】

SQL> select covar_samp(bonus,salary) from emp;

 

COVAR_SAMP(BONUS,SALARY)

------------------------

              83.3333333

 

SQL> select * from emp;

 

        ID NAME           SALARY      BONUS

---------- ---------- ---------- ----------

      1101 Cho               250        125

      1102 Joe               240        100

      1103 kim               250        100

      1104 jijoe             220        100

 

SQL>

 

 

 

5-6) CUME_DIST 함수

--------------------------------------------------------------------------------

 

이 함수는 그룹 값 내에서 어떤 값의 cumulative distribution(누적분포)을 계산한다.

 

【형식】

CUME_DIST(expr,... WITHIN GROUP (ORDER BY

     expr [DESC | ASC] [NULLS {FIRST|LAST}],...)

또는

CUME_DIST() over ([query_partition_clause] order_by_clause)

 

【예제】

SQL> select cume_dist(230) within group

  2  (order by salary ) from emp;

 

CUME_DIST(230)WITHINGROUP(ORDERBYSALARY)

----------------------------------------

                                      .4

 

SQL> select * from emp;

 

        ID NAME           SALARY      BONUS

---------- ---------- ---------- ----------

      1101 Cho               250        125

      1102 Joe               240        100

      1103 kim               250        100

      1104 jijoe             220        100

 

SQL>

 

 

 

 

5-7) DENSE_RANK 함수

--------------------------------------------------------------------------------

 

 

그룹 내에서 순위를 반환한다.

 

【예제】

SQL> select * from employees;

 

        ID    DEPT_NO NAME           SALARY      BONUS

---------- ---------- ---------- ---------- ----------

      1101         10 Cho               250        125

      1102         20 Joe               240        100

      1103         10 kim               250        100

      1104         20 jijoe             220        100

 

SQL> select dense_rank(230, .05) within group

  2  (order by salary, bonus) "Dense Rank"

  3  from employees;

 

Dense Rank

----------

         2

 

SQL>

 

 

 

 

5-8) FIRST 함수

--------------------------------------------------------------------------------

 

first last 함수는 행을 서열화 시켜서 첫 번째나 마지막 행을 추출한다.

【형식】

집합함수 KEEP (

 DENSE_RANK FIRST ORDER BY

    expr [DESC|ASC][NULL{FIRST|LAST}],...)

【예제】

SQL> select

  2  min(salary) keep (dense_rank first order by salary) "Worst",

  3  max(salary) keep (dense_rank last order by salary) "Best"

  4  from employees

  5  order by id;

 

     Worst       Best

---------- ----------

       220        250

 

SQL> select * from employees;

 

        ID    DEPT_NO NAME           SALARY      BONUS

---------- ---------- ---------- ---------- ----------

      1101         10 Cho               250        125

      1102         20 Joe               240        100

      1103         10 kim               250        100

      1104         20 jijoe             220        100

 

SQL>

 

 

 

 

5-9) GROUP_ID 함수

--------------------------------------------------------------------------------

 

GROUP() 함수는 group by로 분리되어 복제된 번호로 복제 횟수를 구분하도록 출력한다.

번호가 0부터 시작되므로 n번 복제되었으면 n-1의 번호가 출력된다.

 

【예제】

SQL> select dept_no, group_id() from employees

  2  group by dept_no;

 

   DEPT_NO GROUP_ID()

---------- ----------

        10          0

        20          0

 

SQL> select * from employees;

 

        ID    DEPT_NO NAME           SALARY      BONUS

---------- ---------- ---------- ---------- ----------

      1101         10 Cho               250        125

      1102         20 Joe               240        100

      1103         10 kim               250        100

      1104         20 jijoe             220        100

 

SQL>

 

 

 

 

5-10) Grouping 함수

--------------------------------------------------------------------------------

 

Grouping 함수는 Rollup이나 cube 연산자랑 함께 사용하여

 grouping 함수에서 기술된 컬럼이 그룹핑시 사용되었는지 보여주는 함수이다.

특별히 연산의 기능은 없으며,

  rollup이나 cube 연산 후 출력된 결과에 대한 사용자의 이해를 높이기 위해 사용된다.

  , grouping 함수를 이용할 경우 출력되는 결과값 중 null 값이 있다면,

      null 값이 rollup이나 cube 연산의 결과로 생성된 값인지,

      원래 테이블상에 null 값으로 저장된 것인지 확인할 수 있다.

 

. grouping 함수는 인수로 하나의 값만을 가진다.

. grouping 함수에 사용된 인수는 group by 절에 기술된 값 중에 하나와 반드시 일치해야 한다.

. grouping 함수의 결과값으로 0 또는 1을 반환한다.

    0은 해당인수로 쓰인 값이 rollup이나 cube 연산에 사용되었음을 나타나고,

    1은 사용되지 않았음을 의미한다.

【형식】

SELECT   컬럼명,그룹함수(컬럼명), GROUPING(컬럼명)

FROM  테이블명

WHERE  조건

GROUP BY [ROLLUP | CUBE] 그룹핑하고자하는 컬럼명,...

HAVING  그룹조건

ORDER BY 컬럼명 또는 위치번호

 

【예제】

SQL> select grade,deptno,sum(salary),GROUPING(deptno)

  2  from aaa

  3  group by rollup(grade,deptno);

 

     GRADE     DEPTNO SUM(SALARY) GROUPING(DEPTNO)

---------- ---------- ----------- ----------------

         1         10         100                0

         1         20         500                0

         1         30         300                0

         1                    900                1

         2         10         400                0

         2         20         200                0

         2         30         600                0

         2                   1200                1

                             2100                1

 

9 rows selected.

 

SQL>

 

 

 

5-11) GROUPING_ID 함수

--------------------------------------------------------------------------------

 

GROUPING_ID(expr,...) 함수는 행과 관련되는 GROUPING 비트 벡터에 대응되는 수치를 반환한다.

 

【예제】

SQL> select * from employees;

 

        ID    DEPT_NO NAME           SALARY      BONUS

---------- ---------- ---------- ---------- ----------

      1101         10 Cho               250        125

      1102         20 Joe               240        100

      1103         10 kim               250        100

      1104         20 jijoe             220        100

 

SQL> select sum(salary), grouping_id(dept_no)

  2  from employees

  3  group by dept_no;

 

SUM(SALARY) GROUPING_ID(DEPT_NO)

----------- --------------------

        500                    0

        460                    0

 

SQL>

 

 

 

5-12) LAST 함수

--------------------------------------------------------------------------------

 

first last 함수는 행을 서열화 시켜서 첫 번째나 마지막 행을 추출한다.

【형식】

집합함수 KEEP (

 DENSE_RANK LAST ORDER BY

    expr [DESC|ASC][NULL{FIRST|LAST}],...)

【예제】

SQL> select

  2  min(salary) keep (dense_rank first order by salary) "Worst",

  3  max(salary) keep (dense_rank last order by salary) "Best"

  4  from employees

  5  order by id;

 

     Worst       Best

---------- ----------

       220        250

 

SQL> select * from employees;

 

        ID    DEPT_NO NAME           SALARY      BONUS

---------- ---------- ---------- ---------- ----------

      1101         10 Cho               250        125

      1102         20 Joe               240        100

      1103         10 kim               250        100

      1104         20 jijoe             220        100

 

SQL>

 

 

 

 

5-13) MAX 함수

--------------------------------------------------------------------------------

 

이 함수는 최대 값을 반환한다.

 

【형식】

MAX ([{DISTINCT|ALL}] expr) [OVER(analytic_clause)]

 

【예제】

SQL> select max(salary) over (partition by dept_no)

  2  from employees;

 

MAX(SALARY)OVER(PARTITIONBYDEPT_NO)

-----------------------------------

                                250

                                250

                                240

                                240

 

SQL> select max(salary) from employees;

 

MAX(SALARY)

-----------

        250

 

SQL>

 

 

 

5-14) MIN 함수

--------------------------------------------------------------------------------

 

이 함수는 최소 값을 반환한다.

 

【형식】

MIN ([{DISTINCT|ALL}] expr) [OVER(analytic_clause)]

 

【예제】

SQL> select min(salary) over (partition by dept_no)

  2  from employees;

 

MIN(SALARY)OVER(PARTITIONBYDEPT_NO)

-----------------------------------

                                250

                                250

                                220

                                220

 

SQL> select min(salary) from employees;

 

MIN(SALARY)

-----------

        220

 

SQL>

 

 

 

 

5-15) PERCENTILE_CONT 함수

--------------------------------------------------------------------------------

 

이 함수는 연속 모델에 대한 inverse distribution function이다.

 

【형식】

PERCENTILE_CONT(expr) WITHIN GROUP (ORDER BY expr [{DESC|ASC}])

  [OVER (query_partition_cluause)]

 

【예제】

SQL> select dept_no,percentile_cont(0.5) within group

  2  (order by salary DESC)

  3  from employees GROUP BY dept_no;

 

   DEPT_NO PERCENTILE_CONT(0.5)WITHINGROUP(ORDERBYSALARYDESC)

---------- --------------------------------------------------

        10                                                250

        20                                                230

 

SQL> select * from employees;

 

        ID    DEPT_NO NAME           SALARY      BONUS

---------- ---------- ---------- ---------- ----------

      1101         10 Cho               250        125

      1102         20 Joe               240        100

      1103         10 kim               250        100

      1104         20 jijoe             220        100

 

SQL>

 

 

 

 

5-16) PERCENTILE_DISC 함수

--------------------------------------------------------------------------------

 

이 함수는 불연속 모델에 대한 inverse distribution function이다.

 

【형식】

PERCENTILE_DISC(expr) WITHIN GROUP (ORDER BY expr [{DESC|ASC}])

  [OVER (query_partition_cluause)]

 

【예제】

SQL> select dept_no,percentile_disc(0.5) within group

  2  (order by salary DESC)

  3  from employees GROUP BY  dept_no;

 

   DEPT_NO PERCENTILE_DISC(0.5)WITHINGROUP(ORDERBYSALARYDESC)

---------- --------------------------------------------------

        10                                                250

        20                                                240

 

SQL> select * from employees;

 

        ID    DEPT_NO NAME           SALARY      BONUS

---------- ---------- ---------- ---------- ----------

      1101         10 Cho               250        125

      1102         20 Joe               240        100

      1103         10 kim               250        100

      1104         20 jijoe             220        100

 

SQL>

 

 

 

 

5-17) PERCENT_RANK 함수

--------------------------------------------------------------------------------

 

이 함수는 CUME_DIST 함수와 유사하게 percent_rank 값을 반환한다.

 

【형식】

PERCENT_RANK(expr,...) WITHIN GROUP (ORDER BY expr [{DESC|ASC}]

  [NULLS {FIRST|LAST}],...)

또는

PERCENT_RANK() OVER( [query_partition_clause] order_by_clause)

 

【예제】

SQL> select percent_rank(230,0.05) within group

  2  (order by salary,bonus) from employees;

 

PERCENT_RANK(230,0.05)WITHINGROUP(ORDERBYSALARY,BONUS)

------------------------------------------------------

                                                   .25

 

SQL> select * from employees;

 

        ID    DEPT_NO NAME           SALARY      BONUS

---------- ---------- ---------- ---------- ----------

      1101         10 Cho               250        125

      1102         20 Joe               240        100

      1103         10 kim               250        100

      1104         20 jijoe             220        100

 

SQL>

 

 

 

 

5-18) RANK 함수

--------------------------------------------------------------------------------

 

이 함수는 그룹 내에서 위치를 반환한다.

 

【형식】

RANK(expr,...) WITHIN GROUP (ORDER BY expr [{DESC|ASC}]

  [NULLS {FIRST|LAST}],...)

또는

RANK() OVER( [query_partition_clause] order_by_clause)

 

【예제】

SQL> select rank(230,0.05) within group

  2 (order by salary,bonus) from employees;

 

RANK(230,0.05)WITHINGROUP(ORDERBYSALARY,BONUS)

----------------------------------------------

                                             2

SQL> select * from employees;

 

        ID    DEPT_NO NAME           SALARY      BONUS

---------- ---------- ---------- ---------- ----------

      1101         10 Cho               250        125

      1102         20 Joe               240        100

      1103         10 kim               250        100

      1104         20 jijoe             220        100

 

SQL>

 

 

 

 

5-19) REGR_(linear regression) function* 함수

--------------------------------------------------------------------------------

 

선형 회귀(linear regression) 함수 ordinary-least squares regression line을 찾도록 한다.

 사용되는 회귀함수는 자음 중 하나이다.

 REGR_SLOPE REGR_INTERCEPT REGR_COUNT

 REGR_R2 REGR_AVGX REGR_AVGY

 REGR_SXX REGR_SYY REGR_SXY

 

【형식】

REGR { REGR_SLOPE|REGR_INTERCEPT|REGR_COUNT|REGR_R2|REGR_AVGX|

       REGR_AVGY|REGR_SXX|REGR_SYY|REGR_SXY}

    (expr1,expr2) [OVER (analytic_clause)]

 

【예제】

SQL> select regr_slope(salary,bonus) from employees

 

REGR_SLOPE(SALARY,BONUS)

------------------------

              .533333333

 

SQL> select * from employees;

 

        ID    DEPT_NO NAME           SALARY      BONUS

---------- ---------- ---------- ---------- ----------

      1101         10 Cho               250        125

      1102         20 Joe               240        100

      1103         10 kim               250        100

      1104         20 jijoe             220        100

 

SQL>

 

 

 

 

5-20) STDDEV 함수

--------------------------------------------------------------------------------

 

이 함수는 standard deviation을 반환한다.

 

【형식】

STDDEV [{DISTINCT|ALL}] (expr) [OVER (analytic_clause)]

 

【예제】

SQL> select stddev(salary) from emp;

 

STDDEV(SALARY)

--------------

    14.1421356

 

SQL> select * from emp;

 

        ID NAME           SALARY      BONUS

---------- ---------- ---------- ----------

      1101 Cho               250        125

      1102 Joe               240        100

      1103 kim               250        100

      1104 jijoe             220        100

 

SQL>

 

 

 

 

5-21) STDDEV_POP 함수

--------------------------------------------------------------------------------

 

이 함수는 population standard deviation을 반환한다.

 

【형식】

STDDEV_POP (expr) [OVER (analytic_clause)]

 

【예제】

SQL> select stddev_pop(salary) from emp;

 

STDDEV_POP(SALARY)

------------------

        12.2474487

 

SQL> select * from emp;

 

        ID NAME           SALARY      BONUS

---------- ---------- ---------- ----------

      1101 Cho               250        125

      1102 Joe               240        100

      1103 kim               250        100

      1104 jijoe             220        100

 

SQL>

 

 

5-22) STDDEV_SAMP 함수

--------------------------------------------------------------------------------

 

이 함수는 cumulative sample standard deviation을 반환한다.

 

【형식】

STDDEV_SAMP (expr) [OVER (analytic_clause)]

 

【예제】

SQL> select stddev_samp (salary) from emp;

 

STDDEV_SAMP(SALARY)

-------------------

         14.1421356

 

SQL> select * from emp;

 

        ID NAME           SALARY      BONUS

---------- ---------- ---------- ----------

      1101 Cho               250        125

      1102 Joe               240        100

      1103 kim               250        100

      1104 jijoe             220        100

 

 

SQL>

 

 

 

 

5-23) SUM 함수

--------------------------------------------------------------------------------

 

이 함수는 합계를 반환한다.

 

【형식】

SUM ([{DISTINCT|ALL}] expr) [OVER (analytic_clause)]

 

【예제】

SQL> select sum(salary) from emp;

 

SUM(SALARY)

-----------

        960

 

SQL> select * from emp;

 

        ID NAME           SALARY      BONUS

---------- ---------- ---------- ----------

      1101 Cho               250        125

      1102 Joe               240        100

      1103 kim               250        100

      1104 jijoe             220        100

 

SQL>

 

 

 

 

5-24) VAR_POP 함수

--------------------------------------------------------------------------------

 

이 함수는 population variance를 반환한다.

 

【형식】

VAR_POP (expr) [OVER (analytic_clause)]

 

【예제】

SQL> select var_pop(salary) from emp;

 

VAR_POP(SALARY)

---------------

            150

 

SQL> select * from emp;

 

        ID NAME           SALARY      BONUS

---------- ---------- ---------- ----------

      1101 Cho               250        125

      1102 Joe               240        100

      1103 kim               250        100

      1104 jijoe             220        100

 

 

SQL>

 

 

 

 

5-25) VAR_SAMP 함수

--------------------------------------------------------------------------------

 

이 함수는 sample variance를 반환한다.

 

【형식】

VAR_SAMP (expr) [OVER (analytic_clause)]

 

【예제】

SQL> select var_samp(salary) from emp;

 

VAR_SAMP(SALARY)

----------------

             200

 

SQL> select * from emp;

 

        ID NAME           SALARY      BONUS

---------- ---------- ---------- ----------

      1101 Cho               250        125

      1102 Joe               240        100

      1103 kim               250        100

      1104 jijoe             220        100

 

 

SQL>

 

 

 

 

5-26) VARIANCE 함수

--------------------------------------------------------------------------------

 

이 함수는 variance를 반환한다.

 

【형식】

VARIANCE ([{DISTINCT|ALL}] expr) [OVER (analytic_clause)]

 

【예제】

SQL> select variance(salary) from emp;

 

VARIANCE(SALARY)

----------------

             200

 

SQL> select * from emp;

 

        ID NAME           SALARY      BONUS

---------- ---------- ---------- ----------

      1101 Cho               250        125

      1102 Joe               240        100

      1103 kim               250        100

      1104 jijoe             220        100

 

SQL>

 

 

 

 

5-27) Grouping sets 함수

--------------------------------------------------------------------------------

 

Grouping sets 함수는 Group by의 확장된 형태로 하나의 쿼리문에서 원하는 그룹핑 조건을 여러 개 기술할 수 있으며,

 grouping sets 함수 사용이 불가능한 이전 버전에서

 복잡한 union all 연산자를 사용하여 기술하던 것을 간단하게

 한 문장 안에서 해결할 수 있어 검색시 효율성이 증대 된다.

 다시 말해서, grouping sets 함수를 사용하면,

              group by ... union all을 사용한 것보다

              SQL 문이 간단해지고 또한 실행시 성능이 빨라진다.

【형식】

SELECT   컬럼명,그룹함수(컬럼명), GROUPING(컬럼명)

FROM  테이블명

WHERE  조건

GROUP BY [ROLLUP | CUBE] 그룹핑하고자하는 컬럼명, ...

  [GROUPING SETS (컬럼명,컬럼명, ...), ...]

HAVING  그룹조건

ORDER BY 컬럼명 또는 위치번호

 

【예제】

SQL> select grade,deptno,sum(salary)

  2  from aaa

  3  group by grouping sets(grade,deptno);

 

     GRADE     DEPTNO SUM(SALARY)

---------- ---------- -----------

         1                    900

         2                   1200

                   10         500

                   20         700

                   30         900

 

SQL> select grade,deptno,sum(salary)

  2  from aaa

  3  group by grouping sets((grade,name),(deptno,name));

 

     GRADE     DEPTNO SUM(SALARY)

---------- ---------- -----------

         1                    100

         1                    300

         1                    500

         2                    200

         2                    400

         2                    600

                   10         100

                   20         200

                   30         300

                   10         400

                   20         500

                   30         600

 

12 rows selected.

SQL>

【예제】Union all을 사용한 경우

SQL> select grade,deptno,sum(salary)

  2  from aaa

  3  group by grade,deptno

  4  union all

  5  select grade,deptno,sum(salary)

  6  from aaa

  7  group by grade,deptno;

 

     GRADE     DEPTNO SUM(SALARY)

---------- ---------- -----------

         1         10         100

         1         20         500

         1         30         300

         2         10         400

         2         20         200

         2         30         600

         1         10         100

         1         20         500

         1         30         300

         2         10         400

         2         20         200

         2         30         600

 

12 rows selected.

 

SQL>

 

composite columns rollup, cube, grouping sets 절과 같은 기능을 사용하면

표현되는 각 컬럼이 하나가 아닌 복수 개의 컬럼으로 정의되는 경우이며

다음 표를 보고 이해하자.

composite column 문의 경우  group by 문의 경우 group by grouping sets(a,b,c)  group by a union allgroup by b union allgroup by c  group by grouping sets(a,b,(b,c))  group by a union allgroup by b union allgroup by b,c  group by grouping sets((a,b,c))  group by a,b,c  group by grouping sets(a,(b),())  group by a union allgroup by b union allgroup by ()  group by grouping sets(a,rollup(b,c))  group by a union allgroup by rollup(b,c)  group by rollup(a,b,c)  group by (a,b,c) union allgroup by (a,b) union allgroup by (a) union allgroup by ()  group by cube(a,b,c)  group by (a,b,c) union allgroup by (a,b) union allgroup by (a,c) union allgroup by (b,c) union allgroup by (a) union allgroup by (b) union allgroup by (c) union allgroup by () 

 

 

 

 

6-1) AVG* 함수

--------------------------------------------------------------------------------

 

조건을 만족하는 행(row)의 평균을 값을 반환하며,

 aggregate 함수나

 analytic 함수로 사용된다.

 

【형식】

AVG( [DISTINCT | ALL] 컬럼명)

   [ [OVER] (analytic )]

 

【예제】aggregate

SQL> select * from emp;

 

        ID NAME           SALARY      BONUS

---------- ---------- ---------- ----------

      1101 Cho               250        125

      1102 Joe               240        100

      1103 kim               250        100

      1104 jijoe             220        100

 

SQL> select avg(salary) from emp;

 

AVG(SALARY)

-----------

        240

 

SQL>

【예제】analytic

SQL> select avg(distinct salary) over(partition by bonus)

  2  from emp;

 

AVG(DISTINCTSALARY)OVER(PARTITIONBYBONUS)

-----------------------------------------

                               236.666667

                               236.666667

                               236.666667

                                      250

 

 

SQL> select avg(salary) over(partition by bonus order by id

    2 rows between 1 preceding and 1 following) as avg  from emp;

 

       AVG

----------

       245

236.666667

       235

       250

 

SQL>

 

 

 

 

6-2) CORR* CORR* 함수

--------------------------------------------------------------------------------

 

집합 쌍의 상관관계 계수를 반환한다.

 

【형식】

CORR( expr1, expr2 ) [ [OVER] (analytic )]

 

【예제】

SQL> select corr(avg(bonus),max(bonus))

  2  from employees

  3  group by dept_no;

 

CORR(AVG(BONUS),MAX(BONUS))

---------------------------

                          1

 

SQL>

 

 

 

6-3) COUNT* 함수

--------------------------------------------------------------------------------

 

 

 쿼리한 행의 수를 반환한다.

【형식】

COUNT([*|DISTINCT|ALL] 컬럼명) [ [OVER] (analytic )]

 

【예제】

SQL> select count(*) from emp;

 

  COUNT(*)

----------

         4

 

SQL> select count (distinct dept_no) from employees;

 

COUNT(DISTINCTDEPT_NO)

----------------------

                     2

 

SQL> select count (all dept_no) from employees;

 

COUNT(ALLDEPT_NO)

-----------------

                4

 

SQL> select salary,count(*)

  2  over (order by salary)

  3  from emp;

 

    SALARY COUNT(*)OVER(ORDERBYSALARY)

---------- ---------------------------

       220                           1

       240                           2

       250                           4

       250                           4

 

SQL>

 

 

 

 

6-4) COVAR_SAMP 함수

--------------------------------------------------------------------------------

 

이 함수는 number 쌍의 집합에 대한 sample covariance를 반환한다.

 

【형식】

COVAR_SAMP(expr1, expr2 [ OVER (analytic )] )

 

【예제】

SQL> select covar_samp(bonus,salary) from emp;

 

COVAR_SAMP(BONUS,SALARY)

------------------------

              83.3333333

 

SQL> select * from emp;

 

        ID NAME           SALARY      BONUS

---------- ---------- ---------- ----------

      1101 Cho               250        125

      1102 Joe               240        100

      1103 kim               250        100

      1104 jijoe             220        100

 

SQL>

 

 

 

 

6-5) CUME_DIST 함수

--------------------------------------------------------------------------------

 

이 함수는 그룹 값 내에서 어떤 값의 cumulative distribution(누적분포)을 계산한다.

 

【형식】

CUME_DIST(expr,... WITHIN GROUP (ORDER BY

     expr [DESC | ASC] [NULLS {FIRST|LAST}],...)

또는

CUME_DIST() over ([query_partition_clause] order_by_clause)

 

【예제】

SQL> select cume_dist(230) within group

  2  (order by salary ) from emp;

 

CUME_DIST(230)WITHINGROUP(ORDERBYSALARY)

----------------------------------------

                                      .4

 

SQL> select * from emp;

 

        ID NAME           SALARY      BONUS

---------- ---------- ---------- ----------

      1101 Cho               250        125

      1102 Joe               240        100

      1103 kim               250        100

      1104 jijoe             220        100

 

SQL>

 

 

 

6-6) DENSE_RANK 함수

--------------------------------------------------------------------------------

 

 

그룹 내에서 순위를 반환한다.

 

【예제】

SQL> select * from employees;

 

        ID    DEPT_NO NAME           SALARY      BONUS

---------- ---------- ---------- ---------- ----------

      1101         10 Cho               250        125

      1102         20 Joe               240        100

      1103         10 kim               250        100

      1104         20 jijoe             220        100

 

SQL> select dense_rank(230, .05) within group

  2  (order by salary, bonus) "Dense Rank"

  3  from employees;

 

Dense Rank

----------

         2

 

SQL>

 

 

 

6-7) FIRST 함수

--------------------------------------------------------------------------------

 

first last 함수는 행을 서열화 시켜서 첫 번째나 마지막 행을 추출한다.

【형식】

집합함수 KEEP (

 DENSE_RANK FIRST ORDER BY

    expr [DESC|ASC][NULL{FIRST|LAST}],...)

【예제】

SQL> select

  2  min(salary) keep (dense_rank first order by salary) "Worst",

  3  max(salary) keep (dense_rank last order by salary) "Best"

  4  from employees

  5  order by id;

 

     Worst       Best

---------- ----------

       220        250

 

SQL> select * from employees;

 

        ID    DEPT_NO NAME           SALARY      BONUS

---------- ---------- ---------- ---------- ----------

      1101         10 Cho               250        125

      1102         20 Joe               240        100

      1103         10 kim               250        100

      1104         20 jijoe             220        100

 

SQL>

 

 

 

6-8) FIRST_VALUE 함수

--------------------------------------------------------------------------------

 

이 함수는 서열화된 값에서 첫 번째를 출력한다.

 

【형식】

FIRST_VALUE ( expr ) OVER ( analytic_)

 

【예제】

SQL> select salary,first_value(name)

  2  over (order by salary asc)

  3  from (select * from employees

  4        where dept_no = 20

  5        order by salary);

 

    SALARY FIRST_VALU

---------- ----------

       220 jijoe

       240 jijoe

 

SQL> select * from employees;

 

        ID    DEPT_NO NAME           SALARY      BONUS

---------- ---------- ---------- ---------- ----------

      1101         10 Cho               250        125

      1102         20 Joe               240        100

      1103         10 kim               250        100

      1104         20 jijoe             220        100

 

SQL>

 

 

 

6-9) LAG 함수

--------------------------------------------------------------------------------

 

이 함수는 analytic 함수로서,

self join하지 않고 하나의 테이블에서 동시에 한 행(row) 이상을 접근할 수 있도록 한다.

 

【형식】

LAG ( value_expr [,offset] [,default] )

     OVER ([query_partition_clause] order_by_clause )

 

【예제】

SQL> select name,salary,LAG(salary,1,0)    

  2   OVER (ORDER BY salary) FROM employees;

 

NAME           SALARY LAG(SALARY,1,0)OVER(ORDERBYSALARY)

---------- ---------- ----------------------------------

jijoe             220                                  0

Joe               240                                220

Cho               250                                240

kim               250                                250

 

SQL> select * from employees;

 

        ID    DEPT_NO NAME           SALARY      BONUS

---------- ---------- ---------- ---------- ----------

      1101         10 Cho               250        125

      1102         20 Joe               240        100

      1103         10 kim               250        100

      1104         20 jijoe             220        100

 

SQL>

 

 

 

 

6-10) LAST_VALUE 함수

--------------------------------------------------------------------------------

 

이 함수는 서열화된 값에서 마지막 번째를 출력한다.

 

【형식】

LAST_VALUE ( expr ) OVER ( analytic_)

 

【예제】

SQL> select salary,last_value(name)

  2  over (order by salary asc)

  3  from (select * from employees

  4        where dept_no = 20

  5        order by salary);

 

    SALARY LAST_VALUE

---------- ----------

       220 jijoe

       240 Joe

 

SQL> select * from employees;

 

        ID    DEPT_NO NAME           SALARY      BONUS

---------- ---------- ---------- ---------- ----------

      1101         10 Cho               250        125

      1102         20 Joe               240        100

      1103         10 kim               250        100

      1104         20 jijoe             220        100

 

SQL>

 

 

 

 

6-11) LEAD 함수

--------------------------------------------------------------------------------

 

이 함수는 analytic 함수로서, self join하지 않고

하나의 테이블에서 동시에 한 행(row) 이상을 접근할 수 있도록 한다.

 

【형식】

LEAD ( value_expr [,offset] [,default] )

     OVER ([query_partition_clause] order_by_clause )

 

【예제】

SQL> select name,salary,LEAD(salary,1,0)   

  2   OVER (ORDER BY salary) FROM  employees;

 

NAME           SALARY LEAD(SALARY,1,0)OVER(ORDERBYSALARY)

---------- ---------- -----------------------------------

jijoe             220                                 240

Joe               240                                 250

Cho               250                                 250

kim               250                                   0

 

SQL> select * from employees;

 

        ID    DEPT_NO NAME           SALARY      BONUS

---------- ---------- ---------- ---------- ----------

      1101         10 Cho               250        125

      1102         20 Joe               240        100

      1103         10 kim               250        100

      1104         20 jijoe             220        100

 

SQL>

 

 

 

6-12) NTILE 함수

--------------------------------------------------------------------------------

 

이 함수는 analytic 함수로서, 데이터를 주어진 bucket expr로 분리한다.

 

【형식】

NTILE ( expr ) OVER ([query_partition_clause] order_by_clause )

 

【예제】

SQL> select name,salary,NTILE(3) OVER (ORDER BY salary DESC)

  2  FROM  employees;

 

NAME           SALARY NTILE(3)OVER(ORDERBYSALARYDESC)

---------- ---------- -------------------------------

Cho               250                               1

kim               250                               1

Joe               240                               2

jijoe             220                               3

 

SQL> select * from employees;

 

        ID    DEPT_NO NAME           SALARY      BONUS

---------- ---------- ---------- ---------- ----------

      1101         10 Cho               250        125

      1102         20 Joe               240        100

      1103         10 kim               250        100

      1104         20 jijoe             220        100

 

SQL>

 

 

 

 

6-13) RATIO_TO_REPORT 함수

--------------------------------------------------------------------------------

 

이 함수는 analytic 함수로서, 데이터 합에 대한 구성비를 계산한다.

 

【형식】

RATIO_TO_REPORT ( expr ) OVER ([query_partition_clause])

 

【예제】

SQL> select name,salary,RATIO_TO_REPORT(salary) OVER ()

  2   FROM  employees;

 

NAME           SALARY RATIO_TO_REPORT(SALARY)OVER()

---------- ---------- -----------------------------

Cho               250                    .260416667

Joe               240                           .25

kim               250                    .260416667

jijoe             220                    .229166667

 

SQL> select * from employees;

 

        ID    DEPT_NO NAME           SALARY      BONUS

---------- ---------- ---------- ---------- ----------

      1101         10 Cho               250        125

      1102         20 Joe               240        100

      1103         10 kim               250        100

      1104         20 jijoe             220        100

 

SQL>

 

 

 

 

6-14) ROW_NUMBER 함수

--------------------------------------------------------------------------------

 

이 함수는 analytic 함수로서, 각 행(row) unique 번호를 부여한다.

 

【형식】

ROW_NUMBER () OVER ([query_partition_clause] order_by_clause )

 

【예제】

SQL> SELECT ROW_NUMBER() OVER (ORDER BY salary DESC),name

  2    FROM  employees;

 

ROW_NUMBER()OVER(ORDERBYSALARYDESC) NAME      

----------------------------------- ----------

                                  1 Cho       

                                  2 kim       

                                  3 Joe       

                                  4 jijoe     

 

SQL> select * from employees;

 

        ID    DEPT_NO NAME           SALARY      BONUS

---------- ---------- ---------- ---------- ----------

      1101         10 Cho               250        125

      1102         20 Joe               240        100

      1103         10 kim               250        100

      1104         20 jijoe             220        100

 

SQL>

 

 

 

 

 

7-1) REF 타입

--------------------------------------------------------------------------------

테이블의 어떤 컬럼이 독립된 다른 객체 테이블을 참조하는 데이터 타입을 의미한다.

일반적으로 테이블을 만들때 사용하는 외부키(foreign-key)를 이용한 참조관계와 유사하다.

REF 타입의 컬럼 데이터를 읽을 때는 반드시 DEREF 함수를 사용한다.

REF 타입으로 정의된 컬럼에는 실제 데이터가 저장되는 것이 아니고 참조되는 객체가 존재하는 포인트정보만 가지고 있기 때문에 객체가 삭제 된다면, 해당 컬러은 정상적으로 검색되지 못한다.

이러한 현상을 REF Dangling 현상이고 한다.

이러한 dangling 현상을 방지하기 위해서는 삭제된 객체 정보를 참조하는 행의 컬럼 정보를 analyze 명령어를 이용하여 null 값으로 변경해 주어야 한다.

【예제】

SQL> connect jijoe/jijoe_password

connected

 

SQL> create type person_type as object(

  2  first_name         varchar2(10),

  3  last_name          varchar2(10),

  4  phone              varchar(12),

  5  birthday           varchar2(12));

  6  /

 

Type created.

 

SQL> create type emp_type as object (

  2  empno      number,

  3  emp        person_type);

  4  /

 

Type created.

 

SQL> create table emp2 of emp_type

  2  oidindex emp_oid;

 

Table created.

 

SQL> insert into emp2 values(

  2  emp_type(1000,person_type('junik','joe','123-1234','20-jul-04')));

 

1 row created.

 

SQL> create table dept(

  2  empno      number(4),

  3  ename      varchar2(15),

  4  mgr        REF emp_type SCOPE IS emp2);

 

Table created.

 

SQL> insert into dept

  2  select empno, 'SCOTT', REF(e)

  3  from emp2 e

  4  where empno=1000;

 

1 row created.

 

 

【예제】

SQL> select ename,empno from dept;

 

ENAME                EMPNO

--------------- ----------

SCOTT                 1000

 

SQL> select mgr, DEREF(mgr) from dept;

 

MGR

--------------------------------------------------------------------------------

DEREF(MGR)(EMPNO, EMP(FIRST_NAME, LAST_NAME, PHONE, BIRTHDAY))

--------------------------------------------------------------------------------

0000220208DFA05B27A63701D9E034080020B588F4DFA05B27A63601D9E034080020B588F4

EMP_TYPE(1000, PERSON_TYPE('junik', 'joe', '123-1234', '20-jul-04'))

 

 

SQL>

 

【예제】

SQL> select empno,ename,mgr

  2  from dept

  3  where mgr is dangling;

 

no rows selected

 

SQL> analyze table dept validate REF update set dangling to NULL;

 

Table analyzed.

 

SQL>

 

 

 

8-1) ROWID 컬럼

--------------------------------------------------------------------------------

 

오라클에서 내부적으로 사용되는 컬럼을 pseudocolumn이라고 하며,

ROWID, ROWNUM등이 있다.

ROWID는 데이터베이스에서 컬럼이 위치한 장소이다.

 

【예제】

SQL> select rowid from test;

 

ROWID

------------------

AAAHbHAABAAAMXCAAA

 

SQL> select rowid from test

  2  where rowidtochar(rowid) like '%AABAA%';

 

ROWID

------------------

AAAHbHAABAAAMXCAAA

 

SQL> select lengthb(rowidtonchar(rowid)), rowidtonchar(rowid)

  2  from test;

 

LENGTHB(ROWIDTONCHAR(ROWID)) ROWIDTONCHAR(ROWID

---------------------------- ------------------

                          36 AAAHbHAABAAAMXCAAA

 

SQL>

 

 

여기서 rowid의 의미는 다음과 같다.

AAAHbH  AAB  AAAMXC  AAA 객체번호  테이블스페이스번호  블록번호  행번호

 

 

 

 

8-2) ROWNUM 컬럼

--------------------------------------------------------------------------------

 

오라클에서 내부적으로 사용되는 컬럼을 pseudocolumn이라고 하며,

ROWID, ROWNUM등이 있다.

ROWNUM은 테이블에서 select 되어진 일련 번호임

【예제】

SQL> select rownum,ename from emp;

 

    ROWNUM ENAME

---------- ----------

         1 CLARK

         2 MILLER

         3 JONES

         4 ALLEN

         5 MARTIN

         6 CHAN

 

6 rows selected.

 

SQL> delete from emp where ename='JONES';

 

1 row deleted.

 

SQL> select rownum,ename from emp;

 

    ROWNUM ENAME

---------- ----------

         1 CLARK

         2 MILLER

         3 ALLEN

         4 MARTIN

         5 CHAN

 

SQL>

 

블로그 이미지

유효하지않음

,

이 경우는 대부분이 데이터 입력, 삭제 또는 복구 작업시에 일어나며, Archive Mode 운
영중일때 발생한다.

 [운영 로그 확인]

 c:\> type C:\oracle\product\10.2.0\SID\alert_SID

   ; 오류가 발생하면 위와 같은 로그 파일을 생성한다.

 Thu Apr 06 21:45:55 2006
Errors in file c:\oracle\product\10.2.0\admin\oradb\bdump\oradb_arc0_3556.trc:

ORA-19815: 경고: db_recovery_file_dest_size/2147483648바이트는 100.00%가 사용 중이므로, 나머지 0바이트를 사용할 수 있습니다.

   ; 위의 로그를 확인 한 결과 dest_size가 full이 되어서 발생한 행걸림 현상을 확인.

 [로그 확인]

 sql> archive log list;

 데이터베이스 로그 모드                        아카이브 모드
 자동 아카이브                                      사용
 아카이브 대상                                      USE_DB_RECOVERY_FILE_DEST
 가장 오래된 온라인 로그 순서                1
 아카이브할 다음 로그                            1
 현재 로그 순서                                      3

 sql> show parameter archive;

 NAME                                 TYPE                              VALUE
 -------------------------- ------------------------- -------------------------------
 archive_lag_target               integer                             0
 log_archive_config              string
 log_archive_dest                 string
 log_archive_dest_1              string

    ; 위의 내용을 보면 log_archive_dest에 보면 Value가 없다. 진행이 안된 상태이다.

  sql>show parameter dest;

   ; dest에 관련된 파라메터를 확인한다.


 [해결방안1]
  DB를 Shutdown immediate를 한다.
  initSID.ora 파일 내용중 dest_size line을 주석처리한다.
  DB를 Startup 한다

 [해결방안2]
  sql> alter system set db_recivery_file_dest_size=3000M;
  운영중인 DB에서 dest_size를 늘려준다.


alert.log파일에 이런 에러가 떴거든요...

ORA-19815: 경고: db_recovery_file_dest_size/2147483648바이트는 85.28%가 사용 중이므로,
나머지 316203008바이트를 사용할 수 있습니다.


Thu Jul 13 10:54:55 2006
************************************************************************
You have following choices to free up space from flash recovery area:
1. Consider changing RMAN RETENTION POLICY. If you are using Data Guard,
   then consider changing RMAN ARCHIVELOG DELETION POLICY.
2. Back up files to tertiary device such as tape using RMAN
   BACKUP RECOVERY AREA command.
3. Add disk space and increase db_recovery_file_dest_size parameter to
   reflect the new space.
4. Delete unnecessary files using RMAN DELETE command. If an operating
   system command was used to delete files, then use RMAN CROSSCHECK and
   DELETE EXPIRED commands.
************************************************************************
 
 
 
가장 많이 발생하는 원인은 아카이브 로그 파일이 계속 쌓일 경우입니다.

OS 상에서 아카이브 로그 파일을 삭제하였을 경우에도 RMAN 상에서는 삭제한 걸 인식하지 못합니다.

해결 방법으로는

1) db_recovery_file_dest_size의 크기를 늘려 준다.

2) 필요 없는 아카이브 파일 OS에서 삭제후 RMAN에서 삭제

 - OS 상에서 아카이브 삭제

 - RMAN> crosscheck archivelog all;

    RMAN> delete expired archivelog all;

3) 백업 정책 확인
 

블로그 이미지

유효하지않음

,

alter system set "_optimizer_connect_by_cost_based" = false scope=both;

ORA-00600: 내부 오류 코드, 인수 : [qkacon:FJfsrwo], [5], [], [], [], [], [], []..

bug number : Bug 5254539

A SQL statement involving a hierarchical query (CONNECT BY)
using cursor statements in the select list may fail with
ORA-600 [qkacon:FJfsrwo]

===================================================================================================

alter system set "_optimizer_cost_based_transformation" = off scope=both;

===================================================================================================
The information in this article applies to:
Oracle Server - Enterprise Edition - Version: 9.2.0.3 - 10.2
This problem can occur on any platform.

Errors ORA 600 internal error code, arguments: [qctcte1],[0],[%s], [%s], [%s],

Symptoms
ORA-00600 [qctcte1] is encountered while performing a nested select which might include functions like distinct or have an order by clause.


Example:


Sql> CREATE OR REPLACE TYPE int_list IS VARRAY(200) OF INTEGER;

Sql> CREATE TABLE test (id INTEGER);

Sql> SELECT id FROM ( SELECT rp.id FROM (SELECT DISTINCT column_value ID FROM
TABLE(int_list(1,1,2))) rp, test p WHERE p.id = 1 ORDER BY p.id DESC)


ERROR at line 2:
ORA-00600: internal error code, arguments: [qctcte1], [0], [], [], [], [], [], []

 

Cause
An inconsistent datatype is reported during typechecking when parsing a query. This is bug 3557906.
Fix
There are several Workarounds :

1> Remove the desc from the order by clause

Sql > SELECT id FROM ( SELECT rp.id FROM (SELECT DISTINCT column_value ID
FROM TABLE(int_list(1,1,2))) rp, test p WHERE p.id = 1 ORDER BY p.id )


2> Alter session set "_complex_view_merging"=false;


3> Remove the distinct clause

Sql > SELECT id FROM ( SELECT rp.id FROM (SELECT column_value ID FROM TABLE(int_list
(1,1,2))) rp, test p WHERE p.id = 1 ORDER BY p.id DESC)

4> Remove the order by clause

Sql > SELECT id FROM ( SELECT rp.id FROM
(SELECT column_value ID FROM TABLE(int_list(1,1,2))) rp, test p WHERE p.id = 1 )

5> _pred_move_around = false

This is fixed in 10.2 and will be fixed in the 9206 patchset.
References
<Bug:3557906> ORA-600: INTERNAL ERROR CODE, ARGUMENTS: [QCTCTE1], [0],



쿼리문에 흰트를 사용해도 되네요..
 /*+ NO_CONNECT_BY_COST_BASED */ 
  or
/*+ OPT_PARAM('_optimizer_connect_by_cost_based', 'false') */


블로그 이미지

유효하지않음

,