'02.Oracle'에 해당되는 글 248건

  1. 2009.06.27 오라클9i의 향상된 RMAN
  2. 2009.06.27 RMAN-00554: initialization of internal recovery manager package failed
  3. 2009.06.27 rman을 이용한 백업(backup 명령어)
  4. 2009.06.27 [오라클 11g] 보안
  5. 2009.06.26 Oracle9i Admin.pdf
  6. 2009.06.24 emctl start dbconsole / Environment variable ORACLE_SID not defined. Please define it.
  7. 2009.06.24 oracle 백업 스케줄 걸기...
  8. 2009.06.21 오라클(Oracle) CLOB 데이터 입력 - JDBC
  9. 2009.06.21 오라클 페이징 처리 깔끔하게...한방에..
  10. 2009.06.15 oracle TRUNC 원하는 소수점 자리수 만큼 보여주기, 소수점 자리 자르기
  11. 2009.06.13 oracle-sql-tuning pocket reference (오라클 튜닝) 2
  12. 2009.06.13 oracle 공인교재 9i 한글판. 4
  13. 2009.06.09 oracel : xdb 8080 Changing XML DB Default Ports
  14. 2009.06.09 oracle : xdb 8080 변경
  15. 2009.06.09 oracle XDB 8080 충돌시 포트 변경하는 거
  16. 2009.06.08 CLOB COLUMN 또는 CLOB VARIABLE를 REPLACE, SEARCH하는 방법
  17. 2009.06.04 오라클 에러코드별 처리..
  18. 2009.06.04 oracle 0917
  19. 2009.06.04 오라클 RDBMS의 구조(1)[시스템 글로벌 영역 1
  20. 2009.06.04 ora-06502 :pl/sql : numeric or value error : character string buffer too small 5
  21. 2009.05.30 sql 함수 사용 방법
  22. 2009.05.30 oracle 스크립트 모음
  23. 2009.05.14 Ora-12571 에러 해결 방법 2
  24. 2009.05.12 sql codes 모든 sql codes
  25. 2009.05.11 공유 풀 영역 튜닝
  26. 2009.05.11 v$sqlarea 뷰
  27. 2009.05.11 *오라클서버의 메모리에 관한 테이블*/
  28. 2009.05.06 오라클 10g 함수 10g Release 1 (10.1)
  29. 2009.04.28 oracle 데이터 삭제 후 commit 데이터 복구 하는방법.[oracle 삭제된 데이터 복구] 2
  30. 2009.04.28 오라클에서의 데이터 암호화 기능
02.Oracle/DataBase2009. 6. 27. 10:57
반응형

오라클9i의 향상된 RMAN

등록일: 2001년 11월 19일
by Darl Kuhn, 역 한빛리포터 2기 신동섭

복구 매니저(RMAN)는 모든 오라클 백업과 복구 액티비티를 관리하는데 사용될 수 있는 유틸리티이다. RMAN은 중요한 성능 이득을 제공하며 많은 매뉴얼 DBA 백업과 복구 작업을 자동화한다. RMAN은 첫번째 오라클8이 배포된 후 오랜 시간동안 사용되었다. 주요한 오라클 배포판들은 모두 조화롭게 향상된 RMAN을 포함하고 있으며 오라클9i 도 예외가 아니다.

오라클9i는 RMAN을 더 쉽게 사용할 수 있도록 하였으며 백업과 복구 시나리오에 있어서 더 많은 유연성을 가지고 있다. 몇 가지 더욱 더 향상된 점들은 아래와 같다:
  • RMAN 환경을 지속시키는 새로운 CONFIGURE 명령어
  • RUN{} 명령어와 같이 실행할 필요가 없는 BACKUP과 RESTORE 명령어
  • 블록 레벨의 복구 능력
가장 새로운 특징 중 하나는 지속적인 RMAN 채널 셋팅을 구성하는 능력이다. 새로운 오라클9i configure 명령어를 통해, 여러분은 채널 파일 포맷, 병렬처리, 디바이스 타입, 최대 조각(piece) 크기, 기타 등등을 위한 기본 설정을 할 수 있다. 이러한 아이디어는 여러분의 초기 RMAN 환경을 구성하고 RMAN 명령어를 수행할 때 이들을 명쾌하게 구성할 필요가 없도록 하기위해 이들을 존속시켜야 한다. 아래 예제는 디스크 채널을 위해 기본 병렬처리를 어떻게 하는가를 보여주며 또한 기본 파일 포맷을 구체화시켜준다:

RMAN> configure device type disk parallelism 2;
RMAN> configure channel device type disk format =
/ora01/backup/rman_%U.bus;

그 지점부터 RMAN은 백업 명령을 수행하기 위해 두개의 디스크 채널을 할당할 것이며 여러분이 더 선호하는 파일 포맷으로 백업 조각 파일들을 생성할 것이다.
Oracle RMAN Pocket Reference

여러분의 모든 configuration 세팅을 보기위해서는 show all 명령어를 사용하면 된다:

RMAN> show all;

SHOW ALL 명령의 결과에서 만약 기본 세팅이 변경되지 않았다면 텍스트 "# default"로 표현되는 형식이 될 것이다. 채널 특성을 없애기 위해서는 CONFIGURE CLEAR 명령을 사용해라.

또다른 하나의 훌륭한 구성 특징은 여러분의 타겟 데이터베이스 controlfile 자동 백업을 할 수 있는 능력이다. 이것은 아래의 명령으로 수행된다:

RMAN> configure controlfile autobackup on;

일단 한번 사용 가능한 상태가 되었으면 여러분이 BACKUP 또는 COPY 명령을 수행할 때마다 그 controlfile도 백업되어진다. 추가적으로 여러분이 이러한 특징을 사용할 수 있게 되었다면 복구 목록을 사용하지 않는다고 하더라도 RMAN 백업으로부터 controlfile을 회복 할 수 있다. 이러한 작동은 오라클8i 에서의 RMAN과는 아주 다르다. 여러분이 모든 controlfile을 잃어버렸다면 오라클9i 의 앞 버전에서는 RMAN으로만 복구 할 수 있으며 이 유일한 방법은 여러분이 복구목록을 사용하고 있을 때에만 가능하다.
오라클 기술에 대한 오라일리와 한빛의 도서 목록을 보려면
oracle.hanbitbook.co.kr을 클릭하세요.
또한 오라클9i 가 가지고 있는 새로운 점은 BACKUP과 RESTORE 명령어 사용을 위한 문법이 더 간단하다는 것이다. 오라클8i 에서는 RUN{} 명령어안에 백업과 복구 동작을 넣어야 한다. 그러나 오라클9i 에서는 더 이상 고생을 할 필요가 없다. 예를 들면 여러분의 데이터베이스를 백업하기 위한 명령어는 아래처럼 아주 간단하다:

RMAN> backup database;

이 경우에는, RMAN은 사용할 미디어 디바이스 타입이 무엇인지와 백업할 장소가 어디인지를 결정하기위해 구성해야하는 기본 채널 셋업을 사용할 것이다. 추가적으로 재저장과 복구 동작은 아래처럼 간단히 할 수 있다:

RMAN> restore database;
RMAN> recover database;

RESTORE 명령어 사용법이 오라클9i 에서는 달라졌다는 사실을 알아야 한다. RMAN이 파일을 재저장하기 전에 파일이 더 적합한 장소에 있는지를 보기위해 검사를 할 것이며 또한 파일 헤더를 조사할 것이다. 만약 RMAN이 파일 헤더에서 정확한 정보를 발견하게되면 그 데이터파일을 복구하지는 않을 것이다. 만약 여러분이 RESTORE DATABASE 명령을 수행한 후 단지 하나의 파일을 빠뜨렸다면 바로 그 빠진 파일만 복구된다. 따라서 데이터베이스 복구를 하는 동안 경과되는 시간을 절약할 수 있다는 점이 장점이다. 여러분은 RESTORE 명령어에 FORCE 옵션을 사용하여 기본 동작에 오버라이드 할 수 있다.

오라클9i 가 가지고 있는 또 다른 RMAN의 특징은 새로운 명령어인 BLOCK RECOVER이다. 이 명령은 여러분에게 데이터베이스가 온라인상으로 동작하는 동안에도 손상된 블록들을 복구하는 능력을 제공한다. 이 명령어를 사용함에 따른 이익은 하나의 대용량의 데이터파일에 손상된 블록이 있음을 발견했을 때 모든 데이터파일을 재저장하고 복구할 필요 없이 단지 손상된 블록만을 지금 바로 복구할 수 있다는 것이다. 이것으로 복구 시간을 확연히 단축시킬 수 있다.

이 기사에는 단지 오라클9i 의 RMAN에 대해 새롭게 개선된 몇 가지만을 다루고 있다. 완전한 오라클9i 와 오라클8i RMAN 구문과 RMAN 개념을 알고 싶다면 11월 출간예정인 오라일리의
『Oracle RMAN Pocket Reference』를 참조하면 된다.
오라클 DBA와 소프트웨어 개발자로 14년의 경력을 갖고있는 Darl Kuhn은 현재 썬 마이크로시스템즈의 선임 DBA이다. 썬에서 근무하기 전 그는 DBA에서부터 일반 응용 프로그램 개발까지 아우르는 컨설턴트였다. 과거 4년 동안 Darl은 Rocky Mountain Oracle Users Group을 위해 자발적으로 DBA이자 개발자로 임해왔다. 그는 또한 레지스대학교의 전산정보시스템 학과의 대학원 과정에서 오라클 DBA와 소프트웨어 개발과정을 강의했다. Darl은 콜로라도 주립 대학교에서 MBA를 취득하였으며 현재 콜로라도의 덴버에 살고 있다.

network.hanbitbook.co.kr Copyright © 2002 Hanbit Media, Inc
Posted by 1010
02.Oracle/DataBase2009. 6. 27. 10:54
반응형

RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-00554: initialization of internal recovery manager package failed
RMAN-04005: error from target database:
ORA-01017: invalid username/password; logon denied

일때 조치 방법

rman target rman/rman

Posted by 1010
02.Oracle/DataBase2009. 6. 27. 10:52
반응형
rman을 이용한 백업(backup 명령어)

rman 유틸리티를 이용하여 백업하는 방법에 대하여 살펴본다.

1) 이미지 복사
이 방법은 운영체제의 복사 명령어와 같이 물리적 파일을 
rman을 사용하여 카탈로그 DB에 백업하는 방법이다.

 이 방법의 특징은 다음과 같다.
 • 디스크 저장장치에서만 복사할 수 있다.
 • 복구할 때 rman을 사용하지 않고 운영체제에서 직접 복구한다.
 • 데이터 파일, 아카이브 파일, 컨트롤 파일을 모두 이미지 복사할 수 있다.
 • 파일들의 모든 블록을 그대로 복사한다.


2) 다중백업세트
rman을 이용한 백업작업을 수행할 때 여러 개의 데이터 파일과 아카이브 파일, 
컨트롤 파일들을 사용자가 지정한 파일의 개수로 백업할 수 있는데,
 이를 다중백업세트(multiplex backup sets)라 한다.
 또한 하나의 백업세트 안에 저장될 수 있는 파일의 개수도 지정할 수 있는데, 
이를 백업조각(backup piece)라 한다.

예를 들어, 데이터베이스에는 3개의 데이터 파일과 3개의 컨트롤 파일, 
2개의 리두로그 파일, 3개의 아카이브 파일이 있는 경우,

rman에서  BACKUP DATABASE FILESPERSET=4 명령어로 대상 데이터베이스를 전체 백업한다. 
이 백업의 결과는 CONFIGURE CHANNEL DEVICE TYPE DISK FORMAT= 'backup/%U'에 정의 되어 있는 경로에 
3개의 백업세트와 4개의 백업조각이 백업된다. 

즉, 백업세트는 백업작업 후 생성될 백업 파일의 개수를 의미하며, 
백업조각은 하나의 백업세트에 저장될 파일의 수를 의미한다. 

【예제】
$ rman target rman/rman
 
Recovery Manager Release 9.2.0.1.0 - 64bit Production
Copyright (c) 1995, 2002, Oracle Corporation.  All rights reserved.
connected to target database JINPO (DBID=785004453)
 
RMAN> configure default device type to disk;
 
using target database controlfile instead of recovery catalog
new RMAN configuration parameters
CONFIGURE DEFAULT DEVICE TYPE TO DISK;
new RMAN configuration parameters are successfully stored
 
RMAN> backup database archivelog all filesperset=5;
 
Starting backup at 10-SEP-04
allocated channel ORA_DISK_1
channel ORA_DISK_1 sid=12 devtype=DISK
channel ORA_DISK_1 starting full datafile backupset
channel ORA_DISK_1 specifying datafile(s) in backupset
including current SPFILE in backupset
including current controlfile in backupset
input datafile fno=00001 name=/export/home/oracle/oradata/jinpo/system01.dbf
input datafile fno=00005 name=/export/home/oracle/oradata/jinpo/example01.dbf
input datafile fno=00002 name=/export/home/oracle/oradata/jinpo/undotbs01.dbf
input datafile fno=00010 name=/export/home/oracle/oradata/jinpo/xdb01.dbf
input datafile fno=00006 name=/export/home/oracle/oradata/jinpo/indx01.dbf
input datafile fno=00009 name=/export/home/oracle/oradata/jinpo/users01.dbf
input datafile fno=00003 name=/export/home/oracle/oradata/jinpo/cwmlite01.dbf
input datafile fno=00004 name=/export/home/oracle/oradata/jinpo/drsys01.dbf
input datafile fno=00007 name=/export/home/oracle/oradata/jinpo/odm01.dbf
input datafile fno=00008 name=/export/home/oracle/oradata/jinpo/tools01.dbf
channel ORA_DISK_1 starting piece 1 at 10-SEP-04
channel ORA_DISK_1 finished piece 1 at 10-SEP-04
piece handle=/export/home/oracle/app/oracle/product/9.2.0/dbs/01fvkg11_1_1 comment=NONE
channel ORA_DISK_1 backup set complete, elapsed time: 00:03:47
channel ORA_DISK_1 starting archive log backupset
channel ORA_DISK_1 specifying archive log(s) in backup set
input archive log thread=1 sequence=70 recid=1 stamp=536405085
input archive log thread=1 sequence=71 recid=2 stamp=536490872
channel ORA_DISK_1 starting piece 1 at 10-SEP-04
channel ORA_DISK_1 finished piece 1 at 10-SEP-04
piece handle=/export/home/oracle/app/oracle/product/9.2.0/dbs/02fvkg84_1_1 comment=NONE
channel ORA_DISK_1 backup set complete, elapsed time: 00:00:08
Finished backup at 10-SEP-04
 
RMAN> 


3) 이중 백업세트
다중 백업세트가 여러 개의 파일들을 하나의 백업세트로 구성하는 방법인데 반하여, 
이중백업세트는 하나의 파일을 여러 개의 백업세트로 나누는 방법을 의미한다.
BACKUP 명령어와 함께 COPIES 키워드가 하나의 데이터 파일을 몇 개의 조각으로 나눌 것인지를 지정한다. 
DATAFILE n 키워드는 대상 데이터 파일의 파일 번호이며, 
번호는 DBA_DATA_FILES 자료사전에서 확인할 수 있다.
【예제】
SQL> connect system/manager
Connected.
SQL> select file_name,file_id from dba_data_files;
 
FILE_NAME                                             FILE_ID
------------------------------------------------- ----------
/export/home/oracle/oradata/jinpo/system01.dbf            1
/export/home/oracle/oradata/jinpo/undotbs01.dbf           2
/export/home/oracle/oradata/jinpo/cwmlite01.dbf           3
export/home/oracle/oradata/jinpo/drsys01.dbf              4
/export/home/oracle/oradata/jinpo/example01.dbf           5
/export/home/oracle/oradata/jinpo/indx01.dbf              6
/export/home/oracle/oradata/jinpo/odm01.dbf               7
/export/home/oracle/oradata/jinpo/tools01.dbf             8
/export/home/oracle/oradata/jinpo/users01.dbf             9
/export/home/oracle/oradata/jinpo/xdb01.dbf              10
 
10 rows selected.
 
SQL> exit
$ rman target rman/rman
 
Recovery Manager Release 9.2.0.1.0 - 64bit Production
Copyright (c) 1995, 2002, Oracle Corporation.  All rights reserved.
connected to target database JINPO (DBID=785004453)
 
RMAN> BACKUP COPIES 2 DATAFILE 5;
 
Starting backup at 10-SEP-04
using target database controlfile instead of recovery catalog
allocated channel ORA_DISK_1
channel ORA_DISK_1 sid=9 devtype=DISK
channel ORA_DISK_1 starting full datafile backupset
channel ORA_DISK_1 specifying datafile(s) in backupset
input datafile fno=00005 name=/export/home/oracle/oradata/jinpo/example01.dbf
channel ORA_DISK_1 starting piece 1 at 10-SEP-04
channel ORA_DISK_1 finished piece 1 at 10-SEP-04 with 2 copies
piece handle=/export/home/oracle/app/oracle/product/9.2.0/dbs/03fvkhdm_1_1 comment=NONE
piece handle=/export/home/oracle/app/oracle/product/9.2.0/dbs/03fvkhdm_1_2 comment=NONE
channel ORA_DISK_1 backup set complete, elapsed time: 00:01:15
Finished backup at 10-SEP-04
 
RMAN> 


4) Backup 명령어
rman 유틸리티 프롬프트에서 사용하는 backup 명령어와 그 옵션은 다음과 같다.
【형식】
     BACKUP [BACKUP-TYPE] [옵션]

여기서 BACKUP-TYPE의 종류는 다음과 같다.
DATABASE데이터베이스 전체를 백업한다.
TABLESPACE ‘테이블스페이스명’ 지정한 테이블스페이스만 백업한다.
DATAFILE ‘파일명’ 특정 데이터 파일만 백업한다.
DATAFILECOPY ‘파일명’ 지정한 데이터파일을 복사하여 백업한다.
ARCHIVELOG ALL 백업시 모든 아카이브 파일도 함께 백업한다.
CURRENT CONTROLFILE 백업시 현재 컨트롤 파일도 함께 백업한다.
CONTROLFILECOPY ‘파일명’ 현재 컨트롤 파일을 복사하여 백업한다.
옵션의 종류는 다음과 같다.
TAG=‘내용’ 현재 백업절차에 대한 주석을 작성
FILESPERSET=n 백업조각의 수를 지정
DELETE INPUT 백업 후 아카이브 파일들을 삭제
FORMAT = ‘파일 경로와 파일명’ 백업파일의 경로와 파일명을 지정
다음은 자동으로 파일명을 지정하는 와일드카드는 다음과 같다.
%P 백업세트 내의 백업조각 번호
%S 백업세트번호
%D 대상 데이터베이스명
%N 대상 데이터베이스의 다른 표시이름
%T 초단위 시간 정보
%U 백업세트와 시간정보로 된 8문자
V$BACKUP_SET 자료사전을 참조해보면 현재 생성되어 있는 백업세트의 개수와 각 백업세트의 블록 크기를 알 수 있으며, 또한 V$BACKUP_PIECE 자료사전을 보면 백업세트의 경로와 파일명을 알 수 있다. 【예제】 SQL> connect system/manager Connected. SQL> select recid, block_size from v$backup_set; RECID BLOCK_SIZE ---------- ---------- 1 8192 2 512 3 8192 SQL> col handle format a65; SQL> select recid,set_count,piece#, handle from v$backup_piece; RECID SET_COUNT PIECE# HANDLE ---------- ---------- ---------- ----------------------- 1 1 1 /export/home/oracle/app/oracle/product/9.2.0/dbs/01fvkg11_1_1 2 2 1 /export/home/oracle/app/oracle/product/9.2.0/dbs/02fvkg84_1_1 3 3 1 /export/home/oracle/app/oracle/product/9.2.0/dbs/03fvkhdm_1_1 4 3 1 /export/home/oracle/app/oracle/product/9.2.0/dbs/03fvkhdm_1_2 SQL> 5) 컨트롤 파일의 자동 백업 rman 유틸리티에서 configure 명령으로 컨트롤 파일을 자동 백업하고 똑 같은 복사 본을 사용자가 지정하는 경로에 지정한 파일 명으로 백업할 수 있다. CONFIGURE CONTROLFILE AUTOBACKUP ON 명령을 실행하면 컨트롤 파일의 정보가 변경 될 때마다 채널 할당시 설정한 기본 백업경로에 백업해 준다. 또한 CONFIGURE SNAPSHOT CONTROLFILE NAME TO ‘경로와 파일명’ 명령으로 실행하면 지정된 경로와 파일명으로 컨트롤 파일을 백업해 준다. 【예제】 $ rman target rman/rman Recovery Manager Release 9.2.0.1.0 - 64bit Production Copyright (c) 1995, 2002, Oracle Corporation. All rights reserved. connected to target database JINPO (DBID=785004453) RMAN> CONFIGURE CONTROLFILE AUTOBACKUP ON; using target database controlfile instead of recovery catalog new RMAN configuration parameters CONFIGURE CONTROLFILE AUTOBACKUP ON; new RMAN configuration parameters are successfully stored RMAN> CONFIGURE SNAPSHOT CONTROLFILE NAME TO 'joe_contrpl'; snapshot controlfile name set to joe_contrpl new RMAN configuration parameters are successfully stored RMAN> 참조: dbv 유틸리티를 사용하여 백업된 데이터가 깨졌는지 확인할 수 있다.
Posted by 1010
02.Oracle/DataBase2009. 6. 27. 10:51
반응형
출처: http://www.dbguide.net/oracle11g_guide/oracle11g_guide_10.jsp

간략한 개요

Oracle Database 11g는 패스워드 대소문자 구분, Transparent Tablespace Encryption, UTL_TCP/HTTP/SMTP를 위한 액세스 컨트롤 리스트 등 다양한 보안 관련 신기능을 제공합니다.

디폴트 패스워드

2006년에 게시된 OTN 아티클 "프로젝트 락다운: 데이터베이스 인프라스트럭처의 보안을 위한 단계별 접근법(한글)"에서, 필자는 디폴트 패스워드의 사용, 데이터베이스 스캔과 같은 보안 문제를 해결하기 위한 방안을 설명한 바 있습니다.


이제 이 아티클 내용의 일부는 이제 더 이상 참고할 필요가 없게 되었습니다. Oracle Database 11g는 DBA_USERS_WITH_DEFPWD 데이터 딕셔너리 뷰를 조회하는 기막힐 정도로 간단한 방법으로 디폴트 패스워드를 사용 중인 사용자들을 신속하게 확인할 수 있는 기능을 제공합니다. (DBA_는 표준 접두어로, 이 뷰가 DBA 사용자들의 정보만을 포함하고 있음을 의미하는 것은 아닙니다.) 디폴트 패스워드를 사용 중인 사용자 목록을 확인하는 방법이 아래와 같습니다:


select *
from dba_users_with_defpwd


실행 결과는 아래와 같습니다:


USERNAME
------------------------------
DIP
MDSYS
WK_TEST
CTXSYS
OLAPSYS
OUTLN
EXFSYS
SCOTT
MDDATA
ORDPLUGINS
ORDSYS
XDB
LBACSYS
SI_INFORMTN_SCHEMA
WMSYS


위에서 디폴트 패스워드인 TIGER가 사용되고 있는 SCOTT 사용자를 확인할 수 있습니다. 아래와 같이 변경해 줍니다:


SQL> alter user scott identified by tiger1;
User altered.


이제 다시 뷰를 확인해 보면


SQL> select * from dba_users_with_defpwd;


SCOTT가 리스트에서 사라진 것을 확인할 수 있습니다. 아주 간단합니다!


패스워드의 대소문자 구분

Oracle Database 11g 이전 버전에서는 사용자 패스워드의 대소문자 구분은 지원되지 않았습니다. 예를 들자면 아래와 같습니다:


SQL> conn scott/tiger
Connected.
SQL> conn scott/TIGER
Connected.


하지만 이는 패스워드의 대소문자 구분을 요구하는 PCI(Payment Card Industry) 데이터 보안 표준과 같은 업계 표준에 위배되는 것이어서 많은 문제의 소지가 있었습니다.


Oracle Database 11g는 패스워드의 대소문자 구분을 지원합니다. DBCA를 통해 데이터베이스를 생성하는 과정에서, 오라클 데이터베이스는 "새로운 보안 표준"으로 업그레이드할 것인지의 여부를 묻습니다. 이 보안 표준에는 패스워드의 대소문자 구분이 포함되어 있습니다. 업그레이드를 승인하면, 패스워드는 최초 생성된 것과 동일한 대/소문자 단위로 저장됩니다. 새로운 보안 표준을 승인한 경우 아래와 같은 실행 결과를 확인할 수 있습니다:


SQL> conn scott/tiger
Connected.
SQL> conn scott/TIGER
ERROR:
ORA-01017: invalid username/password; logon denied

Warning: You are no longer connected to ORACLE.


"tiger"와 "TIGER"가 다르게 취급되는 것을 확인할 수 있습니다.


하지만 애플리케이션 중 일부는 패스워드를 전달할 때 올바른 대소문자 구분을 사용하지 않고 있을 수 있습니다. 대표적인 예가 사용자 입력 폼입니다. 사용자 입력 폼에서 패스워드를 입력 받으면서 대소문자 변환을 전혀 수행하지 않는 경우가 많습니다. Oracle Database 11g에서 대소문자를 구분한 포맷으로 사용자가 패스워드를 입력하거나, 애플리케이션에서 대소문자 변환을 수행하도록 개발자가 바꾸어 주지 않는 이상 로그인이 실패할 가능성이 있습니다.


필요하다면 아래와 같이 SEC_CASE_SENSITIVE_LOGON 시스템 매개변수를 변경하여 대소문자를 구분하지 않는 체제로 변환하는 것도 가능합니다.


SQL> conn / as sysdba
Connected.
SQL> alter system set sec_case_sensitive_logon = false;

System altered.

SQL> conn scott/TIGER
Connected.


기존의 Oracle 10g 데이터베이스를 11g로 업그레이드하는 경우에는 패스워드를 새로운 표준으로 마이그레이션 할 수 있습니다. 패스워드의 상태는 DBA_USERS 뷰의 PASSWORD_VERSIONS 컬럼을 통해 확인할 수 있습니다.



위에서 패스워드 컬럼이 NULL로 설정되어 있음을 확인할 수 있습니다. Oracle Database 10g 또는 그 이전 버전에서는 여기에 해쉬 값이 저장되어 있습니다. 그렇다면 패스워드는 어디로 간 것일까요? 패스워드는 여전히 데이터베이스(USER$ 테이블)에 저장되어 있지만 DBA_USERS 뷰를 통해서는 조회될 수 없습니다. 사용자가 글로벌하게 또는 외부 인증을 통해 생성된 경우, GLOBAL, EXTERNAL과 같이 상태 정보가 나타나지만 패스워드의 해쉬 값은 표시되지 않습니다.


다음으로, Oracle Database 11g에 새로 추가된 PASSWORD_VERSIONS 컬럼에 주목하시기 바랍니다. 이 컬럼은 패스워드의 대소문자 구분 여부를 표시합니다. "10G 11G"의 값은 사용자가 10g에서 생성되어 11g로 마이그레이션 되었거나 11g에서 직접 생성되었음을 의미합니다.


원한다면 패스워드 파일을 생성하는 과정에서 새로운 매개변수인 ignorecase를 입력하여 SYSDBA 패스워드도 대소문자를 구분하도록 강제할 수 있습니다.


$ orapwd file=orapwPRODB3 password=abc123 entries=10 ignorecase=n


위의 예제에서 SYSDBA 패스워드는 abc123이며, ABC123은 허용되지 않습니다.


패스워드의 대소문자 구분은 외부 침입자에 의한 패스워드 해킹을 더욱 어렵게 만듭니다. 또 법규 준수를 보장할 수 있다는 이점도 있습니다. 더욱 중요한 사실은, 데이터베이스 셧다운 과정을 거치지 않고도 패스워드의 대소문자 구분 설정을 다이내믹하게 변경할 수 있다는 사실입니다. 이 기능은 레거시 애플리케이션을 업그레이드하면서 발생할 수 있는 로그인 문제를 해결하는데 큰 도움이 됩니다.


프로파일, 패스워드 검증 함수

오라클 데이터베이스가 제공하는 패스워드 검증 함수에 대해 알고 계십니까? 여러분들 중 상당수가 그 존재조차도 모르고 계시리라 짐작합니다. 이 함수는 데이터베이스 패스워드의 품질을 확인하는 가장 쉽고 빠른 방법을 제공합니다. 예를 들어 패스워드가 일정한 수 이상의 문자로 구성되었는지, 유저네임과 동일하지는 않은지 등을 확인할 수 있습니다. 또 기능이 기본 내장되어 있으므로 활성화 작업만 거치면 함수를 사용할 수 있습니다.


Oracle Database 11g의 패스워드 관리 함수는 한층 개선된 검증 로직을 제공합니다. $ORACLE_HOME/rdbms/admin 디렉토리의 utlpwdmg.sql 패스워드 검증 파일은 verify_fnction_11g라는 새로운 패스워드 함수를 생성합니다. 이 스크립트의 하단에서 아래와 같은 코드를 확인할 수 있습니다:


ALTER PROFILE DEFAULT LIMIT
PASSWORD_LIFE_TIME 180
PASSWORD_GRACE_TIME 7
PASSWORD_REUSE_TIME UNLIMITED
PASSWORD_REUSE_MAX UNLIMITED
FAILED_LOGIN_ATTEMPTS 10
PASSWORD_LOCK_TIME 1
PASSWORD_VERIFY_FUNCTION verify_function_11G;


이 스크립트는 DEFAULT 프로파일에 이 스크립트는 DEFAULT 프로파일에 함수를 연결합니다. DEFAULT는 (별도로 명시되지 않는 이상) 모든 사용자를 위한 디폴트 프로파일로 설정되어 있습니다. 이러한 방법으로 인증 체계에 관련된 법규 준수를 보장할 수 있습니다. 패스워드 검증 함수의 11g 버전을 생성하는 스크립트를 실행하기만 하면, 스크립트가 디폴트 프로파일에 자동으로 연결되고 패스워드 검증 기능이 활성화됩니다.



개선된 감사 기능

감사 문제 역시 관리자들의 골칫거리 중 하나입니다. 오라클 데이터베이스는 사용자 작업의 추적을 위한 강력한 감사 기능을 제공합니다. 하지만 대부분의 사용자들은 I/O 성능 저하를 우려하여 감사 기능을 적용하지 않고 있습니다. 하지만 실제로는 일부 감사 기능은 활성화하더라도 성능 오버헤드를 우려할 필요가 없습니다.


그 한 가지 예가 CREATE SESSION입니다. CREATE SESSION은 세션이 시작될 때, 그리고 종료될 때 한 번씩 기록을 저장합니다. 이 감사 옵션은 I/O에 미치는 영향은 극히 미미하지만 그 혜택은 매우 강력합니다.


Oracle Database 11g에서는 한층 강력한 감사 솔루션의 구현을 가능하게 하는 두 가지 간단한 변경 사항이 적용되었습니다. 먼저, 데이터베이스 매개변수 audit_trail이 디폴트로 NONE이 아닌 DB로 설정되어 있습니다. 따라서 데이터베이스를 재시작하지 않고도 임의의 오브젝트, 구문, 권한에 대한 감사 기능을 활성화하는 것이 가능합니다.


두 번째로 디폴트 설정에서 감사 대상에 포함되는 구문의 종류가 많아졌습니다. 그 목록이 아래와 같습니다.


ALTER SYSTEM
SYSTEM AUDIT
CREATE SESSION
CREATE USER
ALTER USER
DROP USER
ROLE
CREATE ANY TABLE
ALTER ANY TABLE
DROP ANY TABLE
CREATE PUBLIC DATABASE LINK
GRANT ANY ROLE
ALTER DATABASE
CREATE ANY PROCEDURE
ALTER ANY PROCEDURE
DROP ANY PROCEDURE
ALTER PROFILE
DROP PROFILE
GRANT ANY PRIVILEGE
CREATE ANY LIBRARY
EXEMPT ACCESS POLICY
GRANT ANY OBJECT PRIVILEGE
CREATE ANY JOB
CREATE EXTERNAL JOB


위의 작업들을 감사 대상에 포함시키더라도 I/O는 크게 증가하지 않으며, 따라서 성능 오버헤드를 최소화한 상태에서 합리적인 수준의 감사를 수행할 수 있습니다.


이 두 가지 변경 사항 덕분에 별도의 설정 작업을 거치지 않고도 강력한 감사 기능을 활용할 수 있게 되었습니다. 물론 이것은 단순한 데이터베이스 매개변수와 감사 설정에 불과하며, 필요한 경우 쉽게 비활성화할 수 있습니다. 하지만 구문 리스트를 주의 깊게 살펴 본다면, 심지어 개발 데이터베이스에서도 감사가 필요할 수 있음을 깨닫게 될 것입니다. 물론 좀 더 세부적인 튜닝은 필요할 수 있습니다. (예를 들어, 데이터 웨어하우스 환경에서는 사용자들이 많은 수의 임시 테이블을 생성, 삭제하므로 CREATE/DROP TABLE에 대한 감사가 성능 문제를 발생시킬 수 있습니다.)


주의: Oracle Database 11g로 업그레이드한 경우, 위에서 언급된 구문에 대해 감사 기능이 기본적으로 활성화됩니다. 감사 로그는 SYSTEM 테이블스페이스의 AUD$ 테이블에 저장되며 매우 빠른 속도로 차오를 수 있습니다. 이 공간에 대한 감시를 게을리 하지 마십시오.


Transparent Tablespace의 암호화

보안과 관련한 새로운 법규들이 제정되면서, 암호화 기능에 대한 관심이 점점 더 증가하고 있습니다. 데이터에 대한 암호화는 필요합니다. 하지만 정말 중요한 것은 어떻게 암호화할 것인가의 문제입니다.


Oracle Database 10g Release 1 또는 그 이전 버전에서는 DBMS_CRYPTO, DBMS_OBFUSCATION_TOOLKIT 툴킷을 이용하여 암호화 프레임워크를 직접 구현할 수 있었습니다. 하지만 Oracle Database 10g Release 2의 Transparent Data Encryption 기능이 소개되면서 이 프레임워크는 용도폐기 되어 버렸습니다.


Transparent Data Encryption 기능을 이용하면 특정 컬럼을 선택적으로 암호화하는 것이 가능합니다. 하지만 이 기능은 성능과 관련된 문제를 갖고 있습니다. 암호화된 컬럼에는 인덱스 레인지 스캔이 적용될 수 없으므로 성능이 심각하게 저하될 수 있습니다.


Oracle Database 11g의 Transparent Tablespace Encryption 기능이 돋보이는 것은 바로 이러한 이유 때문입니다. 테이블스페이스가 암호화된 것으로 선언되면, 테이블뿐 아니라 테이블스페이스 내의 모든 데이터(Transportable Tablespace, 백업 포함)가 암호화됩니다. 하지만 인덱스 스캐닝 작업은 데이터가 해독된 메모리 공간에서 실행되므로 성능 저하 문제는 발생하지 않습니다.


아직 감이 안 잡히셨습니까? 그 동작 원리에 대해 좀 더 알아 봅시다. 암호화 프로시저는 Transparent Data Encryption의 경우와 동일합니다. 이를 위해 마스터 암호화 키가 저장되는 월렛(wallet)을 생성해야 합니다. Transparent Data Encryption이 셋업 되지 않은 상태라면 월렛과 키를 생성해 주어야 합니다.


먼저, 월렛이 저장될 디렉토리를 생성합니다. 디폴트 디렉토리는 $ORACLE_BASE/admin//wallet입니다. 월렛 서브디렉토리는 디폴트 상태에서는 존재하지 않으므로 별도로 생성해 주어야 합니다. 아래의 예제에서는 /home/oracle/app/admin/PRODB3/wallet을 디렉토리로 선택하였습니다.


다음으로 아래 구문을 실행하여 월렛에 암호화 키를 생성합니다.


alter system set encryption key identified by "abcd1234!";

이 구문은 월렛과 키를 함께 생성해 줍니다. 이제 디렉토리를 조회하면 방금 생성한 월렛 파일(ewallet.p12)을 확인할 수 있습니다.


$ cd /home/oracle/app/admin/PRODB3/wallet
$ ls
ewallet.p12


월렛은 패스워드(abcd1234)를 사용해서만 열 수 있습니다. 이 구문은 월렛을 여는 작업도 함께 수행합니다. 따라서 월렛을 별도로 생성할 필요가 없습니다. 데이터베이스가 기동되고 나면 아래 구문을 실행하여 월렛을 열기만 하면 됩니다:


alter system set wallet open identified by "abcd1234!"


월렛에 관련한 자세한 정보는 다른 오라클 매거진 아티클에서 확인하실 수 있습니다.


이제 테이블스페이스를 생성합니다:


create tablespace secure1
datafile '/home/oracle/oradata/PRODB3/secure1_01.dbf'
size 1M
encryption using 'AES128'
default storage (encrypt)
/


"encryption using ... default storage (encrypt)" 구문은 테이블스페이스를 암호화된 상태로 선언합니다. (참고: 이 테이블스페이스에는 AES 128비트 암호화가 적용되었습니다. 그 밖에도 Triple DES 168-bit key, AES 192-bit key, AES 256-bit key 등의 옵션이 제공됩니다.)


테이블스페이스를 생성한 다음에는 다른 테이블스페이스의 경우와 마찬가지 방법으로 테이블을 생성할 수 있습니다.


create table secure_trans
tablespace secure1
as
select * from trans
where rownum < 201
/

create table secure_res
tablespace secure1
as
select * from res
where rownum < 201
/


위 구문은 암호화된 테이블스페이스 SECURE1에 테이블을 생성하고 있습니다. 비교를 위해 암호화가 적용되지 않은 테이블스페이스 INSECURE1을 생성하고 이 안에 SECURE_TRANS, INSECURE_RES 테이블을 생성합니다. INSECURE_TRANS 테이블과 SECURE_TRANS 테이블은 그 구조가 동일하며 다른 테이블스페이스에 저장되었다는 차이만을 갖습니다. SECURE_RES, INSECURE_RES의 경우도 마찬가지입니다.


이제 데이터파일 검색에 사용할 데이터를 테이블의 텍스트 필드를 업데이트합니다:


update secure_trans set comments = 'Transaction Comments';
update insecure_trans set comments = 'Transaction Comments';
commit;


테이블스페이스를 오프라인/온라인 처리하여 컨텐트가 디스크에 기록되도록 합니다:


alter tablespace secure1 offline;
alter tablespace secure1 online;
alter tablespace insecure1 offline;
alter tablespace insecure1 online;


이제 캐시의 데이터가 디스크에 기록되었습니다. 여기서 검색을 수행하면 어떤 결과를 얻게 될까요?


$ strings insecure1_01.dbf | grep Transaction
Transaction Comments
...


문자열은 데이터파일에 일반 텍스트로 저장되어 있습니다. 이제 같은 작업을 암호화된 SECURE1 테이블스페이스에 반복합니다.

$ strings secure1_01.dbf | grep Transaction
$


데이터파일이 암호화되었기 때문에 아무것도 반환되지 않습니다. 또 컬럼의 값을 일반 텍스트 포맷으로 조회할 수도 없습니다. 여기까지는 좋습니다. 그렇다면 성능은 어떨까요? 아래 쿼리를 실행해서 테스트해 봅시다.


select hotel_id, sum(amt)
from secure_trans t, secure_res r
where t.res_id = r.res_id
group by hotel_id


쿼리를 실행하면서 트레이스를 걸어 보겠습니다. 아래는 트레이스파일에서 발췌한 정보입니다.



Now, run the same test against INSECURE_RES and INSECURE_TEST, which are on a normal (unencrypted) tablespace.



양쪽의 실행 시간이 거의 차이가 없습니다. 암호 해독으로 인한 CPU 사용량도 그리 많지 않습니다. 따라서 테이블스페이스의 암호화로 인한 성능 영향은 거의 없다는 결론을 내릴 수 있습니다.


DBA_TABLESPACES 뷰에 새로 추가된 ENCRYPTED 컬럼은 테이블스페이스의 암호화 정보를 제공합니다. 또 새로운 뷰 V$ENCRYPTED_TABLESPACES를 이용하면 테이블스페이스를 위해 어떤 종류의 암호화 기능이 활성화 되었는지 확인할 수 있습니다.



이 뷰를 V$TABLESPACE 뷰의 TS# 컬럼과 조인하면 전체 그림을 한 눈에 파악할 수 있습니다. V$TABLESPACE 뷰의 구조가 아래와 같습니다:



여기서 ENCRYPT_IN_BACKUP 컬럼은 Transparent Tablespace Encryption과 전혀 무관하다는 점을 참고하시기 바랍니다. 이 컬럼은 Oracle Database 10g Release 2에서 처음 소개된, 백업 과정에서 RMAN이 제공하는 테이블스페이스 암호화 기능과 연관되어 있습니다.


지금까지 확인한 것처럼 Transparent Tablespace Encryption은 꽤 우아한 방법으로 두 가지 문제를 해결해 줍니다. 데이터 관리가 SGA 내부에서 수행되기 때문에 디스크에 저장된 암호화된 데이터는 성능 저하 문제를 동반하지 않습니다.


Data Pump 덤프파일의 암호화

Oracle Database 10g는 데이터 이동을 위한 가장 강력한 툴, Data Pump 제공합니다. Data Pump는 기존에 제공되던 export/import 툴을 대체하는 역할을 합니다. Data Pump는 그 전송 속도가 매우 빠를 뿐 아니라 프로세스의 병렬화, 테이블스페이스의 리매핑과 같은 다양한 신기능을 제공합니다. Oracle Database 11g에서는 ENCRYPTION이라는 새로운 매개변수를 통해 덤프파일의 보안을 한층 강화할 수 있게 되었습니다..


덤프파일은 데이터베이스 외부에 존재하며 데이터베이스의 보안 범위에 포함되지 않습니다. 이 때문에 보안과 관련한 여러 가지 문제들이 발생할 수 있습니다. 보안에 민감한 일부 기업 환경에서는 DBA들이 데이터의 익스포트 작업 이후 써드 파티 유틸리티를 이용하여 덤프파일을 암호화하는 절차를 거칩니다. 하지만 익스포트 데이터의 양이 많다면 무척 번거로운 작업이 될 것입니다.


일반적인 덤프파일이 얼마나 보안에 취약할 수 있는지 한 번 알아 보기로 합시다. 여기 COMMENTS라는 이름의 컬럼을 포함하는 TRANS 테이블이 있습니다. 이 컬럼에는 "Transaction Comments"라는 값이 저장되어 있습니다. 이 테이블을 아래와 같이 일반적인 방법으로 익스포트 했습니다:


$ expdp scott/tiger tables=trans dumpfile=insec.dmp directory=tmp_dir

덤프파일에서 컬럼 값을 조회하면:


$ strings /tmp/insec.dmp | grep Transaction


검색 조건에 매치되는 텍스트가 여럿 발견됩니다. 따라서 덤프파일의 데이터는 암호화되지 않은 일반 텍스트임을 알 수 있습니다.

이제 11g에 새로 추가된 매개변수 ENCRYPTION을 이용하여 익스포트 작업을 수행해 봅시다. 이때 사용할 알고리즘의 타입도 함께 지정해 주어야 합니다. 여기서는 AES 128비트 알고리즘을 사용하기로 하겠습니다.



이 덤프파일에 대해 텍스트 문자열을 검색해 보겠습니다


$ cat /tmp/sec.dmp | grep Transaction
$


덤프파일의 값이 암호화되어 있기 때문에 검색 결과가 전혀 표시되지 않습니다.


여기서 여러분들은 이렇게 질문할지도 모릅니다. "하지만 암호화에는 키가 필요하지 않나요? 앞 과정에서 키를 입력한 적이 없는데요? 키가 없는 상태에서 암호화된 데이터를 해독할 수 있는 건가요?"


해답은 아주 간단합니다. 바로 앞에서 설명한 Transparent Tablespace Encryption의 월렛의 키가 사용됩니다. Data Pump 암호화에서 Transparent Tablespace Encryption 기능을 이용할 필요는 없습니다. 하지만 월렛 생성을 위한 과정은 거쳐야 합니다. 말할 필요도 없는 사실이지만 월렛은 암호화/해독 과정에서 열 수 있어야 합니다.


Data Pump 툴 사용에 익숙한 사용자분들이라면 ENCRYPTION_PASSWORD 매개 변수를 통해 이와 유사한 기능이 제공되었음을 기억하실 것입니다. 그렇다면 과거에 제공되던 기능과 어떻게 다른 것일까요?


네, 좋은 질문입니다. 10g 버전은 전체 덤프파일을 암호화하는 것이 아니라, Transparent Data Encryption의 적용을 받는 컬럼만을 암호화합니다. Transparent Data Encryption을 사용하지 않고 있다면 덤프파일은 전혀 암호화되지 않습니다. 11g 버전에서는 Transparent Data Encryption의 사용 여부에 관계없이 전체 덤프파일을 암호화하는 것이 가능합니다. 이처럼 11g 버전의 암호화 기능이 훨씬 유연하고 실용적임을 알 수 있습니다. 사용자들은 성능과 같은 여러 가지 이유로 데이터베이스에 저장된 데이터를 직접 암호화하는 것을 원하지 않을 수 있습니다. 하지만 데이터베이스의 외부에 저장되는 데이터라면 암호화하는 것이 바람직합니다. 이런 경우에 Data Pump 암호화 기능은 매우 요긴하게 활용될 것입니다.


UTL_TCP/HTTP/SMTP를 위한 액세스 컨트롤 리스트

UTL_TCP, UTL_HTTP, UTL_SMTP 패키지에 대해 이미 알고 계신 분들이 많을 것입니다. 이 패키지들은 데이터베이스 외부의 서버들과의 커뮤니케이션을 위해 사용됩니다. 예를 들어, utl_tcp는 데이터베이스 링크를 통하지 않고 2대의 호스트 간에 TCP/IP 커뮤니케이션을 설정하는데 활용됩니다. 마찬가지로, utl_http는 웹 서버에 대해 http 요청을 생성하는 용도로, utl_smtp는 호스트 간의 SMTP 메일 호출을 위해 사용됩니다.


이 패키지들은 개발자들에 의해 주로 활용됩니다. 예를 들어, utl_smtp는 데이터베이스 내에서 이메일을 전송하는데, utl_http는 PL/SQL 프로그램 내부에서 웹 페이지를 처리하는 데 활용되곤 합니다. 하지만 이러한 툴들은 심각한 보안 리스크를 수반합니다. utl_tcp를 이용하는 데이터베이스에서 사용자는 시스템 프롬프트를 거치지 않고도 데이터베이스의 접근이 허용되는 다른 호스트로 쉽게 접속할 수 있습니다. 이는, 불과 1년 전 오라클 사용자 커뮤니티에 대혼란을 초래한 보이저(Voyager) 웜이 사용한 공격 수법이었습니다.


이러한 리스크를 해결하기 위해, 많은 전문가들은 이 패키지들의 "execute from public" 권한을 삭제할 것을 권고하고 있습니다. 필자 역시 OTN 프로젝트 락다운 시리즈 아티클을 통해 같은 방법을 권장한 바 있습니다. 하지만 개발자들이 이 패키지들을 꼭 실행해야 하는 상황이라면 어떻게 해야 할까요?


Oracle Database 11g는 이를 위한 참신한 해법을 제공합니다. 바로 실행 권한을 모든 사용자에게 허용하되, 호출 가능한 리소스를 통제하는 방법입니다. 예를 들어, utl_tcp 패키지에서 일부 IP 주소만을 호출할 수 있도록 제한할 수 있습니다. 이러한 메커니즘을 액세스 컨트롤 리스트(ACL)라 부릅니다. 사용자는 utl_tcp의 실행 권한을 갖고 있다 하더라도, 호스트가 ACL에 등록된 경우에만 해당 호스트에 연결할 수 있습니다. 따라서 utl_tcp 패키지를 이용한 악성 프로그램의 접근 시도를 원천적으로 차단할 수 있습니다.


그 동작 원리를 살펴 봅시다. 먼저 ACL을 생성합니다:



'CONNECT' 매개변수는 ACL이 CONNECT 역할에 적용됨을 의미합니다. 이곳에서 사용자 또는 역할을 정의할 수 있습니다. ACL은 utlpkg.xml 파일 내에 생성됩니다.


생성 작업을 완료한 후 아래와 같은 방법으로 ACL이 추가되었는지 확인할 수 있습니다:


SELECT any_path
FROM resource_view
WHERE any_path like '/sys/acls/%.xml';


실행 결과가 아래와 같습니다:



출력의 마지막 라인에서 방금 생성된 ACL을 확인할 수 있습니다. 다음으로, 이 ACL에 권한을 추가해 줍니다. 예제에서는 SCOTT 사용자만이 이 ACL을 사용할 수 있도록 제한합니다. 또 시작, 종료일도 정의가 가능합니다.



이 ACL에 관련된 호스트 및 기타 상세 정보를 적용합니다:



위의 코드는 "사용자 SCOTT은 호스트 www.proligence.com에만 접속할 수 있으며 포트 22에서 55 사이만을 사용할 수 있음"을 의미합니다. 이제 테스트해 봅시다:


SQL> grant execute on utl_http to scott
2 /

Grant succeeded.

SQL> conn scott/tiger
Connected.
SQL> select utl_http.request('http://www.proligence.com') from dual;
select utl_http.request('http://www.proligence.com') from dual
*
ERROR at line 1:
ORA-29273: HTTP request failed
ORA-06512: at "SYS.UTL_HTTP", line 1577
ORA-24247: network access denied by access control list (ACL)
ORA-06512: at line 1

Note the error "ORA-24247: network access denied by access control list (ACL)." The user called the http server on port 80, which is outside the allowed range 22-55. Therefore the action was prevented.


문제를 해결하기 위해 새로운 룰을 추가해 봅시다:


1 begin
2 dbms_network_acl_admin.assign_acl (
3 acl => 'utlpkg.xml',
4 host => 'www.proligence.com',
5 lower_port => 1,
6 upper_port => 10000);
7* end;
8 /

PL/SQL procedure successfully completed.

SQL> conn scott/tiger
Connected.
SQL> select utl_http.request('http://www.proligence.com') from dual;

UTL_HTTP.REQUEST('HTTP://WWW.PROLIGENCE.COM')
--------------------------------------------------------------------------------
</iframe><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">


<HTML><HEAD><TITLE>Proligence Home</TITLE>
<META http-equiv=Content-Language content=en-us>
...


위 룰은 www.proligence.com 호스트에 대해서만 접근 허용됩니다. 다른 웹 사이트를 호출하면 ORA-24247 에러와 함께 실패할 것입니다. 이는 매우 세분화된 보안 정책이 적용된 것으로 볼 수 있습니다. 호스트 www.proligence.com에 접속해야 할 비즈니스 상의 이유가 있다면, 이 호스트만 허용하고 다른 호스트에 대한 접근은 차단함으로써 악성 사용자의 접근 시도를 통제할 수 있습니다.


ACL의 상세 정보를 확인하려면 DBA_NETWORK_ACLS 뷰를 조회합니다:



필자의 의견으로는 이 기능이야 말로 Oracle Database 11g에서 최고로 손꼽을 만한 보안 기능이 아닐까 합니다.


데이터 마스킹

많은 기업들이 수시로 운영 데이터베이스의 이미지를 스테이징 또는 QA 데이터베이스에 업데이트함으로써, 개발자들이 운영 시스템과 유사한 환경에서 개발된 코드를 테스트하도록 하고 있습니다. 하지만 이러한 절차에는 잠재적인 보안 문제가 수반됩니다. 운영 데이터베이스의 내용이 QA 데이터베이스와 동기화될 때 민감한 개인 정보가 유출될 수 있기 때문입니다. 이러한 리스크를 해결하기 위해, 많은 기업들이 중요한 데이터들을 의미 없는 값으로 대체하는 방법을 사용하고 있습니다. 이러한 방법을 데이터 마스킹(data masking)이라 부릅니다. 예를 들어, 실제 사회보장번호를 입력하는 대신 9개의 무작위 숫자로 업데이트하는 방법이 사용됩니다.


하지만 실제로 변경하는 작업은 매우 까다로울 수 있습니다. SQL 스크립트를 직접 작성하고, 프로세스에 문제가 없는 지, 운영 시스템에 부담이 되지 않을지 등을 점검해야 합니다. 그렇다면 오라클 데이터베이스가 직접 데이터 임포트 작업을 관리할 수 있다면 좋지 않을까요? Oracle Database 11g에는 Data Pump의 임포트 과정에서 데이터 변경을 지원하기 위한 remap_data 매개변수가 새로 추가되었습니다.


이를 위해 먼저, 리매핑 함수를 생성합니다:



이 함수는 varchar 변수를 취한 후 9개의 문자를 반환합니다. 이 함수를 이용하여 SSN의 마스킹을 수행하도록 하겠습니다. ACCOUNTS 테이블은 다음과 같이 정의되어 있습니다.



계좌 소유자의 SSN 정보를 저장한 ACC_SSN 컬럼의 마스킹을 수행하고 합니다. 이제 Data Pump를 이용하여 테이블을 익스포트 합니다. 익스포트 과정에서 새로운 매개변수, remap_data를 이용하여 익스포트 덤프 파일의 데이터를 마스킹 처리합니다.

$ expdp scott/tiger tables=scott.accounts dumpfile=
accounts.dmp directory=tmp_dirremap_data=accounts.acc_ssn:pkg_mask.fn_mask_ssn

이 매개변수는 pkg_mask 패키지의 fn_mask_ssn 리매핑 함수로부터 생성된 값을 이용합니다. 매개변수의 포맷에 주의하시기 바랍니다. 매개변수는 다음과 같은 패턴을 갖습니다:


[.].:[.].


은 마스크 대상 컬럼의 이름입니다. 실제 리매핑 로직은 .에 위치하고 있습니다.



이제 개발 데이터베이스로 테이블을 임포트할 수 있습니다. 임포트 작업이 완료된 후 테이블의 데이터를 점검한 결과가 아래와 같습니다:

ACC_SSN 값이 달라져 있음을 확인할 수 있습니다. 이 값들은 앞에서 작성한 pkg_mask.fn_mask_ssn 리매핑 함수로부터 생성되어, 임포트 과정에서 함께 임포트된 것입니다.


remap_data 매개변수를 사용하지 않고 이미 테이블을 익스포트 처리했다면, 덤프파일에는 실제 값이 저장되어 있을 것입니다. 이런 경우에도 같은 매개변수를 사용하여 임포트 과정에서 마스킹을 수행할 수 있습니다.


$ impdp scott/tiger dumpfile=accounts.dmp remap_data=
accounts.acc_ssn:pkg_mask.fn_mask_ssn directory=tmp_dir tables=accounts

여기서는 randomizer 함수가 사용되고 있으며, 그 밖의 어떤 로직을 사용하더라도 무방합니다. 예를 들어, SSN의 마지막 4개 숫자를 X로 변환하는 방법도 가능합니다. 이를 위해 사용되는 함수는 아래와 같이 구현됩니다:



이 패키지 함수는 나중에 어떤 컬럼에서든 재활용이 가능하다는 이점이 있습니다.


기타 보안 기능

이전 버전에서는 대부분의 보안 작업이 Oracle Security Manage라는 툴을 통해 수행되었습니다. Oracle Database 11g의 Oracle Enterprise Manager는 이러한 작업을 수행하는데 필요한 모든 툴들을 제공하고 있습니다. OEM의 Database 홈페이지에 위치한 Server 탭의 스크린샷이 아래와 같습니다. 오른쪽 하단에 Security라는 이름의 섹션이 위치한 것을 확인하실 수 있습니다.



이 섹션은 사용자, 프로파일, 역할 관리 등의 프로세스에 관련한 전체 보안 관련 도구의 하이퍼링크를 제공하고 있습니다. 그 밖에도 Virtual Private Database, Oracle Label Security 등을 위한 마법사를 이용하거나 Enterprise Manager 스크린으로부터 애플리케이션 컨텍스트를 생성, 관리할 수 있습니다. "Oracle Database 11g: DBA와 개발자가 알고 있어야 하는 새로운 기능" 홈페이지로 돌아가기 

[출처] [오라클 11g] 보안|작성자 형기

Posted by 1010
02.Oracle/DataBase2009. 6. 26. 23:54
반응형
Posted by 1010
02.Oracle/DataBase2009. 6. 24. 17:43
반응형

C:\Documents and Settings\Administrator>emctl start dbconsole
Environment variable ORACLE_SID not defined. Please define it.

C:\Documents and Settings\Administrator>set ORACLE_SID=orcl

C:\Documents and Settings\Administrator>emctl start dbconsole
OC4J Configuration issue. C:\oracle\product\10.2.0\db_1/oc4j/j2ee/OC4J_DBConsole
_192.168.1.66_orcl not found.

C:\Documents and Settings\Administrator>emctl start dbconsole
EM Configuration issue. C:\oracle\product\10.2.0\db_1/192.168.1.66_orcl not foun
d.

C:\Documents and Settings\Administrator>emctl start dbconsole
Oracle Enterprise Manager 10g Database Control Release 10.2.0.1.0
Copyright (c) 1996, 2005 Oracle Corporation. All rights reserved.
http://ts:1158/em/console/aboutApplication
Starting Oracle Enterprise Manager 10g Database Control ...OracleDBConsoleorcl
서비스를 시작합니다..
OracleDBConsoleorcl 서비스를 시작할 수 없습니다.

시스템 오류가 발생했습니다.

시스템 오류 3이(가) 생겼습니다.

지정된 경로를 찾을 수 없습니다.


C:\Documents and Settings\Administrator>emctl start dbconsole
Oracle Enterprise Manager 10g Database Control Release 10.2.0.1.0
Copyright (c) 1996, 2005 Oracle Corporation. All rights reserved.
http://ts:1158/em/console/aboutApplication
Starting Oracle Enterprise Manager 10g Database Control ...OracleDBConsoleorcl
서비스를 시작합니다.................
OracleDBConsoleorcl 서비스가 잘 시작되었습니다.


C:\Documents and Settings\Administrator>


해결방법

C:\WINDOWS\system32\drivers\etc

의 host화일을 수정한다

현재 사용중인 pc 의 이름과 ip를 매칭시켜주면된다.


192.168.1.66 ts

이런식으로 추가하여준다.

Posted by 1010
02.Oracle/DataBase2009. 6. 24. 17:36
반응형

command파일엔 아래와 같은 식으로 하시구요

sqlplus sms/sms @C:\oracle\scripts\export_backup.sql
C:\oracle\scripts\export_backup_act.cmd


export_backup.sql 파일의 내용은 아래와 같습니다.

set feedback off
set head off
set linesize 1000
spool C:\oracle\scripts\export_backup_act.cmd

select 'exp *****/***** file=D:\ora_backup\full'||to_char(sysdate,'YYYYMMDD')
       ||'.dmp log=D:\ora_backup\full'||to_char(sysdate,'YYYYMMDD')||'.log full=y'
from dual;

select 'del D:\ora_backup\full'||to_char(sysdate-5,'YYYYMMDD')||'.*'||
       '>> D:\ora_backup\full'||to_char(sysdate,'YYYYMMDD')||'.log'
from dual union all
select 'del D:\ora_backup\full'||to_char(sysdate-4,'YYYYMMDD')||'.*'||
       '>> D:\ora_backup\full'||to_char(sysdate,'YYYYMMDD')||'.log'
from dual union all
select 'del D:\ora_backup\full'||to_char(sysdate-3,'YYYYMMDD')||'.*'||
       '>> D:\ora_backup\full'||to_char(sysdate,'YYYYMMDD')||'.log'
from dual;

spool off
exit


윈도우 예약작업을 걸실땐 맨위에 있는 command파일이 수행되게 스케줄 하시면 될듯.

Posted by 1010
02.Oracle/DataBase2009. 6. 21. 04:23
반응형
Posted by 1010
02.Oracle/DataBase2009. 6. 21. 04:19
반응형
오라클의 경우 MYSQL과 같이 LIMIT 기능을 제공하지 않아 페이징 처리하는데 어려움이 따른다.

일반적으로 사람들이 가장 많이 사용하는 방법을 먼저 소개하도록 하겠다.

이 방법은 일방적인 데이터의 양에서는상당히 괜찮은 속도를 보장해준다.
 
그러나 대용량의 경우 부족한 성능을 보다.


1. 일반적인 오라클 페이징 처리

 
01.SELECT * FROM (
02.     SELECT A.*, 
03.                 ROWNUM AS RNUM,
04.                 FLOOR((ROWNUM-1)/{디스플레이수}+1) AS PAGE,
05.                 COUNT(*) OVER() AS TOTCNT FROM (
06.          {검색쿼리 - 정렬이 필요할 경우 정렬조건 포함}
07.    ) A
08.) WHERE PAGE = {페이지번호};
09.  
10.OR
11.  
12.SELECT * FROM (
13.     SELECT A.*, 
14.                 ROWNUM AS RNUM,
15.                 COUNT(*) OVER() AS TOTCNT FROM (
16.          {검색쿼리 - 정렬이 필요할 경우 정렬조건 포함}
17.    ) A
18.) WHERE RNUM > {범위부터} AND RNUM <= {범위까지};


2. 오라클 대용량 페이징 처리

 
01.SELECT * FROM (
02.     SELECT ROWNUM AS RNUM, A.* FROM (
03.          {검색쿼리 - 정렬이 필요할 경우 정렬조건 포함}
04.    ) A WHERE ROWNUM <= {범위까지}
05.) WHERE RNUM > {범위부터};
06.  
07.OR
08.  
09.SELECT * FROM (
10.     SELECT /*+ INDEX_ASC or INDEX_DESC(A {정렬조건 인덱스명}) */
11.                 ROWNUM AS RNUM, A.*  FROM (
12.          {검색쿼리 - 정렬이 필요한 경우 정렬조건을 포함하지 않고 ORACLE 힌트사용}
13.     ) A WHERE ROWNUM <= {범위까지}
14.) WHERE RNUM > {범위부터};
Posted by 1010
02.Oracle/DataBase2009. 6. 15. 00:59
반응형
- 원하는 소수점 자리수 만큼만 보여주고 나머지는 없애버린다.

- EX) TRUNC(12.345, 2)  => 12.34 (소수점 2자리만 보여준다)
         TRUNC(12.345)     => 12 (소수점 자릿수를 지정하지 않으면 정수만 보여준다.)
         TRUNC('2004-05-33', 'MONTH')  => '2004-05-01' (월을 기준으로 1일로 돌아온다)
         TRUNC('2004-05-12', 'YEAR')    =>  '2004-01-01' (년을 기준으로 1월 1일로 돌아온다)
Posted by 1010
02.Oracle/DataBase2009. 6. 13. 15:44
반응형






..오라클 sql 튜닝...포켓 가이드

뭐 대략 간단한거 같네요..

간단한 예제...

DELETE FROM
FROM ps_pf_ledger_f00
WHERE EXISTS
(SELECT 'x'
FROM ps_pf_led_pst2_t1 b
WHERE b.business_unit = ps_pf_ledger_f00.business_unit
AND b.fiscal_year = ps_pf_ledger_f00.fiscal_year
AND b.accounting_period= ps_pf_ledger_f00.accounting_period
AND b.pf_scenario_id = ps_pf_ledger_f00.pf_scenario_id
AND b.source = ps_pf_ledger_f00.source
AND b.account = ps_pf_ledger_f00.account
AND b.deptid = ps_pf_ledger_f00.deptid
AND b.cust_id = ps_pf_ledger_f00.cust_id
AND b.product_id = ps_pf_ledger_f00.product_id
AND b.channel_id = ps_pf_ledger_f00.channel_id
AND b.obj_id = ps_pf_ledger_f00.obj_id
AND b.currency_cd = ps_pf_ledger_f00.currency_cd);
Elapsed: 00:08:160.51

이건 8초 걸린다...

DELETE FROM ps_pf_ledger_f00
WHERE( business_unit,fiscal_year,accounting_period,
pf_scenario_id ,account,deptid ,cust_id ,
product_id,channel_id,obj_id,currency_cd)
IN
(SELECT business_unit,fiscal_year,accounting_period,
pf_scenario_id ,account,deptid ,cust_id ,
product_id,channel_id,obj_id,currency_cd
FROM ps_pf_led_pst2_t1 );
Elapsed: 00:00:00.30

이건 0.8 초 ...
----------------------


SELECT COUNT(*)
FROM trans
WHERE cost_center = 'MASS'
AND bmark_id = 9;
Response Time = 4.255 seconds


The index that has the column that is listed first in the WHERE CLAUSE will drive the query. In this statement, the indexed entries for COST_CENTER = `MASS' will return significantly more rows than those for BMARK_ID=9, which will return at most only one or two rows.
The following query reverses the order of the conditions in the WHERE clause, resulting in a much faster execution time.


SELECT COUNT(*)
FROM trans
WHERE bmark_id = 9
AND cost_center = 'MASS';
Response Time = 1.044 seconds


Posted by 1010
02.Oracle/DataBase2009. 6. 13. 10:26
반응형
Posted by 1010
02.Oracle/DataBase2009. 6. 9. 11:36
반응형

XML DB Port Assignments

by Jeff Hunter, Sr. Database Administrator

Portions of this article are written by Roby Sherman and Copyright 2002


Contents

  1. Introduction
  2. Repository Views and Default Ports
  3. Changing XML DB Default Ports
  4. Disabling the Port Assignment



Introduction

Oracle introduced the XML Database in release 9i. Along with this new feature, Oracle continues the practice of incorporating new, barely documented port assignments that often leave the DBA to search endlessly for possible configuration file(s) that define these port assignments. Well, when it comes to searching for where these port numbers related to XML DB are defined, you will not find them on the file system, but rather inside the database. This article will attempt to unravel some of the mysteries on managing port assignments related to Oracle XML DB.



Repository Views and Default Ports

The key XML DB technologies can be grouped into two major classes - a XMLType that provides a native XML storage and retrieval capability strongly integrated with SQL, and a XML Repository that provides foldering, access control, versioning etc. for XML resources. Users view and manage XML objects like files and schemas in the XML Repository as a hierarchy of folders. This repository aspect of XML DB involves access through standard protocols such as HTTP/WebDAV and FTP. These servers will bind to ports 8080 and 2100 respectively by default.

DBA's will sometimes wonder why their Web Server, that always used to work, has all of the sudden been hijacked after installing Oracle9i and creating a database using DBCA. After some research, they attempt to shutdown the Oracle TNS listener and notice that the port in question (mostly 8080) is no longer being utilized. Unfortunately, there is little to tell the DBA that these ports are going to be used until they find out the hard way: When the database starts and steals the ports away from another process that hasn't yet started or when the other process errors and/or is unreachable.



Changing XML DB Default Ports

The following section describes the syntax that can be used to alter XML DB configuration information from within SQL*Plus. Ensure that you are logged into the database from a DBA account. In the following example, the default HTTP/WebDAV and FTP ports are changed from 8080 and 2100 to 8081 and 2111 respectively:
  SQL> -- Change the HTTP/WEBDAV port from 8080 to 8081
  SQL> call dbms_xdb.cfg_update(updateXML(
    2        dbms_xdb.cfg_get()
    3      , '/xdbconfig/sysconfig/protocolconfig/httpconfig/http-port/text()'
    4      , 8081))
    5  /

  Call completed. 


  SQL> -- Change the FTP port from 2100 to 2111
  SQL> call dbms_xdb.cfg_update(updateXML(
    2         dbms_xdb.cfg_get()
    3       , '/xdbconfig/sysconfig/protocolconfig/ftpconfig/ftp-port/text()'
    4       , 2111))
    5  /

  Call completed. 


  SQL> COMMIT;

  Commit complete. 


  SQL> EXEC dbms_xdb.cfg_refresh;

  PL/SQL procedure successfully completed.


  SQL> -- Verify the change
  SQL> set long 100000
  SQL> set pagesize 9000
  SQL> SELECT dbms_xdb.cfg_get FROM dual;

CFG_GET
--------------------------------------------------------------------------------
<xdbconfig xmlns="http://xmlns.oracle.com/xdb/xdbconfig.xsd" xmlns:xsi="http://w
ww.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.oracle.com/x
db/xdbconfig.xsd                                     http://xmlns.oracle.com/xdb
/xdbconfig.xsd">
  <sysconfig>
    <acl-max-age>900</acl-max-age>
    <acl-cache-size>32</acl-cache-size>
    <invalid-pathname-chars>,</invalid-pathname-chars>
    <call-timeout>300</call-timeout>
    <max-session-use>100</max-session-use>
    <default-lock-timeout>3600</default-lock-timeout>
    <resource-view-cache-size>1048576</resource-view-cache-size>
    <protocolconfig>
      <common>
        <extension-mappings>
          <mime-mappings>
            <mime-mapping>
              <extension>au</extension>
              <mime-type>audio/basic</mime-type>
            </mime-mapping>
            <mime-mapping>
              <extension>avi</extension>
              <mime-type>video/x-msvideo</mime-type>
            </mime-mapping>
            <mime-mapping>
              <extension>bin</extension>
              <mime-type>application/octet-stream</mime-type>
            </mime-mapping>
            <mime-mapping>
              <extension>bmp</extension>
              <mime-type>image/bmp</mime-type>
            </mime-mapping>
            <mime-mapping>
              <extension>doc</extension>
              <mime-type>application/msword</mime-type>
            </mime-mapping>
            <mime-mapping>
              <extension>eml</extension>
              <mime-type>message/rfc822</mime-type>
            </mime-mapping>
            <mime-mapping>
              <extension>gif</extension>
              <mime-type>image/gif</mime-type>
            </mime-mapping>
            <mime-mapping>
              <extension>htm</extension>
              <mime-type>text/html</mime-type>
            </mime-mapping>
            <mime-mapping>
              <extension>html</extension>
              <mime-type>text/html</mime-type>
            </mime-mapping>
            <mime-mapping>
              <extension>jpe</extension>
              <mime-type>image/jpeg</mime-type>
            </mime-mapping>
            <mime-mapping>
              <extension>jpeg</extension>
              <mime-type>image/jpeg</mime-type>
            </mime-mapping>
            <mime-mapping>
              <extension>jpg</extension>
              <mime-type>image/jpeg</mime-type>
            </mime-mapping>
            <mime-mapping>
              <extension>jsp</extension>
              <mime-type>text/html</mime-type>
            </mime-mapping>
            <mime-mapping>
              <extension>mid</extension>
              <mime-type>audio/mid</mime-type>
            </mime-mapping>
            <mime-mapping>
              <extension>mov</extension>
              <mime-type>video/quicktime</mime-type>
            </mime-mapping>
            <mime-mapping>
              <extension>movie</extension>
              <mime-type>video/x-sgi-movie</mime-type>
            </mime-mapping>
            <mime-mapping>
              <extension>mp3</extension>
              <mime-type>audio/mpeg</mime-type>
            </mime-mapping>
            <mime-mapping>
              <extension>mpe</extension>
              <mime-type>video/mpg</mime-type>
            </mime-mapping>
            <mime-mapping>
              <extension>mpeg</extension>
              <mime-type>video/mpg</mime-type>
            </mime-mapping>
            <mime-mapping>
              <extension>mpg</extension>
              <mime-type>video/mpg</mime-type>
            </mime-mapping>
            <mime-mapping>
              <extension>msa</extension>
              <mime-type>application/x-msaccess</mime-type>
            </mime-mapping>
            <mime-mapping>
              <extension>msw</extension>
              <mime-type>application/x-msworks-wp</mime-type>
            </mime-mapping>
            <mime-mapping>
              <extension>pcx</extension>
              <mime-type>application/x-pc-paintbrush</mime-type>
            </mime-mapping>
            <mime-mapping>
              <extension>pdf</extension>
              <mime-type>application/pdf</mime-type>
            </mime-mapping>
            <mime-mapping>
              <extension>ppt</extension>
              <mime-type>application/vnd.ms-powerpoint</mime-type>
            </mime-mapping>
            <mime-mapping>
              <extension>ps</extension>
              <mime-type>application/postscript</mime-type>
            </mime-mapping>
            <mime-mapping>
              <extension>qt</extension>
              <mime-type>video/quicktime</mime-type>
            </mime-mapping>
            <mime-mapping>
              <extension>ra</extension>
              <mime-type>audio/x-realaudio</mime-type>
            </mime-mapping>
            <mime-mapping>
              <extension>ram</extension>
              <mime-type>audio/x-realaudio</mime-type>
            </mime-mapping>
            <mime-mapping>
              <extension>rm</extension>
              <mime-type>audio/x-realaudio</mime-type>
            </mime-mapping>
            <mime-mapping>
              <extension>rtf</extension>
              <mime-type>application/rtf</mime-type>
            </mime-mapping>
            <mime-mapping>
              <extension>rv</extension>
              <mime-type>video/x-realvideo</mime-type>
            </mime-mapping>
            <mime-mapping>
              <extension>sgml</extension>
              <mime-type>text/sgml</mime-type>
            </mime-mapping>
            <mime-mapping>
              <extension>tif</extension>
              <mime-type>image/tiff</mime-type>
            </mime-mapping>
            <mime-mapping>
              <extension>tiff</extension>
              <mime-type>image/tiff</mime-type>
            </mime-mapping>
            <mime-mapping>
              <extension>txt</extension>
              <mime-type>text/plain</mime-type>
            </mime-mapping>
            <mime-mapping>
              <extension>url</extension>
              <mime-type>text/plain</mime-type>
            </mime-mapping>
            <mime-mapping>
              <extension>vrml</extension>
              <mime-type>x-world/x-vrml</mime-type>
            </mime-mapping>
            <mime-mapping>
              <extension>wav</extension>
              <mime-type>audio/wav</mime-type>
            </mime-mapping>
            <mime-mapping>
              <extension>wpd</extension>
              <mime-type>application/wordperfect5.1</mime-type>
            </mime-mapping>
            <mime-mapping>
              <extension>xls</extension>
              <mime-type>application/vnd.ms-excel</mime-type>
            </mime-mapping>
            <mime-mapping>
              <extension>xml</extension>
              <mime-type>text/xml</mime-type>
            </mime-mapping>
            <mime-mapping>
              <extension>zip</extension>
              <mime-type>application/x-zip-compressed</mime-type>
            </mime-mapping>
          </mime-mappings>
          <lang-mappings>
            <lang-mapping>
              <extension>en</extension>
              <lang>english</lang>
            </lang-mapping>
          </lang-mappings>
          <charset-mappings/>
          <encoding-mappings>
            <encoding-mapping>
              <extension>gzip</extension>
              <encoding>zip file</encoding>
            </encoding-mapping>
            <encoding-mapping>
              <extension>tar</extension>
              <encoding>tar file</encoding>
            </encoding-mapping>
          </encoding-mappings>
        </extension-mappings>
        <session-pool-size>50</session-pool-size>
        <session-timeout>6000</session-timeout>
      </common>
      <ftpconfig>
        <ftp-port>2111</ftp-port>
        <ftp-listener>local_listener</ftp-listener>
        <ftp-protocol>tcp</ftp-protocol>
        <session-timeout>6000</session-timeout>
      </ftpconfig>
      <httpconfig>
        <http-port>8081</http-port>
        <http-listener>local_listener</http-listener>
        <http-protocol>tcp</http-protocol>
        <session-timeout>6000</session-timeout>
        <server-name>XDB HTTP Server</server-name>
        <max-header-size>16384</max-header-size>
        <max-request-body>2000000000</max-request-body>
        <servlet-realm>Basic realm="XDB"</servlet-realm>
        <webappconfig>
          <welcome-file-list>
            <welcome-file>index.html</welcome-file>
            <welcome-file>index.htm</welcome-file>
          </welcome-file-list>
          <error-pages/>
          <servletconfig>
            <servlet-mappings>
              <servlet-mapping>
                <servlet-pattern>/Test</servlet-pattern>
                <servlet-name>TestServlet</servlet-name>
              </servlet-mapping>
              <servlet-mapping>
                <servlet-pattern>/oradb/*</servlet-pattern>
                <servlet-name>DBURIServlet</servlet-name>
              </servlet-mapping>
            </servlet-mappings>
            <servlet-list>
              <servlet>
                <servlet-name>TestServlet</servlet-name>
                <servlet-language>Java</servlet-language>
                <display-name>XDB Test Servlet</display-name>
                <description>A servlet to test the internals of the XDB Servlet API</description>
                <servlet-class>xdbtserv</servlet-class>
                <servlet-schema>xdb</servlet-schema>
              </servlet>
              <servlet>
                <servlet-name>DBURIServlet</servlet-name>
                <display-name>DBURI</display-name>
                <servlet-language>C</servlet-language>
                <description>Servlet for accessing DBURIs</description>
                <security-role-ref>
                  <role-name>authenticatedUser</role-name>
                  <role-link>authenticatedUser</role-link>
                </security-role-ref>
              </servlet>
            </servlet-list>
          </servletconfig>
        </webappconfig>
      </httpconfig>
    </protocolconfig>
  </sysconfig>
</xdbconfig>



Disabling the Port Assignment

One of the easist ways to disable Oracle from assigning both XML DB ports (FTP and HTTP/WebDAV) is to remove the following instance parameter from the database:
    dispatchers='(PROTOCOL=TCP) (SERVICE=<ORACLE_SID>XDB)'
This change would obviously require bouncing the database.

A second way to disable the XML DB ports is to simply change their port assignments to the value of zero (0). This is an attractive option since it uses code that can be incorporated directly into database creation scripts so that the value can be tweaked each time you create a new database.

Modifying these ports to zero can also be accomplished using a GUI; Oracle Enterprise Manager (version 9.2.0.1 or higher). Simply open OEM, select and expand the database. Next, expend the XML Database item and click on Configuration. You should be able to see and change any of the XML DB configuration parameters on the right-hand side of the OEM console. Simply make your changes and click APPLY to make them permanent.

For more information on Managing Oracle XML DB Using Oracle Enterprise Manager, click here.

Posted by 1010
02.Oracle/DataBase2009. 6. 9. 11:35
반응형

Tomcat 등의 웹컨테이너 설치 후 서비스 시작을 하려다보면
8080포트 충돌로 인해 서비스가 되지 않는 경우가 있다.

Oracle XDB가 바로 8080포트를 이미 사용하고 있기 때문이다
리스너의 서비스 상태를 점검해보고 Oralce XDB Port를 변경해보자.


C:\Documents and Settings\geenoo>netstat -ano

Proto  Local Address          Foreign Address        State           PID
 TCP    dozuq:8080             dozuq:0                LISTENING        884
 TCP    dozuq:2100             dozuq:0                LISTENING        884
:
:

PID로 프로세스를 찾는다.
C:\Documents and Settings\geenoo>tasklist /SVC /fi "PID eq 884"

이미지 이름                        PID     서비스
========================= ====== =============================================
TNSLSNR.EXE                    884      OracleOraHome92TNSListener


다음 명령으로 리스너의 서비스 상태를 보자.

D:\oracle\ora92\bin>lsnrctl status

.
.



Oracle XDB 가 8080(HTTP)와 2100(FTP) 포트를 쓴다는 걸 확인했다.
이제 포트(Port)를 변경해보자.



1. [시작] -> [프로그램] -> [Oracle - OraHome92]
-> [Configuration and Migration Tools] -> [Database Configuration Assistant] 선택

사용자 삽입 이미지



2. [다음] -> [데이터베이스의 데이이터베이스 옵션구성] 선택

사용자 삽입 이미지



3. 옵션을 구성하고자 하는 [사용 가능한 데이터베이스] 선택하고
DBA의 사용자 이름과 암호를 입력한 후 [다음]

사용자 삽입 이미지



4. [표준데이터베이스 기능...] 클릭

사용자 삽입 이미지



5. 표준데이터베이스 기능 팝업창에서 [사용자정의...] 클릭

사용자 삽입 이미지



6. 이 팝업창에서 FTP 및 WebDAV포트와 HTTP포트를 입력하고 [확인]한다.
만약 클라이언트에서 XML DB로의 접속을 원치 않을 경우엔 'XML DB프로토콜 비활성화'을 선택

사용자 삽입 이미지



7. "표준데이터베이스 기능" 팝업창(5.)의 [확인]을 선택하여 창을 닫는다.



8. 팝업창을 닫고 나면 "데이터베이스 기능"(4.) 화면으로 돌아간다. [다음] 클릭



9. [완료] 클릭

사용자 삽입 이미지


사용자 삽입 이미지



Posted by 1010
02.Oracle/DataBase2009. 6. 9. 11:34
반응형
2009-05-15 00:55

发布时间:2008.03.03 04:58    来源:赛迪网    作者:Alizze

从Oracle 9i开始,Oracle的安装缺省包含了XDB。在启动数据库后,Oracle XDB的http服务将会自动占用了8080端口,这给使用或JBoss、Tomcat进行java web开发的人造成了许多不必要的麻烦。

本文将主要介绍修改XDB的http和ftp服务端口的3种方法。

1.使用dbms_xdb包修改端口设置

使用sys登录sqlplus

sqlplus sys/syspassword as sysdba

执行如下的脚本:

============================ 
-- Change the HTTP/WEBDAV port from 8080 to 8081 
call dbms_xdb.cfg_update(updateXML( 
dbms_xdb.cfg_get() 
, '/xdbconfig/sysconfig/protocolconfig/httpconfig/http-port/text()' 
, 8081)) 
/ 
-- Change the FTP port from 2100 to 2111 
call dbms_xdb.cfg_update(updateXML( 
dbms_xdb.cfg_get() 
, '/xdbconfig/sysconfig/protocolconfig/ftpconfig/ftp-port/text()' 
, 2111)) 
/ 
COMMIT; 
EXEC dbms_xdb.cfg_refresh;

2.使用OEM console

选择数据库,XML Database,Configuration。更改XDB的有关设置。

3.修改SPFILE[SID名].ORA文件,去掉数据库的初始化参数:

这个文件是Oracle的启动配置文件dispatchers='(PROTOCOL=TCP) (SERVICE=XDB)',将会禁止XDB的http和ftp服务。

下面我们来重启计算机,或者在服务中重启OracleService[SID名]这个服务。重启后可能无法使用Enterprise Manager Console和其他客户端连接,这时请大家使用Oracle的Configuration and Migration Tools/Net Configuration Assistant工具删除监听器,然后新建一个监听器,最后重启监听器。(责任编辑:卢兆林)

以下为个人原创:

另外,安装了oracle10g后,lomboz all in one不能正常启动,在日记文件中有如下语句:

!MESSAGE Product org.objectweb.lomboz.product.lomboz could not be found.

原因在于oracle添加的java环境变量。和当前lomboz使用的环境版本不同。

解决办法很简单:

将环境变量中path的值“C:\Program Files\Java\jdk1.7.0\bin;”(此值与你安装的JAVA版本、安装位置不同而有所不同)放在最前面,其它的置后(请务必注意分号的位置)。重新启动Eclipse,可以成功启动。经证实,修改后的环境变量对Oracle的使用没有影响,仍可正常使用。

希望可以帮到遇到这种问题的朋友们。

Posted by 1010
02.Oracle/DataBase2009. 6. 8. 15:17
반응형
CLOB COLUMN 또는 CLOB VARIABLE를 REPLACE, SEARCH하는 방법
Posted: 2007. 1. 29 오전 2:06
Click to report abuse...   Click to reply to this thread Reply
제품 : PL/SQL

작성날짜 : 2001-02-08

CLOB COLUMN 또는 CLOB VARIABLE를 REPLACE, SEARCH하는 방법
=========================================================

1. Table 및 Data 생성

SAL> CREATE TABLE test (key NUMBER,c CLOB);
SAL> INSERT INTO test VALUES (1,'aaa#~#bbb#~#ccc');
SAL> INSERT INTO test VALUES (2,'aaa#~#bbb#~#ccc');

2. 사용된 DBMS_LOB package routines :

- ISOPEN()
- CREATETEMPORARY()
- INSTR()
- GETLENGTH()
- COPY()
- TRIM()

3. 아래처럼 Clob를 handling하기 위한 PL/SQL Code 생성

CREATE OR REPLACE PROCEDURE Srch_N_Repl_Clob
(dest_lob IN OUT CLOB, search_str VARCHAR2,replace_str VARCHAR2)
AS
temp_clob CLOB;
end_offset INTEGER := 1;
start_offset INTEGER := 1;
occurence NUMBER := 1;
replace_str_len NUMBER := LENGTH(replace_str);
temp_clob_len NUMBER := 0;
dest_lob_len NUMBER := 0;

BEGIN
IF DBMS_LOB.ISOPEN(dest_lob) = 0 THEN
NULL;
END IF;
DBMS_LOB.CREATETEMPORARY(temp_clob,TRUE,DBMS_LOB.SESSION);
LOOP
end_offset := DBMS_LOB.INSTR(dest_lob,search_str,1,occurence);
IF end_offset = 0 THEN
temp_clob_len := DBMS_LOB.GETLENGTH(temp_clob);
dest_lob_len := DBMS_LOB.GETLENGTH(dest_lob) - start_offset + 1;
IF dest_lob_len > 0 THEN
DBMS_LOB.COPY(temp_clob,dest_lob,dest_lob_len,temp_clob_len+1,start_offset);
END IF;
EXIT;
END IF;
temp_clob_len := DBMS_LOB.GETLENGTH(temp_clob);
IF (end_offset - start_offset) > 0 THEN
DBMS_LOB.COPY(temp_clob,dest_lob,(end_offset - start_offset),temp_clob_len+1,start_offset);
END IF;
start_offset := end_offset + LENGTH(search_str);
occurence := occurence + 1;
IF replace_str IS NOT NULL THEN
DBMS_LOB.WRITEAPPEND(temp_clob,replace_str_len,replace_str);
END IF;
END LOOP;
IF LENGTH(search_str) > LENGTH(replace_str) THEN
DBMS_LOB.TRIM(dest_lob,DBMS_LOB.GETLENGTH(temp_clob));
END IF;
DBMS_LOB.COPY(dest_lob,temp_clob,DBMS_LOB.GETLENGTH(temp_clob),1,1);
END ;
/

4. Clob의 column 및 variable이 변경된 상태를 실행해보면

SQL>DECLARE
2 dest_lob CLOB;
3 BEGIN
4 SELECT c INTO dest_lob FROM test WHERE key = 1 FOR UPDATE;
5 Srch_N_Repl_Clob(dest_lob,'#~#',' Replaced ');
6 END;
7 /

SQL>SELECT * FROM test;

KEY C


--------------------------------------------------
1 aaa Replaced bbb Replaced ccc
2 aaa#~#bbb#~#ccc
Posted by 1010
02.Oracle2009. 6. 4. 19:57
반응형
오라클 에라멧세지 정리.


-----
현상 : Oracle Stored Procedure 호출이 제대로 되지 않음
원인 : Stored Procedure에 입출력되는 VARCHAR 변수의 초기화가 되지 않음
조치 : Stored Procedure 입력, 출력 VARCHAR 변수의 Length를 반드시 설정
(TMS에 문제를 일으키는 것으로 보임)
-----
현상 : exec TMS_ORACLE7 -A: Failed.
원인 : ORACLE에서 DB 사용자에게 GRANT(사용허가권)가 없어서 발생하는 문제임.
ORACLE LIB에서 문제가 생길 수도 있다.
조치 : ORACLE의 VIEW중에 V$XATRANS$라는 VIEW를 GRANT시켜주면 조치됨.
ORACLE의 DBA권한에서 실행가능함.
방법: grant all on V$XATRANS$ TO SCRJPCS
여기서 SCRJPCS는 DB USER-ID임.
-----
현상 : DataBase에 연결하지 못한다.
원인 : 1.해당 DataBase에 필요한 환경 설정이 잘못되어 있다.(INVAL Error발생)
2.환경 파일에 환경 설정이 잘못되어 있다.(INVAL Error)
3.DataBase에 권한이 없다.
4.DataBase가 기동되지 않았다.
조치 : 1.set 명령으로 필요한 환경변수 설정을 확인한다.
- Oracle : ORACLE_HOME, ORACLE_SID, ORA_NLS
- Informix : INFORMIXDIR, INFORMIXSERVER
2.구성파일에 설정되어 있는 ENVFILE을 확인한다.
3.해당 User에게 DataBase 권한을 부여한다.
- ORACLE : "v$xatrans$"라는 VIEW에 대하여 해당 User에게 권한을 부여한다.
- INFORMIN : 해당 DB를 사용할 수 있는 권한을 User에게 부여한다.
4.DataBase를 기동하고 Server를 새로 띄운다.
-----
현상 : LINE/COL ERROR
-------- -----------------------------------------------------------------
0/0 PLS-00801: Message 801 not found; product=PLSQL; facility=PCM
22/9 PL/SQL: SQL Statement ignored
28/17 PLS-00201: identifier 'JWONRYO.JWONMAS' must be declared
62/9 PL/SQL: SQL Statement ignored
원인 : 현 Database의 Domain 밖에 있는 Table을 Handling하는 경우에 권한이 없는
경우에 발생
조치 : 접근할 수 있는 권한을 부여한다.
-----
현상 : LINE/COL ERROR
-------- -----------------------------------------------------------------
135/5 PL/SQL: Statement ignored
135/9 PLS-00365: 'AVSQLCODE' is an OUT parameter and cannot be read
원인 : OUT parameter를 IN parameter로 사용하고 그 값을 읽은 경우.
조치 : OUT parameter를 IN OUT parameter로 선언.
-----
현상 : ORA-0020
원인 : 프로세스 수를 프로세스를 초과한 경우.
조치 : 프로세스 수를 들여줌.
-----
현상 : ORA-00023: session references process's private memory; cannot detach session
원인 : XA library를 사용하는데 Oracle이 dedicator server로 설치된 경우 발생
조치 : XA library를 사용할려면 Oracle을 MTS mode로 설치되어야 한다.
-----
현상 : 1.ORA-0054 resource busy and acquire with NOWAIT specified
2.ORA-0054 WHEN DROP A TABLE(SESSION KILL)
원인 : 1.Oracle 사용자가 어떤 Row을 Lock를 했는데, 다른 Oracle 사용자가 NOWAIT문을 이용하여
동일한 Row를 Lock를 한 경우에 발생
2.TABLE에 LOCK이 걸려 DML 및 DDL 명령 사용시
조치 : LOCK을 걸고있는 SESSION들을 KILL
-----
현상 : ORA-0059
원인 : DB_FILES 값에 도달한 경우
조치 : init.ora 의 DB_FILES 를 늘려주고 DB 를 Restartup 하면 해결
-----
현상 : ORA-00210: cannot open control file '/dev/vx/rdsk/oracle/v_ctl1'
ORA-07368: sfofi: open error, unable to open database file.
원인 : Sequent Symmetry or NUMA-Q platform이 very large file (O/S에서 2GB
이상의 file system 지원)을 지원하기 위해 VLFS patch를 적용했거나
VLFS를 이미 지원하는 O/S Version일 경우 오라클 master node가 정상적으로
startup 되고 나서 다른 node가 startup parallel이 될 때 먼저 startup 된
master node가 shared disk 의 모든 오라클 관련 file을
none-shared mode로 open 하기 때문에 위의 현상이 발생됨.
조치 : 1.PTX/Cluster V1.3.2일 경우
* Oracle V7.3.x : O/S상에서 VLFS patch적용하지 않았을 경우는 관계
없으나, 이미 적용되었다면 추가적으로 O/S patch FP#23373
적용하여야 함
2.PTX/Cluster running DYNIX/PTX 4.4.x 일 경우
* Oracle V7.3.3 : 현재 fix된 patch는 없으며 다음과 같은
workaround 방법으로 해결이 가능함.

Workaround)
--- $ORACLE_HOME/rdbms/lib/ins_rdbms.mk file에 아래의 추가된 부분만
삽입하여 오라클 kernel relink 실시
(예:make -f ins_rdbms ioracle)
oracle: $(ORALIBD) $(CORELIBD) $(NETLIBD) $(KSMS) $(CONFIG)
$(PSOLIBLIST) opimai.o @$(ECHO) $(LINK) -o $@ $(LDFLAGS)
$(LDFLAGS_ORA) opimai.o $(CONFIG) \
-llkseqora \ ---> 추가된 부분
$(LLIBSERVER) $(LLIBORA) $(LLIBKNLOPT) $(LLIBSLAX)
$(LLIBPLSQL) \
$(LLIBSICX) $(LLIBSOWSUTL) \
$(LLIBSICX) $(LLIBSOWSUTL) \

...........
...........

* Oracle V7.3.4 :
Oracle V7.3.4 일 경우는 문제가 없으나 patchset을 적용할 경우
V7.3.4.2에서는 V7.3.3과 같은 방법으로 oracle kernel을 relink하면
문제가 해결됨.
-----
현상 : ORA-0376 : file %s cannot be read at this time
원인 : DBF가 파손됨.
조치 : Check the state of the file. Bring it online
-----
현상 : ORA-00376: file 29 cannot be read at this time
ORA-01110: data file 29: '/db/GICORP_4/axix01.dbf'
원인 : datafile의 size가 os에서 허용하는 filesize를 초과해서 발생.
조치 : unix의 ulimit filesize를 확인해 보시기 바랍니다.
그리고 datafile size 보다 크도록 수정해 주어야 합니다.
1.unix ulimit filesize를 증가 시킨다
C shell인 경우
% limit filesize <number>
Bourne 이나 Korn shell 인 경우
$ ulimit -f <number>
2.archivelog mode인지 확인합니다
SVRMGR> select * from v$database;

NAME CREATED LOG_MODE CHECKPOINT ARCHIVE_CH
--------- -------------------- ------------ ---------- ----------
GICORP 05/17/00 13:44:56 ARCHIVELOG 36290290 36284249
1 row selected.
3.media recovery가 필요한 datafiles를 찾습니다
SVRMGR> select * from v$recover_file;

FILE# ONLINE ERROR CHANGE# TIME
---------- ------- ------------------ ---------- --------------------
9 OFFLINE 36287415 12/20/00 23:30:55
23 OFFLINE 36289350 12/21/00 08:40:54
28 OFFLINE 36287415 12/20/00 23:30:55
29 OFFLINE 36287415 12/20/00 23:30:55
37 OFFLINE 36287415 12/20/00 23:30:55
5 rows selected.
4.각각의 datafile에 대해서 다음을 실행해 줍니다
SVRMGR> recover datafile '/db/GICORP_4/axix01.dbf';

Media recovery complete.

SVRMGR> alter database datafile '/db/GICORP_4/axix01.dbf' ONLINE;
Statement processed.

5.database를 restart합니다

SVRMGR> shutdown
Database closed.
Database dismounted.
ORACLE instance shut down.
SVRMGR> startup
ORACLE instance started.
Total System Global Area 54578916 bytes
Fixed Size 69348 bytes
Variable Size 20783104 bytes
Database Buffers 33554432 bytes
Redo Buffers 172032 bytes
Database mounted.
Database opened.
SVRMGR>
-----
현상 : ORA-0312,0313 에러(ONLINE LOG CRASH)
원인 : 1.데이타베이스 STARTUP 시 발생
조치 : [ ONLINE LOG 가 손상되었을때 DB에 OPERATION 이 없었던 경우는 다음과 같은 절차로 DB을
OPEN 할수있다 - 확률 70% ]

1.CONTROLFILE 생성
-. 손상된 online log 는 포함시키지 않는다.
-.resetlogs option 으로 생성한다.
-.reuse option 은 생략하고 기존 controlfile 은 다른이름으로 move 시킴.

<V7 에서 CONTROLFILE 생성하는 방법 >
sqldba> startup mount
sqldba> alter database backup controlfile to trace;

위와 같이 명령을 입력하면 ORACLE_HOME/rdbms/log 디렉토리에 트레이스 화일이
생긴다. 그 트레이스 화일에서 create controlfile 명령부분을 남기고 삭제한다.
콘트롤화일 생성 문장 예 - <cnt.sql> : GROUP 1 이 ONLINE LOG 라고 가정
---------------------------------------------------------------------
CREATE CONTROLFILE DATABASE "RC722" RESETLOGS NOARCHIVELOG
MAXLOGFILES 32 ********
MAXLOGMEMBERS 2
MAXDATAFILES 30
MAXINSTANCES 8
MAXLOGHISTORY 800
LOGFILE
GROUP 2 '/oracle/oracle/dbs/log2RC722.dbf' SIZE 5M,
GROUP 3 '/oracle/oracle/dbs/log3RC722.dbf' SIZE 5M
DATAFILE
'/oracle/oracle/dbs/systRC722.dbf',
'/oracle/oracle/dbs/rbsRC722.dbf',
'/oracle/oracle/dbs/toolRC722.dbf',
'/oracle/oracle/dbs/usrRC722.dbf',
'/oracle/oracle/dbs/tempRC722.dbf',
'/oracle/oracle/rcdata.dbf'
;
2.절차
$ sqldba lmode=y
SQLDBA> connect internal
SQLDBA> shutdown abort
SQLDBA> startup nomount
statement processed
SQLDBA> @cnt
SQLDBA> recover database using backup controlfile until cancel;
....
...
CANCEL (Return)
Recovery canceled
SQLDBA> alter database open resetlogs;

: 만일 정상적으로 open 되면 log file 추가
SQLDBA> alter database add logfile '?/dbs/log1ORA722.dbf' size 1M;
: 정상적으로 open 안되면 RC에 다시 연락
-----
현상 : ORA-0439
원인 : BITMAP INDEXES 생성 시 option 이 인스톨되지 않아서 발생
조치 : 반드시 Oracle 8 Enterprise Edition 에서만 사용이 가능하다.
Oracle 8i 에서도 동일하게 적용된다.
-----
현상 : ORA-0600[3339] DATA BLOCK CORRUPTION DETECTION
[3339] [arg1] [arg2] [] [] [] []
ORA-1578 : Data block corrupted in file # block #
원인 : 1.ORACLE이 직접 버퍼로 데이타를 읽어들일 때 읽은 블럭의 DBA(Data Block Address)가 잘못
되었음(INVALID)을 의미
2.ORACLE의 문제가 아니라 OS나 HW의 문제인 경우가 많다.
-----
현상 : ORA-0604: error occurred at recursive SQL level %s
원인 : 1.내부적으로 SQL명령이 실행될 때 발생(현재 할당된 익스텐트가 가득 차서 다음 익스텐트를
할당 받으려고 할 때 오라클이 다음 익스텐트의 크기와 위치를 결정하기 위하여 SELECT
명령을 내리게 되는 것과 같은 경우)
2.init.ora 화일의 파라미터 가운데 DC_FREE_EXTENTS 나 ROW_CACHE_ENQUEUES 의 값이 너무
작게 설정
3.테이블 스페이스가 가득 차거나 Extent 갯수의 최대 허용값을 초과해서 에러가 발생하는
경우 ORA-604 에러가 함께 발생
조치 : 1.?/dbs/init<SID>.ora 화일에 지정된 open_cursors 의 크기를 알아보는 것이다. 이 값이
설정이 안되어 있으면 Default가 50이므로
open_cursors=255
----------------
2.DC_FREE_EXTENTS 나 ROW_CACHE_ENQUEUES들의 값을 크게 설정
3.에러의 원인을 찾기 위해서 init.ora 화일에 다음과 같은 라인을 추가한다.
events = "604 trace name errorstack"
이렇게 init.ora를 변경하고 DB를 Shutdown 하고 Startup 하면 ORA-0604 에러가 발생하는
경우에 자세한 정보를 Trace 화일에 기록해 주므로 이 화일을 검사하여 에러의 원인을
찾을 수 있다.
-----
현상 : ORA-0901 invalid CREATE command
원인 : CREATE 뒤에 오는 KeyWord를 식별하지 못한 경우
-----
현상 : ORA-0902 invalid dadatype
원인 : Oracle에서 제공되지 않은 datatype를 사용한 경우
-----
현상 : ORA-0903 invalid table name
원인 : 테이블의 이름이 Oracle object 명명에 대한 필요조건을 만족시키지 못한 경우
-----
현상 : ORA-0904 열명이 부적합합니다.
원인 : 컬럼이 테이블에 존재하지 컬럼을 사용한 경우
-----
현상 : 083147.gold!stmkdjc.22031: LIBTUX_CAT:522: INFO: Default tpsvrdone() function
used
ORA-0904 : invalid column name
ORA-1003 : no statement parsed
원인 : 1.해당 Table에 존재하지 않은 Field를 사용한 경우
2.Host Variable 앞에 ":"를 덧붙지지 않은 경우
3.해당 Table를 변경하고 관련된 프로그램을 컴파일하지 않은 경우
조치 : 1.해당 Table에 Column이 존재하는지 확인
2.Host Variable 앞에 ":"를 덧붙인다.
3.해당 Table에 관련된 프로그램를 컴파일한다.
-----
현상 : ORA-0906 missing left parenthesis
원인 : 왼쪽 괄호를 찾지 못한 경우에 발생
-----
현상 : ORA-0907 missing right parenthesis
원인 : 오른쪽 괄호를 찾지 못한 경우에 발생
-----
현상 : ORA-0910 specified legth too long for its datatype
원인 : 특정 datatype의 길이가 허용 최대 길이를 초과한 경우
-----
현상 : ORA-0911 invalid character
원인 : Oracle이 뮤효 문자라고 간주하는 것을 만날 때 발생한 에러로 실제문제는 없어진 문자때문
-----
현상 : ORA-0913 too many value
원인 : INSERT문에서 지정된 열의 수보다 열 값의 수가 적으면 발생
-----
현상 : ORA-0917 missing comma
원인 : 1.Comma를 기대하고 있는 SQL문에 comma가 없는 경우
2.오른쪽 괄호가 없는 경우에도 발생
-----
현상 : ORA-0918 column ambiguously defined
원인 : 1.둘 이상의 테이블이 한 SQL문에서 참조될 때 발생
2.한개 이상의 지정된 테이블에 존재하는 어떤 열이 해당 테이블로 한정받지 못한 경우
-----
현상 : ORA-0920 invalid relational operator
원인 : 관계 연산자를 식별하지 못한 경우
-----
현상 : ORA-0921 unexpected end of SQL command
원인 : 불완전한 SQL문일 경우에 발생
-----
현상 : ORA-0922 missing or invalid option
원인 : option에 임의의 문자가 삽입됨(예:NOT NULL --> NOT_NULL)
-----
현상 : ORA-0932 inconsistent datatype
원인 : 1.어떤 연산자를 어떤 열에 적용시키려고 하는데 그것의 datatype을 연산자와 함께 사용한 경우
2.ORA-0997 illegal use of LONG datatype을 복귀시킬 가능성
-----
현상 : ORA-00933: SQL command not properly ended
원인:
-----
현상 : ORA-0934 group function is not allowed here
원인 : SQL문의 WHERE구나 GROUP BY구에서 Group function를 사용한 경우
-----
현상 : ORA-0936 missing expression
원인 : 1.Comma 기술 뒤에 열이나 표현식이 존재하지 않은 경우에 발생
2.ORA-0917 missing comma을 복귀시킬 가능성
-----
현상 : ORA-0937 not a single-group group function
원인 : 어떤 SQL문의 선택 list는 어떤 열이 GROUP BY구에서 참조되지 않으면 그열과 Group function를
포함할 수 없다.
-----
현상 : ORA-0938 not enough arguments for function
원인 : SQL문이 불충분한 수의 인수로 함수를 호출한 경우에 발생
-----
현상 : ORA-0942 : table or view does not exist(테이블 또는 뷰가 존재하지 않습니다.)
원인 : Oracle은 테이블이나 뷰가 존재하지만 사용자가 테이블이나 뷰를 위한 오브젝트 특권(Grant)을 부여하지 않음
조치 : Table 생성 및 권한부여
-----
현상 : ORA-0947 not enough values
원인 : INSERT문에서 지정된 열의 수가 열 값의 수보다 클때 발생
-----
현상 : ORA-0979 not GROUP BY expression
원인 : 어떤 query의 선택 list 안의 한 열이 GROUP BY구에 들어있고 다른 열은 들어있지 않은 경우에 발생
-----
현상 : ORA-0997 illegal use of LONG datatype
원인 : 1.어떤 기능들은 datatype이 LONG인 열에서 수행되지 않는다.
2.Long column은 2G까지 지원을 하지만,
SQL*Plus에서 insert into 문장을 이용하여 long column에 넣을 문자열을
single quote(') 안에 기술 시, 2000 characters가 넘으면 ora-1704 에러가 난다.
조치 : 1.TABLE의 COPY는 가능하지 않으므로,LONG COLUMN을 가진 테이블을 COPY하고자 할 때,
32KBytes 이하의 size라면 다음의 PL/SQL을 사용하면 가능하다.
2.PL/SQL을 이용해야 하며, 경우에 따라 Pro*C, SQL*Loader 등을 이용하여 insert해야만 한다.
-----
현상 : ORA-1001 Invalid Cursor
원인 : Typing 에러, 잘못된 메모리 관리 등의 여러가지 원인에 의해서 발생.
조치 : 1.환경에서 조치할 사항
- PRECOMPILE 옵션 가운데 MAXOPENCURSORS 를 늘려준다.
- init<SID>.ora 화일에서 OPEN_CURSORS 파라미터 값을 늘려준다.
- 사용되지 않는 CURSOR는 OPEN 상태로 두지 말고 CLOSE 시켜준다.
- 지금은 거의 사용되지 않지만 ORACLE V6 를 사용한다면 PRECOMPILE 옵션 가운데
AREASIZE를 512K 정도로 크게 늘려주도록 한다. 그리고 init<SID>.ora 에서
CONTEXT_AREA 값도 늘려준다 .
- TRACE FILE을 이용하면 문제의 원인을 찾는데 있어 유용할 때가 있다.
2.그 밖의 경우
- OPEN 되지 않은 CURSOR 에 대해서 작업을 할 때
- 존재하지 않는 OBJECT에 대해서 SQL 명령을 실행할 때
- CURSOR CACHE로부터 삭제된 경우
- CURSOR CACHE로부터 삭제된 또다른 경우
PRECOMPILE 옵션 가운데에서 MAXOPENCUSORS 를 늘려주거나
HOLD_CURSOR=YES, RELEASE_CURSOR=NO 로 설정
- XA/TUXEDO 환경에서 ORA-1001 에러가 발생하는 경우(일부 ORACLE 버젼에서 발생)
-----
현상 : ORA-1002 FETCH OUT OF SEQUENCE IN PRO*C(stop[<fltmsjaud>]:리스너를 중단합니다.
원인 : 1.user가 더이상 유효하지 않은 cursor로부터 fetch를 하려고 하기 때문
2.ORA-1403 등과 같이 NO DATA FOUND를 return하는 fetch작업을 수행할때
3.SELECT FOR UPDATE를 가진 cursor 의 fetch작업내에 commit이 있는 경우
조치 : 3.commit을 fetch loop의 바깥쪽으로 빼거나 select for update문을 사용하지 않아야 한다.
-----
현상 : ORA-1012 Error( not logged on )가 발생
원인 : 1.tpbegin()이 되어 있지 않음
2.PC쪽에서 NOTRAN Mode로 Service를 호출
조치 : 1.Program을 확인한다.
2.flag를 0으로 Setting한다.(TRAN Mode로 Service 호출)
3.Service절에 Default에 AUTOTRAN을 "Y"로 설정하고 해당 Service명을 기술한다.
-----
현상 : ORA-1027 bind variables not allowed for data definition operations
원인 : WHERE에 BIND_VAR 를 이용한 CREATE VIEW 는 불가능
조치 : 이 경우 EXEC SQL CREATE TABLE IMAGE
(EMPNO NUMBER(4) NOT NULL, BITMAP LONG RAW)
END-EXEC.
이 처럼 create 해야 한다.
-----
현상 : ORA-1031 insufficient privileges
원인 : 사용자가 테이블이나 뷰와 연관된 적어도 한 개의 object 특권을 부여받았지만 SQL문에서 지정된
특권을 부여받지 않았을 때 발생
1.ORACLE의 SYSTEM 유저에 POWERBUILDER의 BASE TABLE 5개가 생성이 되어 있지
않은 경우
2.SYSTEM 유저로 접속한 후에도 일반 유저가 접속이 되지 않을 경우
조치 : 1.5개 base table(pbcatcol, pbcattbl, pbcatfmt, pbcatvld, pbcatedt)을
drop한 다음 system 유저로 접속을 하고, 다시 일반 유저로 접속하는 방법.
2.system 유저로 들어가서 5개 base table에 대한 사용 권한을
일반 유저에게 주는 방법.
$sqlplus system/manager

SQL>grant all on pbcatcol to public;
SQL>grant all on pbcatedt to public;
SQL>grant all on pbcatfmt to public;
SQL>grant all on pbcattbl to public;
SQL>grant all on pbcatvld to public;
-----
현상 : ORA-1034, "ORACLE not available"
ORA-7320, "smsget: shmat error when trying to attach sga."
ORA-7429, "smsgsg: shmget() failed to get segment."
원인 : ORACLE DBA 사용자만 데이타베이스를 ACESS할수 있고 다른 사용자는 SQL*PLUS 등을 통하여
CONNECT를 하려고 할때 다음 에러가 발생 할경우
-----
현상 : TPFAILED ......................
sqlca.sqlcode ==> -1036
ORACLE에서 단독으로 실행하면 문제가 발생되지 않고 OUTPUT을 정확하게 출력하지만
TP/M와 함께 실행이 되면 SQL SELECT문을 수행하지 못하고 sqlca.sqlcode ==> -1036의
MESSAGE를 뿌리고 실행을 멈춘다.
원인 : ORACLE에서 Version간의 Segment 정의부분이 다르기 때문
조치 : makefile 혹은 proc.mk file에서
sqlcheck=semantic userid=scrjpcs/scrjpcs를 포함시킨다.
-----
현상 : ORA-1039: insufficient privileges on underlying objects of the view.
원인 : SYS user가 아닌 다른 user로 SQL Analyze에 로그인하여 SQL statement에 대한 explain plan 옵션을 사용할 때 다음과 같은 에러가 발생
조치 : 1.dictionary table/view들을 validate시켜 놓으려면 dba가 read 권한만 SQL Analyze를 수행하는 user에게 grant하면 충분하다.
2.SYS user로서 SQL explaining을 수행하는 것이다.
-----
현상 : ORA-9992 scumnt: failed to open <FILENAME>
ORA-9993 scumnt: failed to lock <FILENAME>
ORA-1102 cannot mount database in exclusive mode
원인 : 서로 독립적인 두개의 instance가 동일한 database file들을 동기화 (synchronisation)없이 access할 수 있기 때문에 database corruption을 유발시킬 수 있었다.
조치 : database의 db_name이 변경되면 각각의 lk<DB_NAME> file을 생성.
-----
현상 : ORA-01118: cannot add any more database files: limit of XXX exceeded
원인 : 데이타 화일의 갯수가 MAXDATAFILES 값에 도달한 경우 발생
조치 : MAXDATAFILES를 늘리기 위해서는 DB를 새로 만들어야 하며 그 이후 버젼을 사용중이라면 콘트롤
화일을 새로 만들어서 MAXDATAFILES를 늘릴 수 있다
-----
현상 : ORA-1157 : cannot identify data file 11 - file not found
ORA-1110 : data file 11 : '/user1/oracle7/dbs/user2.dbf'
원인 : OS 명령으로 DATA FILE 을 삭제한 경우
조치 : DATABASE STARTUP시 STARTUP MOUNT 단계까지 실행한 후, 문제의 데이타 화일을 OFFLINE 시킨다.
데이타베이스를 오픈한다. 단 데이타베이스 오픈이 정상적으로 수행되면 문제가 발생한 데이타
화일을 포함하고 있는 TABLESPACE를 DROP하지 않을 경우에는 DATABASE STARTUP시 항상 데이타
화일의 오픈 단계에서 에러가 발생된다. 따라서, 문제의 데이타 화일의 OFFLINE과 TABLESPACE의
DROP전에 반드시 해당 TABLESPACE를 사용하고 있는 USER의 데이타 백업을 수행해야 한다.

데이타 화일의 OFFLINE과 관련된 명령은 다음과 같다.
SQLDBA를 COMMAND LINE MODE로 기동시킨다.

$ sqldba lmode=y
SQLDBA> CONNECT INTERNAL;
SQLDBA> STARTUP MOUNT;
ORACLE instance started.
Database mounted.
SQLDBA> ALTER DATABASE DATAFILE '/user1/oracle7/dbs/user2.dbf'
OFFLINE DROP;
Statement processed.
SQLDBA> ALTER DATABASE OPEN;
Statement processed.
SQLDBA> DROP TABLESPACE tablespace_name INCLUDING CONTENTS;
Statement
-----
현상 : ORA-01237 cannot extend datafile %s
원인 : O/S 레벨에서는 file size를 1TB 이상 지원한다고 하는데, oracle datafile을 2G 이상으로 resize하려고 한다거나 tablespace에 datafile을 추가하거나 생성할 때, 2G 이상 주면 file size limit에 걸리는 현상 발생
조치 : 화일 시스템에서 large file을 사용하기 위해서는 화일 시스템을 'largefiles' option으로 mount해야 한다.
-----
현상 : ORA-1400 primary key or mandatory(NOT NULL) column is missing or NULL during insert
원인 : 어떤 필수적인 열을 위한 값을 공급하지 않은 경우
-----
현상 : ORA-1401 inserted value too large for column(열에 입력한 값이 너무 큽니다.)
원인 : 문자열을 할당하고자 할때 길이가 최대치를 초과한 경우
-----
현상 : ORA-1403 no dada found
원인 : 사실상 전혀 Error가 아니다.
-----
현상 : ORA-1405 fetched column value is NULL
원인 : ERROR 가 아니고 WARNING MESSAGE 이다.
조치 : dbms=v6 를 PRECOMPILER OPTION 에 추가해준다. dbms=v6 로 SETTING 할경우는 HOST 변수에
NULL 이 RETURN 되더라도 sqlca.sqlcode 는 0 이 된다.
-----
현상 : ORA-1407 cannot update mandatory(NOT NULL) column to NULL
원인 : 필수적인 열의 값을 NULL에 설정한 경우에 발생
-----
현상 : ORA-1408 such column list already indexed
원인 : 이미 동일한 열 List에 기초한 Index를 갖고 있는 Table에서 Index를 작성하고자 하는 경우에 발생
-----
현상 : ORA-1410 invalid ROWID
원인 : 1.적절한 Format으로 ROWID를 상술하지 않은 경우에 발생
2.지정된 ROWID가 존재하지 않은 경우에 발생
-----
현상 : ORA-01438: 지정한 정도를 초과한 값이 열에 지정되었습니다.
원인 : 지정한 자릿수를 초과한 Column이 존재한 경우에 발생
-----
현상 : ORA-01422: exact fetch returns more than requested number of rows
ORA-06512: at "SYS.STANDARD", line 648
ORA-06512: at "BETH.BETH", line 6
ORA-06512: at line 1
원인 : SELECT 문에서 조건에 해당하는 row가 2건 이상
return되었을 때 발생하는 TOO_MANY_ROWS 에러와 동일한 에러이다.
조치 : 확인한 결과 DUAL table에서는 비록 2개의 ROWID를 볼 수는 없지만,
실제 2개의 row가 DUAL table에 존재하는 상황이다.
따라서, 다음 명령을 이용하여 여분의 필요없는 row를 delete해야 한다.
-----
현상 : ORA-1449 column contains NULL values; cannot alter to NOT NULL
원인 : 어떤 열을 필수적인 것으로 변경하고자 하나 적어도 테이블 내의 한 행이 그 열을 위한 NULL값을
가질 때 발생
-----
현상 : ORA-1452 cannot CREATE UNIQUE INDEX; duplicate keys found
원인 : 값이 독특하지 않은 일련의 열에서 독특한 인덱스를 작성한 경우에 발생
-----
현상 : ORA-1453 SET TRANSACTION must be first statement of transaction
원인 : 모종의 다른 SQL문 이후에 SET TRANSACTION문을 기동할 때 발생
-----
현상 : ORA-01458 Invalid length inside variable character string
원인 : DB Table field의 길이와 Host Variable의 길이 차이가 있을때 발생한다.
그러므로 Table field의 길이와 Host Variable의 길이를 비교해 본다. 혹은 Stored
Procedure의 Input Parameter가 Null 값으로 넘겨질 때도 발생한다.
조치 : DB Table field와 Host Variable의 길이를 조정한다.
Stored Procedure의 Input Parameter에 Null값을 0의 값을 채워서 넘긴다.
주의 : Stored Procedure에서 Cursor를 사용할 때
FOR ... LOOP를 사용할 때 주의를 해야한다.
FOR i IN 1..batch_size LOOP
FETCH get_emp
INTO
emp_name( i )
,job( i )
,sql( i )
;

IF get_emp%NOTFOUND THEN -- if no row was found
CLOSE get_emp;
done_fetch := 100; -- indicate all none
EXIT;
ELSE
done_fetch := 900; -- indicate all none
found := found + 1; -- count row
END IF;
END LOOP;
에서 Fetch Array의 0번째에 Data를 저장할 때 문제가 생긴다.
그러므로, emp_name( 0 )이라고 하면 Error를 발생한다.
-----
현상 : ORA-01476: divisor is equal to zero
원인 : Zero값으로 임의의 수를 나누었을때 발생
-----
현상 : ORA-01480: trailing null missing from STR bind value
원인 : 1.해당 Column의 Size 보다 더 큰 값이 들어온 경우에 발생
2.Character Type(CHAR, VARCHAR)의 Host variable인 경우 변수 선언시 Table의 Column size 만큼의 변수길이를 선언한 경우 발생
조치 : 1.해당 Column의 Size와 해당값을 확인
2.Character Type(CHAR, VARCHAR)의 Host variable인 경우 변수 선언시 Table의 Column size에 1를 더해 주어야 한다.
(데이터의 마지막에 NULL 문자를 포함해야 하기 때문에)
-----
현상 : ORA-1481 invalid number format model
원인 : 어떤 숫자 Format Model이 미정의 문자를 포함한 경우에 발생
-----
현상 : ORA-1547 : Failed to allocate extent of size 'num' in tablespace 'TOOLS
원인 : TABLESPACE가 에러에 명시된 ORACLE block 수 만큼의 요청된 EXTENT를 할당할 충분한 FREE
SPACE를 갖고있지 못할 경우에 발생
조치 : 1.해당 TABLESPACE내에서 연속된 영역의 ORACLE block 할당할 수 있도록 데이타 화일을 추가
2.TABLE의 STORAGE PARAMETER에서 INITIAL EXTENT, NEXT EXTENT의 크기를 조정하여 TABLE을
재구축
3.다음의 방법으로는 관련 TABLESPACE를 재구성하는 것
-----
현상 : ORA-1552 (CANNOT USE SYSTEM ROLLBACK SEGMENT FOR NON-SYSTEM TABLESPACE '%S')
원인 : SYSTEM TABLESPACE 이외의 TABLESPACE를 포함한 OPERATION을 위하여 SYSTEM TABLESPACE의
ROLLBACK SEGMENT를 사용할 경우에 발생
조치 : SYSTEM TABLESPACE에 하나 이상의 ROLLBACK SEGMENT를 추가한 다음, 데이타베이스 오브젝트를
생성
-----
현상 : ORA-1555 Snapshot Too Old
원인 : 1.데이타의 변경이 심한 데이타베이스에서 롤백 세그먼트의 갯수와 크기가 작을 경우에 발생
2.롤백 세그먼트가 손상되어 읽을 수 없게 된 경우
3.Fetch Across Commit(테이블에 대하여 Query가 커서를 열고 루프 내에서 데이타를 Fetch
하고 변경하고 커밋하는 과정에서 발생)
4.Delayed Block Clean Out(데이타 블럭이 변경되고 커밋되면 오라클은 롤백세그먼트 헤더에
그 트랜잭션이 커밋되었다고 기록하지만 데이타 블럭을 바로 변경하지는 않는다 (Fast
Commit). 그리고 다음 트랜잭션이 변경된 블럭을 요구할 때야 비로소 변경 시키는것
조치 : 1.커서가 Open된 상태에서는 커밋을 자주하지 않고 롤백 세그먼트 크기를 키워 나가도록
2.커서를 사용하기 전에 Full Table Scan을 해주면 예방이 가능
-----
현상 : ORA-1562(Failed to extend rollback segment(id = %s))
원인 : 1.사용중인 ACTIVE 상태의 ROLLBACK SEGMENT가 다음 EXTENT를 할당하고자 할 경우
2.해당 ROLLBACK SEGMENT에 대하여 발생 가능한 최대 EXTENT 수를 초과할때 발생
조치 : ROLLBACK SEGMENT의 재생성
-----
현상 : ORA-01578: ORACLE data block corrupted (file # 6, block # 3)
ORA-01110: data file 6: '/tmp/ts_corrupt.dbf'
원인 :
조치 : 해당 objects를 drop하고 recreate하여 처리
-----
현상 : ORA-01578
원인 : data block 에 corruption 이 생긴 경우에 발생.
조치 : 1.최선의 해결책은 backup 받아둔 file 을 restore 한 후 recover 작업을 하는 것이다.
2.backup datafile 을 restore 하고 recover 하지 않을 것이라면 우선, 어떤 object 에서 corruption 이 발생하였는지 확인해야 한다.
3.해당 segment 가 non-data dictionary index 라면, 해당 index 를 drop 한 후 재생성한다.
4.해당 segment 가 table 이라면, corruption 이 발생한 block 의 data 는 소실된 것이다.
5.만약 해당 table 에 대한 최근의 export dump file 이 존재한다면, 해당 table 을 drop 한 후 import 함으로써 복구할 수 있다.
6.corruption 이 발생한 non-clustered table 에서 corrupted block 을
access 하지 않고 나머지 data 들을 select 할 수 있도록 ROWID 를 이용할
수 있다.
7.만약 data dictionary 에 속하는 table, index 또는 rollback segment에
corrupted block 이 발생하였다면 Oracle Support 의 지원을 받는다.
8.일반적으로, ORA-1578 은 hardware 의 문제때문에 유발된다. 하지만 만약에
ORA-600[3374] 가 발생한다면 memory 상에서 corruption 이 발생한
경우이다. 이 경우 database 를 restartup 하면 문제가 해결될 수 있다.
-----
현상 : ORA-1591(Pending Transaction의 처리)
원인 : 분산 트랜잭션의 경우 2 phase commit수행 단계중에 fail이 발생하게 되면 관여된 일부 database에서는 rollback 혹은 commit이 되고, 일부는 distributed lock이 걸린 상태로 계속 지속될 수 있다.
이렇게 pending된 transaction에 대해서는 기본적으로 Oracle의 background process인 RECO process가 자동으로 정리하여 주나, 경우에 따라 자동으로 정리가 되지 못하는 상황이 발생
조치 : STEP 1: alert.log file을 check한다.
STEP 2: network 환경을 확인한다.
STEP 3: RECO process가 떠 있는지 확인한다.
STEP 4: DBA_2PC_PENDING을 조회해 본다.
STEP 5: DBA_2PC_NEIGHBORS view를 조회해 본다.
STEP 6: commit point site를 확인한다.
STEP 7: DBA_2PC_PENDING의 MIXED column을 확인한다.
STEP 8: DBA_2PC_PENDING의 STATE column의 값을 확인한다.
STEP 9: 불일치 사항을 파악하고 DBA_2PC_PENDING을 정리한다.

2PC에서 1st phase commit(xa_prepare)이 정상적으로 종료되면 Oracle의 dba_pending_transaction에 해당
Transaction에 대한 정보가 나타난다.

formatid 40
globalid 636861656A750000000000000000000000000000000000
5B5103A6BEC9900000DE8
branchid 0000006600000065

이 상태에서 일정한 시간 내에 2nd phase commit(xa_commit)에 끝나지 않으면 dba_2pc_pending에도 이
Transaction이 나타난다.

local_tran_id 4.24.3026
global_tran_id 40.636861656A750000000000000000000000000000000000
5B5103A6BEC9900000DE8
state prepared
mixed no
advice
tran_comment
fail_time
force_time
retry_time
os_user jun
os_termina
host chaeju
db_user
commit# 5332231

위에서 "일정한 시간"이란 용어를 사용했는데 Oracle의 문서에는 이에 관한 정확한 언급은 없다.
다만, 다른 Transaction에서 해당 레코드를 참조하려고 할 때 이미 lock이 걸려 있으므로 대기하는
시간에 대해서는 init.ora에서 지정하는 distributed_lock_timeout에 대해서만 언급하고 있다. 그런데
oracle 8.1.7에서는 distributed_lock_timeout을 설정하면 obsolete로 나온다.

이 시간 동안에 해당 레코드에 대한 lock이 풀리지 않으면 아래와 같은 에러를 만난다.

ORA-02049: time-out: distributed transaction waiting for lock

위의 에러가 발생한 이후에 이 레코드를 참조하려고 하면 1591 에러가 나타난다.

ORA-01591: lock held by in-doubt distributed transaction '4.24.3026'

보는 것처럼 ORA-01591 에러 메시지에는 local_tran_id가 있다. 이를 이용하여 dba_2pc_pending에서
global_tran_id를 조회하고, 이 데이터는 dba_pending_transaction의 formatid와 globalid로 이루어져
있으므로 이를 이용하여 dba_pending_transaction에서 branchid도 얻을 수 있다.

이들로 부타 아래와 같이 XID를 얻을 수 있다.

xid.formatid = dba_pending_transactions.formatid
xid.gtrid_length = len(dba_pending_transactions.globalid)
xid.bqual_length = len(dba_pending_transactions.branchid)
xid.data = dba_pending_transactions.globalid + dba_pending_transactions.branchid

여기까지는 Oracle로 부터 XID를 얻는 과정이다.

tpconvert(str, (char *)&xid, TPTOSTRING | TPCONVXID)를 이용하여 XID의 string 표현을 얻을 수 있고
이값을 이용하여 .TMIB 서비스를 호출하면 아래와 같은 정보를 얻을 수 있다.

TA_ERROR 0
TA_MORE 0
TA_OCCURS 1
TA_GRPCOUNT 2
TA_GRPINDEX 0
TA_GRPNO 102
TA_GRPNO 101
TA_TIMEOUT 9
TA_COORDGRPNO 102
TA_CLASS T_TRANSACTION
TA_STATE READY
TA_COORDLMID SITE1
TA_GSTATE READY
TA_GSTATE READY
TA_TPTRANID 0x0 0x3a6bec99 0xde8 0x28 0x0 0x0
TA_XID 0x0 0x3a6bec99 0xde8 0x28 0x66
TA_COORDSRVGRP APPGRP2
TA_LMID SITE1
TA_SRVGRP APPGRP2
TA_SRVGRP APPGRP1

위의 경우에는 아직 Tuxedo가 transaction에 대한 정보를 가지고 있기 때문에 별다른 조치가 필요없다.
하지만, Oracle의 dba_2pc_pending에는 있는데 Tuxedo에서 해당 Transaction에 대한 정보를 가지고
있지 않은 경우에는 Oracle에서 rollback force나 commit force를 이용하여 pending transaction을
정리해 주어야만 lock이 풀린다.
-----
현상 : ORA-1628, 00000, "max # extents (%s) reached for rollback segment %s"
ORA-1630, 00000, "max # extents (%s) reached in temp segment in tablespace %s"
ORA-1631, 00000, "max # extents (%s) reached in table %s.%s"
ORA-1632, 00000, "max # extents (%s) reached in index %s.%s"
원인 : 오브젝트의 익스텐트가 MAX # 에 도달 했기 때문에 발생되며 오브젝트의 MAXEXTENTS는
STORAGE 의 MAXEXTENTS 파라미터에 의해 결정
조치 : ALTER TABLE .. STORAGE (MAXEXTENTS n)를 사용하여 최대 MAXEXTENTS 값보다 작은 수로
MAXEXTENTS를 늘려준다.
-----
현상 : ORA-1652, 00000, "unable to extend temp segment by 6144 in tablespace "VESSEL"
원인 : 테이블이나 인덱스 등을 만들 때 자신의 TEMP TABLESPACE 가 아닌 곳에서 ORA-1652(temp
tablespace가 부족함) 에러가 발생
조치 : 에러메시지에서 보여주는 대로 해당 테이블스페이스에 Temporary Segment 가 생성될 만한
연속된 공간을 마련하여 주는 것
-----
현상 : ORA-1653
원인 : 특정 tablespace 에 space 가 부족해서 table의 extent가 일어나지 못해서 발생
조치 : user의 default tablespace 를 변환한 후, 이 default tablespace
안에 create table을 다시 한 후 sql*loader 를 실행한다
-----
현상 : ORA-1654 ERROR ON INDEX SEGMENT
원인 : tablespace가 적어 extent 영역을 할당할 수 없어서 발생
조치 : datafile을 추가 시 이전값 이상의 사이즈를 추가해야 함.
-----
현상 : ORA-1722 invalid number
원인 : 수치값이 불법일 경우
-----
현상 : ORA-1747 열명을 올바르게 지정해 주십시요.
원인 : 열명이 다른 경우(SQL문장 기술시 첫번째 열명 앞에 Comma를 삽입한 경우)
-----
현상 : tb_ra315 insert error ORA-02291: integrity constraint (SCRJAPPR.A315_E007_FK)
violated - parent ....
원인 : Table과 관련된 Reference 관계로 parent table의 data가 없는 관계로 data 입력불가
조치 : Reference 관계를 끈어주든지 아니면 관계된 Table에 Data를 모두 입력하는 방법.
-----
현상 : ORA-02303: cannot drop or replace a type with type or table dependents
원인 : Type이나 table의 dependency가 있는 type을 drop하거나 replace하고자 할 때 발생.
조치 : SQL Reference guide에 의하면 DROP TYPE FORCE 옵션은 recommend하지 않는다.
왜냐하면 이 옵션을 쓰게 되면 복구가 불가능하고 dependency가 있던 table들은
access하지 못하는 결과를 초래한다.
-----
현상 : ORA-03113: end-of-file on communication channel
원인 : 1.이전에 작동했던 해당 instance의 shared memory segment들이 아직 system에 남아있어서 발생.
2.서버의 Oracle 쉐도 프로세스가 예기치 않게 종료된 경우 발생.
3.SQL*NET 드라이버가 Unix의 ORACLE 실행 파일과 연결되지 않아 발생한 경우.
4.서버쪽의 기계 손상이나 네트워크 고장인 경우.
5.네트워크에서 두 서버가 같은 노드 이름을 가질 때에도 이 오류가 발생.
6.모든 원인은 결국 클라이언트가 서버로부터 어떤 정보를 읽으러 갔다가 거기서 더 이상 연결이 없음을 발견했다는 뜻임.
7.Oracle XA를 사용하는 AP 서버 혹은 TMS 서버가 떠 있는 상황에서 연결된 DB를 재기동 시키거나 혹은 다른 문제로 인해서 데이터베이스와의 연결이 끊어진 경우에 발생
조치 : shared memory를 check하여 oracle이 소유하고 있는 shared memory segment를 삭제하여 문제를 해결.
자동으로 재접속을 하기 위해서는 TUXWA4ORACLE(WorkAround For Oracle) 환경변수를 1로 설정하면 해당 서버가 오라클에 접근하여 3113 에러가 발생하는 순간에 재접속이 이루어진다.
(XA 서버에만 해당되며 Non-XA 서버의 경우는 사용자 coding에 의해서 동일한 기능을 구현할 수 있다.)
-----
현상 : ORA-3114 Error( not connected to ORACLE )가 발생
원인 : ORACLE이 Shutdown 되었다.
조치 : ORACLE이 떠 있는지 확인하고, Server를 새로 기동한다.
-----
현상 : ORA-3121
원인 : SQL*NET V2를 통해 연결하려 할 때 연결 스트링에 'tns:'net접두어를 사용하지 않은 경우
조치 : 구버전인 SQL*NET V1의 net 접두어 (SQL*Net TCP/IP에 대한 "t:"등)를 사용하지 않도록 주의
하십시요.
-----
현상 : ORA-4068 existing state of packages%s%s%s has been discarded
원인 : 응용프로그램 실행 중에 사용하고 있는 Stored Procedure를 Compile하는 경우에 발생
조치 : 응용프로그램을 재기동시킨다.
-----
현상 : ORA-4091 table name is mutating, trigger/function may not see it
원인 : DataBase Trigger가 Transaction 내에서 변경된 테이블에 대하여 Query를 기동할 때 발생
조치 : 1.PL/SQL table을 생성한다.
2.BEFORE STATEMENT trigger를 생성한다.
3.AFTER ROW trigger를 생성한다.
4.AFTER STATEMENT trigger를 생성한다.
5.data insert 및 확인
-----
현상 : ORA-4092 cannot COMMIT or ROLLBACK in a trigger
원인 : 1.Trigger가 COMMIT or ROLLBACK을 실행하고자 할 때 발생
2.Trigger가 내장 프로시저, COMMIT나 ROLLBACK될 함수, 패캐지 서브프로그램을 호출한 경우
-----
현상 : ORA-6106,ORA-6120 NETTCP : socket creation failure
원인 : WIN V1.X용 SQL*NET TCP/IP는 SQLTCP.DLL과 SQLTCP1.DLL들은 ORACLE용 연결 스트링이 TCP/IP
프로토콜 스트링으로 변환되면 OCI DLL에 의해 작업 진행중에 올려집니다. ORACLE INTERFACE
DLL은 SQLTCP.DLL을 먼저 올리려고 합니다. 이것이 실패하면 DOS TSR 버전의 드라이버를
찾습니다. 두 가지 모두 실패하면 ORA-3121 메세지가 나옵니다.
-----
현상 : ORA-6108
원인 : 1.부적절한 machine, 또는 machine는 맞지만 틀린 포트를 지정할 때 발생
2.TCP/IP 레이어는 모든 연결 요구를 Listener의 소켓 큐에 넣을 수 없을 경우 발생
3.네트워크가 아주 혼잡하고 호스트에 도달하려는 중에 시간이 종료할 경우
조치 : 1.클라이언트에서 호스트 Machine에 대해 ping을 실행하십시요. 대부분의 PC TCP/IP업체는
"ping" 유틸리티를 제공합니다. 클라이언트 Machine에서 다음을 입력하십시요
ping <host IP address>
이 방법으로 잘 되지 않으면 아마도 호스트 machine이 down된 것입니다. IP 주소를 사용
하여 호스트에 대해 ping을 성공적으로 실행할 수 없으면, 서버의 호스트 이름을 사용하여
ping을 실행해 보십시요.
ping <hostname>
호스트 이름을 사용하여 ping을 실할 수 없으면 TCP/IP 구성을 점검하십시요. 호스트 이름
을 가지고 ping을 실행할 수 없으면, 연결 스트링에 호스트 이름을 사용하여 SQL*NET와
연결할 수 없습니다.
2.SQL*NET TCP/IP Listener가 해당 서버에서 실행중인지 점검하십시요. 서버의 UNIX프롬프트
에서 다음을 입력하면 됩니다.
ps -al|grep "orasrv"
이 때 최소한 한 행이 표시되어야 합니다. 그렇지 않으면 UNIX 프롬프트에서 "orasrv"
또는 "tcpctl start"를 입력하여 수화자를 띄우십시요. SYSADMIN 특권을 가지고 해당 기계
에 로그인해야 합니다.
3.서버쪽에서 루프백을 할 수 있는 지, 다시 말해서 PC 클라이언트에서 지정한 것과 같은
연결 스트링을 사용하여 서버의 툴을 연결할 수 있는지 점검하십시요. 예를 들면, 서버의
SQLPLUS 또는 SQLDBA를 호출하고 서버의 SQLPLUS 또는 SQLDBA 프롬프트에서 다음을 입력
하십시요.
CONNECT USERNAME/PASSWORD@t:<servername>/<portnum>:<sid>
4.루프백 성사되면 호스트 서버의 ORASRV 포트 번호를 확인하십시요. (대부분의 기계에서
SERVICE 파일은 /etc 디렉토리에 있습니다.) 또한 "tcpctl" 유틸리티를 사용하면 대부분의
UNIX 기계에서 ORACLE Listener를 시작하거나 멈출 수 있습니다. "tcpctl stop"로 Listener
를 종료하십시요. "tcpctl start"으로 다시 시작하십시요. 이때 시작 포트에 관한 정보가
표시됩니다.
5.이것이 성공하면 포트를 지정하지 말고 포트를 연결해 보십시요.
t:<servername>:<sid>
연결되지 않으면 클라이언트에서 SERVICE 파일을 정확하게 설정하 않았기 때문입니다.
a)WINDOWS\WIN.INI를 점검하여 [Oracle] 부분의 ORA_CONFIG 매개 변수가 어떤 구성 파일을
지시하고 는지 알아보십시요. 이폴트는 다음과 같습니다.
[Oracle]
ORA_CONFIG=C:\WINDOWS\ORACLE.INI
b)ORACLE.INI 파일을 보고 TCP_SERVICES_FILE 매개변수가 설정되었고 SERVICES 파일을 지시
하고 있는 지 확인하십시요.
c)SERVICES 파일을 보고 다음 항목이 있는 지 확인하십시요.
orasrv 1525/tcp oracle
6.또한 서버가 SQL*NET V2가 아니라 SQL*NET V1을 실행중인지 확인하십시요.
7.결 스트링의 재시도 매개변수를 증가시켜 보십시요. 재시도 횟수를 지정하는 구문은 다음과
같습니다.
t:host[/service]:SID[,buffer-size][:conn-retries]
conn-retries의 디폴트는 1입니다.
8.VAX에 연결할 경우에는 VAX config.ora 파일에 다음행이 있는지 확인하십시요.
SQLNET USERNAMEMAP*=*
이것은 VAX account가 없는 PC가 디폴트 사용자 account을 사용하여 연결 할 수 있게 해
줍니다.
-----
현상 : ORA-6110 "NETTCP: message send failure"
원인 : Windows 클라이언트의 TCP/IP사이에 버퍼 조정문제가 있을 때 발생
조치 : 1.버퍼 크기를 연결 스트링에 포함시켜 일정한 크기로 고정하는 것
t:<servername>:<sid>,<buffersize>
연결 스트링에 버퍼 크기를 포함시킨 후에도 여전히 ORA-6110이 발생하면 더 작은 값을
사용해 보십시요. WINDOWS용 SQL*NET TCP/IP의 기본 버퍼 크기는 4096입니다. 이것을
1024로 사용하면 대개 ORA-6110에러가 없어집니다.
2.서버쪽
1)서버에서 루프백을 수행할 수 있습니까? 다시 말해서 PC 클라이언트에서 지정한 것과
같은 연결 스트링을 사용하여 서버의 툴을 연결할 수 있습니까? 예를 들어 서버에서
SQLPLUS 또는 SQLDBA를 호출하고 에러가 없어집니다.
CONNECT USERNAME/PASSWORD@t:<servername><portnum>:<sid>
루프백을 실행하면 실제 문제를 더 잘 보여주는 다른 에러가 나타나는 수도 있습니다.
2)ORA-6110은 Oracle실행 파일에 사용 권한이 정확하게 설정 되어 있지 않으면 Unix 서버에
연결할 때도 발생할 수 있습니다. Oracle과 orasrv의 사용권한은 다음과 같이 설정되어야
합니다.
>chmod 6755 oracle
>chmod 6755 orasrv
이 때, Permission는 다음과 같이 설정됩니다.
-rwsr-xr-x 1 oracle dba ...size ...date oracle
-rwsr-xr-x 1 root dba ...size ...date oracle

3)ORA-6110과 틀린 네트워크 주소
TCP/IP 네트워크에서 중복 IP주소가 살아 있으면 ORA6110이 발생할 수 있습니다. 네트
워크의 모든 IP주소가 고유의 것인지 확인하십시요.
-----
현상 : ORA-6122 "NETTCP: setup failure
원인 : SQL*NET 구성이 적절하게 설정되지 않은 상태에서 WINDOWS용 SQL*NET TCP/IP를 가지고 연결
하려 할 때 발생
조치 : 1.WINDOWS\WIN.INI를 조사해 보십시요. ORA_CONFIG 매개 변수를 정의하는 ORACLE 부분이
있어야 합니다
[Oracle]
ORA_CONFIG=C:\WINDOWS\ORACLE.INI
2.ORACLE.INI(또는 ORA_CONFIG 매개변수가 지시하는 파일)을 보십시요. ORACLE_HOME이
WINDOWS용 SQL*NET TCP/IP와 다른 Oracle Windows 응용 프로그램이 설 된 디렉토리를
지시하는 지 확인하십시요. 디폴트는 다음과 같습니다.
ORACLE_HOME=\ORAWIN
3.또한 ORACLE.INI에 TCP_VENDOR를 정확하게 설정했는지도 확인하십시요.
4.경로에 C:\ORAWIN\BIN(또한 ORACLE_HOME을 설정한 BIN 디렉토리)이 있는지 확인하십시요.
DOS프롬프트에서 SET을 입력하고 <return>을 누르면 됩니다. 이명령은 경로를 보여줍니다.
5.ORAWIN\BIN 디렉토리에 SQLTCP.DLL과 SQLTCP1.DLL이 모두 있는지 확인하십시요.
6.경로의 다른 어떤 디렉토리에도 SQLTCP.DLL이 없는 것을 확인하십시요.
7.ORAWIN\BIN 디렉토리와 경로의 다른 디렉토리에 MSOCKLIB.DLL이 있는 지 확인하십시요.
또한 파일의 두 복사본을 가지고 있지 않도록 하십시요. 복사본이 둘일 경우, 이전 복사본
의 이름을 바 면 문제가 줄어들 수 있습니다.
8.WINDOWS 디렉토리에 VSL.INI 파일이 있는지 확인하십시요. 만약 없으면 ORACLE INSTALLER
를 통해 SQL*NET를 다시 입력하십시요.
-----
현상 : ORA-6136, 00000, "NETTCP: error during connection handshake"
원인 : 1.Client and Server 환경에서 간혹 SQL*NET으로 Server에 접속하려고 할 경우
2.Unix Server에서 $tcpctl stop 으로 orasrv의 Process를 정지시키려고 해도 아무런 반응
없이 Holding되는 경우가 발생
조치 : 1.TCPCTL Utility를 이용하여 다음의 Option을 부여하여 Start하는 방법.
$tcpctl start listen=30 timeout=30 forkon listen=<queue size>이며, 청취자 열의
크기를 지정.
timeout=<seconds>이며, 지정된 시간에 orasrv와의 응답 확인 시간을 나타냄.
forkon SQL*net이 orasrv process에 접근하는 방법을 나타냄.
System에 따라서 forkon option이 적용 않되는 경우도 있음.
2.Client에서 접속을 하여 사용 다가 비정상 종료(Session이 맺어진 상태에서 Client의
Power Off)를 하여 Server에 Processor가 남아 있고, orasrv를 통해 접속할 수 있는
Session의 수가 점점 줄어들 경우가 있는 데 이러한 경우에는 orasrv를(tcpctl stop or
UNIX kill command를 이용)강제로 종료 시고 다음과 같이 Start 시켜 주십시오.

#nohup tcpctl start ( Client의 비정상 종료가 Orasrv에는 영향을 미치지 않음)
또는
#orasrv (ORACLE_HOME\bin directory에서 직접 orasrv processor를 띄운다)
-----
현상 : ORA-06502 : PL/SQL : 값(수치) 오류입니다.
원인 : DB Column과 Host variableㅇ의 길이가 맞지 않은 경우.
조치 : DB Column과 Host variableㅇ의 길이를 확인하고 길이를 동일하게 한다.
-----
현상 : ORA-06533: Subscript beyond count
원인 : VARRAY는 default 로 3개의 element 이상을 가져 올수 없기 때문.
조치 : EXTEND method를 이용하여 해결할 수 있다.
-----
현상 : ORA-06571
원인 : SQL문 안에서 Stored function을 call하여 사용하는 경우 발생.
조치 : 기본적으로 stored function이나 procedure, package에서의
DML 문장의 사용은 보장이 되는 기능이나, sql list에서의 stored function의
사용은 몇 가지 제약 조건을 가지고 수행이 가능합니다.
-----
현상 : ORA-1119: error in creating database file
ORA-7515: sfccf UIC GROUP <= MAXSYSGROUP - file operations not allowed
원인 : VMS에서만 발생하는 에러로 DATAFILE을 생성하려는 Directory의 Owner가 DBA user가 아닐때 발생.
조치 : Datafile을 생성하려는 Directory의 Owner를 Oracle DBA user로 변경시켜 주어야 한다.
-----
현상 : ORA-9241, ORA-9301
원인 : 개발툴이 해당 툴 또는 SQL*NET에 필요한 메세지 화일을 찾을 수 없을 때 발생
조치 : ORACLE.INI 파일에 LOCAL = <V2 service name>을 추가한다. 만일 ORACLE.INI 파일에 LOCAL
파라미터를 추가한 후에도 계속 ora-9301 에러가 계속 발생한다면 autoexec.bat 파일에 SET
CONFIG = <PATH> \ORACLE.INI를 추가한다.
[주의 1]CONFIG가 ORACLE.INI를 지시하도록 설정하면 나중에 다시 설치할 문제가 발생할 수
있다. 그럴 때는 AUTOEXEC.BAT 에서 SET CONFIG 행을 삭제하고 다시 Booting 한후
설치를 시작한다.
[주의 2]MS ACCESS를 이용하여 ORACLE의 데이타를 질의할 경우는 환경변수를 다음과 같이
설정한다.
SET CONFIG_FILES = <path> \ORACLE.INI
[주의 3]SET 다음의 CONFIG 나 CONFIG_FILES 은 반드시 대문자 이어야 한다.
-----
현상 : ORA-9352
원인 : nt 에서 service 의 problem 발생.
조치 : 1.background services and processes 를 띄우기
dos>oradim80 -startup -sid SID -starttype srvc,inst -usrpwd password -pfile filename
2.여러 개의 instance 를 띄우고자 하는 경우
- ORACLE_SID 를 setting 한다.
c:\> set oracle_sid =sid
- server manager 실행
c:\>svrmgr30
svrmgr>connect internal/passwd
-----
현상 : ORA-12004/ORA-12034
원인 : master table의 snapshot log가 있는 table에 대해서, snapshot이 추가로
생성되고 나면 snapshot을 생성하기 시작한 시간과, 기존의 snapshot이 log를
refresh해간 시간을 비교하여 새로운 snapshot 생성시작 시간이 더 빠르면
ora-12004가 발생
조치 : 생성하고자 하는 snapshot에 대한 master table의 다른 snapshot들을 refresh하지 못하도록 하거나, refresh하지 않는 시간에 새로운 snapshot을 생성하여야 한다.
refresh 못하도록 막는 방법으로는 일시적으로 snapshot job을 broken시킨 후 snapshot이 생성된 후 다시 broken을 false로 하면 된다.
-----
현상 : ORA-12154
원인 : tnsnames.ora 파일의 Alias처럼 정의된 Connect String으로 사용하는 db_alias를 찾지 못할 경우 발생
-----
현상 : TNS-12203 "TNS:unable to connect to destination"
원인 : 1.WINDOWS용 TCP/IP 어댑터를 설치하지 않은 상태에서 연결하려 할
2.TNS-12203 에러는 WINDOWS용 ORACLE SQL*NET소프트웨어가 ORACLE 홈 디 렉토리를 찾을 수
없다는 의미일 수 있습니다.
3.TNSNAMES.ORA가 ORACLE 홈 디렉토리 아래의 NETWORK\ADMIN에 있는지 확인하십시요.
4.서버쪽에서 실행중인 SQL*NET V2 TCP/IP Listener가 없어도 TNS-12203이 발생
5.연결할 SERVICES 이름에 대해 CONNECT DESCRIPTOR에 정확한 ADDRESS 매개변수를 지정했는지
확인하십시요.
6.JSB VSL 소켓이 초기화되지 않으면 TNS-12203 이 발생할 수 있습니다.
7.TNS-12203에 이어 실제 문제가 무엇인지 더 자세하게 나타내 주는 또 다른 에러가 발생할 수
있습니다.
조치 : 1.SQL*NET TCP/IP V2는 SQL*NET V2와 V2 TCP/IP 어댑터 등 두가지 제품으로 구성됩니다.
이들은 별도의 두 키트로 되어 있는데, 반드시 두 키트를 모두 설치해야 합니다.
2.WIN.INI파일의 ORACLE 부분에 다음 항목이 있는지 확인하십시요.
[ORACLE]
ORA_CONFIG=C:\WINDOWS\ORACLE.INI
WINDOWS디렉토리가 C:\WINDOWS가 아니면, 위 행의 C:\WINDOWS 부분을 그 이름으로 바꾸십시요
그런 다음, ORACLE 소프트웨어를 다시 설치하십시요. ORACLE.INI 파일이 있으면 ORACLE.INI
파일에 다음 행이 있는지 확인하십시요.
ORACLE_HOME=C:\ORAWIN
ORACLE 홈 디렉토리가 C:\ORAWIN이 아니면 위 행의 C:\ORAWIN 부분을 이름으로 바꾸십시요.
3.ORACLE 홈 디렉토리는 ORACLE.INI(또는 WIN.INI의 ORA_CONFIG매개변수가 지시하는 파일)의
ORACLE_HOME 에 의해 정의됩니다.
4.서버쪽에서 실행중인 SQL*NET V2가 있는지 확인하십시요. 서버쪽에서 Listener Control 유틸
리티(LSNRCTL)를 사용하면 서버의 V2 Listener가 실행중인지 확인할 수 있습니다. 서버에서
"LSNRCTL STATUS"명령을 실행하십시요. Listener Control이 유틸리티 대해서는 SQL*NET
Administrator's Guide를 참조하십시요.
5.정확한 ADDRESS 매개변수를 사용중인지 확인하는 방법은, WINDOWS 클라이언트에서 사용 할 것
과 같은 ADDRESS 매개 변수를 가진 TNSNAMES.ORA를 사용하여 서버에서 루프백을 해 보는 것
입니다. 루프백을 수행한다는 것은 데이타베이스와 같은 기계에서 SQL*DBA 등을 호출하고
연결 스트링을 지정함으로써 SQL*NET V2를 통해 연결한다는 뜻입니다.
6.문제를 해결하려면 다음 사항을 점검하여 JSB VSL 레이어가 정확하게 초기화되었는지 확인
하십시요.
1)ORACLE.INI 파일(또는 WIN.INI의 ORA_CONFIG 매개변수가 지시하는 파일)의 업체키 매개
변수 TCP_VENDOR가 정확하게 설정되었는 지 확인하십시요
2)ORACLE_HOME\BIN 디렉토리에 MSOCKLIB.DLL이 있는지 확인하십시요.
3)ORACLE_HOME\BIN 디렉토리에 선택된 JSB 업체 특유의 DLL이 있는지, 또는그 JSB 업체 특유
의 TSR 파일이 실행되는 지 확인하십시요.
4)WINDOWS 홈 디렉토리에 VSL.INI 파일이 있는 지 확인하십시요.
7.화면에서 다른 에러가 보이지 않으면 ORACLE_HOME\NETWORK\LOG 디렉토리의 SQLNET.LOG 파일을
점검하십시요.
-----
현상 : TNS-12533

Posted by 1010
02.Oracle2009. 6. 4. 18:24
반응형

Keep pool로 바꾸는 방법

 SQL> show parameter keep

NAME                                    TYPE        VALUE
-----------------------------------------------------
buffer_pool_keep                     string
control_file_record_keep_time   integer          7
db_keep_cache_size               big integer     0
SQL> alter system set db_keep_cache_size=4M          <--- 에러가 날 경우

System altered.

SQL> show parameter keep

NAME                                    TYPE           VALUE
--------------------------------------------------------
buffer_pool_keep                     string
control_file_record_keep_time   integer           7
db_keep_cache_size               big integer     4M
<에러 해결>

SQL> show parameter sga_target

NAME                                 TYPE           VALUE
------------------------------------------------------
sga_target                           big integer    272M
SQL> show parameter sga_target

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
sga_target                           big integer 272M
SQL> alter system set db_keep_cache_size=4M scope=both


용량 확인

SQL> show parameter size

NAME                                 TYPE        VALUE
--------------------------------------------------------
bitmap_merge_area_size            integer     1048576
create_bitmap_area_size            integer     8388608
db_16k_cache_size                    big integer 0
db_2k_cache_size                      big integer 0
db_32k_cache_size                    big integer 0
db_4k_cache_size                      big integer 0
db_8k_cache_size                      big integer 0
db_block_size                            integer     8192
db_cache_size                           big integer 0
db_keep_cache_size                   big integer 4M
db_recovery_file_dest_size           big integer 2G

db_recycle_cache_size                big integer 0
global_context_pool_size              String
hash_area_size                           integer     131072
java_max_sessionspace_size       integer     0
java_pool_size                            big integer 0
large_pool_size                           big integer 0
max_dump_file_size                    string      UNLIMITED
object_cache_max_size_percent   integer     10
object_cache_optimal_size           integer     102400
olap_page_pool_size                   big integer 0
parallel_execution_message_size integer     2148

sga_max_size                             big integer 272M
shared_pool_reserved_size           big integer 4613734
shared_pool_size                         big integer 0
sort_area_retained_size                 integer     0
sort_area_size                             integer     65536
streams_pool_size                       big integer 0
workarea_size_policy                   string      AUTO

redolog 버퍼용량 확인

SQL> show parameter log


ASMM Disable 만드는 질의

SQL> alter system set sga_target=0 scope=both

SQL> alter system set java_pool_size=0 scope=both

SQL> alter system set large_pool_size=0 scope=both
SQL> alter system set shared_pool_size=0 scope=both

SQL> alter system set stream_pool_size=0 scope=both


버퍼사이즈 계산

SQL> select pool,sum(bytes)/1024/1024 from v$sgastat group by pool;

POOL         SUM(BYTES)/1024/1024
----------------------------------
                           175.998459      <===기타 keep(4M), sga 와 상관없는거 다빼면 버퍼사이즈
java pool                       4
shared pool            84.0056801
large pool                      4


SQL> show parameter sga_target

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
sga_target                           big integer 272M
SQL> select name,value from v$parameter where name like '%size'

NAME                                          VALUE
-------------------------------------------------------------------------------
sga_max_size                              285212672

shared_pool_size                          92274688

large_pool_size                              4194304

java_pool_size                                 4194304

streams_pool_size                                 0

shared_pool_reserved_size                  4613734

java_max_sessionspace_size                  0

db_block_size                                          8192

db_cache_size                                    176160768

db_2k_cache_size                                       0

db_4k_cache_size                                 0

db_8k_cache_size                                 0

db_16k_cache_size                                 0

db_32k_cache_size                                 0

db_keep_cache_size                           4194304

db_recycle_cache_size                              0

db_recovery_file_dest_size                  2147483648

global_context_pool_size

 create_bitmap_area_size                     8388608

bitmap_merge_area_size                     1048576

parallel_execution_message_size               2148

hash_area_size                                 131072

max_dump_file_size                        UNLIMITED

object_cache_optimal_size                  102400

sort_area_size                                     65536

sort_area_retained_size                           0

olap_page_pool_size                                0


9장 자동화된 툴


Dictionary Views

SQL> select table_name, num_rows from dba_tables where owner='SCOTT'

TABLE_NAME                       NUM_ROWS
--------------------------------------------
DEPT
EMP
BONUS
SALGRADE

EM-Admin-Advisor central

SQL> select view_name from dba_views where view_name like '%ADVICE'
VIEW_NAME
------------------------------
V_$PGA_TARGET_ADVICE
V_$MTTR_TARGET_ADVICE
V_$PX_BUFFER_ADVICE
V_$DB_CACHE_ADVICE
V_$SGA_TARGET_ADVICE
V_$SHARED_POOL_ADVICE
V_$JAVA_POOL_ADVICE
V_$STREAMS_POOL_ADVICE
GV_$PGA_TARGET_ADVICE
GV_$MTTR_TARGET_ADVICE
GV_$PX_BUFFER_ADVICE

GV_$DB_CACHE_ADVICE
GV_$SGA_TARGET_ADVICE
GV_$SHARED_POOL_ADVICE
GV_$JAVA_POOL_ADVICE
GV_$STREAMS_POOL_ADVICE
DBA_HIST_DB_CACHE_ADVICE
DBA_HIST_SHARED_POOL_ADVICE
DBA_HIST_STREAMS_POOL_ADVICE
DBA_HIST_PGA_TARGET_ADVICE
DBA_HIST_SGA_TARGET_ADVICE
DBA_HIST_JAVA_POOL_ADVICE

DBA_HIST_MTTR_TARGET_ADVICE

23 rows selected.


Asynchronius와  synchronius 장단점 비교

 Commit 장점 단점
 Asynchronius  속도가 빠름  신뢰도 떨어짐(data lose의 가능성), 배치잡할때
 synchronius  안정성이 높음  Transaction 많을때 느려짐, 일반 사용

Posted by 1010
02.Oracle2009. 6. 4. 18:14
반응형

1. 오라클 RDBMS의 구조(1)[시스템 글로벌 영역]


http://www.dbcore.net/~corenet/education/speciallec/admin/chap2-1.html

 http://www.dbcore.net/~corenet/education/speciallec/admin/chap2-2.html

 

 

1.1 시스템 글로벌 영역(SGA)


** SGA란? **


- SGA는 간단하게 오라클 서버 메모리 영역이라고 할 수 있습니다.


- SGA는 Oracle의 인스턴스에 대한 데이터와 제어 정보를 가지는 공유 메모리 영역의 집합 입니다


- 사용 목적에 따라 오라클 파라미터 파일(init.ora)의 조정으로 SGA의 각 부분의 크기를 조절 할 수 있습니다.

(initSID.ora 파일을 열어 보시면 large_pool_size=8388608, shared_pool_size=50331648 이렇게 사이즈가 지정되어 있습니다.)


- Oracle9i부터 오라클 서버의 종료 없이 SGA의 구성을 SGA_MAX_SIZE 파라미터 값 범위 내에서만 각각의 크기를 동적으로 변경 가능 합니다.


- Oracle 서버를 동시에 사용하고 있는 사용자는 시스템 글로벌 영역의 데이타를 공유 합니다.


- 전체 시스템 글로벌 영역을 실제 메모리 크기가 허용하는 범위에서 가장 크게 잡으면 디스크I/O를 줄이고 메모리에 가능한 많은 데이터를 저장할 수 있으므로 최적의 성능을 낼 수 있습니다.


- SGA는 공유 풀(Shared Pool), 데이터베이스 버퍼캐쉬(DataBase Buffer Cache), 리두로그 버퍼(Redo Log Buffer)이 세가지와 Large Poll과 Java Pool로 구성되어 있습니다.


SGA-bluegury2.jpg


                                                                                                                                   

** 공유 풀(Shared Pool) **


- Shared Pool은 Library Cache와 데이터 사전 캐쉬(Data Dictionary Cache)로 구성되어 있습니다.


- Shared Pool은 하나의 데이터베이스에 행해지는 모든 SQL문을 처리하기 위하여 사용 됩니다.


- Shared Pool은 문장을 실행하기 위해 그 문장과 관련된 실행 계획과 구문분석 정보가 들어 있습니다.


- Shared Pool의 사이즈는 SHARED_POOL_SIZE 파라미터 값으로 결정 합니다.


1) Library Cache

- 라이브러리 캐쉬는 가장 최근에 사용된 SQL 문장의 명령문과, 구문 분석 트리, 실행계획 정보를 가지고 있습니다.

- Shared SQL과 Shared PL/SQL 영역으로 구분되어 있습니다.

- Shared SQL 영역 : SQL문장에 대한 실행계획과 파싱 트리를 저장하고 공유 합니다.

    동일한 문장이 다음번에 실행되면 Shared SQL 영역에 저장되어 있는 실행계획과 파싱 트리를

    그대로 이용하기 때문에 SQL 문장의 처리 속도는 향상 됩니다.

- Shared PL/SQL 영역 : 가장 최근에 실행한 PL/SQL 문장을 저장하고 공유 합니다.

     파싱 및 컴파일 된 프로그램 및 프로시져(함수, 패키지, 트리거)가 저장 됩니다.


2) Data Dictionary Cache

- 테이블, 컬럼, 사용자 이름, 사용 권한 같은 가장 최근에 사용된 데이터 사전의 정보를 저장하고 있습니다.

- 구문 분석 단계에서 서버 프로세스는 SQL문에 지정된 오브젝트 이름을 찾아내고 접근 권한을 검증하기 위해 Dictionary Cache의 정보를 찾아봅니다.


                                                                                                                                   

** 데이터베이스 버퍼 캐쉬(DataBase Buffer Cache) **


데이터베이스 버퍼 캐쉬는 가장 최근에 사용된 데이터 블럭을 저장하는 메모리 공간 입니다. 이 버퍼는 아직까지 디스크에 완전히 쓰여지지 않는 수정된 데이터를 보유할 수도 있습니다.

LRU 알고리즘에 의해 가장 오래전에 사용된 것은 디스크에 저장하고 메모리에는 가장 최근에 사용된 데이터를 저장 함으로, 디스크 입출력이 줄어 들고, 데이터베이스 시스템의 성능이 증가 됩니다.


※LRU 알고리즘 : 최근에 사용된 블록을 유지하기 위해 오래된 것을 제거하는 알고리즘.


DB_BLOCK_SIZE : 데이터베이스 버퍼 캐쉬 내의 블록의 크기


Oracle 8i까지는 DB_BLOCK_SIZE와 DB_BLOCK_BUFFERS를 곱해서 데이터베이스 버퍼 캐쉬의 크기를 결정 했습니다. 하지만 Oracle 9i부터는 DB_BLOCK_BUFFERS를 Deprecated 시키고, DB_CACHE_SIZE 라는 파라미터가 Oracle 9i에 새롭게 도입이 되었습니다.


★ 오라클 9i에 변경된 Database Buffer Cache 관련 파라미터에 대해서 자세히 알아보겠습니다.


1) Deprecated Buffer Cache Parameters


다음의 세 가지 파라미터는 예전 비전과의 호환을 위해 존재하는 것으로, Oracle 9i부터는 의미가 없어 집니다.

- DB_BLOCK_BUDDERS

- BUFFER_POOL_KEEP

- BUFFER_POOL_RECYCLE


Oracle 9i는 위의 파라미터들이 정의되어 있으면 위에 값들을 사용하게 됩니다.


하지만, Oracle 9i에 생성된 새로운 파라미터들을 사용하는 것이 좋으며, 만일 위 파리미터(DB_BLOCK_BUFFERS, BUFFER_POOL_KEEP, BUFFER_POOL_RECYCLE) 값들을 사용한다면 Oracle 9i의 새로운 기능인 Dynamic SGA 특징을 사용할 수 없습니다.


또한 initSID.ora 화일에 위 파라미터들과 새로운 파라미터를 동시에 기술한다면 에러가 발생합니다.


2) New Buffer Cache Sizing Parameters


다음의 세 가지 파라미터가 추가 되었습니다.


DB_CACHE_SIZE : 디폴트 버퍼 캐쉬, 반드시 존재해야 하며, 0으로 설절할 수 없습니다.


DB_KEEP_CACHE_SIZE : Keep Buffer Cache의 크기, 재활용될 가능성이 높은 블록을 고정적으로 저장하는데 사용 합니다.


DB_RECYCLE_CACHE_SIZE : 재활용 버퍼 캐시 크기, 재활용 될 가능성이 낮은 블록을 즉시 제거 하는데 사용 합니다.


이전 버전과 다른 점은 이전 버전의 경우 각각의 파라미터 (DB_BLOCK_BUFFERS, BUFFER_POOL_KEEP, BUFFER_POOL_RECYCLE)에 정의된 값들이 buffer개수 (즉, 실제 메모리 크기를 구하려면 db_block_size를 곱했어야 했는데.)였는데 반해 이제는 구체적인 메모리 크기를 지정 합니다.


Oracle 9i부터는 Multiple Block Size(2k, 4k, 8k, 16k, 32k)를 지원 합니다.


DB_BLOCK_SIZE에 의해 정해진 block size가 primary block size가 됩니다. (SYSTEM tablespace는 이 block size를 이용합니다.)


Oracle 9i에 새로 생긴 파라미터는 아래와 같이 ALTER SYSTEM 명령으로 동적변경이 가능합니다


SQL> ALTER SYSTEM SET DB_CACHE_SIZE=96M;

SQL> ALTER SYSTEM SET DB_KEEP_CACHE_SIZE=16M;

SQL> ALTER SYSTEM SET DB_RECYCLE_CACHE_SIZE=16M;


이 강좌는 오라클 불틴 No 12090을 참고해서 작성 했습니다.


                                                                                                                                   

** 리두 로그 버퍼(Redo Log Buffer) **


- 리두 로그 버퍼는 데이터베이스에서 일어난 모든 변화를 저장하는 메모리 공간입니다.


- DB에서 발생한 모든 변화는 LGWR에 의해 리두 로그 파일에 저장 합니다.


- 리두 로그 버퍼는 Database의 변경 사항 정보를 유지하는 SGA에 있는 Circular(순환) 버퍼 입니다.


- Redo Log Buffer의 크기는 오라클 파라미터 LOG_BUFFER에서 지정합니다.


                                                                                                                                   

** Java Pool과 Large Pool **


1) Java Pool

 - Java Pool은 자바로 작성된 프로그램을 실행할 때 실행 계획을 저장하는 영역 입니다.


 - Java Pool은 JAVA_POOL_SIZE 파라미터로 관리되며, 기본 크기 24MB가 할당 됩니다.


2) Large Pool

 - Large Pool은 Oracle 백업 및 복원 작업에 대한 대용량 메모리 할당, I/O 서버 프로세스 및 다중 스레드 서버와 Oracle XA에 대한 세션 메모리를 제공하는 SGA의 선택적인 영역입니다.


 - Large Pool은 LARGE_POOL_SIZE 파라미터로 관리되며, 기본 크기는 0byte 입니다.


                                                                                                                                   

 

  

 

  ================================================
    * Oracle Community OracleClub.com
    * http://www.oracleclub.com
    * http://www.oramaster.net
    * 운영자 : 김정식 (oramaster _at_ empal.com)
  ================================================ 
Posted by 1010
02.Oracle2009. 6. 4. 10:49
반응형
 

ORA-06502 PL/SQL: numeric or value error: character string buffer too small

 

해당 에러가 발생하는 것은 데이타가 자릿수를 초과한경우 임


데이터크기를 어느정도 맞춘상태에서 작업한 상황이라 이건 말도 안되는 경우라 생각했는데..

프로시져에서 REPLACE를 이용해 데이터를 변경하는 부분에서 변경될 데이터를 담을 변수의 크기의 공간이 적다는 것을 발견했네요...


항상 조심했어야 했는데.. 나름대로 충분하다고 계산된 것이 replace 문자를 넣는 바람에 초과된걸 계산안했더니 오류를 발생하네요(사실 초과된지도 몰랐는데ㅠ.ㅠ)


암튼 조심조심해야 겠네요..

Posted by 1010
02.Oracle/DataBase2009. 5. 30. 14:21
반응형
LIST

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의 아스키 문자로 반환한다.
Ä
【예제】
SQL> select ascii('ABÄCDE') from dual;
☜ ABÄCDE의 두번째 Ä는 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( 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 절과 같은 기능을 사용하면
표현되는 각 컬럼이 하나가 아닌 복수 개의 컬럼으로 정의되는 경우이다.
 


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>

Posted by 1010
02.Oracle/DataBase2009. 5. 30. 13:59
반응형




세부폴더
------------------
constraints
miscellaneous
monitoring
rac
resource_manager
script_creation
security

자세한 내용은 관련 URL 입니다

http://www.oracle-base.com/dba/DBACategories.php 

Posted by 1010
02.Oracle/DataBase2009. 5. 14. 16:11
반응형

참고할만한 사이트

http://cexx.org/lspfix.htm


ORA-12571: TNS:packet writer failure


문제발견 : 하나의 클라이언트가 데이타베이스 접속을 못한다.

                그래서 업무를 수행하지 못한다.


문제해결 : 첨부된 실행파일을 실행한후 Finish 버튼을 누르면 해결된다.


이거땜시 하루 정도는 고생한거 같다. ㅜ.ㅜ

Posted by 1010
02.Oracle/DataBase2009. 5. 12. 16:23
반응형
Posted by 1010
02.Oracle/DataBase2009. 5. 11. 15:49
반응형
공유 풀 영역 튜닝

서버 튜닝

server tuning은 최적의 성능을 얻기 위해 DB 버퍼 캐시, 로그 버퍼와 같은 메모리 영역과 기타 프로세스 영역의 크기를 적당하게 할당하여 성능을 향상시키는 방법을 말한다.
서버튜닝을 통하여 성능을 향상시킬 수 있는 내용은 다음과 같다.
• DB 메모리 영역의 튜닝을 통한 성능 향상
• 물리적 디스크로부터 입출력 수행에 따른 성능 저하 개선
• 백그라운드 프로세스의 활성하를 통한 DB 성능 개선

1)공유 풀 영역튜닝
2)
데이터버퍼 캐시 영역튜닝
3)리두로그 버퍼 튜닝


공유 풀 영역튜닝

공유 풀(shared pool)은 사용자가 실행한 SQL 문의 구문 분석 정보가 저장되는 영역으로 라이브러리 캐시 영역과 데이터 사전 캐시로 구성되어 있다.

라이브러리 캐시는 오라클 DB가 메모리에서 데이터를 얼마나 자주 변경했는지, 어떤 SQL 문이 자주 실행되는지 등의 실행 결과와, 사용자가 실행한 SQL 문의 텍스트 정보가 저장되어 있다.
데이터 사전 캐시 영역은 테이블/뷰의 이름, 테이블을 구성하는 컬럼의 이름과 타입, 이들에 대한 사용자 권한 등과 같은 정보를 저장하는 영역이다.


라이브러리 캐시 튜닝

라이브러리 캐시 튜닝의 목적은 동일한 SQL이나 PL/SQL은 라이브러리 캐시에 한번만 저장될 수 있도록 하자는 것이다. 즉, 동일한 SQL이나 PL/SQL의 텍스트, 파싱(parsing) 결과, 실행계획 등이 각각 메모리에 저장되도록 하는 것이 아니라 하나의 SQL이나 PL/SQL의 정보들만 메모리에 저장되도록 하고 나머지는 이미 메모리에 저장된 정보를 이용할 수 있도록 하자는 것이다.

이를 위해서는 표준화된 코딩 규칙에 따라 SQL과 PL/SQL을 개발함으로써 모든 사용자가 공유할 수 있도록 하고, 이미 라이브러리 캐시에 저장되어 있는 정보가 제거 되지 않도록 하면 된다.

동일한 SQL 문이란 다음과 같은 조건을 만족하는 두 개의 SQL 문을 의미한다.

	• 대문자/소문자 동일
	• 띄어쓰기 규칙 동일
	• 공백(space)의 개수 동일
	• SQL 문에 사용된 변수의 데이터 타입과 변수 이름이 동일
공유 푸 영역을 검색할 때는 V$SQLAREA, V$SQLTEXT 데이터 사전을 사용한다.
검색 결과에서 PARSE_CALLS 항목을 유의해볼 필요가 있다.

동일한 SQL 문에 대해서는 구문 분석이 이루어 지지 않음을 알 수 있다.

SQL> conn system/manager
connected
SQL> select ename,sal from scott.emp where sal >=3000;
 
ENAME             SAL
---------- ----------
SCOTT            3000
KING             5000
FORD             3000
 
SQL> select ename,sal from scott.emp where sal >=3000;
 
ENAME             SAL
---------- ----------
SCOTT            3000
KING             5000
FORD             3000
 
SQL> select sql_text,version_count,loads,invalidations,parse_calls,sorts
  2  from v$sqlarea
  3  where sql_text not like '%$%'
  4             and command_type in (2,3,6,7)
  5             and upper(sql_text) like '%SCOTT.EMP%'
  6             order by sql_text;
 
SQL_TEXT
--------------------------------------------------------------------------------
VERSION_COUNT      LOADS INVALIDATIONS PARSE_CALLS      SORTS
------------- ---------- ------------- ----------- ----------
select ename,sal from scott.emp where sal>=3000
            1          1             0           2          0
 
 
SQL> select sql_text,version_count,loads,invalidations,parse_calls,sorts
  2  from v$sqlarea
  3  where sql_text not like '%$%'
  4             and command_type in (2,3,6,7)
  5             and upper(sql_text) like '%SCOTT.EMP%'
  6             order by sql_text;
 
SQL_TEXT
--------------------------------------------------------------------------------
VERSION_COUNT      LOADS INVALIDATIONS PARSE_CALLS      SORTS
------------- ---------- ------------- ----------- ----------
select ename,sal from scott.emp where sal>=3000
            1          1             0           3          0
 
 
SQL>

사용하고 있는 DB의 라이브러리 캐시 영역에 대한 분석은 라이브러리 캐시에 대한 튜닝의 계힉을 세우기 위해 아주 중요하다. 공유 풀 영역에 대한 분석을 위한 데이터 사전 뷰는 다음과 같다.
V$sgastat 모든 SQL 구조의 크기에 대한 정보를 제공
V$librarycache 라이브러리 캐시에 있는 항목의 유형에 대한 통계정보들을 제공
V$sql
V$sqlarea 현재 어떤 SQL 문들이 사용자들에게 공유되고 있는지에 대한 정보
V$sqltext 현재 어떤 SQL 문들이 사용자들에게 공유되고 있는지에 대한 정보
V$db_object_cache 패키지를 포함한 캐시된 객체들

V$librarycache 뷰를 사용한 분석

히트율 분석 v$librarycache 데이터 사전의 GETS 컬럼과 GETTHIS 컬럼에 대한 백분율
GETS는 사용자가 실행한 SQL 구문이 분석되어 라이브러리 캐시 영역에 로더 되려고 했던 횟수
GETTHIS는 그 중에서 실제로 load된 수를 의미함
reload비율 v$librarycache 데이터 사전으로부터 라이브러리 캐시의 reload 비율을 분석한다.
reload비율은 PINS 컬럼에 대한 RELOADS 컬럼에 대한 비율임
PINS 컬럼은 라이브러리 캐시의 정보가 사용된 횟수를 의미하고,
RELOADS 컬럼은 라이브러리 캐시의 정보가 메모리로부터 제거디어 다시 로딩된 횟수를 의미한다. 만약 0.01이하라면 SHARED_POOL_SIZE 값을 늘려야 한다.
무효화 invalidation(무효화)는 v$librarycache 데이터 사전으로부터 SQL문에서 참조된 객체가 다른 사용자에의해 삭제된 상태가 얼마나 발생했는지를 나타내는 것으로 INVALIDATION 컬럼의 값이 계속 증가하는 값이면 공유 풀 영역이 작아 성능이 저하됨을 나타낸다.

SQL> select * from v$sgastat;
 
POOL         NAME                            BYTES
------------ -------------------------- ----------
             fixed_sga                      778796
             buffer_cache                184549376
             log_buffer                     524288
shared pool  subheap                         52652
shared pool  KQR L SO                       213068
shared pool  KQR M PO                      3021240
shared pool  KQR M SO                       483516
shared pool  KQR S PO                       669044
shared pool  KQR S SO                        12628
shared pool  sql area                     13678560
shared pool  KGLS heap                     2622804
 
POOL         NAME                            BYTES
------------ -------------------------- ----------
shared pool  joxs heap                        4220
shared pool  row cache                     3707272
shared pool  PX subheap                     131068
shared pool  parameters                      27604
shared pool  repository                     145944
shared pool  ASH buffers                   4194304
shared pool  free memory                  10909496
shared pool  PL/SQL DIANA                  1225720
shared pool  PL/SQL MPCODE                 2761632
shared pool  library cache                11884516
shared pool  miscellaneous                23639736
 
POOL         NAME                            BYTES
------------ -------------------------- ----------
shared pool  pl/sql source                   18244
shared pool  PLS non-lib hp                  10404
shared pool  XDB Schema Cac                3797208
shared pool  alert threshol                   4220
shared pool  joxlod exec hp                 337180
shared pool  joxlod pcod hp                  56004
shared pool  partitioning d                 347548
shared pool  table definiti                   1988
shared pool  trigger defini                   2668
shared pool  trigger inform                   2008
shared pool  trigger source                   5832
 
POOL         NAME                            BYTES
------------ -------------------------- ----------
shared pool  type object de                 251344
shared pool  event statistics per sess     3860360
shared pool  fixed allocation callback         352
large pool   PX msg pool                    902160
large pool   free memory                   3292144
java pool    joxs heap                      354816
java pool    free memory                   2578496
java pool    joxlod exec hp                5455296
 
41 rows selected.
 
SQL> select namespace,gethitratio from v$librarycache;
 
NAMESPACE       GETHITRATIO
--------------- -----------
SQL AREA         .980316179
TABLE/PROCEDURE  .817467385
BODY             .997121957
TRIGGER          .984754522
INDEX            .112746633
CLUSTER          .987701768
OBJECT                    1
PIPE                      1
JAVA SOURCE               1
JAVA RESOURCE             1
JAVA DATA                 0
 
11 rows selected.
 
SQL> select sum(pins) PINS, sum(reloads) RELOADS, sum(reloads/pins) RATIO
  2  from v$librarycache where pins != 0;
 
      PINS    RELOADS      RATIO
---------- ---------- ----------
   3000107       7964 .014909064
 
SQL>
SQL> select namespace,gethitratio, invalidations 
  2  from v$librarycache;
 
NAMESPACE       GETHITRATIO INVALIDATIONS
--------------- ----------- -------------
SQL AREA         .980312259          2065
TABLE/PROCEDURE  .817544718             0
BODY             .997125699             0
TRIGGER          .984762397             0
INDEX            .112746633             0
CLUSTER          .987701768             0
OBJECT                    1             0
PIPE                      1             0
JAVA SOURCE               1             0
JAVA RESOURCE             1             0
JAVA DATA                 0             0
 
11 rows selected.
 
SQL>
공유 풀 크기의 변경

위에서 설명한 것과 같은 다양한 튜닝 도구들에 의해 공유 풀 영역의 튜닝이 필요하다면 공유 풀의 크기를 변경해야 한다.
공유 풀 크기의 변경은 다음 사항을 고려하여 정해야 한다.
1) 저장된 객체(테이블, 뷰,프로시저등)들을 위해 필요한 공간얼마나 되는지 산정한다.
2) 자주 사용되는 (4회이상) 응용 프로그램의 메모리를 조회해 본다.
3) 한 사용자의 open 커서당 공유 풀은 250바이트 정도 할당하는 것이 좋으며, 최고조일 때의 전체 메모리는 (오픈커서수 x 25바이트)로 산정한다.
이제 매개변수 shared_pool_size는 (1+2+3+30% 정도의 여유공간)로 잡는다. 공유 풀 영역의 크기를 설정하기 위해 다음 매개변수의 값을 설정한다.

  
	SHARED_POOL_SIZE=[크기];
	SHARED_POOL_REVERSED_SIZE=[크기];
【예제】
SQL> select sum(sharable_mem) from v$db_object_cache;
 
SUM(SHARABLE_MEM)
-----------------
         35909092        ☜  가용 설정 공간
 
SQL> select sum(sharable_mem) from v$db_object_cache
  2  where owner is not null;
 
SUM(SHARABLE_MEM)
-----------------
         16046514  	 ☜  1) 공유객체를 위한 공간
 
SQL> select sum(sharable_mem) from v$sqlarea
  2  where executions > 4;
 
SUM(SHARABLE_MEM)
-----------------
          9785693       ☜  2) 자주 사용되는 으용 프로그램 공간
 
SQL> select sum(250*users_opening) from v$sqlarea;
 
SUM(250*USERS_OPENING)
----------------------
                 10500       ☜  3) 오픈된 커서의 수에 따른 할당된 메모리 크기
 
SQL> 
이 예제에서 가용 메모리=35909092로 되어 있다.
계산하여 보면 { 1)+2)+3)}*30%추가=25842707 * 1.3= 335955191임
그러므로 가용메모리 설정 값 35909092이 계산 값 335955191보다 크므로 여유가 있음

데이터 사전 캐시 튜닝

라이브러리 캐시와 함께 공유 풀의 데이터 사전 캐시에서의 튜닝의 목적은 히트율을 높이는 것이다. 데이터 사전 캐시를 모니터링하기 위해 V$ROWCACHE 뷰를 사용한다.
GETS 컬럼은 사용자가 자료사전을 쿼리했을 때 data dictionary영역으로 자료를 요청했던 횟수
GETMISSES는 자료 요청을 했지만 data dictionary로부터 자료를 얻지 못했던 횟수

대부분 자료사전을 빠르게 검색하기 위해서 GETS에 대한 GETMISSES의 백분율이 2% 미만이어야하고, 아주 큰 자료사전이라면 15%미만이어야 좋은 성능을 기대할 수 있음

이 값들이 15% 이상이면 매개변수 shared_pool_size 크기를 늘리는 것을 고려해 보아야 한다. DB 캐시 영역의 크기는 shared_pool_size 매개변수를 사용하여 변경할 수 있다.
utlbstat, utlestat 유틸리티의 분석결과인 report.txt나 statspack 패키지의 분석 결과인 report.txt에서 다음 사항을 참고해도 좋다.

name GET_REQS GET_MISS SCAN_REQSMOD_REQS COUNT CUR_USAGE
dc_objects
dc_synonyms

【예제】
SQL> select parameter, gets, getmisses, getmisses/gets
  2  from v$rowcache 
  3  where gets != 0;
 
PARAMETER                              GETS  GETMISSES GETMISSES/GETS
-------------------------------- ---------- ---------- --------------
dc_segments                          157452       5536     .035159922
dc_tablespaces                       127769          8     .000062613
dc_tablespace_quotas                   5896          7     .001187246
dc_files                                 72          4     .055555556
dc_users                             661602         80     .000120919
dc_rollback_segments                  46198         21     .000454565
dc_objects                           118673       9587     .080785014
dc_global_oids                       461691        175     .000379041
dc_constraints                         1899        634     .333859926
dc_object_ids                        599331       3945     .006582339
dc_sequences                            181         28     .154696133
dc_usernames                          29648         48     .001618996
dc_histogram_defs                    168054      62822      .37382032
dc_table_scns                           133        133              1
dc_profiles                            5472          1     .000182749
global database name                      4          2             .5
outstanding_alerts                     5597       1100     .196533857
dc_awr_control                         6079          1     .000164501
dc_histogram_data                     31078       6155     .198050068
dc_histogram_data                     13713        488      .03558667
dc_users                              63178         60     .000949698
 
21 rows selected.
 
SQL> 

Posted by 1010
02.Oracle/DataBase2009. 5. 11. 15:48
반응형
v$sqlarea 뷰
공유 풀 영역을 검사할 때 v$sqlarea나 v$sqltext을 사용

【예제】 
SQL> conn system/manager
connected
SQL> select ename,sal from scott.emp where sal >=3000;
 
ENAME             SAL
---------- ----------
SCOTT            3000
KING             5000
FORD             3000
 
SQL> select ename,sal from scott.emp where sal >=3000;
 
ENAME             SAL
---------- ----------
SCOTT            3000
KING             5000
FORD             3000
 
SQL> select sql_text,version_count,loads,invalidations,parse_calls,sorts
  2  from v$sqlarea
  3  where sql_text not like '%$%'
  4             and command_type in (2,3,6,7)
  5             and upper(sql_text) like '%SCOTT.EMP%'
  6             order by sql_text;
 
SQL_TEXT
--------------------------------------------------------------------------------
VERSION_COUNT      LOADS INVALIDATIONS PARSE_CALLS      SORTS
------------- ---------- ------------- ----------- ----------
select ename,sal from scott.emp where sal>=3000
            1          1             0           2          0
 
 
SQL> select sql_text,version_count,loads,invalidations,parse_calls,sorts
  2  from v$sqlarea
  3  where sql_text not like '%$%'
  4             and command_type in (2,3,6,7)
  5             and upper(sql_text) like '%SCOTT.EMP%'
  6             order by sql_text;
 
SQL_TEXT
--------------------------------------------------------------------------------
VERSION_COUNT      LOADS INVALIDATIONS PARSE_CALLS      SORTS
------------- ---------- ------------- ----------- ----------
select ename,sal from scott.emp where sal>=3000
            1          1             0           3          0
 
 
SQL>


SQL> select executions, disk_reads, buffer_gets from v$sqlarea; EXECUTIONS DISK_READS BUFFER_GETS ---------- ---------- ----------- 9 0 9 1 2 47 2 11 94 0 0 0 3 4 56 0 0 0 0 0 0 9 8 73 1 0 4 737 0 2211 1 2 15 EXECUTIONS DISK_READS BUFFER_GETS ---------- ---------- ----------- 1 2 15 1 1 15 8 104 471 1 0 0 1 0 0 1 0 0 0 0 0 1 0 0 1 2 55 2 0 0 11 0 0 EXECUTIONS DISK_READS BUFFER_GETS ---------- ---------- ----------- 0 0 0 7 0 14 9 0 27 9 0 45 4 2 55 12 3 24 737 2 2212 3 0 9 1 0 3 30 2 92 1 0 3 EXECUTIONS DISK_READS BUFFER_GETS ---------- ---------- ----------- 6 8 44 3 1 6 2 0 6 4 2 30 6 5 43 4 2 42 1 0 3 1 0 3 10 8 56 4 75 316 1 0 966 EXECUTIONS DISK_READS BUFFER_GETS ---------- ---------- ----------- 0 0 0 9 10 130 4 1 28 0 0 0 118 7 478 55 26 294 1 0 2 1 0 2 0 0 0 1 0 3 1 0 17 EXECUTIONS DISK_READS BUFFER_GETS ---------- ---------- ----------- 0 0 0 77 10 573 1 39 582 192 5 1070 1 0 2 43 1 43 0 0 0 26 1 129 17 3 60 1 4 15 1 0 0 EXECUTIONS DISK_READS BUFFER_GETS ---------- ---------- ----------- 3 9 35 1 0 3 1 3 25 26 0 88 26 0 121 15 1 39 1 1 37 4567 0 4567 2 3 69 9 0 45 1 1 33 EXECUTIONS DISK_READS BUFFER_GETS ---------- ---------- ----------- 3 3 28 0 0 0 4 0 12 76 13 1368 175 3 525 26 1 112 1 69 2397 26 0 112 0 0 0 1 4 43 1 117 2816 EXECUTIONS DISK_READS BUFFER_GETS ---------- ---------- ----------- 76 0 76 77 1 585 1 4 81 1 0 46 0 0 0 12 15 120 12 14 84 12 59 192 9 1 43 1 0 23 12 10 86 EXECUTIONS DISK_READS BUFFER_GETS ---------- ---------- ----------- 0 0 0 26 1 121 44 1 245 9 6 142 0 0 0 39 8 90 8 12 118 37 7 74 2 0 6 3 1 3 55 29 557 EXECUTIONS DISK_READS BUFFER_GETS ---------- ---------- ----------- 8 0 26 3 0 6 7 0 3514 25 0 50 194 13 582 26 1 119 16214 1 113754 1 6 55 1 6 58 1 7 55 1 6 55 EXECUTIONS DISK_READS BUFFER_GETS ---------- ---------- ----------- 9 11 72 31 3 62 1 6 55 1 6 55 1 6 55 1 7 58 7 11 283 1 6 55 1 1 27 3 0 3 0 0 0 EXECUTIONS DISK_READS BUFFER_GETS ---------- ---------- ----------- 4566 0 9132 1 2 37 1 12 80 1 0 7 1 12 112 1 0 7 1 0 7 1 0 7 9 0 27 7 4 69 1 11 211 EXECUTIONS DISK_READS BUFFER_GETS ---------- ---------- ----------- 1 0 7 1 0 7 1 0 7 1 0 7 1 0 7 0 0 0 7 490 3514 0 0 0 1 368 1317 1 0 7 1 0 7 EXECUTIONS DISK_READS BUFFER_GETS ---------- ---------- ----------- 1 0 7 1 0 7 1 0 7 1 0 7 1 0 7 1 0 7 190 36 552 1 0 7 0 1 92 0 1 82 0 1 92 EXECUTIONS DISK_READS BUFFER_GETS ---------- ---------- ----------- 0 1 91 13 1 65 0 1 94 0 4 93 0 2 84 0 1 84 737 10 905 737 2 2299 737 1 2286 0 1 82 116 12 361 EXECUTIONS DISK_READS BUFFER_GETS ---------- ---------- ----------- 737 143 310752 737 13 855 121 3 408 737 13 867 737 3 849 737 2 861 4 2 30 9 1 54 1 32 674 12 4 62 4 0 107 EXECUTIONS DISK_READS BUFFER_GETS ---------- ---------- ----------- 3 2 57 118 24 688 189 rows selected. SQL> 【예제】 SQL> select substr(sql_text,1,40) "SQL", count(*), 2 sum(executions) "총실행회수" 3 from v$sqlarea 4 where sql_text like '%emp%' 5 group by substr(sql_text, 1,40) 6 having count(*) >0 7 order by 2; SQL COUNT(*) 총실행회수 --------------------------------------------- ---------- ---------- select substr(sql_text,1,40) "SQL", coun 1 5 select count(*) from emp 1 1 select ename from emp where ename=:test 1 2 INSERT INTO wrh$_sql_plan sp (sn 1 1 select t.ts#,t.file#,t.block#,nvl(t.bobj 1 20013 select obj#, dataobj#, part#, hiboundlen 1 144 6 rows selected. SQL> 【예제】 SQL> show user USER is "SYS" SQL> desc v$sqlarea Name Null? Type ----------------------------------------- -------- ---------------------------- SQL_TEXT VARCHAR2(1000) SQL_FULLTEXT CLOB SQL_ID VARCHAR2(13) SHARABLE_MEM NUMBER PERSISTENT_MEM NUMBER RUNTIME_MEM NUMBER SORTS NUMBER VERSION_COUNT NUMBER LOADED_VERSIONS NUMBER OPEN_VERSIONS NUMBER USERS_OPENING NUMBER FETCHES NUMBER EXECUTIONS NUMBER PX_SERVERS_EXECUTIONS NUMBER END_OF_FETCH_COUNT NUMBER USERS_EXECUTING NUMBER LOADS NUMBER FIRST_LOAD_TIME VARCHAR2(38) INVALIDATIONS NUMBER PARSE_CALLS NUMBER DISK_READS NUMBER DIRECT_WRITES NUMBER BUFFER_GETS NUMBER APPLICATION_WAIT_TIME NUMBER CONCURRENCY_WAIT_TIME NUMBER CLUSTER_WAIT_TIME NUMBER USER_IO_WAIT_TIME NUMBER PLSQL_EXEC_TIME NUMBER JAVA_EXEC_TIME NUMBER ROWS_PROCESSED NUMBER COMMAND_TYPE NUMBER OPTIMIZER_MODE VARCHAR2(10) OPTIMIZER_COST NUMBER OPTIMIZER_ENV RAW(2000) OPTIMIZER_ENV_HASH_VALUE NUMBER PARSING_USER_ID NUMBER PARSING_SCHEMA_ID NUMBER PARSING_SCHEMA_NAME VARCHAR2(30) KEPT_VERSIONS NUMBER ADDRESS RAW(8) HASH_VALUE NUMBER OLD_HASH_VALUE NUMBER PLAN_HASH_VALUE NUMBER MODULE VARCHAR2(64) MODULE_HASH NUMBER ACTION VARCHAR2(64) ACTION_HASH NUMBER SERIALIZABLE_ABORTS NUMBER OUTLINE_CATEGORY VARCHAR2(64) CPU_TIME NUMBER ELAPSED_TIME NUMBER OUTLINE_SID VARCHAR2(40) LAST_ACTIVE_CHILD_ADDRESS RAW(8) REMOTE VARCHAR2(1) OBJECT_STATUS VARCHAR2(19) LITERAL_HASH_VALUE NUMBER LAST_LOAD_TIME DATE IS_OBSOLETE VARCHAR2(1) IS_BIND_SENSITIVE VARCHAR2(1) IS_BIND_AWARE VARCHAR2(1) IS_SHAREABLE VARCHAR2(1) CHILD_LATCH NUMBER SQL_PROFILE VARCHAR2(64) SQL_PATCH VARCHAR2(30) SQL_PLAN_BASELINE VARCHAR2(30) PROGRAM_ID NUMBER PROGRAM_LINE# NUMBER EXACT_MATCHING_SIGNATURE NUMBER FORCE_MATCHING_SIGNATURE NUMBER LAST_ACTIVE_TIME DATE BIND_DATA RAW(2000) TYPECHECK_MEM NUMBER SQL> select count(*) from v$sqlarea; COUNT(*) ---------- 1469 SQL>
Posted by 1010
02.Oracle/DataBase2009. 5. 11. 15:02
반응형

*오라클서버의 메모리에 관한 테이블*/
select * from v$sgastat
 
select pool, sum(bytes) "SIZE"
from v$sgastat
where pool = 'shared pool'
group by pool

/*cpu를 많이 사용하는 쿼리문과 프로세스아이디,시리얼번호,머신 알아내기*/
select c.sql_text
,b.SID
, b.SERIAL#
,b.machine
,b.OSUSER
,b.logon_time --이 쿼리를 호출한 시간
from v$process a, v$session b, v$sqltext c
where a.addr = b.paddr
and b.sql_hash_value = c.hash_value
and a.spid = '675958'
order by c.PIECE


/*cpu를 많이 사용하는 쿼리문과 프로세스아이디,시리얼번호,머신 알아내기*/
select c.sql_text
from v$process a, v$session b, v$sqltext c
where a.addr = b.paddr
and b.sql_hash_value = c.hash_value
and a.spid = '171'
order by c.PIECE

/*프로세스 아이디를 이용하여 쿼리문 알아내기*/
select c.sql_text
,b.SID
, b.SERIAL#
,b.machine
,b.OSUSER
,b.logon_time --이 쿼리를 호출한 시간
from v$process a, v$session b, v$sqltext c
where a.addr = b.paddr
and b.sql_hash_value = c.hash_value
and a.spid = '1708032' --1912870/
order by c.PIECE
 
/*세션 죽이기(SID,SERAIL#)*/
ALTER SYSTEM KILL SESSION '8,4093'

/*hash_value 가지고 SQL 문장 찾아내는 쿼리 */
select sql_text from v$sqltext where hash_value= 317853294


/*오라클 세션과 관련된 테이블*/
select count(*) from v$session where machine ='머신이름' and schemaname ='스키마이름'

/*인엑티브 상태의 세션들-로그온타입이 과도하게 지나도록 없어지지 않는것은 세션을 죽이도록 한다
단 machine이 머신이름 에 해당하는 것만 죽이도록 한다
prev_hash_value 로 해쉬밸류를 알아내어 쿼리문을 확인할 수 있다
*/ 
select sid,serial#,username,status,logon_time,prev_hash_value,machine
from v$session
where machine ='머신이름' and schemaname ='스키마이름' and status = 'INACTIVE'

select count(*) from v$session where machine ='머신이름' and schemaname ='스키마이름' and status = 'INACTIVE'

select count(*) from v$session where machine ='머신이름' and schemaname ='스키마이름' and status = 'KILLED'

SELECT COUNT(*) FROM V$SESSION WHERE MACHINE ='머신이름' AND SCHEMANAME ='스키마이름'  AND STATUS = 'ACTIVE'
   
--현재 스키마이름 스키마로 실행중인(active) 프로세스를 알아내는 쿼리문
select SID, SERIAL#, SQL_HASH_VALUE, PREV_HASH_VALUE,ROW_WAIT_OBJ#, LOGON_TIME, MACHINE
from v$session
where schemaname ='스키마이름' and status = 'ACTIVE'
  
--위에서 알아내 hash_value 값을 이용하여 해당 프로세스가 실행중인 쿼리문 알아내기
select * from v$sqltext where hash_value = 2626426688-
order by piece

select * from v$session
where machine ='머신이름' and schemaname ='스키마이름' and status = 'ACTIVE' and ROW_WAIT_OBJ# > 0


/******************************************************************************************/
 현재 커서 수 확인하는 Query
/******************************************************************************************/
 

SELECT sid, count(sid) cursor
FROM V$OPEN_CURSOR
WHERE user_name = '유저이름'
GROUP BY sid
ORDER BY cursor DESC


SELECT sql_text, count(sid) cnt
FROM v$OPEN_CURSOR
GROUP BY sql_text
ORDER BY cnt DESC



  
  
 
  
   116, 15217
  
    select sql_text from v$sqltext
 where hash_value= 3252988466 --1389452958 
 order by piece
  
select * from v$session_wait
 
  select sid, serial#, username, taddr, used_ublk, used_urec
 from v$transaction t, v$session s
 where t.addr = s.taddr;


 
select *  from sys.v_$open_cursor
 
 
  select user_name, sql_text, count(*) cnt from sys.v_$open_cursor
 where user_name = '유저이름' and sid = 114
  group by user_name, sql_text
  order by cnt desc

 alter system kill session '27,127'

--ALTER SYSTEM KILL SESSION '45, 3977'
--이런식으로 통계정보를 생성하신 후에

 analyze table emp compute statistics;

 alter table customers pctfree 5 ;

select * from dba_tables
where table_name = 'RP_PART_MST'



/*******************************************************************************
* LOCK 관련
*******************************************************************************/

--V$LOCK 을 사용한 잠금 경합 모니터링
SELECT s.username, s.sid, s.serial#, s.logon_time,
    DECODE(l.type, 'TM', 'TABLE LOCK',
          'TX', 'ROW LOCK',
       NULL) "LOCK LEVEL",
    o.owner, o.object_name, o.object_type
FROM v$session s, v$lock l, dba_objects o
WHERE s.sid = l.sid
AND o.object_id = l.id1
AND s.username IS NOT NULL   

--락이 걸린 세션 자세히 알아보기
select a.sid, a.serial#,a.username,a.process,b.object_name,
decode(c.lmode,2,'RS',3,'RX',4,'S',5,'SRX',8,'X','NO') "TABLE LOCK",
decode (a.command,2,'INSERT',3,'SELECT',6,'UPDATE',7,'DELETE',12,'DROP TABLE',26,'LOCK TABLE','UNknown') "SQL",
decode(a.lockwait, NULL,'NO wait','Wait') "STATUS"
from v$session a,dba_objects b, v$lock c
where a.sid=c.sid and b.object_id=c.id1
and c.type='TM'

--락이 걸린 세션 간단히 알아보기
select a.sid, a.serial#, b.type, c.object_name, a.program, a.lockwait,
       a.logon_time, a.process, a.osuser, a.terminal
from v$session a, v$lock b, dba_objects c
where a.sid = b.sid
  and b.id1 = c.object_id
  and b.type = 'TM';

select a.sid, a.serial#, a.username, a.process, b.object_name
from v$session a , dba_objects b, v$lock c
where a.sid=c.sid and b.object_id = c.id1
and c.type = 'TM'

--락이 걸린 세션을 찾아 내어 세션을 죽이려고 해도 죽지 않는 경우
--아래 쿼리문으로 OS단의 PROCESS ID를 찾아내어 OS에서 죽인다
--kill -9 프로세스아이디
select substr(s.username,1,11) "ORACLE USER", p.pid "PROCESS ID",
s.sid "SESSION ID", s.serial#, osuser "OS USER",
p.spid "PROC SPID",s.process "SESS SPID", s.lockwait "LOCK WAIT"
from v$process p, v$session s, v$access a
where a.sid=s.sid and
p.addr=s.paddr and
s.username != 'SYS'

--위 쿼리문의 결과가 있다면 락이 걸린 세션이 있다는것이므로 아래의 쿼리문으로 세션을 죽인다
ALTER SYSTEM KILL SESSION '11,39061'

/**********************************************************************************************/





select *
  from v$session
  where sid in (80,100)

SELECT l.SESSION_ID,
    LPAD('  ', DECODE(l.xidusn,0,3,0))
    ||l.oracle_username "User Name",
    o.owner, o.object_name, o.object_type
    FROM v$locked_object l, dba_objects o
WHERE l.object_id = o.object_id
ORDER by o.object_id, 1 desc


--아래 table 은 존재하지 않네...

SELECT sw.username "WAITING_USER", bu.username "LOCKING_USER",
    dw.lock_type, dw.mode_held, dw.mode_requested,
    dw.waiting_session, dw.holding_session
FROM dba_waiters dw, v$session sw, v$session bu
WHERE dw.waiting_session = sw.sid
ANd dw.holding_session = bu.sid   
   


SELECT s.username, s.sid, s.serial#
FROM dba_blockers db, v$session s
WHERE db.holding_session = s.sid 


SELECT vo.session_id,do.object_name, do.owner, do.object_type,do.owner, vo.xidusn, vo.locked_mode
FROM v$locked_object vo , dba_objects do
WHERE vo.object_id = do.object_id

SELECT do.object_name, do.owner, do.object_type,do.owner, vo.xidusn, vo.session_id, vo.locked_mode
FROM v$locked_object vo , dba_objects do
WHERE vo.object_id = do.object_id



Select *
FROM
  all_col_comments
WHERE
  table_name = '테이블이름'
 
 
/************************************************
alter session으로 죽지않는 프로세스 죽이기
1.oracle이 설치된 서버에 텔넷으로 root로 접속한다
2.su -오라클계정
3.sqlplus '/as sysdba''
4.connect system/sys
5.ALTER SYSTEM KILL SESSION '137,1723'

**************************************************/ 

 

 

database.sarang.net 에서 펌

Posted by 1010
02.Oracle/DataBase2009. 5. 6. 13:21
반응형

Skip Headers

오라클 10g 함수
10g Release 1 (10.1)
Go to Documentation Home
HOME
Go to Book List
ORA_home
Go to Table of Contents
연구회
Go to Index
자료실
Go to Master Index
ORA_10G
Go to Feedback page
MAIL

Go to previous page
Previous
Go to next page
Next

SQL Functions

1. 수치함수
2. 문자값을 반환하는 문자 함수
3. NLS 문자 함수
4. 수치값을 반환하는 문자함수
5. 일시 함수
6. 일반적인 비교 함수
7. 변환 함수
8. LARGE OBJECT(LOB) 함수
9. 수집 함수
10. 계층 함수
11. XML 함수
12. 인코딩 함수와 디코딩 함수
13. NULL 함수
14. 환경 함수 와 식별자 함수
15. 집계 함수
16. 분석 함수
17. Object 참조 함수
18. 모델 함수
19. 기타 단일행 함수

일행 함수

단일행 함수는 쿼리 테이블 또는 뷰의 모든 행에 대하여 단일 결과 행을 반환한다. 이 함수는 select lists,where 구문,START WITH, CONNECT BY 구문, HAVING구문을 지정할수 있다.

1. 수치함수

처음메뉴로

함수명 설명
002.ABS  절대값을 반환한다.
003.ACOS

n의 역코사인(arc cosine)값을 반환한다.

007.ASIN  n의 역사인(arc sine)값을 반환한다.
008.ATAN  n의 역탄젠트(arc tangent)값을 반환한다.
009.ATAN2  ATAN2(n,m)은 atan2(n/m)과 같으며, n/m의 역탄젠트(arc tangent)값을 반환한다.
013.BITAND  인수1과 인수2의 비트에 대한 AND연산을 수행하여 정수를 반환한다.
016.CEIL  인수에서 지정한 수치를 올림하여 정수를 구하는 함수이다.
026.COS  n(라디안으로 표현되는 각도)의 코사인값을 반환한다.
027.COSH

n(라디안으로 표현되는 각도)의 쌍곡 코사인값(hyperbolic cosine)을 반환한다

044.EXP  e의 n 제곱 값을 반환한다.
050.FLOOR  지정한 숫자보다 작거나 같은 정수 중에서 최대값을 반환한다
067.LN  입력값의 자연 로그 값을 반환한다.
070.LOG  LOG(m,n)에서 밑을 m으로 한 n의 로그 값을 반환.
078.MOD  n2을 n1으로 나눈 나머지값을 반환.
080.NANVL  입력 값 n2가 Nan(숫치가 아닌)라면, 대체 값 n1을 반환. n2가 NaN이 아니라면, n2를 반환
102.POWER  n2의 n1승 값을 반환.
118.REMAINDER  n2를 n1으로 나눈 나머지를 반환
120.ROUND (number)  n값을 소수점 이하를 integer를 기준으로 반올림하여 반환한다
130.SIGN  n의 부호를 반환.
131.SIN  n의 사인(sine)값을 반환.
132.SINH  n의 쌍곡선 사인(hyperbolic sine)을 반환.
134.SQRT  n의 제곱근을 반환.
159.TAN  n의 사인(tangent)값을 반환.
160.TANH  n의 쌍곡선 탄젠트(hyperbolic tangent)을 반환.
185.TRUNC (number)  인수 n1을 소수점 자리 파라미터 n2 이하를 절삭.
199.WIDTH_BUCKET  동일한 넓이를 갖는 히스토그램을 생성.

 
2. 문자값을 반환하는 문자 함수

처음메뉴로

함수명 설명
018.CHR  10진수 n 에 대응하는 아스키코드를 반환.
022.CONCAT

char1과 char2를 연결하여 반환한다

057.INITCAP  입력 문자열 중에서 각 단어의 첫 글자를 대문자로 나머지는 소문자로 변환하여 반환한다
071.LOWER  입력된 문자열을 소문자로 변환한다
072.LPAD  지정된 자리수 n으로부터 expr1을 채우고,왼편의 남은 공간에 expr1을 채운다.
073.LTRIM  문자열 char 좌측으로부터 set으로 지정된 모든 문자를 제거한다.
081.NCHR  유니코드 문자를 반환.
087.NLS_INITCAP  각 단어의 처음 문자를 대문자로, 나머지 문자를 소문자로 변환하여 char를 반환한다
088.NLS_LOWER  모든 문자를 소문자로 변환하여 반환한다.
089.NLSSORT

입력 문자열을 소팅하여 스트링을 반환한다.

090.NLS_UPPER  입력 문자열을 모두 대문자로 변환한 문자열을 반환한다.
115.REGEXP_REPLACE   지정한 정규 표현을 만족하는 부분을, 지정한 다른 문자열로 치환합니다.
116.REGEXP_SUBSTR   지정한 정규 표현을 만족하는 부분 문자열을 반환.
119.REPLACE   파라미터로 주어지는 첫번째 문자열에서, 두번째 문자열을 모두 세번째 문자열로 바꾼 후 결과를 반환한다.
125.RPAD  인수 expr1 오른편으로 인수 expr2로 지정한 문자를 길이 필요에 따라 반복하여 n만큼 붙여준다
126.RTRIM  인수 char의 오른쪽 끝에서 부터 set으로 지정된 모든 문자를 제거한다.
133.SOUNDEX  char의 음성 표현을 가지는 문자열을 반환.
147.SUBSTR  문자열 Char에서 position 문자 위치로부터 substring_length 문자 길이만큼 문자열을 추출하여 반환.
181.TRANSLATE  from_string에서 각 문자를 to_string안의 대응하는 문자로 치환하여 expr을 반환.
183.TREAT  인수의 선언형을 변경.
184.TRIM  문자열부터 선행 또는 후행(양쪽)문자를 제거.
191.UPPER  모든 문자를 대문자로 변환.

3. NLS 문자 함수

처음메뉴로

함수명 설명
084.NLS_CHARSET_DECL_LEN  NCHAR열의 선언된 폭을 반환.
085.NLS_CHARSET_ID  문제셋 이름에 상응하는 ID번호를 반환.
086.NLS_CHARSET_NAME  ID번호 number에 상응하는 문자 세트의 이름을 반환.

4. 수치값을 반환하는 문자함수

처음메뉴로

함수명 설명
005.ASCII  주어진 char의 첫 문자의 아스키 값에 상응하는 10진수값을 반환한다.
058.INSTR  문자열중에서 지정한 문자가 처음 나타나는 위치를 숫자로 반환.
066.LENGTH  인수 char의 길이를 반환한다
114.REGEXP_INSTR   지정한 조건(정규 표현)을 만족하는 부분의 최초의 위치(무슨 문자인지)를 반환.

 
5. 일시 함수

처음메뉴로

함수명 설명
004.ADD_MONTHS  일자 date에 특정 개월수 integer를 더한 값을 반환한다
032.CURRENT_DATE

현재 세션의 날짜 정보를 Date 데이터 형으로 반환한다.

033.CURRENT_TIMESTAMP  현재 session의 날짜와 시간 정보를 반환한다
035.DBTIMEZONE  데이터 베이스 time zone의 값을 반환한다
045.EXTRACT (datetime)  특정 날짜,시간 값이나 날짜 값 표현식으로부터 지정된 날짜 영역의 값을 추출하여 반환한다
051.FROM_TZ  timestamp 데이터형과 time zone데이터 형을 TIMESTAMP WITH TIME ZONE 데이터형으로 변환.
062.LAST_DAY  해당 날짜가 속한 달의 마지막 날짜를 반환한다.
069.LOCALTIMESTAMP  timestamp의 현재 날짜와 시각을 출력한다.
079.MONTHS_BETWEEN

일자 date1과 date2 사이의 월을 계산한다

082.NEW_TIME  date,zone1시간대를 zone2 시간대로 출력.
083.NEXT_DAY  해당일을 기준으로 명시된 요일의 다음 날짜를 변환.
093.NUMTODSINTERVAL  n을 INTERVAL DAY TO SECOND 문자로 변경한다.
094.NUMTOYMINTERVAL  n을 INTERVAL YEAR TO MONTH문자로 변경한다
121.ROUND (date)  포맷 모델 fmt에 의해 지정한 단위로 반올림된 날짜를 반환한다
128.SESSIONTIMEZONE  현재 세션의 시간대역(time zone)을 반영한다
152.SYS_EXTRACT_UTC  협정 세계시간 UTC (Coordinated Universal Time—formerly Greenwich Mean Time)을 반환
157.SYSDATE  데이터 베이스가 있는 OS의 일자와 시간을 반환한다
158.SYSTIMESTAMP  시스템의 날짜를 반환한다
165.TO_CHAR (datetime)   사용자가 지정한 폼을 갖는 varchar2 형식의 데이터로 변환한다
169.TO_DSINTERVAL  INTERVAR DAY TO SECOND값으로 변환한다.
178.TO_TIMESTAMP  TIMESTAMP 데이터형의 값으로 변환한다.
179.TO_TIMESTAMP_TZ  TIMESTAMP WITH TIME ZONE 데이터형으로 변환한다.
180.TO_YMINTERVAL  INTERVAL YEAR TO MONTH 형태로 변경한다
186.TRUNC (date)    날짜를 년,월,일을 기준으로 반올림하거나 절삭한다.
187.TZ_OFFSET  문장이 실행된 일자에 근거한 인수에 상응하는 time zone offset을 반환한다
 
6. 일반적인 비교 함수

처음메뉴로

함수명 설명
052.GREATEST  하나 이상의 인수중에서 가장 큰 값을 반환.
065.LEAST  인수 EXPR의 리스트 중에서 가장 작은 값을 반환.

7. 변환 함수

처음메뉴로

함수명 설명
006.ASCIISTR  주어진 문자열의 아스키 문자열을 반환.
012.BIN_TO_NUM

비트(2진수) 벡터를 동등한 수치(10진수)로 변환.

015.CAST    데이터 형식이나 collection 형식을 다른 데이터 형식이나 collection 형식으로변환.
017.CHARTOROWID  CHAR, VARCHAR2, NCHAR, or NVARCHAR2 데이터형태의 값으로부터 ROWID형으로 변환.
021.COMPOSE  완전한 정규화된 형태의 유니코드를 반환.
023.CONVERT  문자세트를 다른 문자세트로 문자열을 변환.
037.DECOMPOSE  입력과 같은 문자 세트로 분해후의 UNICODE 문자열을 반환.
056.HEXTORAW  16진수를 raw값으로 변환.
093.NUMTODSINTERVAL

n을 INTERVAL DAY TO SECOND 문자로 변경.

094.NUMTOYMINTERVAL  n을 INTERVAL YEAR TO MONTH문자로 변경한다.
110.RAWTOHEX  RAW을 16진수의 문자로 변환.
111.RAWTONHEX  RAW을 NVARCHAR2 형태의 16진수로 변환.
123.ROWIDTOCHAR  rowid 값을 VARCHAR2형식으로 변환.
124.ROWIDTONCHAR  rowid값을 NVARCHAR2형식으로 변환.
127.SCN_TO_TIMESTAMP  시스템 변경 번호(SCN)로 평가되는 수치를 인수로 취하여, SCN과 관련된 가까운 timestamp를 반환.
161.TIMESTAMP_TO_SCN  timestamp와 관련된 시스템 변경 번호(system change number,SCN)을 반환.
162.TO_BINARY_DOUBLE  배정밀도 부동소수점을 반환.
163.TO_BINARY_FLOAT  단순정밀도(single-precision) 부동 소수점수(floating-point number)를 반환.
164.TO_CHAR (character)  데이터 베이스 문자 세트로 변환.
165.TO_CHAR (datetime)  지정된 포맷의 VARCHAR2 데이터 타입의 값으로 변환.
166.TO_CHAR (number)  VARCHAR2 데이터형의 값으로 변환.
167.TO_CLOB  NCLOB값을 CLOB값으로 변환.
168.TO_DATE  char을 날짜형 데이터 타입값으로 변환.
169.TO_DSINTERVAL  INTERVAR DAY TO SECOND값으로 변환.
170.TO_LOB  LONG또는 LONG ROW값을 LOB값으로 변환.
171.TO_MULTI_BYTE  multibyte 문자를 상응하는 single-byte 문자로 변환한 문자를 반환.
172.TO_NCHAR (character)  문자열,CLOB,NCLOB 값을 각국 문자 세트로 변환.
173.TO_NCHAR (datetime)  national character set으로 변환.
174.TO_NCHAR (number)  n을 national character set으로 변환.
175.TO_NCLOB  CLOB값을 NCLOB값으로 변환.
176.TO_NUMBER  expr을 NUMBER 데이터형의 값으로 변환.
177.TO_SINGLE_BYTE  multibyte문자를 그에 상응하는 single-byte문자로 변환하여 char을 반환.
178.TO_TIMESTAMP  CHAR,VARCHAR2,NCHAR,NVARCHAR2 데이터형의 char을 TIMESTAMP 데이터형의 값으로 변환.
179.TO_TIMESTAMP_TZ  CHAR,VARCHAR2,NCHAR,NVARCHAR2데이터형의 char을 TIMESTAMP WITH TIME ZONE 데이터형으로 변환.
180.TO_YMINTERVAL  CHAR,VARCHAR2,NCHAR,NVARCHAR2 데이터형의 문자열을 INTERVAL YEAR TO MONTH 형태로 변경
182.TRANSLATE ... USING  char을 데이터 베이스 문자세트와 각국어 문자 센트사이의 변환에 대한 지정된 문자 세트로 변경.
189.UNISTR  텍스트 문자열을 인수로 취하고, 각국어 문자 세트로 반환.
 
8. LARGE OBJECT(LOB) 함수

처음메뉴로

함수명 설명
011.BFILENAME  서버 파일 시스템의 물리 LOB 바이너리 파일과 연관된 BFILE locator를 반환.
042.EMPTY_BLOB, EMPTY_CLOB  LOB 변수를 초기화하기 위하여 쓰이거나, 또는 INSERT 문이나 UPDATE 문에서 empty LOB 위치를 반환.

9. 수집 함수

처음메뉴로

함수명 설명
014.CARDINALITY  nested table에서 원소의 수를 반환.
020.COLLECT  선택된 행으로부터 입력된 형태의 중첩 테이블을 생성.
103.POWERMULTISET  입력된 중첩(nested)테이블의 공백이 아닌 모든 부분집합(submultisets)을 소유한 중첩 테이블의 중첩된 테이블을 반환.
104.POWERMULTISET_BY_CARDINALITY  중첩 테이블과 cardinality(주어진 수학적 집합에서 요소들의 개수)를 취해서, 지정한 카디나리트의 중첩 테이블의 모든 비공백 부분집합(submultisets이라고 불리는)을 소유하는 중첩 테이블의 중첩테이블을 반환.
129.SET  중첩 테이블에서 중복을 배제하여 반환.

10. 계층 함수

처음메뉴로

함수명 설명
149.SYS_CONNECT_BY_PATH  루트로 부터 node로 열의 값 Path를 반환.

11. XML 함수

처음메뉴로

함수명 설명
039.DEPTH  상관 변수를 가지는 UNDER_PATH조건에 의해 지정된 PATH에서 레벨의 수를 반환.
043.EXISTSNODE  node의 존재여부를 확인하여 그 결과를 반환.
046.EXTRACT (XML)

XML 플래그먼트(fragment)를 포함한 XMLType 인스턴스를 반환.

047.EXTRACTVALUE  node의 스칼라 값을 반환.
098.PATH  지정된 자원에서 상대적인 경로를 반환.
151.SYS_DBURIGEN  특정 열 또는 행 오브젝트에 대한 DBURIType 데이터 타입의 URL을 생성.
155.SYS_XMLAGG  입력 받은 모든 문서를 하나의 XML문서를 통합.
156.SYS_XMLGEN  스칼라값,object type,xml type 인스턴스를 XML문서로 변형.
200.XMLAGG  XML fragment(조각)의 집합체를 취해서, 집계된 XML 문서를 반환.

 GROUP BY 질의에서 XML 데이타를 그룹으로 분류 또는 집계하는 함수.

201.XMLCOLATTVAL  XML 단편(fragment)을 생성하고, 각각의 XML 단편(fragment)이 속성 name을 포함한 name열을 가지는 결과 XML으로 확장.
202.XMLCONCAT  둘 이상의 XML 값을 연결하는 함수.
203.XMLELEMENT  XMLType 타입의 instance를 반환.

 관계형 값을 XML 요소로 변형시키는 함수.

204.XMLFOREST  각 인수의 파라미터를 XML로 변환하고, 변환된 인수를 연결한 XML 단편(fragment)을 반환.

 관계형 값 목록으로부터 XML 요소의 목록(일명: '포리스트(forest)')을 생성하는 함수.

205.XMLSEQUENCE  XMLType에 있는 top-level 노드의 varray를 반환.

 커서의 각 행에 대하여 XMLSequence 형태로써 XML문서를 반환.

206.XMLTRANSFORM  스타일 쉬트를 인스턴스로 적용하고, XMLType를 반환.
 
12. 인코딩 함수와 디코딩 함수

처음메뉴로

함수명 설명
036.DECODE  일반적인 프로그래밍 언어의 IF문을 SQL 문자 또는 PL/SQL안으로 끌여들여 사용하기 위하여 만들어진 오라클함수.
041.DUMP  지정한 데이터의 위치와 길이 등을 지정한 형식으로 반환.
097.ORA_HASH  주어진 표현에 대한 해쉬 값을 계산하는 함수.
198.VSIZE  expr의 내부 표현에서 바이트의 수를 반환.

13. NULL 함수

처음메뉴로

함수명 설명
019.COALESCE  나열된 값을 순차적으로 체크하여 NULL이 아닌 첫번째 인수를 반환.
068.LNNVL  조건의 한쪽 또는 양쪽 연산자가 NULL이 존재할 경우에, 조건문을 평가하기 위한 방법을 제공.
092.NULLIF  expr1과 expr2가 같으면, NULL값을 반환.
095.NVL  쿼리의 결과에서 NULL(공백으로 반환)값을 치환.
096.NVL2  지정한 표현이 NULL인지 여부에 근거하여 쿼리의 반환될 값을 판단할수 있다. expr1이 NULL이 아니라면, NVL2는 expr2를 반환한다. 만약 expr1인 NULL이라면, NVL2는 expr3을 반환.

14. 환경 함수 와 식별자 함수

처음메뉴로

함수명 설명
150.SYS_CONTEXT  문맥 namespace와 관련된 parameter의 값을 반환.
153.SYS_GUID  16바이트로 구성된 고유전역식별자(globally unique identifier,RAW 값)을 생성하여 반환.
154.SYS_TYPEID  피연산자(operand)의 대부분 지정한 형태의 typeid를 반환.
188.UID  세션 사용자의 유일한 식별하는 정수를 반환.(로그인 유저)
192.USER  VARCHAR2 형태를 가지는 세션 사용자(로그인 유저)의 이름을 반환.
193.USERENV  현재 세션에 대한 정보를 반환.

 
15. 집계 함수

처음메뉴로

Aggregate functions return a single result row based on groups of rows, rather than on single rows. Aggregate functions can appear in select lists and in ORDER BY and HAVING clauses. They are commonly used with the GROUP BY clause in a SELECT statement, where Oracle Database divides the rows of a queried table or view into groups. In a query containing a GROUP BY clause, the elements of the select list can be aggregate functions, GROUP BY expressions, constants, or expressions involving one of these. Oracle applies the aggregate functions to each group of rows and returns a single result row for each group.

If you omit the GROUP BY clause, then Oracle applies aggregate functions in the select list to all the rows in the queried table or view. You use aggregate functions in the HAVING clause to eliminate groups from the output based on the results of the aggregate functions, rather than on the values of the individual rows of the queried table or view.


Many (but not all) aggregate functions that take a single argument accept these clauses:

  • DISTINCT causes an aggregate function to consider only distinct values of the argument expression.

  • ALL causes an aggregate function to consider all values, including all duplicates.

For example, the DISTINCT average of 1, 1, 1, and 3 is 2. The ALL average is 1.5. If you specify neither, then the default is ALL.

All aggregate functions except COUNT(*) and GROUPING ignore nulls. You can use the NVL function in the argument to an aggregate function to substitute a value for a null. COUNT never returns null, but returns either a number or zero. For all the remaining aggregate functions, if the data set contains no rows, or contains only rows with nulls as arguments to the aggregate function, then the function returns null.

You can nest aggregate functions. For example, the following example calculates the average of the maximum salaries of all the departments in the sample schema hr:

SELECT AVG(MAX(salary)) FROM employees GROUP BY department_id;

AVG(MAX(SALARY))
----------------
           10925

This calculation evaluates the inner aggregate (MAX(salary)) for each group defined by the GROUP BY clause (department_id), and aggregates the results again.

The aggregate functions are:

함수명 설명
010.AVG  지정된 컬럼에 대한 조건을 만족하는 행중에서 Null을 제외한 평균을 반환.
020.COLLECT  선택된 행으로부터 입력된 형태의 중첩 테이블을 생성.
024.CORR  수치 쌍에 대한 상관 계수를 반환.
025.CORR_*  (CORR 참조) Pearson's 상관계수를 계산.
028.COUNT  쿼리에 의해 반환된 행의 수를 반환.
029.COVAR_POP  number조합의 세트의 모집단 공분산을 반환.
030.COVAR_SAMP  number쌍의 세트의 표본 공분산을 반환.
031.CUME_DIST  값의 그룹에 있는 값의 누적 분포치를 계산.
038.DENSE_RANK  ORDER BY절에 사용된 컬럼이나 표현식에 대하여 순위를 부여하는데 RANK()와 달리 동일 순위 다음의 순위는 동일 순위의 수와 상관없이 1 증가된 값을 돌려준다
048.FIRST  주어진 소트 지정에 대해서 FIRST 또는 LAST로서 순위를 주어서 행의 세트로부터 값의 세트에 운영하는 집계와 분석 함수.
053.GROUP_ID  지정된 GROUP BY 결과로부터 중복된 그룹을 구별.
054.GROUPING  ROLLUP이나 CUBE 연산자와 함께 사용하여 GROUPING 함수에 기술된 컬럼이 그룹핑 시 즉, ROLLUP이나 CUBE 연산시 사용이 되었는지를 보여 주는 함수.
055.GROUPING_ID  행과 관련되는 GROUPING 비트 벡터에 대응되는 수치를 반환.
061.LAST  행을 서열화 시켜서 마지막 행을 추출.
075.MAX  인수중에서 최대값을 반환.
076.MEDIAN  중앙값 또는 값의 정렬후에 중앙값이 보간된 값을 반환.
077.MIN  인수중에서 최소값을 반환.
099.PERCENT_RANK  그룹 수에 대한 값의 순위 퍼센트를 반환.
100.PERCENTILE_CONT  연속된 분포 모델을 가정한 역 분포 함수(inverse distribution function).
101.PERCENTILE_DISC  이산 분포 모형을 가정하는 역 분포 함수.
108.RANK  값의 그룹에서 값의 순위를 계산.
117.REGR_ (Linear Regression) Functions  선형회귀함수는 정규 최소 제곱 회귀 선상을 수치 쌍의 세트에 적합.
135.STATS_BINOMIAL_TEST  단지 두개의 유효한 값이 존재하는 이분 변수(두개의 배타적인 값을 가지는 변수)에 대해서 이용되는 정확 확률 테스트.
136.STATS_CROSSTAB  교차분석(crosstab)은 두개의 명목 변수를 분석하는 방법.
137.STATS_F_TEST  STATS_F_TEST함수는 두개의 분산이 유의한 차가 있는지 테스트.
138.STATS_KS_TEST  두개의 표본이 같은 모집단에 속하고 있는지 또는 같은 분포를 가지는 모집단에 속하고 있는지 테스트 하는 Kolmogorov-Smirnov함수.
139.STATS_MODE  가장 큰 빈도를 가지는 값을 반환.
140.STATS_MW_TEST  A Mann Whitney test는 2개의 독립 표본을 비교.
141.STATS_ONE_WAY_ANOVA  일원분산분석 함수(STATS_ONE_WAY_ANOVA)는 분산의 다른 2개 추정치 비교에 의해 통계적 유의성에 대한 평균(그룹 또는 변수에 대한)의 유의한 차를 검증.
142.STATS_T_TEST_*   t검정에서는, 평균치의 차이의 유의성을 측정.
143.STATS_WSR_TEST  대응쌍표본의 윌콕스 부호 순위 검증을 수행하며,표본간의 차이가 zero로부터 유의한 차이가 있는지 검정.
144.STDDEV  Number의 조합인 expr의 표본표준편차를 반환.
145.STDDEV_POP  모집단 표준 편차를 계산하고, 모집단 분산의 제곱근값을 반환.
146.STDDEV_SAMP  누적 표본 표준편차를 계산하고, 표본 분산의 제곱근값을 반환.
148.SUM  expr의 값의 합을 반환.
195.VAR_POP  Null값들을 제거한후에 Number 세트의 모집단 분산을 반환.
196.VAR_SAMP  null들을 제거한후에 number의 세트의 표본분산을 반환.
197.VARIANCE  expr의 분산을 반환.

 
16. 분석 함수

처음메뉴로

Analytic functions compute an aggregate value based on a group of rows. They differ from aggregate functions in that they return multiple rows for each group. The group of rows is called a window and is defined by the analytic_clause. For each row, a sliding window of rows is defined. The window determines the range of rows used to perform the calculations for the current row. Window sizes can be based on either a physical number of rows or a logical interval such as time.

Analytic functions are the last set of operations performed in a query except for the final ORDER BY clause. All joins and all WHERE, GROUP BY, and HAVING clauses are completed before the analytic functions are processed. Therefore, analytic functions can appear only in the select list or ORDER BY clause.

Analytic functions are commonly used to compute cumulative, moving, centered, and reporting aggregates.


analytic_function::=
Description of analytic_function.gif follows
Description of the illustration analytic_function.gif


analytic_clause::=
Description of analytic_clause.gif follows
Description of the illustration analytic_clause.gif


query_partition_clause::=
Description of query_partition_clause.gif follows
Description of the illustration query_partition_clause.gif


order_by_clause::=
Description of order_by_clause.gif follows
Description of the illustration order_by_clause.gif


windowing_clause ::=
Description of windowing_clause.gif follows
Description of the illustration windowing_clause.gif

The semantics of this syntax are discussed in the sections that follow.


analytic_function

Specify the name of an analytic function (see the listing of analytic functions following this discussion of semantics).


arguments

Analytic functions take 0 to 3 arguments. The arguments can be any numeric datatype or any nonnumeric datatype that can be implicitly converted to a numeric datatype. Oracle determines the argument with the highest numeric precedence and implicitly converts the remaining arguments to that datatype. The return type is also that datatype, unless otherwise noted for an individual function.



analytic_clause

Use OVER analytic_clause to indicate that the function operates on a query result set. That is, it is computed after the FROM, WHERE, GROUP BY, and HAVING clauses. You can specify analytic functions with this clause in the select list or ORDER BY clause. To filter the results of a query based on an analytic function, nest these functions within the parent query, and then filter the results of the nested subquery.

Notes on the analytic_clause:
  • You cannot specify any analytic function in any part of the analytic_clause. That is, you cannot nest analytic functions. However, you can specify an analytic function in a subquery and compute another analytic function over it.

  • You can specify OVER analytic_clause with user-defined analytic functions as well as built-in analytic functions. See CREATE FUNCTION .


query_partition_clause

Use the PARTITION BY clause to partition the query result set into groups based on one or more value_expr. If you omit this clause, then the function treats all rows of the query result set as a single group.

To use the query_partition_clause in an analytic function, use the upper branch of the syntax (without parentheses). To use this clause in a model query (in the model_column_clauses) or a partitioned outer join (in the outer_join_clause), use the lower branch of the syntax (with parentheses).

You can specify multiple analytic functions in the same query, each with the same or different PARTITION BY keys.

If the objects being queried have the parallel attribute, and if you specify an analytic function with the query_partition_clause, then the function computations are parallelized as well.

Valid values of value_expr are constants, columns, nonanalytic functions, function expressions, or expressions involving any of these.


order_by_clause

Use the order_by_clause to specify how data is ordered within a partition. For all analytic functions except PERCENTILE_CONT and PERCENTILE_DISC (which take only a single key), you can order the values in a partition on multiple keys, each defined by a value_expr and each qualified by an ordering sequence.

Within each function, you can specify multiple ordering expressions. Doing so is especially useful when using functions that rank values, because the second expression can resolve ties between identical values for the first expression.

Whenever the order_by_clause results in identical values for multiple rows, the function returns the same result for each of those rows. Please refer to the analytic example for SUM for an illustration of this behavior.


Restriction on the ORDER BY Clause

When used in an analytic function, the order_by_clause must take an expression (expr). The SIBLINGS keyword is not valid (it is relevant only in hierarchical queries). Position (position) and column aliases (c_alias) are also invalid. Otherwise this order_by_clause is the same as that used to order the overall query or subquery.


ASC | DESC

Specify the ordering sequence (ascending or descending). ASC is the default.


NULLS FIRST | NULLS LAST

Specify whether returned rows containing nulls should appear first or last in the ordering sequence.

NULLS LAST is the default for ascending order, and NULLS FIRST is the default for descending order.

Analytic functions always operate on rows in the order specified in the order_by_clause of the function. However, the order_by_clause of the function does not guarantee the order of the result. Use the order_by_clause of the query to guarantee the final result ordering.



windowing_clause

Some analytic functions allow the windowing_clause. In the listing of analytic functions at the end of this section, the functions that allow the windowing_clause are followed by an asterisk (*).


ROWS | RANGE

These keywords define for each row a window (a physical or logical set of rows) used for calculating the function result. The function is then applied to all the rows in the window. The window moves through the query result set or partition from top to bottom.

  • ROWS specifies the window in physical units (rows).

  • RANGE specifies the window as a logical offset.

You cannot specify this clause unless you have specified the order_by_clause.

The value returned by an analytic function with a logical offset is always deterministic. However, the value returned by an analytic function with a physical offset may produce nondeterministic results unless the ordering expression results in a unique ordering. You may have to specify multiple columns in the order_by_clause to achieve this unique ordering.


BETWEEN ... AND

Use the BETWEEN ... AND clause to specify a start point and end point for the window. The first expression (before AND) defines the start point and the second expression (after AND) defines the end point.

If you omit BETWEEN and specify only one end point, then Oracle considers it the start point, and the end point defaults to the current row.


UNBOUNDED PRECEDING

Specify UNBOUNDED PRECEDING to indicate that the window starts at the first row of the partition. This is the start point specification and cannot be used as an end point specification.


UNBOUNDED FOLLOWING

Specify UNBOUNDED FOLLOWING to indicate that the window ends at the last row of the partition. This is the end point specification and cannot be used as a start point specification.


CURRENT ROW

As a start point, CURRENT ROW specifies that the window begins at the current row or value (depending on whether you have specified ROW or RANGE, respectively). In this case the end point cannot be value_expr PRECEDING.

As an end point, CURRENT ROW specifies that the window ends at the current row or value (depending on whether you have specified ROW or RANGE, respectively). In this case the start point cannot be value_expr FOLLOWING.


value_expr PRECEDING or value_expr FOLLOWING

For RANGE or ROW:

  • If value_expr FOLLOWING is the start point, then the end point must be value_expr FOLLOWING.

  • If value_expr PRECEDING is the end point, then the start point must be value_expr PRECEDING.

If you are defining a logical window defined by an interval of time in numeric format, then you may need to use conversion functions.


If you specified ROWS:

  • value_expr is a physical offset. It must be a constant or expression and must evaluate to a positive numeric value.

  • If value_expr is part of the start point, then it must evaluate to a row before the end point.

If you specified RANGE:

  • value_expr is a logical offset. It must be a constant or expression that evaluates to a positive numeric value or an interval literal. Please refer to "Literals " for information on interval literals.

  • You can specify only one expression in the order_by_clause

  • If value_expr evaluates to a numeric value, then the ORDER BY expr must be a numeric or DATE datatype.

  • If value_expr evaluates to an interval value, then the ORDER BY expr must be a DATE datatype.

If you omit the windowing_clause entirely, then the default is RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW.

Analytic functions are commonly used in data warehousing environments. In the list of analytic functions that follows, functions followed by an asterisk (*) allow the full syntax, including the windowing_clause.

함수명 설명
010.AVG *  지정된 컬럼에 대한 조건을 만족하는 행중에서 Null을 제외한 평균을 반환.
024.CORR *  수치 쌍에 대한 상관 계수를 반환.
028.COUNT *  쿼리에 의해 반환된 행의 수를 반환.
029.COVAR_POP *  number조합의 세트의 모집단 공분산을 반환.
030.COVAR_SAMP *  number쌍의 세트의 표본 공분산을 반환.
031.CUME_DIST  값의 그룹에 있는 값의 누적 분포치를 계산.
038.DENSE_RANK  ORDER BY절에 사용된 컬럼이나 표현식에 대하여 순위를 부여하는데 RANK()와 달리 동일 순위 다음의 순위는 동일 순위의 수와 상관없이 1 증가된 값을 돌려준다
048.FIRST  주어진 소트 지정에 대해서 FIRST 또는 LAST로서 순위를 주어서 행의 세트로부터 값의 세트에 운영하는 집계와 분석 함수.
049.FIRST_VALUE *  값의 정렬된 세트에서 첫번째 값을 반환.
060.LAG   현재 행을 기준으로 이전 값을 참조하는 함수.
061.LAST  행을 서열화 시켜서 마지막 행을 추출.
063.LAST_VALUE *  윈도우에서 정렬된 값중에서 마지막 값을 반환.
064.LEAD   현재 행을 기준으로 이후의 값을 참조하는 함수.
075.MAX *  인수중에서 최대값을 반환.
077.MIN *  인수중에서 최소값을 반환.
091.NTILE  순서화된 데이터를 expr에 의해 지정된 bucket의 수로 분한하여, 각 행을 적절한 bucket 번호를 할당.

 출력 결과를 사용자가 지정한 그룹 수로 나누어 출력하는 함수.

099.PERCENT_RANK  그룹 수에 대한 값의 순위 퍼센트를 반환.
100.PERCENTILE_CONT  연속된 분포 모델을 가정한 역 분포 함수(inverse distribution function).
101.PERCENTILE_DISC  이산 분포 모형을 가정하는 역 분포 함수.
108.RANK  값의 그룹에서 값의 순위를 계산.
109.RATIO_TO_REPORT  값의 세트의 합에 대한 값의 비율을 계산.
117.REGR_ (Linear Regression) Functions *  선형회귀함수는 정규 최소 제곱 회귀 선상을 수치 쌍의 세트에 적합.
122.ROW_NUMBER   분할별로 정렬된 결과에 대해 순위를 부여하는 기능.

 1로 시작하는 order_by_clause에서 지정된 행의 순위 순서로, 적용되는 각 행에 unique 순서를 할당.

144.STDDEV *  Number의 조합인 expr의 표본표준편차를 반환.
145.STDDEV_POP *  모집단 표준 편차를 계산하고, 모집단 분산의 제곱근값을 반환.
146.STDDEV_SAMP *  누적 표본 표준편차를 계산하고, 표본 분산의 제곱근값을 반환.
148.SUM *  expr의 값의 합을 반환.
195.VAR_POP *  Null값들을 제거한후에 Number 세트의 모집단 분산을 반환.
196.VAR_SAMP *  null들을 제거한후에 number의 세트의 표본분산을 반환.
197.VARIANCE *  expr의 분산을 반환.
 
17. Object 참조 함수

처음메뉴로

함수명 설명
040.DEREF  인수 expr의 오브젝트 참조를 반환.
074.MAKE_REF  object 인식자가 주 키로 근거하고 있는 object 테이블에서 object view의 행 또는 object 표의 행에 대한 REF를 생성.
112.REF  인수로써 오브젝트 테이블 또는 오브젝트 뷰의 행과 연관된 상관 변수(테이블 별명)를 취한다
113.REFTOHEX  인수 expr을 16진수로 변환.
194.VALUE  object 테이블에 저장된 object instance를 반환.

18. 모델 함수

처음메뉴로

함수명 설명
034.CV  포뮬러의 좌측 항에 정의된 multi-cell reference를 우측 항으로 복사하는 기능을 제공.

 우측 항 계산을 위해 좌측 항의 값 이용하기.

059.ITERATION_NUMBER  델 규칙에 따라 완료된 반복을 나타내는 정수를 반환.
105.PRESENTNNV  cell_reference가 존재하고 NULL이 아닌 경우, model_clause이 실행되기 전에 expr1을 반환.
106.PRESENTV  cell_reference가 존재할때 expr1을 반환한다. 그 이외에는 expr2를 반환.
107.PREVIOUS  각 iteration의 초기에 cell_reference의 값을 반환.

19. 기타 단일행 함수

처음메뉴로

함수명 설명
152.SYS_EXTRACT_UTC  협정 세계시간 UTC (Coordinated Universal Time—formerly Greenwich Mean Time)을 추출.
190.UPDATEXML  XMLType인스턴스와 XPath값 쌍을 취하고, 업데이트된 값을 가지는 XMLType 인스턴스를 반환.


 
Posted by 1010
02.Oracle/DataBase2009. 4. 28. 13:51
반응형
나른한 점심시간.
비몽사몽중에 다음과 같은 업무요건가 들어왔다.
A 라는 테이블에서 errcode 가 309 이고 pt_no 가 3 이상인 모든 데이터를 지워라.

sql 로 표현하면 다음과 같은 쿼리가 나온다.

delete from A where errcode = '309' and pt_no >= 3;
commit;

하지만 쿼리를 다음과 같이 잘못 작성한 무대리.
delete from A where pt_no >= 3;
commit;

commit 하고 담배를 피고 와서 select 를 해보니
아뿔사!! pt_no 가 3 이상인 모든 데이터가 지워진 것이다.
commit 까지 했으니 돌릴 방법이 없을 것 같아
조용히 도망치는 무대리!!

하지만 다음 쿼리로 commit 까지 마친 delete 컬럼에 대해서 복구를 할 수 있다.

INSERT INTO A
SELECT *
FROM A
AS OF TIMESTAMP(SYSTIMESTAMP - INTERVAL '15' MINUTE);

현재 시간 기준으로 15분 이내의 데이터들을 모두 복구하는 쿼리!

멋지다 오라클!

 hanho9@nate.com
Posted by 1010
02.Oracle/DataBase2009. 4. 28. 13:13
반응형

오라클에서의 데이터 암호화 기능

1. 설 명

☞ Bulletin no : 12036 참고

 
Oracle 8i Release2(8.1.6)에서는 데이터를 암호화하여 저장할 수 있는
향상된 기능(DES Encryption)을 제공 합니다
 
 
신용카드번호, 패스워드 등 보안이 필요한 데이터를 암호화된 형태로 저장하여
기존의 3rd Party Tool이나, Application Logic으로 구현하던 암호화 정책을
데이터베이스 차원에서 구현할 수 있도록 해줍니다.
 
일단 암호화의 결과의 길이는 8의 배수로 나옵니다.
자리수가 8이하는 8자리, 8초과 16이하는 16자리...
'123'을 암호화하면 그 자리수는 8자리가 나오지요

 
DBMS_OBFUSCATION_TOOLKIT

암호화 기능을 이용하려면 DBMS_OBFUSCATION_TOOLKIT을 이용해야 합니다.
 
 
이 패키지는 4개의 프로시져로 이루어져 있습니다.

- VARCHAR2 타입을 Encrypt/Decrypt할 수 있는 2개의 프로시져

- RAW 타입을 Encrypt/Decrypt할 수 있는 2개의 프로시져
(다른 타입은 지원하지 않으므로 number인 경우는 to_char 이용)
 
 

DBMS_OBFUSCATION_TOOLKIT을 이용하기 위해서는 :

1) SYS 유저로 아래의 스크립트를 실행 시킵니다.

   @$ORACLE_HOME/rdbms/admin/dbmsobtk.sql
   @$ORACLE_HOME/rdbms/admin/prvtobtk.plb
   
2) 권한을 부여 합니다.

   SQL>GRANT execute ON dbms_obfuscation_toolkit TO public;



2. 패키지 실행하기



--> 패키지 선언부 생성

CREATE OR REPLACE PACKAGE CryptIT AS
   FUNCTION encrypt( Str VARCHAR2,  
                     hash VARCHAR2 ) RETURN VARCHAR2;

   FUNCTION decrypt( xCrypt VARCHAR2,
                     hash VARCHAR2 ) RETURN VARCHAR2;
END CryptIT;
/
 
 
 
--> 패키지 본체 생성

CREATE OR REPLACE PACKAGE BODY CryptIT AS
   crypted_string VARCHAR2(2000);
 
   FUNCTION encrypt( Str VARCHAR2,  
                     hash VARCHAR2 ) RETURN VARCHAR2 AS
   pieces_of_eight INTEGER := ((FLOOR(LENGTH(Str)/8 + .9)) * 8);
 
   BEGIN
 
      dbms_obfuscation_toolkit.DESEncrypt(
               input_string     => RPAD( Str, pieces_of_eight ),
               key_string       => RPAD(hash,8,’#’),
               encrypted_string => crypted_string );
      RETURN crypted_string;
   END;
 
   FUNCTION decrypt( xCrypt VARCHAR2,
                     hash VARCHAR2 ) RETURN VARCHAR2 AS
   BEGIN
      dbms_obfuscation_toolkit.DESDecrypt(
               input_string     => xCrypt,
               key_string       => RPAD(hash,8,’#’),
               decrypted_string => crypted_string );
      RETURN trim(crypted_string);
   END;
END CryptIT;
/

 



3. 실행 예제


1) Encrypt하여 데이터 입력

-- 테스트 테이블을 생성 합니다.

SQL>create table encrypt_table( id number, passwd varchar(20) );


 
-- 테스트 데이트럴 입력 합니다.
-- CryptIT.encrypt(비밀번호, 키값)

SQL>INSERT INTO encrypt_table VALUES( 1, CryptIT.encrypt(’1234’, ’storm’));
1 개의 행이 만들어졌습니다.

 
SQL>INSERT INTO encrypt_table VALUES( 2, CryptIT.encrypt(’5678’, ’oramaster’));
1 개의 행이 만들어졌습니다.

 
 
2) Decrypt하여 데이터 조회
 
--> Decrypt하지 않으면 암호화된 데이터와 비교되서 결과값이 출력되지 않습니다.
SQL> select id, passwd from encrypt_table where passwd = ’1234’;
 
선택된 레코드가 없습니다.
 
 
--> 저장장치에 Encrypt된 값으로 저장 됩니다.

SQL> col passwd format a60
SQL> select id, dump(passwd) passwd from encrypt_table;

         ID PASSWD
---------- -------------------------------------------------------------
         1 Typ=1 Len=8: 246,27,80,184,227,225,245,31
         2 Typ=1 Len=8: 175,231,213,125,85,223,46,133
 


--> Encrypt할 때 사용한 Key로만 Decrypt할 수 있습니다.
 
SQL>SELECT id, CryptIT.decrypt(passwd,’storm’) passwd
       FROM encrypt_table
       WHERE CryptIT.decrypt(passwd,’storm’) = ’1234’;
 
        ID PASSWD
---------- -----------
         1 1234
 
 
SQL>SELECT id, CryptIT.decrypt(passwd,’oramaster’) passwd
    FROM encrypt_table
    WHERE CryptIT.decrypt(passwd,’oramaster’) = ’5678’;
 
        ID PASSWD
---------- -----------
         2 5678
 
 
주의) Table에 접근 권한이 있는 다른 유저도 Key값을 알면 Decrypt할 수 있습니다.
 
 
 
4) 관련 ORA error number
 
ORA error 28231 "Invalid input to Obfuscation toolkit"
- input data, key값이 NULL일 경우 발생
 
ORA error 28232 "Invalid input size for Obfuscation toolkit"
- input data가 8 bytes 배수가 아닐 경우 발생
 
ORA error 28233 "Double encryption not supported by DESEncrypt in Obfuscation toolkit"
- encrypt data를 다시 encrypt경우 발생
 

관 련 자 료
===========
Oracle8i Supplied PL/SQL Packages Reference Release 2 (8.1.6)

 
암호화 하는 프로시저 소스를 암호화하여 보안하자~
암호화 Stored Function을 하나 만들어 wrap사용하시면 됩니다.

복호화는 만들지 안으시는게 좋습니다. (정히 필요하시면 만드시고)
복호화 함수가 있으면 개발자에 의하여 노출될 우려가 있습니다.

암호화 Stored Function => sf_encrypt
wrap iname=/mydir/sf_encrypt.sql oname=/mydir/sf_encrypt.plb
/mydir/sf_encrypt.plb 파일를 이용하여 DB에 rap된 sf_encrypt를 만들고


입력
INSERT INTO encrypt_table VALUES( 1, sf_encrypt('1234'));

SELECT id, '*****' as passwd
FROM encrypt_table
WHERE passwd = sf_encrypt('1234');

이런식으로 사용하시면 인덱스 사용 가능합니다.
 
 
 
========================================================================================================================
========================================================================================================================
 
 
 
일부 서비스에 대해 오라클 DB 버전을 9i에서 10g로 변경하면서, 암호화 패키지 CRYPTIT에서 일부 문제가 있었다.

9i에서 암호화된 테이블을 10g로 가져와서 다음과 같이 decrypt 를 쿼리하면 에러가 발생했다.

select CRYPTIT.decrypt(passwd, 'keyvalue) from user_tbl

ORA-28232: obfuscation 툴킷에 부적합한 입력 길이입니다.
ORA-06512: "SYS.DBMS_OBFUSCATION_TOOLKIT_FFI", 줄 40에서
ORA-06512: "SYS.DBMS_OBFUSCATION_TOOLKIT", 줄 153에서
ORA-06512: "WLOWN.CRYPTIT", 줄 20에서


처음에는 일부 데이터는 정상으로 조회되길래 무슨 문제인가 찾아봐도 뽀죡한 답변을 못찾았다.

좀 삽질하다가 9i와 10g의 sys user의 DBMS_OBFUSCATION_TOOLKIT의 함수내용이 틀린 것을 보고,
암호화 데이터를 다시 갱신해 줫다.

update user_tbl set passwd = CRYPTIT.encrypt(raw_pass, 'keyvalue')

그런후 다시 조회하니 잘 된다. 역시 오라클 버전이 틀려짐에 따라 암호화 내용이 달라진 거 같다.



=========================================================================================================================

=========================================================================================================================




CREATE OR REPLACE PACKAGE CRYPTIT
AS
   FUNCTION ENCRYPT (STR VARCHAR2)
      RETURN VARCHAR2;

   FUNCTION DECRYPT (XCRYPT VARCHAR2)
      RETURN VARCHAR2;
END CRYPTIT;
/



CREATE OR REPLACE PACKAGE BODY CRYPTIT
AS
   CRYPTED_STRING   VARCHAR2 (2000);
   HASH_KEY   VARCHAR2 (10) := '암호화키';

   FUNCTION ENCRYPT (STR VARCHAR2)
      RETURN VARCHAR2
   AS
      PIECES_OF_EIGHT   INTEGER := ((FLOOR (LENGTH (STR) / 8 + .9)) * 8);
   BEGIN
      DBMS_OBFUSCATION_TOOLKIT.DESENCRYPT (INPUT_STRING          => RPAD (STR, PIECES_OF_EIGHT)
                                         , KEY_STRING            => RPAD (HASH_KEY, 8, '#')
                                         , ENCRYPTED_STRING      => CRYPTED_STRING
                                          );
      RETURN CRYPTED_STRING;
   END;

   FUNCTION DECRYPT (XCRYPT VARCHAR2)
      RETURN VARCHAR2
   AS
   BEGIN
      DBMS_OBFUSCATION_TOOLKIT.DESDECRYPT (INPUT_STRING          => XCRYPT
                                         , KEY_STRING            => RPAD (HASH_KEY, 8, '#')
                                         , DECRYPTED_STRING      => CRYPTED_STRING
                                          );
      RETURN TRIM (CRYPTED_STRING);
   END;
END CRYPTIT;
/

Posted by 1010