Detail
'tablespace'Search Results Total 620
AID (Altibase Information Directory)
-
- 8. Tablespace(TBS)ㅣ 2016-08-01
- Tablespace (TBS)TS 테이블스페이스 정보를 확인하기 위한 각 모니터링 요소에 대응하는 쿼리는 아래와 같다. [TS01] 메모리 테이블스페이스 사용량TS01[맨 위로] 알티베이스 5.5.1 이상 버전에서 사용할 수
- [Technical Documents(한국어)]
-
- Tablespaceㅣ 2012-04-05
- CREATE TABLESPACE ALTIBASE HDB has two types of tablespace. Those are Memory tablespace and Disk tablespace. Oracle's tablespace is disk tablespace. Therefore, When converting oracle to altibase, user specifies statement like "CREATE [ DISK ] [ DATA ] TABLES
- [Technical Documents(English)]
QnA
-
- Tablespace 오류 문의 ㅣ 2020-01-20
- 안녕하세요. 알티베이스 입니다. The tablespace does not have enough free space" 라는 오류가 발생하는 것으로 보아 해당 테이블이 속해있는 테이블스페이스 사용량이 100%인 것으로 보입니다. 참고로 delete를
-
미리보기
안녕하세요. 알티베이스 입니다. The tablespace does not have enough free space" 라는 오류가 발생하는 것으로 보아 해당 테이블이 속해있는 테이블스페이스 사용량이 100%인 것으로 보입니다. 참고로 delete를
-
- tablespace 문의 ㅣ 2018-02-13
- tablespaces c where a.user_id=b.user_id and c.id=a.tbs_id ; 3. 마찬가지로 access 권한 때문에 그런 것 같습니다. 해당 테이블스페이스에 access 권한을 주신 후 재시도 해보시기 바랍니다. 추가문의 있으시면 답글
-
미리보기
tablespaces c where a.user_id=b.user_id and c.id=a.tbs_id ; 3. 마찬가지로 access 권한 때문에 그런 것 같습니다. 해당 테이블스페이스에 access 권한을 주신 후 재시도 해보시기 바랍니다. 추가문의 있으시면 답글
Technical Documents
-
- [백서] ALTIBASE_백서_Altibase User Memory Tablespace ㅣ 2012-09-26
-
미리보기
-
- Altibase Quick Install & Start for UNIX ㅣ 2012-09-26
- TABLESPACE sys_tbs_disk_data ACCESS sys_tbs_mem_data ON; 사용한 각 입력 부분은 다음과 같다. 입력 항목 설명 CREATE USER 이후 새롭게 만들 사용자의 이름을 기술한다. IDENTIFIED BY 이후 사용자의 비밀번
-
미리보기
Copyright ⓒ 2000~2013 ALTBASE Corporation. All Rights Reserved. Real Alternative DBMS ALTIBASE, Since 1999 ALTIBASE Quick Install UNIX ALTIBASE 5 2010. 03 ALTIBASE Quick Install UNIX 2 page of 18 Document Control Change Record Date Author Change Reference 2010-03-19 lim272 Created Reviews Date Name (Position) Distribution Name Location ALTIBASE Quick Install UNIX 3 page of 18 목차 개요 .................................................................................................................................................... 4 설치 .................................................................................................................................................... 5 사전 절차 ..................................................................................................................................... 5 패키지 압축 해제 ....................................................................................................................... 5 라이센스 설치 ............................................................................................................................. 6 프로퍼티 설정 ............................................................................................................................. 7 32비트 제품의 설치 .................................................................................................................. 8 DB 생성 및 구동 .............................................................................................................................. 9 DB생성 ......................................................................................................................................... 9 ALTIBASE 구동 ........................................................................................................................ 11 ALTIBASE 종료 ........................................................................................................................ 13 간단한 사용 예 ............................................................................................................................... 14 Altibase Technical Center............................................................................................................ 14 iSQL ............................................................................................................................................ 14 DB 사용자의 생성 및 삭제 .................................................................................................... 15 테이블스페이스의 생성 및 삭제 ........................................................................................... 16 테이블의 생성 및 삭제 ........................................................................................................... 16 ALTIBASE Quick Install UNIX 4 page of 18 개요 본 문서는 ALTIBASE 제품을 설치하고 구동/종료하는 방법에 대해 기본적인 내용을 설명한다. 기본적인 설치 이후 성능 개선을 위한 프로퍼티의 변경 및 개선은 별도의 문서로 제공되니 해당 문서를 참고하도록 한다. 참고할 문서 1. 디스크IO 병목을 고려한 볼륨 구성 가이드 2. ALTIBASE 용량 산정 가이드 3. 효율적인 이중화 구성 가이드 4. 각 운영체제 별 사전 환경 설정과 관련된 가이드 문서 5. ALTIBASE 설정 파일 가이드 ALTIBASE Quick Install UNIX 5 page of 18 설치 사전 절차 1. 시스템 내에 ALTIBASE 설치를 위한 사용자 계정이 있어야 한다. 2. 해당 사용자 계정에 최소한 다음의 환경변수를 설정해야 한다. ALTIBASE_HOME=/home/altibase // 이 경로는 임의의 예시임. PATH=$ALTIBASE_HOME/bin:$PATH LD_LIBRARY_PATH=$ALTIBASE_HOME/lib:$LD_LIBRARY_PATH 위 환경변수는 사용자 계정의 쉘의 종류에 따라 다를 수 있음으로 환경에 맞게 적절하게 설정하도록 한다. 위 환경변수를 제대로 설정하였다면 프롬프트 상 다음의 결과들이 보여야 한다. Shell> echo $ALTIBASE_HOME /home/altibase // 사용자가 지정한 경로가 보여야 함. Shell> echo $PATH /home3/lim272/pkgs/jdk1.6.0_10/bin:/home/altibase/bin:/usr/java/bin Shell> echo LD_LIBRARY_PATH /home/altibase/lib:/home3/lim272/unixODBC/lib: 패키지 압축 해제 사용자는 ATC(http://atc.altibase.com) 또는 ALTIBASE로부터 다음과 같은 형태의 패키지를 받을 수 있다. 해당 패키지에는 운영체제의 정보 및 컴파일 비트, 제품의 버전 정보 등이 직관적으로 기술되어 있음으로 적합한 제품 패키지를 요청하거나 다운받도록 한다. ATC에는 최신 패키지만 존재하기 때문에 만일 사용자가 얻고자 하는 특정 버전 또는 특정 운영체제의 패키지가 없을 경우 아래로 연락을 취하면 된다. (02) 2082-1114 또는 support@altibase.com 정확한 제품 패키지의 제공을 위해 사용자는 운영체제, CPU, Memory Size, 컴파일러 및 진행 프로젝트에 대한 정보를 제공해야 한다. 제품 패키지의 파일명의 예 altibase-XEON_LINUX_redhat_Enterprise_AS4-64bit-5.3.3.2-release-GCC3.4.6.tgz ALTIBASE Quick Install UNIX 6 page of 18 압축 해제 방법 Shell> gzip -dc altibase-XXX.tgz | tar xvf - README admin/ admin/adminview.sql admin/showTables.sql admin/showReplications.sql admin/showProcBody.sql admin/tracelog.sql ……생략….. ALTIBASE를 설치할 적절한 디렉토리에 위의 패키지 파일을 위치시킨 후 위와 같이 gzip 및 tar 명령을 통해 압축을 해제하는 것만으로 ALTIBASE 설치는 완료된다. 본 문서는 기본 설치 및 구동에 대한 부분임으로 설치 후 사용자가 확인할 주요 디렉토리들만 설명한다. (상세한 것은 매뉴얼을 참고하도록 한다.) 디렉토리 설명 admin 성능뷰를 쉽게 볼 수 있는 예제 SQL 및 View 생성 파일 bin ALTIBASE 실행 파일 및 유틸리티 include 응용 프로그램 개발을 위해 제공되는 헤더파일 install 응용 프로그램 개발을 위한 makefile prefix 예 lib 응용 프로그램 개발을 위해 제공되는 라이브러리 sample 응용 프로그램의 예제 프로그램 소스 trc ALTIBASE 상태 정보가 기록되는 Trace 로그파일 위치 conf ALTIBASE 설정 파일의 위치 및 예제 파일, 라이센스 파일의 위치 logs 트랜잭션 로그파일의 기본 경로 (압축 해제 시 빈 디렉토리) dbs 데이터파일의 기본 경로 (압축 해제 시 빈 디렉토리) 라이센스 설치 압축 해제 후 DB생성 및 제품의 구동을 위해서는 반드시 라이센스를 필요로 한다. 라이센스의 요청은 다음과 같이 할 수 있다. 1. http://atc.altibase.com 에서 신청하여 받는 방법 2. support@altibase.com 으로 라이센스 요청 ALTIBASE Quick Install UNIX 7 page of 18 라이센스 발급을 위해서는 사용자의 시스템 정보 및 설치할 ALTIBASE의 버전 정보를 반드시 제공해야 한다. Shell> ulimit -a Shell> altibase -v 기타 CPU종류 및 Clock, 메모리의 크기 정보를 제공해야 함. 위와 같은 방법을 통해 받은 라이센스 파일은 확장자 없이 “license”라는 파일 이름으로 $ALTIBASE_HOME/conf/ 디렉토리 밑에 복사하면 된다. 프로퍼티 설정 ALTIBASE 설정 파일은 $ALTIBASE_HOME/conf/altibase.properties 라는 파일로 저장한다. 패키지를 압축 해제하면 $ALTIBASE_HOME/conf/altibase.properties.sample이라는 파일이 존재하는데 해당 파일을 “altibase.properties” 라는 이름으로 동일 디렉토리에 복사하면 된다. 확인 사항 Shell> ls $ALTIBASE_HOME/conf altibase.properties.sample altibase.properties license DB생성 전에 먼저 altibase.properties파일에 수정할 사항이 몇 가지 존재하는데 본 문서에서는 PORT_NO만 수정하고 나머지 항목은 별도의 문서로 제공하기 때문에 해당 문서를 참고하도록 한다. (『ALTIBASE 설정 파일 가이드』) 다음의 항목을 vi 와 같은 편집기를 통해 수정하고 저장하면 된다. Shell> vi $ALTIBASE_HOME/conf/altibase.properties … …. PORT_NO = 20300 … PORT_NO를 시스템 내에 중복되지 않는 번호로 적절하게 설정한다. (변경하지 않아도 되며 이후에라도 사용자가 변경 가능하다.) 위와 같은 작업까지 마무리 하면 모든 설치 작업은 완료된다. 작업 요약 1. 사용자 계정 생성 및 최소 환경변수 설정 2. 설치 파일 준비 및 ALTIBASE 사용자 계정의 $ALTIBASE_HOME 디렉토리에 압축 해제 3. 라이센스 파일 준비 후 $ALTIBASE_HOME/conf/에 복사 4. $ALTIBASE_HOME/conf/altibase.properties 파일 생성 ALTIBASE Quick Install UNIX 8 page of 18 32비트 제품의 설치 ALTIBASE는 공식적으로 32비트 DBMS 제품을 제공하지 않는다. 단, 클라이언트 제품에 대해 개발을 위한 패키지를 제공한다. 클라이언트의 제품은 패키지 이름 앞에 “altibase-client” 라는 이름으로 시작한다. 제품 패키지에는 컴파일러 정보가 포함되기 때문에 gcc/g++ 을 사용할 경우 해당 컴파일러의 버전을 사전에 확인하도록 한다. 클라이언트 제품 역시 위에서 설명한 것과 같이 gzip/tar를 통해 압축을 해제하는 것으로 설치가 완료된다. ALTIBASE Quick Install UNIX 9 page of 18 DB 생성 및 구동 본 장에서는 DB를 생성하고 ALTIBASE를 구동/종료하는 방법을 설명한다. 문서 내에 “$ALTIBASE_HOME/bin” 이라고 표기된 부분은 환경변수인 $ALTIBASE_HOME이 설정되어 있고 PATH에 잡혀 있는 경우 생략이 가능하다. DB생성 설치 작업까지 완료되었다면 DB를 생성하도록 한다. 본 문서는 사용자가 이해하기 쉬운 형태로 설명한다. (여기서는 ALTIBASE 5.3 기준으로 설명한다.) Shell> $ALTIBASE_HOME/bin/server create MS949 UTF8 Shell> $ALTIBASE_HOME/bin/server create US7ASCII UTF8 ALTIBASE는 사용자가 쉽게 DB를 생성할 수 있도록 “server” 라는 쉘 스크립트를 제공하고 있다. 해당 스크립트는 생성 시에 2개의 인자를 입력 받도록 되어 있다. 첫 번째는 DB전체의 문자셋을 의미하며 두 번째는 NVARCHAR의 유니코드 문자셋을 지정한다. 일반적으로 한글을 사용할 경우라면 MS949/KO16KSC5601을 첫 번째 인자로 사용하고 유니코드 사용이 필요하다면 UTF8을 사용한다. 두 번째 인자 값은 UTF8/UTF16 중에 하나를 선택한다. 만일, 사용자가 $ALTIBASE_HOME/conf/altibase.properties 안에 “DB_NAME”을 바꾼 경우라면 해당 스크립트는 동작하지 않는다. 이 경우에는 $ALTIBASE_HOME/bin/server 스크립트를 vi와 같은 편집기를 통해 “mydb”라고 된 부분을 설정 파일에서 바꾼 “DB_NAME”의 값으로 동일하게 변경한 후 사용하면 된다. 정상적으로 DB생성 작업이 수행되면 다음의 리두로그 파일 및 데이터 파일들이 생성되어야 한다. 경로 파일 명 $ALTIBASE_HOME/logs loganchor0 loganchor1 loganchor2 logfile0 logfile1 logfile2 logfile3 logfile4 logfile5 $ALTIBASE_HOME/dbs SYS_TBS_MEM_DIC-0-0 SYS_TBS_MEM_DIC-0-1 SYS_TBS_MEM_DATA-0-0 SYS_TBS_MEM_DATA-0-0 System001.dbf undo001.dbf temp001.dbf dwfile0.dwf dwfile1.dwf 정식적인 DB생성 방법은 『ALTIBASE DB생성 가이드 문서』를 참고하여도 된다. 정상적으로 생성되는 경우는 다음과 같이 화면에 나타난다. Shell> server create MS949 UTF8 ----------------------------------------------------------------- Altibase Client Query utility. Release Version 5.3.3.5 ALTIBASE Quick Install UNIX 10 page of 18 Copyright 2000, ALTIBASE Corporation or its subsidiaries. All Rights Reserved. ----------------------------------------------------------------- ISQL_CONNECTION = UNIX, SERVER = 127.0.0.1, PORT_NO = 27584 [ERR-910FB : Connected to idle instance] // 이 에러는 무시하도록 한다. Connecting to the DB server... Connected. TRANSITION TO PHASE : PROCESS Command execute success. DB Info (Page Size = 32768) (Page Count = 257) (Total DB Size = 8421376) (DB File Size = 1073741824) Creating MMDB FILES [SUCCESS] Creating Catalog Tables [SUCCESS] Creating DRDB FILES [SUCCESS] [SM] Rebuilding Indices [Total Count:0] [SUCCESS] DB Writing Completed. All Done. Create success. Shell> _ 만일, 라이센스가 정상적으로 생성하지 않은 경우 DB생성 및 구동 단계에서 다음과 같은 오류가 발생한다. Shell> server create MS949 UTF8 Altibase Client Query utility. Release Version 5.3.3.5 Copyright 2000, ALTIBASE Corporation or its subsidiaries. All Rights Reserved. ----------------------------------------------------------------- ISQL_CONNECTION = UNIX, SERVER = 127.0.0.1, PORT_NO = 27584 [ERR-910FB : Connected to idle instance] Connecting to the DB server... Connected. TRANSITION TO PHASE : PROCESS License File(/home3/lim272/work/altibase_home/conf/license) does not exist HostID->007f0100 [FAILURE] License File does not exist. Startup Failed.... [ERR-91015 : Communication failure.] Shell> _ ALTIBASE Quick Install UNIX 11 page of 18 이미 다른 이유로 기존에 DB가 생성된 경우는 다음과 같은 오류가 발생함으로 이때에는 기존 데이터파일들을 삭제하거나 별도의 경로를 지정하여 DB를 생성하여야 한다. (기존 사용 중인 파일을 삭제할 경우는 신중하게 결정하도록 한다.) [ERR-11136: The LogAnchor file already exists (File Name: /home3/lim272/work/altibase_home/logs/loganchor0).] // 로그앵커 파일 중복 또는, [ERR-11025: The data file already exists (File Name: /home3/lim272/work/altibase_home/dbs/SYS_TBS_MEM_DIC-0-0).] // 데이터 파일 중복 오류 앞에서 설명한 프로퍼티 파일을 설정하지 않을 경우 접속에서 다음과 같이 “PORT_NO=0”으로 표기되면서 접속 시도조차 하지 못하게 된다. 이 경우에는 본 문서의 “프로퍼티 설정” 부분을 참고하도록 한다. Shell> server create MS949 UTF8 ----------------------------------------------------------------- Altibase Client Query utility. Release Version 5.3.3.5 Copyright 2000, ALTIBASE Corporation or its subsidiaries. All Rights Reserved. ----------------------------------------------------------------- Write PortNo (default:20300) : ISQL_CONNECTION = UNIX, SERVER = 127.0.0.1,PORT_NO = 0 [ERR-910FB : Connected to idle instance] ALTIBASE 구동 위와 같이 DB 생성이 완료되어야 정상적인 ALTIBASE 구동이 가능하다. ALTIBASE 구동 방법은 다음과 같다. Shell> $ALTIBASE_HOME/bin/server start 만일, 앞의 과정들을 모두 수행했음에도 구동이 되지 않는 경우 $ALTIBASE_HOME/trc/altibase_boot.log 를 열어 어떤 오류가 발생하였는지 확인할 수 있다. 일반적으로 라이센스 파일의 오류나 DB생성에 문제가 있는 경우 구동이 되지 않을 수 있음으로 이를 먼저 점검하고 문제가 없다면 support@altibase.com 으로 altibase_boot.log를 첨부하여 이메일을 통해 문의하면 된다. 서버를 구동하는 방법은 위의 쉘 명령 외에 다음 방법으로도 가능하다. Shell> isql -sysdba // DBA 권한의 DB user ID/Password를 입력해야 함. iSQL> startup service; 정상적인 구동 시 다음과 같이 진행 과정이 나타난다. Shell> server start ----------------------------------------------------------------- Altibase Client Query utility. Release Version 5.3.3.5 Copyright 2000, ALTIBASE Corporation or its subsidiaries. ALTIBASE Quick Install UNIX 12 page of 18 All Rights Reserved. ----------------------------------------------------------------- ISQL_CONNECTION = UNIX, SERVER = 127.0.0.1, PORT_NO = 27584 [ERR-910FB : Connected to idle instance] Connecting to the DB server...... Connected. TRANSITION TO PHASE : PROCESS TRANSITION TO PHASE : CONTROL TRANSITION TO PHASE : META [SM] Recovery Phase - 1 : Preparing Database : Dynamic Memory Version => Parallel Loading [SM] Recovery Phase - 2 : Loading Database ….. …..중간 생략….. TRANSITION TO PHASE : SERVICE [CM] Listener started : TCP on port 27584 [CM] Listener started : UNIX [RP] Initialization : [PASS] --- STARTUP Process SUCCESS --- Command execute success. Shell> _ 만일, 앞서 설명한 환경변수 이 제대로 설정되어 있지 않으면 다음과 같이 오류가 발생한다. Shell> server start /bin/sql: No such file or directory 라이센스가 없는 경우는 위에 “DB생성”과 유사한 오류가 발생한다. DB생성을 하지 않은 경우는 다음과 같은 오류가 발생한다. Shell> server start ISQL_CONNECTION = UNIX, SERVER = 127.0.0.1, PORT_NO = 27584 [ERR-910FB : Connected to idle instance] Connecting to the DB server...... Connected. TRANSITION TO PHASE : PROCESS TRANSITION TO PHASE : CONTROL [FAILURE] The log anchor file does not exist or it is not valid. Startup Failed.... [ERR-91015 : Communication failure.] ALTIBASE Quick Install UNIX 13 page of 18 ALTIBASE 종료 ALTIBASE의 종료는 다음과 같이 수행한다. Shell> server stop 서버를 종료하는 방법은 위의 쉘 명령 외에 정식적으로 3가지 방법을 제공하고 있다. Shell> isql -sysdba // DBA 권한의 DB user ID/Password를 입력해야 함. iSQL> shutdown abort; iSQL> shutdown immediate; iSQL> shutdown normal; 옵션 설명 abort 현재 접속된 모든 세션을 강제 종료시키고 즉시 구동을 중지한다. 프로세스를 중지하기 때문에 정상적인 shutdown과정 없이 즉시 종료한다. (이후 데이터 복구에는 아무런 문제가 없음.) immediate 현재 접속된 모든 세션을 강제 종료시키고 정상적인 shutdown과정을 거쳐 중지한다. normal 현재 접속된 모든 세션이 정상 종료하기를 대기한 이후에 정상적인 shutdown과정을 거쳐 중지한다. “normal” 옵션을 사용하는 경우 세션이 종료하기를 기다려야 하기 때문에 이런 이유를 인지하지 못한 채 서버를 중지하면 shutdown과정이 진행되지 않는 것처럼 착각할 수 있음으로 사용에 주의를 필요로 한다. 정상적인 종료 시 다음과 같이 진행 과정이 나타난다. Shell> server stop ----------------------------------------------------------------- Altibase Client Query utility. Release Version 5.3.3.5 Copyright 2000, ALTIBASE Corporation or its subsidiaries. All Rights Reserved. ----------------------------------------------------------------- ISQL_CONNECTION = UNIX, SERVER = 127.0.0.1, PORT_NO = 27584 Ok..Shutdown Proceeding.... TRANSITION TO PHASE : Shutdown Altibase [RP] Finalization : PASS shutdown immediate success. Shell> _ 서버 종료 단계에서는 메모리DB의 이미지를 디스크로 내리는 과정 등이 포함되어 있기 때문에 디스크I/O성능이 느리거나 직전 트랜잭션이 대량의 변경 작업을 수행한 경우에는 트랜잭션 롤백(Rollback) 작업 등을 수행해야 하기 때문에 느리게 진행될 수 있음을 감안해야 한다. ALTIBASE Quick Install UNIX 14 page of 18 간단한 사용 예 본 장에서는 DB사용자의 생성 및 테이블스페이스의 생성이나 테이블의 생성 정도만을 간단하게 예로 설명한다. ALTIBASE는 SQL92표준을 준수하기 때문에 다른 DBMS와 구문상의 큰 차이는 없다. 자세한 SQL문의 사용과 같은 사용법에 대해서는 ALTIBASE가 제공하는 매뉴얼을 참조하도록 한다. Altibase Technical Center ALTIBASE 테크니컬 웹사이트인 http://atc.altibase.com에서 매뉴얼을 확인할 수 있으며 사용 중 궁금한 사항에 대한 답변 및 기술적인 자료를 확인할 수 있다. iSQL ALTIBASE는 사용자가 SQL문을 터미널에서 사용할 수 있도록 제공하는 유틸리티 프로그램이다. DB를 생성한 시점에는 “sys” 라는 DBA권한의 사용자만 존재하기 때문에 $ALTIBASE_HOME/bin/is 만 실행해도 가능하다. (“is”는 isql을 쉽게 사용하도록 만든 쉘 스크립트이다.) Shell> $ALTIBASE_HOME/bin/is Shell> isql -u sys -p manager -s 127.0.0.1 -port 20300 각 입력 옵션은 다음과 같다. 입력 옵션 설명 -u DB 사용자의 계정 이름 -p DB 사용자의 계정 비밀번호 -s 접속 대상 DB가 위치하는 네트웍 IP 주소 -port 접속 대상 DB에 설정한 PORT_NO 만일, DB문자셋을 US7ASCII로 설정하지 않은 경우에는 DB를 생성할 때 지정하였던 문자셋을 환경변수로 잡아야 한다. 다음과 같이 하면 된다. DB생성 시점에 아래와 같이 MS949를 문자셋으로 하였다면 Shell> server create MS949 UTF8 Shell> export ALTIBASE_NLS_USE=MS949 라고 명시적으로 문자셋을 환경변수에 지정하여야만 한글을 입/출력하는데 있어 올바르게 처리가 된다. 만일, 위 환경변수를 설정했음에도 한글이 깨진 글자체로 보일 경우가 발생하는데 그런 경우는 사용하는 터미널의 환경을 한글 사용이 가능하도록 설정하여야 한다. ALTIBASE Quick Install UNIX 15 page of 18 접속 후의 간단한 SQL실행 결과 Shell> isql -u sys -p manager -s 127.0.0.1 -port 27584 ----------------------------------------------------------------- Altibase Client Query utility. Release Version 5.3.3.5 Copyright 2000, ALTIBASE Corporation or its subsidiaries. All Rights Reserved. ----------------------------------------------------------------- ISQL_CONNECTION = TCP, SERVER = 127.0.0.1, PORT_NO = 27584 iSQL> select sysdate from dual; SYSDATE --------------- 19-MAR-2010 1 row selected. iSQL> _ DB 사용자의 생성 및 삭제 ALTIBASE는 기본적으로 “sys” 계정이라는 DBA권한을 가진 사용자가 생성되어 있다. 이 계정으로 접속하여 새로운 사용자를 만들 수 있다. iSQL> CREATE USER new_user IDENTIFIED BY new_user DEFAULT TABLESPACE sys_tbs_disk_data ACCESS sys_tbs_mem_data ON; 사용한 각 입력 부분은 다음과 같다. 입력 항목 설명 CREATE USER 이후 새롭게 만들 사용자의 이름을 기술한다. IDENTIFIED BY 이후 사용자의 비밀번호를 기술한다. DEFAULT TABLESPACE 이후 이 부분부터는 기술하지 않아도 사용자는 생성 가능하다. 다만, 접근 가능한 테이블스페이스를 명시해 주는 절이며 “ALTER USER” 구문을 통해 변경이 가능하다. ACCESS ~ ON ACCESS ~ ON 사이에 기술된 테이블스페이스에 접근 가능하도록 권한을 부여한다. 사용자의 삭제는 다음과 같이 한다. iSQL> DROP USER new_user CASCADE; ALTIBASE Quick Install UNIX 16 page of 18 테이블스페이스의 생성 및 삭제 디스크 테이블스페이스의 생성 예로 설명한다. iSQL> CREATE TABLESPACE test_tbs1 DATAFILE ‘test001.dbf’ SIZE 10M AUTOEXTENT ON MAXSIZE 100M; 정상적으로 위 구문과 같은 예로 수행하면 “$ALTIBASE_HOME/dbs/test001.dbf” 라는 데이터파일이 생성되며 해당 테이블스페이스는 초기 10M부터 시작하여 100M까지 자동 확장되어 사용 가능한 공간으로 설정된다. 디스크 테이블스페이스의 삭제는 다음과 같이 한다. iSQL> DROP TABLESPACE test_tbs1 INCLUDING CONTENTS AND DATAFILES; 해당 구문은 해당 테이블스페이스뿐 아니라 포함된 객체 및 데이터파일까지 삭제한다. 만일, 정상적으로 삭제되지 않는다면 해당 테이블스페이스 접근 중인 DB세션이 존재하는 경우임으로 해당 세션을 찾아 정리한 후 삭제 구문을 재 수행하면 된다. 테이블의 생성 및 삭제 테이블의 생성은 다음과 같이 한다. iSQL> CREATE TABLE test1 ( c1 INTEGER , c2 CHAR(10) , PRIMARY KEY (c1) ) TABLESPACE test_tbs1; 테이블의 삭제는 다음과 같이 한다. iSQL> DROP TABLE test1; 테이블을 생성한 후 정상적인 테이블의 존재 여부를 확인하려면 다음과 같이 한다. iSQL> DESC test1; [ TABLESPACE : SYS_TBS_MEM_DATA ] [ ATTRIBUTE ] ------------------------------------------------------------------------------ NAME TYPE IS NULL ------------------------------------------------------------------------------ A INTEGER FIXED NOT NULL B INTEGER FIXED [ INDEX ] ------------------------------------------------------------------------------ NAME TYPE IS UNIQUE COLUMN ------------------------------------------------------------------------------ ALTIBASE Quick Install UNIX 17 page of 18 __SYS_IDX_ID_162 BTREE UNIQUE A ASC [ PRIMARY KEY ] ------------------------------------------------------------------------------ iSQL>_ ALTIBASE Quick Install UNIX 18 page of 18 알티베이스㈜ 서울특별시 구로구 구로3동 182-13 대륭포스트 2차 1008호 02-2082-1000 http://www.altibase.com 대전사무소 대전광역시 서구 둔산동 921 주은리더스텔 901호 042-489-0330 기술지원본부 서울특별시 구로구 구로3동 182-13 대륭포스트 2차 908호 02-2082-1000 솔루션센터 02-2082-1114 http://support.altibase.com Copyright ⓒ 2000~2013 ALTIBASE Corporation. All Rights Reserved. 이 문서는 정보 제공을 목적으로 제공되며, 사전에 예고 없이 변경될 수 있습니다. 이 문서는 오류가 있을 수 있으며, 상업적 또는 특정 목적에 부합하는 명시적, 묵시적인 책임이 일체 없습니다. 이 문서에 포함된 ALTIBASE 제품의 특징이나 기능의 개발, 발표 등의 시기는 ALTIBASE 재량입니다. ALTIBASE는 이 문서에 대하여 관련된 특허권, 상표권, 저작권 또는 기타 지적 재산권을 보유할 수 있습니다.
Manual
-
- [ALTIBASE XDB 6.1.3] SQL Reference ㅣ 2014-04-18
- TABLESPACE ···················································································································· 55 A
-
미리보기
ALTIBASE XDB Application Development SQL Reference Release 6.1.3 (August 4, 2014) ----------------------------------------------------------- ALTIBASE XDB Application Development SQL Reference Release 6.1.3 Copyright ⓒ 2001~2014 ALTIBASE Corp. All Rights Reserved. 본 문서의 저작권은 ㈜알티베이스에 있습니다. 이 문서에 대하여 당사의 동의 없이 무단으로 복제 또는 전용할 수 없습니다. ㈜알티베이스 152-790 서울시 구로구 구로동 182-13 대륭포스트타워Ⅱ 10층 전화: 02-2082-1114 팩스: 02-2082-1099 고객서비스포털: http://support.altibase.com homepage: http://www.altibase.com ----------------------------------------------------------- 목차 I 목 차 서문 ················································································································i 이 매뉴얼에 대하여 ······················································································································ ii 1. 알티베이스 SQL 소개 ···················································································· 7 SQL 개요 ··········································································································································· 8 SQL문 분류 ···································································································································· 14 2. 데이터 정의어 ······························································································ 17 ALTER DATABASE ························································································································ 18 ALTER INDEX ································································································································· 23 ALTER QUEUE ······························································································································· 26 ALTER REPLICATION ·················································································································· 27 ALTER SEQUENCE ······················································································································· 31 ALTER TABLE ································································································································· 34 ALTER TABLESPACE ···················································································································· 55 ALTER TRIGGER ···························································································································· 59 ALTER USER ··································································································································· 61 ALTER VIEW ··································································································································· 63 COMMENT ····································································································································· 65 CREATE DATABASE ····················································································································· 67 CREATE DIRECTORY ··················································································································· 70 CREATE INDEX ······························································································································ 72 CREATE QUEUE ···························································································································· 79 CREATE REPLICATION ··············································································································· 81 CREATE SEQUENCE ···················································································································· 83 CREATE SYNONYM ····················································································································· 90 CREATE TABLE ······························································································································ 94 CREATE MEMORY TABLESPACE ·························································································· 113 CREATE TRIGGER ······················································································································· 118 II SQL Reference CREATE USER ····························································································································· 125 CREATE VIEW ····························································································································· 128 DROP DATABASE ······················································································································ 132 DROP DIRECTORY ···················································································································· 133 DROP INDEX ······························································································································· 134 DROP QUEUE ····························································································································· 135 DROP REPLICATION ················································································································ 136 DROP SEQUENCE ····················································································································· 137 DROP SYNONYM ······················································································································ 138 DROP TABLE ······························································································································· 140 DROP TABLESPACE ·················································································································· 142 DROP TRIGGER ·························································································································· 144 DROP USER ································································································································· 145 DROP VIEW ································································································································· 147 GRANT ·········································································································································· 148 RENAME TABLE ························································································································· 163 REVOKE ········································································································································· 165 TRUNCATE TABLE ····················································································································· 168 3. 데이터 조작어 ···························································································· 171 DELETE ·········································································································································· 172 INSERT ··········································································································································· 177 LOCK TABLE ································································································································ 181 SELECT ··········································································································································· 186 UPDATE········································································································································· 215 MOVE ············································································································································ 220 ENQUEUE ····································································································································· 223 DEQUEUE ····································································································································· 224 4. 데이터 제어어 ···························································································· 227 ALTER SESSION ························································································································· 228 ALTER SYSTEM ··························································································································· 230 COMMIT ······································································································································· 232 SAVEPOINT ································································································································· 233 ROLLBACK···································································································································· 235 목차 III SET TRANSACTION ··················································································································· 238 5. 집합 연산자 ······························································································· 241 UNION ··········································································································································· 242 UNION ALL ·································································································································· 243 INTERSECT ···································································································································· 244 MINUS ··········································································································································· 245 연산 순서······································································································································ 246 6. SQL 함수 ···································································································· 249 SQL 함수 소개 ··························································································································· 250 집계 함수······································································································································ 252 분석 함수······································································································································ 256 숫자 함수······································································································································ 259 문자 함수······································································································································ 273 날짜시간 함수 ···························································································································· 290 변환 함수······································································································································ 300 기타 함수······································································································································ 311 암호화 함수 ································································································································· 323 7. 산술 연산자 ······························································································· 327 산술 연산자 ································································································································· 328 단항 연산자 ································································································································· 329 이항 연산자 ································································································································· 330 연결 연산자 ································································································································· 332 CAST 연산자 ······························································································································· 333 8. 조건 연산자 ······························································································· 335 SQL 조건의 개요 ······················································································································· 336 논리 연산자 ································································································································· 338 비교조건 ········································································································································ 341 그 외의 조건 ······························································································································· 345 찾아보기 ·································································································· 355 서문 i 서문 ii SQL Reference 이 매뉴얼에 대하여 이 매뉴얼은 데이터 베이스에서 사용되는 SQL(Structured Query Language)의 사용법에 대해 설명한다. 대상 사용자 이 매뉴얼은 다음과 같은 알티베이스 XDB 사용자를 대상으로 작성되었다. 데이터베이스 관리자 성능 관리자 데이터베이스 사용자 응용 프로그램 개발자 기술지원부 다음과 같은 배경 지식을 가지고 이 매뉴얼을 읽는 것이 좋다. 컴퓨터, 운영 체제 및 운영 체제 유틸리티 운용에 필요한 기본 지식 관계형 데이터베이스 사용 경험 또는 데이터베이스 개념에 대한 이해 컴퓨터 프로그래밍 경험 데이터베이스 서버 관리, 운영 체제 관리 또는 네트워크 관리 경험 소프트웨어 환경 이 매뉴얼은 데이터베이스 서버로 알티베이스 XDB 버전 6을 사용한다는 가정 하에 작성되었다. 이 매뉴얼의 구성 이 매뉴얼은 다음과 같이 구성되어 있다. 제 1장 알티베이스 SQL 소개 이 장은 알티베이스를 사용하기 위한 SQL의 개요, 분류, 구조에 대해서 설명한다. 서문 iii 제 2장 자료형 이 장은 알티베이스에서 제공하는 데이터 타입에 대해서 설명한다. 제 3장 데이터 정의어 이 장은 알티베이스에서 사용되는 데이터 정의어(DDL)에 대해서 각각 설명한다. 제 4장 데이터 조작어 이 장은 알티베이스에서 사용되는 데이터 조작어(DML)에 대해서 각각 설명한다. 제 5장 데이터 제어어 이 장은 알티베이스에서 사용되는 데이터 제어어(DCL)에 대해서 각각 설명한다. 제 6장 집합 연산자 이 장은 알티베이스의 SQL에서 사용되는 집합 연산자에 대해서 설명한다. 제 7장 함수 이 장은 알티베이스에서 제공하는 함수들에 대해서 설명한다. 제 8장 산술 연산자 이 장은 알티베이스의 SQL에서 사용되는 산술 연산자에 대해서 설명한다. 제 9장 조건 연산자 이 장은 알티베이스의 SQL문에서 조건절에 사용할 수 있는 조건 연산자에 대해서 설명한다. A. 부록 : 스키마 이 장은 예제 테이블 정보와 ER다이어그램과 샘플데이터에 대해서 설명한다. 문서화 규칙 이 절에서는 이 매뉴얼에서 사용하는 규칙에 대해 설명한다. 이 규칙을 이해하면 이 매뉴얼과 설명서 세트의 다른 매뉴얼에서 정보를 쉽게 찾을 수 있다. 여기서 설명하는 규칙은 다음과 같다. 구문 다이어그램 샘플 코드 규칙 구문 다이어그램 이 매뉴얼에서는 다음 구성 요소로 구축된 다이어그램을 사용하여, iv SQL Reference 명령문의 구문을 설명한다. 구성 요소 의미 예약어 명령문이 시작한다. 완전한 명령문이 아닌 구문 요소는 화살표로 시작한다. 명령문이 다음 라인에 계속된다. 완전한 명령문이 아닌 구문 요소는 이 기호로 종료한다. 명령문이 이전 라인으로부터 계속된다. 완전한 명령문이 아닌 구문 요소는 이 기호로 시작한다. ; 명령문이 종료한다. SELECT 필수 항목 NOT 선택적 항목 ADD DROP 선택사항이 있는 필수 항목. 한 항목만 제공해야 한다. ASC DESC 선택사항이 있는 선택적 항목. , ASC DESC 선택적 항목. 여러 항목이 허용된다. 각 반복 앞부분에 콤마가 와야 한다. 샘플 코드 규칙 코드 예제는 SQL, Stored Procedure, iSQL 또는 다른 명령 라인 구문들을 예를 들어 설명한다. 아래 테이블은 코드 예제에서 사용된 인쇄 규칙에 대해 설명한다. 규칙 의미 예제 [ ] 선택 항목을 표시 VARCHAR [(size)] [[FIXED |] VARIABLE] { } 필수 항목 표시. 반드시 하나 이상을 선택해야 되는 표시 { ENABLE | DISABLE | COMPILE } 서문 v | 선택 또는 필수 항목 표시의 인자 구분 표시 { ENABLE | DISABLE | COMPILE } [ ENABLE | DISABLE | COMPILE ] . . . 그 이전 인자의 반복 표시 예제 코드들의 생략되는 것을 표시 SQL> SELECT ename FROM employee; ENAME ------------------------ SWNO HJNO HSCHOI . . . 20 rows selected. 그 밖에 기호 위에서 보여진 기호 이 외에 기호들 EXEC :p1 := 1; acc NUMBER(11,2); 기울임 꼴 구문 요소에서 사용자가 지정해야 하는 변수, 특수한 값을 제공해야만 하는 위치 지정자 SELECT * FROM table_name; CONNECT userID/password; 소문자 사용자가 제공하는 프로그램의 요소들, 예를 들어 테이블 이름, 칼럼 이름, 파일 이름 등 SELECT ename FROM employee; 대문자 시스템에서 제공하는 요소들 또는 구문에 나타나는 키워드 DESC SYSTEM_.SYS_INDICES_; 관련 자료 자세한 정보를 위하여 다음 문서 목록을 참조하기 바란다. ALTIBASE Administration Installation User’s Manual ALTIBASE Administration Administrator’s Manual ALTIBASE Administration Replication User’s Manual ALTIBASE Application Development Precompiler User’s Manual ALTIBASE Application Development ODBC User’s Manual ALTIBASE Application Development Application Program Interface User’s Manual vi SQL Reference ALTIBASE Tools iSQL User’s Manual ALTIBASE Tools Utilities User’s Manual ALTIBASE Message Error Message Reference 온라인 매뉴얼 알티베이스 고객서비스포털(http://support.altibase.com/)에서 국문 및 영문 매뉴얼(PDF, HTML)을 받을 수 있다. 알티베이스는 여러분의 의견을 환영합니다. 이 매뉴얼에 대한 여러분의 의견을 보내주시기 바랍니다. 사용자의 의견은 다음 버전의 매뉴얼을 작성하는데 많은 도움이 됩니다. 보내실 때에는 아래 내용과 함께 고객서비스포털(http://support.altibase.com/)로 보내주시기 바랍니다. 사용 중인 매뉴얼의 이름과 버전 매뉴얼에 대한 의견 사용자의 성함, 주소, 전화번호 이 외에도 알티베이스 기술지원 설명서의 오류와 누락된 부분 및 기타 기술적인 문제들에 대해서 이 주소로 보내주시면 정성껏 처리하겠습니다. 기술적인 부분과 관련하여 즉각적인 도움이 필요한 경우에는 기술지원센터로 연락하시기 바랍니다. 여러분의 의견에 항상 감사드립니다. 알티베이스 SQL 소개 7 1. 알티베이스 SQL 소개 이 장에서는 알티베이스 SQL의 특징과 구성에 대해서 간략하게 소개하고 있다. 8 SQL Reference SQL 개요 SQL(Structured Query Language)은 데이터베이스 객체를 정의하고 관리하며, 데이터베이스의 데이터를 조작하고 검색하기 위한 언어이다. 이 절은 알티베이스의 SQL 특성에 대해 기술한다. 알티베이스 SQL 특징 빠른 질의 성능 알티베이스의 경우 대부분의 질의들에 대해 SQL 준비 (PREPARE)과정 후 실행하기 전까지 시스템 카탈로그 정보가 변하지 않는 점에 착안해서 준비과정에서 최적화된 실행 계획 트리(execution plan tree)를 만들어 두고 실행시에는 이 실행 계획 트리를 사용하도록 하여 실제 질의가 반복 실행될 때의 수행속도를 대폭 향상시켰다. 이와 같은 방법은 초기 데이터베이스 스키마 생성 후 데이터 정의어(DDL) 구문의 수행은 거의 일어나지 않고 데이터 조작어(DML) 구문의 수행이 빈번한 응용 애플리케이션에 매우 유용하다. SQL/92 표준 지원 알티베이스 SQL은 SQL/92 표준 사양을 지원하므로 다른 데이터베이스의 SQL 사용 경험이 있는 사용자들은 별도의 숙지 없이 알티베이스를 쉽게 사용할 수 있다. 강력한 부질의(subquery) 지원 일반적으로 부질의는 SELECT 구문, TABLE ~ AS SELECT 구문, 및 INSERT ~ AS SELECT 구문의 수식과 IN 절에 주로 사용된다. 여기에 사용되는 부질의는 대부분 여러 칼럼의 여러 레코드를 검색해 준다. 알티베이스의 경우 부질의의 결과가 하나의 값(한 레코드의 한 칼럼)일 경우, 그 부질의는 상수값 대신에 사용할 수 있으며 부질의는 빠른 검색을 지원하므로, 여러 SQL문으로 처리하는 것보다 부질의를 포함하는 SQL문으로 처리하는 것이 더 낫다. 따라서 복잡한 응용 애플리케이션에서 부질의는 유용하다. 알티베이스 SQL 소개 9 다양한 시스템 제공 함수 지원 SQL/92의 표준 사양 이외에 알티베이스는 사용자에게 유용한 다양한 시스템 함수를 지원한다. 질의 최적화와 실행 계획 질의 성능을 높이기 위해서는 SQL구문을 효과적으로 작성해야 한다. 알티베이스가 SQL구문을 처리하는 방식을 이해하는 것은 최적화된 SQL구문을 작성하는데 도움이 될 것이다. 알티베이스에서의 SQL문 처리 과정은 크게 준비(PREPARE) 과정과 실행(EXECUTE) 과정으로 나뉘어진다. 준비 과정 SQL문의 문법을 분석하여 정당성을 검사하고 최적화 한 후 실행 계획을 수립해 실행 계획 트리(execution plan tree)를 생성하는 과정이다. 이 과정에서 메타 테이블에 접근해 테이블과 인덱스 정보 등을 읽어서 최적화된 접근 계획을 수립한다. 따라서 클라이언트가 direct execution 대신에 준비와 실행을 나뉘어서 수행한다면, 준비 후 메타의 변경이 일어나지 않아야 준비(PREPARE) 과정에서 생성된 실행 계획 트리가 실행시에 수정 없이 그대로 사용될 수 있다. 예를 들어, 준비 과정에서 존재했던 인덱스가 실행 과정에서는 존재하지 않는다면 준비 과정에서 인덱스를 사용하는 것으로 최적화된 실행 계획 트리는 실행 과정에서는 무효한 것이 되어 사용할 수 없게 된다. 실행 과정 준비 과정에서 생성된 실행 계획에 따라 질의문을 실제로 수행하는 과정이다. 클라이언트가 호스트 변수를 사용한 SQL문을 prepare 한 후 호스트 변수 값을 변경하면서 여러번 수행하는 경우, 준비 과정은 한번 수행되고 변수값 설정과 실행 과정은 여러번 수행된다. 주석 알티베이스에서는 SQL문의 임의의 위치에 다음 두 가지 형식의 주석을 사용할 수 있다. 10 SQL Reference /* */ C언어의 주석 형식과 동일한 방식으로 주석의 시작에 ‘/*’를 명시하고 주석의 끝에 ‘*/’를 명시한다. 여러 줄의 주석을 쓸 때 사용한다. -- 한 줄의 주석을 쓸 때 ‘-‘를 연이어 두 번 명시하여 사용한다. 알티베이스 객체 (Object) 알티베이스에서 제공하는 데이터베이스 객체(object)는 스키가 객체와 비스키마 객체로 구분되며, 그 종류는 다음과 같다. 스키마 객체 제약조건 (constraint) 인덱스 (index) 시퀀스 (sequence) 시노님 (synonym) 테이블 (table) 저장 프로시저 (stored procedure) 뷰 (view) 트리거 (trigger) 비 스키마 객체 사용자 (user) 이중화 (replication) 테이블스페이스 (tablespace) 디렉토리 (directory) 객체 이름 규칙 객체 이름 SQL문에서 객체의 이름을 쓸 때 인용부호를 사용할 수도 있고 사용하지 않을 수도 있다. 인용부호로는 큰따옴표(“)를 사용한다. 객체 생성시 따옴표로 감싸서 이름을 지정하면, 이 후에 그 객체를 참조할 때는 항상 큰따옴표로 감싼 이름을 사용해야 한다. 알티베이스 SQL 소개 11 인용부호가 없는 이름은 아무런 구분자 없이 사용된다. 다음의 규칙은 인용부호 사용 여부에 상관없이 모두 적용된다. 객체의 이름의 최대 길이는 40바이트이다. 인용부호가 없는 이름은 A-Z, a-z, 0-9, _, $ 를 포함할 수 있다. 또한 객체 이름의 첫 글자는 문자이거나 _ 이어야 한다. 그러나 V$, X$ 또는 D$로 시작할 수는 없다. 인용부호가 있는 이름은 문자, 구두점 또는 공백을 포함할 수 있다. 그러나 큰따옴표(“)를 포함할 수는 없다. 알티베이스의 예약어는 객체 이름으로 사용될 수 없다. (알티베이스의 예약어 목록은 아래에 나열해 두었다.) 같은 이름공간(Name Space)내에는 같은 이름의 객체가 존재할 수 없다. 다음의 스키마 객체들은 한 이름공간을 공유한다: 테이블, 뷰, 시퀀스, 시노님, 저장 프로시저 다음의 스키마 객체들은 자신의 이름공간을 따로 소유한다: 제약조건, 인덱스, 트리거 객체 테이블과 뷰는 동일한 이름 공간를 공유하므로 동일한 스키마 내에 같은 이름의 테이블과 뷰는 존재할 수 없다. 그러나 테이블과 인덱스는 서로 다른 이름공간에 존재하기 때문에 동일한 스키마 내에 같은 이름의 테이블과 인덱스가 존재할 수 있다. 사용자, 이중화 객체, 테이블스페이스, 디렉터리 객체 같은 비스키마 객체들은 자신의 이름공간을 소유한다. 인용부호가 없는 이름은 대소문자 구별이 되지 않는다. 알티베이스는 내부적으로 이름을 대문자로 변경한다. 인용부호로 감싼 이름은 대소문자가 구별된다. 다음의 이름은 알티베이스 내에서 같은 이름으로 변경되기 때문에 같은 이름공간의 다른 객체에 사용될 수 없다: employees, EMPLOYEES, “EMPLOYEES” 알티베이스가 제공하는 객체에 대한 자세한 설명은 Administrator’s Manual을 참고하기 바란다. 비밀번호 사용자가 알티베이스에 접속하기 위해 사용하는 비밀번호 역시 객체 이름과 유사한 제약조건을 가진다. 암호에 사용가능한 문자는 A-Z, a- z, 0-9, _, $ 이다. 또한 알티베이스의 예약어는 비밀번호에 사용될 수 없다. 첫 글자는 반드시 문자 또는 _여야 한다. 비밀번호의 최대 12 SQL Reference 길이는 운영체제에 따라 16 또는 22바이트이다. Solaris x86 2.8과 Windows에서 비밀번호의 최대 길이는 22바이트이다. 그 외 다른 운영체제에서 비밀번호의 최대 길이는 16바이트이다. 예약어 다음 단어들은 알티베이스에 예약되어 있는 단어들로 데이터베이스 객체 이름이나 비밀번호로 사용할 수 없다. 데이터베이스 객체 생성시 또는 SQL구문 작성시에 이를 유념해야 한다. ADD ALL ALTER AND ANY AS ASC BEGIN BETWEEN BY CASCADE CASE CHECK CLOSE COLUMN COMMIT CONNECT CONSTANT CONSTRAINT CONSTRAINTS CONTINUE CREATE CUBE CURSOR CYCLE DATABASE DECLARE DEFAULT DELETE DESC DISCONNECT DISTINCT FUNCTION GET GOTO GRANT GROUP GROUPING HAVING IDENTIFIED IF IN INDEX INNER INSERT INTERSECT INTO IS ISOLATION JOIN LEFT LEVEL LIKE LIMIT LOCALUNIQUE LOCK LOOP MAXROWS MINUS MODE NATIVE NO NOCYCLE NOT REPLACE REPLICATION RESTRICT RETURN REVERSE REVOKE RIGHT ROLLBACK ROLLUP ROW ROWCOUNT ROWTYPE SAVEPOINT SEGMENT SELECT SEQUENCE SESSION SET SETS SOME SQLCODE SQLERRM START STEP SYNONYM SYSTEM TABLE TABLESPACE TEMPORARY THEN TO TRANSACTION 알티베이스 SQL 소개 13 DROP ELSE ELSEIF ELSIF END ESCAPE EXCEPTION EXEC EXECUTE EXISTS EXIT EXTENTSIZE FALSE FETCH FIXED FOR FOREIGN FROM FULL NULL OFF OFFLINE ON OPEN OR ORDER OTHERS OUT OUTER PRIMARY PRIOR PRIVILEGES PROCEDURE RAISE READ REFERENCES RENAME TRIGGER TRUE TRUNCATE UNION UNIQUE UNTIL UPDATE USER VALUES VARIABLE VIEW WAIT WHEN WHERE WHILE WITH WORK SWRITE 14 SQL Reference SQL문 분류 알티베이스가 지원하는 전체 SQL문은 다음과 같이 분류된다. 데이터 정의어 (DDL) 데이터 조작어 (DML) 데이터 제어어 (DCL) 이 장에서는 각 SQL문에 대해 간략히 소개한다. 자세한 사용방법은 3장 데이터 정의어, 4장 데이터 조작어, 5장 데이터 제어어를 참조한다. 데이터 정의어(DDL) DDL은 데이터베이스 객체를 정의하고 변경하는데 사용된다. SQL 문 설명 ALTER DATABASE 데이터베이스 정의 변경 ALTER INDEX 인덱스 정의 변경 ALTER REPLICATION 이중화의 시작, 종료 ALTER SEQUENCE 시퀀스의 정의 변경 ALTER TABLE 테이블의 정의 변경 ALTER TABLESPACE 테이블스페이스 정의 변경 ALTER TRIGGER 트리거 정의 변경 ALTER USER 사용자의 암호 변경 ALTER VIEW 뷰 재 컴파일 CREATE DATABASE 데이터베이스 생성 CREATE DIRECTORY 저장 프로시저 내에서 파일 처리를 위한 디렉토리 객체 생성 CREATE INDEX 인덱스 생성 CREATE QUEUE 큐 생성 CREATE REPLICATION 이중화 생성 CREATE SEQUENCE 시퀀스 생성 CREATE SYNONYM 객체의 별칭(시노님) 생성 CREATE TABLE 테이블 생성 CREATE TABLESPACE 테이블스페이스 생성 CREATE TRIGGER 트리거 생성 CREATE USER 사용자 생성 CREATE VIEW 뷰 생성 알티베이스 SQL 소개 15 DROP DIRECTORY 디렉토리 객체 삭제 DROP INDEX 인덱스 삭제 DROP QUEUE 큐 삭제 DROP REPLICATION 이중화 삭제 DROP SEQUENCE 시퀀스 삭제 DROP SYNONYM 시노님 삭제 DROP TABLE 테이블 삭제 DROP TABLESPACE 테이블스페이스 삭제 DROP TRIGGER 트리거 삭제 DROP USER 사용자 삭제 DROP VIEW 뷰 삭제 GRANT 권한 부여 RENAME 테이블 이름 변경 REVOKE 권한 취소 TRUNCATE TABLE 테이블의 모든 레코드 삭제 [표 1-1] 데이터 정의어 목록 메타 정보가 변경되는 위의 DDL 구문들이 수행되면 그 세션의 현재 시작되어 있는 트랜잭션은 종료되고 새로운 트랜잭션으로 그 DDL 문이 처리된 후 그 트랜잭션은 종료된다. 즉 DDL 문은 하나의 트랜잭션으로 처리되는 SQL문들이다. 다시 말해서 AUTOCOMMIT 모드가 비설정(OFF)된 상태에서 데이터 조작어(DML)를 수행하고 명시적으로 커밋(COMMIT)을 호출하지 않았다 하더라도 위의 SQL문들을 수행하면 알티베이스 내부적으로 이전에 수행된 데이터 조작어(DML)들이 모두 묵시적으로 커밋된다. 즉, 위 DDL문을 수행하기 전에 수행된 DML 트랜잭션은 DDL문 수행 후 롤백문을 이용해 철회될 수 없다. 데이터 조작어(DML) DML(Data Manipulation Language) 문은 데이터를 조작하는데 사용된다. 데이터 정의어(DDL)와 달리 AUTOCOMMIT 모드가 비설정(OFF) 되어 있는 상태에서 DML문을 수행하면 수행 후 묵시적으로 커밋되지 않는다. 따라서, AUTOCOMMIT 모드가 비설정(OFF)된 상태에서 어떤 트랜잭션이 여러 개의 DML문을 수행하고 롤백(rollback)을 호출하면 그 트랜잭션은 철회된다. SQL 문 설명 DELETE 데이터의 삭제 INSERT 데이터의 삽입 16 SQL Reference LOCK TABLE 특정한 모드에서 테이블 잠금 SELECT 데이터의 검색 UPDATE 데이터의 변경 MOVE 한 테이블에서 다른 테이블로 데이터 이동 ENQUEUE 메시지를 큐에 삽입 DEQUEUE 메시지를 큐에서 꺼내고 큐에서 삭제 [표 1-2] 데이터 조작어 목록 데이터 제어어(DCL) 시스템 제어문 SQL 문 설명 ALTER SYSTEM 프로퍼티 변경, 체크포인트와 데이터베이스 백업 수행 세션 제어문 SQL 문 설명 ALTER SESSION 세션의 프로퍼티 변경 트랜잭션 제어문 SQL 문 설명 COMMIT 트랜잭션 정상 종료 ROLLBACK or ROLLBACK TO SAVEPOINT savepoint_name 트랜잭션 전체 철회 또는 savepoint_name 시점으로 트랜잭션 부분 철회 SAVEPOINT savepoint_name 트랜잭션내에서 마커 설정 SET TRANSACTION READ-ONLY 또는 READ-WRITE 트랜잭션 시작, 또는 트랜잭션의 ISOLATION LEVEL 설정 변경 위의 세션 제어문과 트랜잭션 제어문은 각 세션에만 영향을 미치고 다른 세션에는 영향을 미치지 않는다. 데이터 정의어 17 2. 데이터 정의어 이 장에서는 데이터베이스 객체를 생성하는데 사용하는 SQL 문장인 DDL 문장의 문법과 특징을 사용 예제를 들어서 상세하게 설명한다. 18 SQL Reference ALTER DATABASE 구문 alter_database ::= ALTER;DATABASE session_clause startup_clausedatabase_name archivelog_option backup_clause recover_clause create_checkpoint_image_clause startup_clause ::= CONTROL SERVICE META UPGRADE RESETLOGS SHUTDOWN NORMAL IMMEDIATE EXIT session_clause ::= numberSESSIONCLOSE archivelog_option ::= ARCHIVELOG NOARCHIVELOG 데이터 정의어 19 backup_clause ::= BACKUP LOGANCHOR ‘’backup_dirTABLESPACE DATABASE TOtablespace_name recover_clause ::= RECOVERDATABASE until_option until_option ::= UNTIL CANCEL TIME‘’YYYY-MM-DD:HH:MM:SS 전제 조건 ALTER DATABASE구문은 알티베이스 다단계 구동에서 서비스 전 단계에서 SYS 사용자가 -sysdba 관리자 모드로 접속한 후 수행할 수 있다. 단 SESSION CLOSE 의 경우에는 -sysdba 모드로 접속하지 않아도 사용할 수 있다. 설명 기존 데이터베이스의 정의를 변경하는 구문이다. database_name 변경될 데이터베이스 이름을 명시한다. startup_clauses 이 절은 알티베이스 구동 단계를 명시하는데 사용된다. CONTROL 데이터베이스 구동 단계를 CONTROL 단계로 변경한다. 이 단계에서 데이터베이스 미디어 복구가 가능하다. 데이터베이스 다단계 구동 단계에 대한 자세한 설명은 Administrator’s Manual을 참조한다. CONTROL 다음 단계인 META단계로 가기 위해서는 다음 구문을 20 SQL Reference 수행해야 한다: ALTER DATABASE dababase_name META; META 데이터베이스 구동 단계를 META 단계로 변경한다. 전 단계인 CONTROL단계에서 이 단계로 오는 중에 데이터베이스 메타 데이터가 로딩된다. 다음 단계로 가기 위해서는 다음 구문을 수행해야 한다: ALTER DATABASE dababase_name SERVICE; SERVICE 데이터베이스 구동 단계를 SERVICE 단계로 변경한다. 이 단계로 오면서 테이블 및 데이터가 공유 메모리로 로딩된다. 이 단계에서 이중화 또는 SNMP 등의 확장 서비스가 모두 구동될 수 있다. 데이터베이스가 이 단계로 성공적으로 구동되었다면, 필요한 복구가 완료되어 시스템이 정상적으로 서비스를 제공하는 상태임을 의미한다. META UPGRADE 이 옵션은 데이터베이스 구동 단계를 META UPGRADE 단계로 변경한다. 데이터베이스가 이 단계로 구동될 때, 모든 복구 작업이 완료된다. 다음 단계로 가기 위해서는 다음 구문을 수행해야 한다: ALTER DATABASE dababase_name SERVICE; META RESETLOGS CONTROL 단계에서 불완전 복구를 수행한 후, 서버를 정상 구동하기 위해 필요한 작업이다. 불완전 복구로 인해 더 이상 필요하지 않게 된 로그 레코드들을 초기화한다. 다음 단계로 가기 위해서는 다음 구문을 수행해야 한다: ALTER DATABASE dababase_name SERVICE; SHUTDOWN NORMAL 서버에 접속한 모든 클라이언트의 연결이 정상적으로 해제될 때까지 대기한 후 서버를 정상 종료한다. SHUTDOWN IMMEDIATE 서버에 접속된 모든 클라이언트의 연결을 강제로 해제한 후, 서버를 정상 종료한다. SHUTDOWN EXIT 이 옵션은 알티베이스 서버를 강제로 종료하는데 사용된다. 이 방법으로 알티베이스가 종료되면, 데이터베이스의 내용이 올바르지 않게 되어 다음 서버 구동시에 복구 작업이 수행될 것이다. 데이터 정의어 21 CREATE CHECKPOINT IMAGE 이 구문은 메모리 체크포인트 이미지파일이 유실되었을 때, 로그 앵커의 정보를 참고하여 체크포인트 이미지 파일을 생성하기 위해 사용된다. 이 구문을 실행한 후에는 매체 완전 복구를 수행하여 메모리 체크포인트 이미지 파일을 복구하도록 한다. 체크포인트 이미지파일은 메모리 테이블스페이스에 정의된 체크포인트 경로에 생성되므로, 경로는 지정할 필요가 없고 파일명만 명시하면 된다. 이 구문은 CONTROL 단계에서만 실행 가능하다. <질의> ‘MEM-TBS-1’ 이름의 체크포인트 이미지파일을 다시 생성한다. iSQL> ALTER DATABASE CREATE CHECKPOINT IMAGE 'MEM-TBS-1'; SESSION CLOSE 이 구문은 세션을 강제로 종료시킨다. SESSION CLOSE 다음에 세션의 ID을 지정하면 된다. 이 구문이 실행되면 그 세션의 트랜잭션은 롤백된다. Note: 세션이 락을 잡기 위해 대기중이라면 즉시 종료되지 않는다. archivelog_option CONTROL 단계에서 아카이브로그 모드와 노아카이브로그 모드를 전환하는데 사용된다. BACKUP LOGANCHOR 데이터베이스가 아카이브로그 모드로 운영중일때, 이 구문은 서비스를 중지하지 않은 상태에서 로그 앵커를 온라인 백업하는데 사용된다. BACKUP TABLESPACE 데이터베이스가 아카이브로그 모드로 운영중일때, 이 구문은 서비스를 중지하지 않은 상태에서 지정된 테이블스페이스를 백업 디렉토리에 백업하는데 사용된다. BACKUP DATABASE 데이터베이스가 아카이브로그 모드로 운영중일때, 이 구문은 서비스를 중지하지 않은 상태에서 모든 테이블스페이스 및 로그앵커를 백업하는데 사용된다. RECOVER DATABASE 이 구문은 매체 완전복구를 수행한다. 아카이브 로그 디렉토리의 로그 파일을 판독하여 매체 오류가 발생한 데이터 파일들을 현재 22 SQL Reference 시점으로 복구한다. RECOVER DATABASE UNTIL TIME 이 구문은 특정 시점으로 매체 불완전 복구를 수행하는데 사용된다. 아카이브 로그 디렉토리의 로그 파일을 판독하여 매체 오류가 발생한 데이터 파일들을 특정 시점으로 복구한다. RECOVER DATABASE UNTIL CANCEL 이 구문은 아카이브 로그 파일들 중 유효한 가장 최근 시점으로 매체 불완전 복구를 수행하는데 사용된다. 아카이브 로그 디렉토리의 로그 파일을 판독하여 매체 오류가 발생한 데이터 파일들을 유효한 시점까지 복구한다. 예제 <질의> 데이터베이스 mydb를 구동하여 정상 서비스를 제공하도록 한다. xdbiSQL> ALTER DATABASE mydb SERVICE; <질의> 아카이브로그 모드로 데이터베이스를 전환한다. xdbiSQL> ALTER DATABASE ARCHIVELOG; <질의> 불완전 복구 수행 후 데이터베이스를 정상 구동한다. xdbiSQL> ALTER DATABASE mydb META RESETLOGS; <질의> 이전 백업으로부터 2008년 2월 16일 오후 12시 시점으로 데이터베이스를 복원한다. xdbiSQL> ALTER DATABASE RECOVER DATABASE UNTIL TIME ‘2008- 02-16:12:00:00’’ <질의> 이전 백업으로부터 유실된 로그파일 20001번 이전인 로그파일 20000번까지의 변경이 반영되도록 데이터베이스를 복원한다. xdbiSQL> ALTER DATABASE RECOVER DATABASE UNTIL CANCEL; 데이터 정의어 23 ALTER INDEX 구문 alter_index ::= ALTER ; INDEX set_persistent_clause index_name user_name. RENAMETOnew_name rebuild_clause set_persistent_clause ::= PERSISTENTSET ON OFF = rebuild_clause ::= PARTITIONindex_partition_name index_attribute REBUILD index_attribute ::= TABLESPACEtablespace_name 전제 조건 SYS 사용자, 인덱스가 속한 스키마의 소유자 또는 ALTER ANY INDEX 시스템 권한을 가진 사용자만이 이 구문으로 인덱스를 변경할 수 있다. 24 SQL Reference 설명 기존 인덱스 정의를 변경하거나 재구축한다. user_name 변경될 인덱스의 소유자 이름을 명시한다. 생략하면 알티베이스는 현재 세션에 연결된 사용자의 스키마에 속한 것으로 간주한다. index_name 변경될 인덱스의 이름을 명시한다. SET PERSISTENT 절 이 절은 non-persistent 인덱스를 persistent 인덱스로, 또는 persistent 인덱스를 non-persistent 인덱스로 변경하기 위해 사용된다. persistent 인덱스에 대한 자세한 내용은 CREATE INDEX 구문을 참고한다 rebuild_clause 존재하는 인덱스 또는 인덱스의 한 파티션을 재구축한다. index_attribute 재구축된 인덱스 파티션이 저장될 테이블스페이스를 명시한다. RENAME 변경될 인덱스의 이름을 명시한다. 주의 사항 이중화 대상 테이블에 걸려있는 인덱스는 변경될 수 없다. 이중화 대상 테이블에 걸려있는 인덱스에는 ‘ALTER INDEX SET PERSISTENT = ON/OFF’와 ‘ALTER INDEX REBUILD’ 구문만 사용할 수 있다. 예제 PERSISTENT 변경 <질의>인덱스 emp_idx1 을 PERSISTENT 인덱스로 변경하라. xdbiSQL> ALTER INDEX emp_idx1 SET PERSISTENT = ON; <질의> 인덱스 const1 을 PERSISTENT 인덱스로 변경하라. 데이터 정의어 25 xdbiSQL> ALTER INDEX const1 SET PERSISTENT = ON; 인덱스 파티션 재구축 <질의> 인덱스 파티션 idx_p5를 테이블스페이스 tbs1에 재구축하라. iSQL> ALTER INDEX IDX1 REBUILD PARTITION idx_p5 TABLESPACE tbs1; 인덱스 이름 변경 <질의> 인덱스 emp_idx1의 이름을 emp_idx2로 변경하라. xdbiSQL> ALTER INDEX emp_idx1 RENAME TO emp_idx2; 26 SQL Reference ALTER QUEUE 구문 alter_queue ::= ;ALTERQUEUEqueue_nameCOMPACT user_name. 설명 큐의 정의를 변경한다. COMPACT 큐가 위치하는 테이블스페이스에 데이터가 없는 빈 페이지들을 반환한다. 이 때, 데이터가 실제로 옮겨지지는 않는다. 데이터 정의어 27 ALTER REPLICATION 구문 alter_replication ::= REPLICATIONreplication_nameALTER ONLY SYNC PARALLELparallel_factorTABLEreplication_item , START QUICKSTART STOP ADD DROP TABLE HOST FROMreplication_itemTOreplication_item remote_host_ip.remote_port_no FLUSH ALLWAITwait_time SETHOSTremote_host_ip.remote_port_no ; RESET replication_item ::= .user_nametbl_name partition_namePARTITION 설명 CREATE REPLICATION 구문으로 이중화 생성 후 이중화의 동작을 제어하는 구문이다. 이중화에 관한 자세한 내용은 Replication Manual 을 참고한다. 28 SQL Reference replication_name 이중화 객체의 이름을 명시한다. SYNC 지역 서버에 있는 이중화 대상 테이블들의 모든 데이터를 원격 서버의 해당 테이블로 전송한 후 이중화가 시작된다. SYNC ONLY 지역 서버에 있는 이중화 대상 테이블들의 모든 데이터를 원격 서버의 해당 테이블로 전송한다. 이중화 송신 쓰레드는 생성되지 않는다. PARALLEL parallel_factor Parallel_factor 값은 생략 가능하다. 생략할 경우 1로 인식된다. Parallel_factor의 최대값은 CPU 개수 * 2이다. 최대값을 초과하여 지정해도 최대 값 이상으로 설정되지 않는다. 0 또는 음수 값을 지정하면 오류 메시지가 반환된다. TABLE replication_item 지역서버의 이중화 대상 테이블 중에서 SYNC로 동기화할 테이블 또는 파티션을 지정한다. 이 절이 명시되면 지정된 테이블 또는 파티션이 동기화된 후 이전에 마지막으로 이중화를 수행했던 시점부터 이중화가 시작된다. TABLE 절을 사용하지 않았을 때에는 모든 이중화 대상 테이블과 파티션이 동기화된 후 현재 로그의 위치부터 이중화가 시작된다. START 가장 최근에 마지막으로 이중화했던 시점부터 이중화를 시작한다. QUICKSTART 현재 시점부터 이중화를 시작한다. START/ QUICKSTART RETRY RETRY 옵션을 사용하여 이중화를 START하거나 QUICKSTART하면, 핸드쉐이크가 실패하더라도 송신 쓰레드가 지역서버에 생성된다. 지역서버와 원격서버간의 핸드쉐이크가 이후 성공할 때, 이중화가 시작된다. 이 옵션이 사용되면, iSQL은 첫 핸드쉐이크 시도가 실패하더라도 핸드쉐이크 성공 메시지를 출력한다. 그러므로 사용자는 이 구문의 실행 결과를 트래이스 로그 또는 성능 뷰를 통해서 확인해야 한다. 데이터 정의어 29 RETRY 옵션 없이 이중화 시작시 첫 핸드쉐이크 시도가 실패하면 ,에러가 발생하고 이중화 시작은 중지된다. 단, RETRY 옵션은 EAGER 모드에서는 지원되지 않는다. STOP 이중화를 중지한다. RESET 이 명령은 이중화 정보(재시작 SN 같은)를 초기화시킨다. 이는 이중화가 중지 중일 때만 실행될 수 있다. 이는 DROP REPLICATION 구문과 CREATE REPLICATION 구문을 연달아 실행한 것과 같은 효과를 낸다. ADD TABLE 이중화 객체에 테이블을 추가한다. 이중화가 중지되어 있는 상태에서만 테이블을 이중화 객체에 추가할 수 있다. TABLE FROM replication_item TO replication_item 이중화 대상 테이블 또는 파티션 이름을 테이블 소유자 이름과 함께 명시한다. DROP TABLE 이중화 테이블을 이중화 객체로부터 삭제한다. 이중화가 중지되어 있는 상태에서만 이중화 테이블을 삭제할 수 있다. FLUSH 이 구문이 실행된 세션은 이중화 송신 쓰레드에 의해서 현재 로그(FLUSH구문이 실행된 시점의 로그) 까지의 변경 내용이 상대방 서버에 전송 되도록 wait_time 초 만큼 기다린다. 만약, ALL옵션이 함께 사용되면 구문이 실행된 세션은 현재 로그가 아닌 가장 최근 로그까지의 변경 내용이 상대방 서버에 전송되도록 기다린다. SET HOST 특정 호스트를 현재 호스트로 지정한다. 이중화를 중지한 상태에서 변경 가능하다. 주의 사항 이중화로 작업을 하는 사용자들이 이중화를 이용하기 전에 명심해야 할 몇가지 사항이 있다. ALTER REPLICATION 구문을 실행하기 전에 Replication Manual을 숙지하기 바란다. 30 SQL Reference 예제 이름이 rep1인 이중화 객체를 시작하라. <질의> 지역서버의 데이터를 원격서버로 전송한 후 이중화를 시작하라. xdbiSQL> ALTER REPLICATION rep1 SYNC; Alter success. <질의> 이중화 rep1이 가장 최근에 마지막으로 수행한 이중화 시점부터 rep1 이중화를 시작하라. xdbiSQL> ALTER REPLICATION rep1 START; Alter success. <질의> 현재 시점부터 이중화를 시작하라. xdbiSQL> ALTER REPLICATION rep1 QUICKSTART; Alter success. 이름이 rep1인 이중화 객체에서 이중화 대상 테이블 employees을 삭제하라. xdbiSQL> ALTER REPLICATION rep1 STOP; Alter success. xdbiSQL> ALTER REPLICATION rep1 DROP TABLE FROM sys.employees TO sys.employees; Alter success. 이름이 rep1인 이중화 객체에 테이블 employees을 추가하라. xdbiSQL> ALTER REPLICATION rep1 STOP; Alter success. xdbiSQL> ALTER REPLICATION rep1 ADD TABLE FROM sys.employees TO sys.employees; Alter success. 이름이 rep1인 이중화 객체의 이중화를 중지하라. xdbiSQL> ALTER REPLICATION rep1 STOP; Alter success. 이름이 rep1인 이중화 객체에 파티션드 테이블 tbl_sales의 파티션 p2를 추가하라. xdbiSQL > ALTER REPLICATION rep1 STOP; Alter success. xdbiSQL > ALTER REPLICATION rep1 ADD TABLE FROM sys.tbl_sales PARTITION p2 TO sys.tbl_sales PARTITION p2; Alter success. 데이터 정의어 31 ALTER SEQUENCE 구문 alter_sequence ::= ALTERSEQUENCEseq_name INCREMENTinteger MAXVALUEinteger NOMAXVALUE MINVALUEinteger NOMINVALUE CYCLE CACHE ; integer user_name. BY 전제 조건 SYS 사용자, 시퀀스가 속한 스키마의 소유자 또는 ALTER ANY SEQUENCE 시스템 권한을 가진 사용자만이 이 구문으로 시퀀스를 변경할 수 있다. 설명 CREATE SEQUENCE 구문으로 시퀀스 생성 후 시퀀스의 정의를 변경하는 구문이다. 더 자세한 설명은 CREATE SEQUENCE 문을 참고한다. user_name 변경될 시퀀스의 소유자 이름이다. 생략하면 알티베이스는 현재 세션에 연결된 사용자의 스키마에 속한 것으로 간주한다. seq_name 변경될 시퀀스 이름이다. 32 SQL Reference INCREMENT BY 시퀀스 값의 증감분을 명시하는데 사용된다. MAXVALUE 시퀀스의 최대값을 명시하는데 사용된다. MINVALUE 시퀀스의 최소값을 명시하는데 사용된다. CYCLE 이는 시퀀스 값이 최대 또는 최소 한계 값에 도달한 후에도 그 시퀀스의 다음 값이 계속되는 것을 허용한다. 오름차순 시퀀스인 경우는 최대값에 도달한 후 최소값부터 다시 시작된다. 반면 내림차순 시퀀스인 경우는 최대값에 도달한 후 최대값부터 다시 시작된다. CACHE 시퀀스 값을 더 빠르게 액세스 하기 위하여 명시된 개수 만큼의 시퀀스 값들이 메모리에 캐시된다. 캐시는 시퀀스가 처음 참조될 때 채워지며 다음에 시퀀스 값이 요청될 때마다 캐시 된 값이 검색된다. 캐시에서 마지막 시퀀스 값이 사용된 이후 다음 시퀀스 값 요청시 새로운 시퀀스 값들이 메모리 캐시된다. 이 옵션을 생략할 경우 기본값은 20이다. 주의 사항 존재하는 시퀀스의 정의를 변경할 때, 시퀀스가 이미 생성된 이후 이므로 START WITH 절은 사용될 수 없다. 시퀀스에 대한 자세한 설명은 CREATE SEQUENCE 구문의 설명을 참고한다. 예제 <질의> 시퀀스 seq1을 최소값이 0, 최대값이 100이고 1씩 증가하도록 변경하라. xdbiSQL> ALTER SEQUENCE seq1 INCREMENT BY 1 MINVALUE 0 MAXVALUE 100; Alter success. 데이터 정의어 33 <질의> 시퀀스 seq2의 최소값, 최대값을 무한대로 변경하라. xdbiSQL> ALTER SEQUENCE seq2 NOMAXVALUE NOMINVALUE; Alter success. 34 SQL Reference ALTER TABLE 구문 alter_table::= ; ALTERTABLEtable_name user_name. log_compression_clause constraints_clauses RENAMEnew_tbl_name ALLINDEX ENABLE DISABLE column_clauses TO COMPACT alter_table_partitioning parallel_clause access_mode_clauseACCESS log_compression_clause ::= COMPRESSED LOGGING UNCOMPRESSED LOGGING parallel_clause::= PARALLELinteger NOPARALLEL 데이터 정의어 35 alter_table_partitioning ::= add_table_partition coalesce_table_partition drop_table_partition merge_table_partition rename_table_partition split_table_partition truncate_table_partition partition_access_mode add_table_partition ::= ADDpartition_spec coalesce_table_partition ::= COALESCEPARTITION drop_table_partition ::= DROPPARTITIONpartition_name merge_table_partition ::= MERGEPARTITIONSpartition_1partition_2,INTOpartition_spec rename_table_partition ::= RENAMEPARTITIONold_partition_nameTOnew_partition_name split_table_partition ::= SPLITPARTITIONcurrent_partitionvalue AT VALUES () , (),INTOpartition_specpartition_spec 36 SQL Reference truncate_table_partition ::= TRUNCATEPARTITIONpartition_name partition_spec ::= PARTITIONpartition_nametable_partition_description index_partition_spec table_partition_description ::= TABLESPACEtablespace_namelob_column_properties index_partition_spec ::= INDEX(partitioned index_nameindex_partition_description) , set_persistent_clause set_persistent_clause ::= index_partition_description ::= TABLESPACEtablespace_name PARTITIONindex_partition_name partition_access_mode ::= ACCESSPARTITIONpartition_nameaccess_mode_clause access_mode_clause ::= READ ONLY WRITE APPEND 데이터 정의어 37 column_clauses::= add_column_clause alter_column_clause drop_column_clause rename_column_clause modify_column_clause add_column_clauses::= ADD COLUMN column_definition() , lob_column_properties column_definition::= column_name , encrypt_clausevariable_clausedefault_clause column_constraint in_row_clause data_type TIMESTAMP 38 SQL Reference alter_column_clause ::= () ALTER column_name SETDEFAULT DROPDEFAULT NULL COLUMNNOT expr LOB_storage_clause LOB()LOB_item , STOREAS()lob_attributes LOGGING NOLOGGING BUFFER NOBUFFER LOB_storage_clause::= lob_attributes::= 데이터 정의어 39 modify_column_clause::= MODIFY COLUMN() , modify_column_spec modify_column_spec modify_column_spec::= column_name data_type FIXED VARIABLE TOLERATEDATALOSS DEFAULTexpr NOT NULL drop_column_clause::= COLUMN( , column_name column_name DROP ) rename_column_clause::= RENAMECOLUMNcolumn_namenew_column_nameTO 40 SQL Reference constraints_clauses::= add_table_constraint_clause drop_constraint_clause modify_constraint_clause rename_constraint_clause add_table_constraint_clauses ::= ADDtable_constraint_for_alter rename_constraint_clauses ::= RENAMEconstraint_namenew_constraint_nameTOCONSTRAINT drop_constraint_clauses ::= DROP CONSTRAINTconstraint_name PRIMARYKEY UNIQUE(column_constraint , ) 데이터 정의어 41 table_constraint_for_alter::= CONSTRAINTconstraint_name constraint_state column_name() PRIMARYKEY UNIQUE ,using_index_clause referential_constraint LOCALUNIQUE set_persistent_clause using_index_clause ::=, set_persistent_clause ::=, referential_constraint ::=CREATE TABLECREATE TABLE modify_constraint_clause::= MODIFYCONSTRAINTconstraint_nameconstraint_state constraint_state::= ENABLE VALIDATE NOVALIDATE 전제 조건 SYS 사용자, 테이블이 속한 스키마의 소유자 또는 ALTER ANY TABLE 시스템 권한을 가진 사용자만이 이 구문으로 테이블 정의를 변경할 수 있다. 설명 ALTER TABLE 구문은 명시된 테이블 정의를 변경하는 SQL문이다. 이 구문의 수행 후 해당 테이블의 메타 정보가 변경된다. ALTER TABLE 구문으로 파티션드 테이블(partitioned table)의 속성을 변경할 수 있다. 파티션드 테이블 관련 구문에는 추가(ADD), 병합(COALESCE), 삭제(DROP), 합병(MERGE), 이름변경(RENAME), 분할(SPLIT), 및 레코드 삭제(TRUNCATE)가 있다. 42 SQL Reference 아래 표는 각 구문을 범위, 해시, 리스트 파티션드 테이블에 사용할 수 있는지 여부를 나타낸다. 범위 파티션드 테이블 리스트 파티션드 테이블 해시 파티션드 테이블 추가 X X ○ 병합 X X ○ 삭제 ○ ○ X 합병 ○ ○ X 이름 변경 ○ ○ ○ 분할 ○ ○ X 레코드 삭제 ○ ○ ○ [표 2-1] 파티셔닝 방법에 따른 지원 연산 user_name 변경될 테이블의 소유자 이름이다. 생략하면 알티베이스는 현재 세션에 연결된 사용자의 스키마에 속한 것으로 간주한다. tbl_name 변경될 테이블 이름이다. COMPACT 데이터가 없는 빈 페이지들을 테이블스페이스에 반환할 것을 지정한다. 콤팩션을 수행할 때, 알티베이스는 실제로 데이터를 옮기지는 않는다. 이 구문은 메모리 테이블과 휘발성 테이블에 대해서만 지원된다. add_table_partition 이는 파티션드 테이블에 파티션을 추가하는 절이다. 이 절은 해시 파티션드 테이블에만 사용할 수 있다. 기존 파티션들에 로컬 인덱스가 이미 생성되어 있는 경우, 추가된 파티션에도 로컬 인덱스가 자동으로 생성된다. 이 때 로컬 인덱스의 이름은 시스템에 의해 자동으로 결정되고, 그 인덱스는 새로 추가된 파티션과 같은 테이블스페이스에 저장된다. partition_spec 이 절은 파티션의 이름과 파티션이 저장될 테이블스페이스를 명시하는데 사용된다. 테이블스페이스 이름은 생략이 가능하며 이 때에는 파티션의 데이터는 해당 테이블이 위치한 테이블스페이스에 저장된다. 또한, 해당 테이블에 인덱스가 존재한다면 인덱스 파티션이 저장될 테이블스페이스를 지정할 수 있다. 데이터 정의어 43 table_partition_description 이 절은 각 파티션이 저장될 테이블스페이스를 명시하고 LOB 컬럼이 있는 경우 LOB 컬럼의 속성을 지정하는데 사용된다. 테이블스페이스 절이 생략되면, 해당 테이블의 기본 테이블스페이스에 파티션이 저장된다. 마찬가지로 LOB 컬럼을 위한 테이블스페이스 절이 생략된 경우에는 해당 파티션의 테이블스페이스에 LOB컬럼의 데이터가 저장된다. 테이블스페이스 적용 방식에 관한 더 자세한 내용은 CREATE TABLE 구문의 table_partition_description설명을 참고한다. index_partition_spec SPLIT PARTITION, MERGE PARTITION, 또는 ADD PARTITION을 실행할 경우 새로운 파티션이 생성된다. 이 때, 이 절은 테이블 파티션과 함께 자동으로 생성되는 인덱스 파티션이 저장될 테이블스페이스를 지정하기 위해 사용될 수 있다. coalesce_table_partition 이 절은 해시 파티션에만 사용할 수 있다. 해시 파티션을 병합하고 데이터를 재구성한다. 파티션을 병합하면 마지막 파티션이 선택되어 그 파티션의 데이터는 남아있는 다른 파티션에 분배된 후 제거된다. drop_table_partition 이 절은 파티션을 제거하는데 사용된다. 파티션에 있는 데이터와 함께 로컬 인덱스도 제거된다. 데이터를 삭제하지 않으려면, 파티션을 DROP을 하기 전에 다른 파티션과 합병(MERGE)한다. merge_table_partition 두 개의 파티션을 한 개의 파티션으로 합병한다. INTO 절에 합병될 새로운 파티션의 이름을 지정한다. 새로운 파티션의 이름으로 합병될 두 개의 파티션 이름 중의 하나 또는 해당 테이블에 존재하지 않는 파티션의 이름을 사용할 수 있다. 범위 파티션을 합병할 경우, 두 개의 파티션 중 더 큰 상한값을 갖는 파티션으로 합병된다. 리스트 파티션을 합병할 경우, 두 개의 파티션이 갖는 파티션 키 값의 합집합을 갖는 파티션으로 합병된다. 어떤 파티션과 기본 파티션을 합병할 경우에는 합병된 파티션의 도메인은 기본 파티션의 도메인으로 포함되어 기본 파티션만 남게 된다. 44 SQL Reference 해당 테이블에 로컬 인덱스가 있는 경우에는 합병된 파티션의 로컬 인덱스가 삭제된다. 테이블에 LOB 컬럼이 있는 경우에는 LOB 컬럼에 대한 속성을 따로 명시할 수 있다. 테이블스페이스를 명시하지 않을 경우, 새로 생성될 파티션의 이름이 원래 존재하는 파티션의 이름과 같고 그 파티션이 다른 테이블스페이스에 저장되어 있었다 하더라도 새로운 파티션은 테이블의 기본 테이블스페이스에 저장된다. rename_table_partition 파티션의 이름을 변경한다. split_table_partition 하나의 파티션을 두 개의 파티션으로 분리한다. AT 절은 범위 파티션에만 사용할 수 있으며, 2개의 파티션으로 나누는 기준이 되는 파티션 키 값을 여기에 명시한다. 이 값은 바로 앞의 파티션 키 값보다 커야 하고, 분리하기 전의 파티션의 파티션 키 값보다는 작아야한다. VALUES 절은 리스트 파티션에만 사용할 수 있으며, 기존의 파티션 키 값의 리스트에서 분리하기를 원하는 값의 리스트를 여기에 명시한다. VALUES 절에 올 수 있는 값은 기존 파티션 키 값의 리스트에 반드시 들어있는 값이어야 한다. 그러나 그 리스트의 모든 값을 포함할 수는 없다. INTO 절은 분리된 2개의 파티션의 이름과 파티션이 저장될 테이블스페이스 등을 지정할 수 있는 구문이다. 테이블에 로컬 인덱스가 있는 경우 로컬 인덱스 파티션도 테이블 파티션과 같이 분리된다. 테이블에 LOB 컬럼이 있는 경우 LOB 컬럼에 대한 속성을 따로 정의할 수 있다. truncate_table_partition 해당 파티션 안에 있는 모든 데이터를 삭제한다. partition_access_mode 파티션에 대한 접근 모드를 읽기 전용 모드, 읽기/쓰기 모드 또는 읽기/추가 모드로 변경한다. ACCESS access_mode_clause 테이블에 대한 접근 모드를 읽기 전용 모드, 읽기/쓰기 모드 또는 데이터 정의어 45 읽기/추가 모드로 변경한다. add_column_clause 테이블에 새로운 칼럼을 추가한다. alter_column_clause 기존 칼럼의 기본 값을 변경한다. modify_column_clause 기존 칼럼의 자료형(data type)을 변경한다. 다음의 표는 특정 자료형이 다른 자료형으로 변경가능한지 여부를 나타낸다. △로 표시한 부분은 자료형을 변경했을 때, 테이블의 데이터가 NULL이 아닌 경우 자료 손실(data loss)이 발생할 수 있음을 나타낸다. 만일 이러한 자료 손실을 감수하고서라도 자료형을 변경하고자 하는 경우 TOLERATE DATA LOSS 옵션을 사용하면 된다. DATE 타입 변경시에는 DEFAULT_DATE_FORMAT 프로퍼티에 따라 칼럼의 데이터가 변환된다. 변경후 변경전 c h a r v a r c h a r n c h a r n v a r c h a r c l o b b i g i n t d o u b l e fl o a t i n t e g e r n u m b e r n u m e ri c r e a l s m a ll i n t d a t e b l o b b y t e n i b b l e b it v a r b it g e o m e t r y char o o o o △ △ △ △ △ △ △ △ △ varchar o o o o △ △ △ △ △ △ △ △ △ nchar o o o o △ △ △ △ △ △ △ △ △ nvarchar o o o o △ △ △ △ △ △ △ △ △ clob bigint o o o o o △ △ o △ △ △ o double o o o o △ o △ △ △ △ △ △ float o o o o △ △ △ △ △ △ △ △ integer o o o o o △ △ o △ △ △ o number o o o o △ △ △ △ △ △ △ △ numeric o o o o △ △ △ △ △ △ △ △ real o o o o △ △ △ △ △ △ o △ smallint o o o o o △ △ o △ △ △ o date △ △ △ △ o blob 46 SQL Reference byte o nibble o bit o o varbit o o o geometry o drop_column_clause 하나의 컬럼 혹은 여러 개의 컬럼을 삭제한다. rename_column_clause 칼럼 이름을 변경한다. column_definition DEFAULT 새로운 칼럼을 추가할 때 DEFAULT 절을 명시하지 않으면 각 행의 새로운 칼럼의 초기값은 NULL이다. 그러나 DEFAULT 절을 명시한 경우에는 기존 행에 칼럼 추가 시 명시한 DEFAULT 값이 입력된다. TIMESTAMP TIMESTAMP 칼럼을 추가한다. column_constraint 새로운 칼럼에 대해 제약조건을 명시한다. NULL/NOT NULL 칼럼에 NULL 값 허용 여부를 지정한다. ALTER TABLE 구문을 사용해서 NULL 값이 허용되지 않는 칼럼을 추가하고자 하면 기본값을 반드시 지정해야 한다. 즉, 테이블에 새로 추가될 칼럼은 NULL 값을 허용하거나 기본값이 지정되어 있어야한다. SET PERSISTENT 자세한 내용은 CREATE INDEX 문을 참고한다 USING INDEX TABLESPACE tablespace_name 제약 조건을 위해 생성되는 인덱스가 저장될 테이블스페이스를 지정한다. * ALTER TABLE 문의 상당수의 절이 CREATE TABLE 문과 같은 기능을 가지고 있다. 그러한 절들에 대한 자세한 정보는 CREATE TABLE문을 참고한다. constraints_clauses 테이블에 제약조건을 추가, 삭제하거나 이름을 변경하는 절이다. 데이터 정의어 47 add_table_constraints_clause 테이블에 제약조건을 추가하는 절이다. rename_table_constraints_clause 제약조건의 이름을 변경하는 절이다. drop_table_constraints_clause 존재하는 제약조건을 제거하는 절이다. DROP CONSTRAINT 제약조건 삭제 DROP PRIMARY KEY 기본키 삭제 DROP UNIQUE UNIQUE 제약 삭제 RENAME TO 테이블의 이름을 변경한다. ENABLE/DISABLE 해당 테이블(tbl_name)의 모든 인덱스들을 비활성화 또는 활성화 상태로 변경하는 옵션이다. 서버 재구동 시 또는 데이터베이스 운영 중에 인덱스 빌딩 시간을 최소화1하여 성능을 향상시킬 수 있다. 예를 들어, iLoader로 대량의 데이터를 데이터베이스에 적재할 때 (또는 기존 테이블의 내용을 새 테이블로 이동할 때) 데이터가 저장될 테이블에 인덱스가 많은 경우, 인덱스 구축으로 인해 데이터 로딩에 많은 시간이 소요2된다. 그러므로 인덱스를 비활성화(disable)시킨 상태에서 대량의 레코드 삽입 후 인덱스를 다시 활성화(enable) 하면 데이터 로딩 시간이 단축되어 성능을 향상시킬 수 있다. set_persistent_clause 로컬 파티션드 인덱스의 각 인덱스 파티션 별로는 이 옵션을 지정할 수 없고, 인덱스 전체에 지정할 수 있다. 자세한 설명은 CREATE INDEX 구문의 설명을 참고한다. 1 재구동 시의 성능을 극대화시키기 위해 인덱스 병렬 구축을 위한 구문을 제공한다. 또한 서버를 정상으로 종료할 때 인덱스를 디스크에 반영하는 PERSISTENT 인덱스 구문도 사용할 수 있다. 2 데이타베이스에 대량의 데이타를 가진 테이블에 대해서 인덱스 생성시 인덱스 생성 소요 시간은 인덱스의 개수에 비례한다. 하나의 테이블에 대해서 여러 개의 인덱스를 동시에 구축하는 방법은 제공하지 않지만, 각 인덱스 별로 병렬 구축을 수행한다면 인덱스 빌딩 시간을 최대한 단축시킬 수 있다. 48 SQL Reference 주의 사항 이중화 대상 테이블의 정의는 변경할 수 없다. 칼럼의 자료형을 변경하는 것은 테이블의 정의를 변경하는 것이므로 이중화 대상 테이블에는 허용되지 않는다. 테이블에 파티션이 하나만 있으면 COALESCE/DROP TABLE PARTITION을 사용할 수 없다. 해시 파티션드 테이블에 DROP PARTITION과 MERGE PARTITION절을 사용할 수 없다. 대신 COALESCE PARTITION 절을 이용하도록 한다. 또한 해시 파티션드 테이블에는 SPLIT PARTITION을 사용할 수 없다. 범위 파티션드 테이블의 경우 병합할 파티션은 서로 인접해 있어야 한다. 다른 테이블에 의해 참조되는 기본키(PRIMARY KEY) 또는 유니크 키가 테이블에 존재하면 그 테이블의 정의는 변경할 수 없다. 칼럼 추가 또는 삭제로 테이블의 전체 칼럼 수가 0이 되거나 최대 칼럼 수인 1024개를 초과할 수 없다. 만약 테이블에 VARIABLE 속성의 칼럼이 있다면 그 테이블의 최대 허용 칼럼 수는 IN ROW 절에 지정한 값에 따라 1024개 이하가 될 것이다. 기본키는 한 테이블에 한 개만 존재할 수 있다. 참조 제약의 경우 외래키(foreign key)와 참조키(기본 키 또는 유니크 키)의 칼럼 개수와 각 칼럼의 자료형은 동일해야 한다. 외래키와 관련있는 칼럼의 경우 칼럼의 자료형을 변경할 수 없다. 외래키가 걸려 있는 칼럼이거나 외래키에 의해 참조되는 키 (기본키 또는 유니크 키)가 걸려 있는 칼럼의 경우 데이터 타입 변경이 칼럼의 값을 변경시킬 수 있으므로, 데이터 타입 변경을 허용하지 않는다. 한 테이블에 생성할 수 있는 인덱스의 최대 개수는 64개이다. 한 테이블의 기본키와 유니크 제약조건의 개수의 총합이 64개를 넘을 수 없다. 제한 사항 ADD/DROP CONSTRAINT 절을 사용해서 기존 칼럼에 TIMESTAMP 제약조건을 추가 또는 삭제할 수 없다. 데이터 정의어 49 TIMESTAMP 제약조건을 가진 칼럼에 INSERT 또는 UPDATE 수행 시 기본값으로 시스템 시간 값이 입력된다. 따라서 ALTIER TABLE SET/DROP DEFAULT 문을 이용하여 DEFAULT를 변경 또는 삭제할 수 없다. 자세한 설명은 CREATE TABLE문을 참고한다 예제 칼럼 추가/삭제 <질의> 테이블 books에 다음 칼럼들을 추가하라. isbn: CHAR(10) PRIMARY KEY edition: INTEGER DEFAULT 1 xdbiSQL> ALTER TABLE books ADD COLUMN (isbn CHAR(10) PRIMARY KEY, edition INTEGER DEFAULT 1); Alter success. 또는 xdbiSQL> ALTER TABLE books ADD COLUMN (isbn CHAR(10) CONSTRAINT const1 PRIMARY KEY, edition INTEGER DEFAULT 1); Alter success. <질의> 테이블 books에서 isbn 칼럼을 삭제하라. xdbiSQL> ALTER TABLE books DROP COLUMN isbn; Alter success. <질의> 테이블 books에 TIMESTAMP 칼럼을 추가하라. xdbiSQL> ALTER TABLE books ADD COLUMN (due_date TIMESTAMP); Alter success. <질의> 테이블 books에 isbn, due_date 칼럼인 due_date을 삭제하라. xdbiSQL> ALTER TABLE books DROP COLUMN (isbn, due_date); Alter success. 기존 칼럼에 제약조건 추가/삭제 <질의> 테이블 books의 기존 bno(북넘버) 칼럼에 UNIQUE 제약조건을 추가하라. xdbiSQL> ALTER TABLE books ADD UNIQUE(bno); Alter success. 또는 xdbiSQL> ALTER TABLE books ADD CONSTRAINT const1 UNIQUE(bno); 50 SQL Reference Alter success <질의> 테이블 boosk의 const1 제약조건의 이름을 변경하라. xdbiSQL> ALTER TABLE books RENAME CONSTRAINT const1 TO const_unique; Alter success <질의> 테이블 books의 bno 칼럼의 UNIQUE 제약조건을 삭제하라. xdbiSQL> ALTER TABLE books DROP UNIQUE(bno); Alter success. 또는 xdbiSQL> ALTER TABLE books DROP CONSTRAINT const_unique; Alter success <질의> 테이블 inventory에 다음 칼럼 추가 시 books 테이블의 isbn을 참조하는 외래키 fk_isbn을 추가하라. isbn: CHAR(10) xdbiSQL> ALTER TABLE inventory ADD COLUMN(isbn CHAR(10) CONSTRAINT fk_isbn REFERENCES books(isbn)); Alter success. <질의> 테이블 inventory의 제약조건 fk_isbn을 삭제하라. xdbiSQL> ALTER TABLE inventory DROP CONSTRAINT fk_isbn; Alter success. <질의> 테이블 books에서 기본키 제약을 삭제하라. xdbiSQL> ALTER TABLE books DROP PRIMARY KEY; Alter success. <질의> 테이블 books의 칼럼 bno(북넘버)에 PRIMARY KEY 제약을 추가하라. xdbiSQL> ALTER TABLE books ADD PRIMARY KEY (bno) USING INDEX PARALLEL 4; Alter success. 각 인덱스 파티션을 위한 테이블스페이스 지정 <질의> 파티션드 테이블 t1에 LOCALUNIQUE 제약을 갖는 i2 컬럼을 추가하라. iSQL> ALTER TABLE T1 ADD COLUMN (I2 INTEGER LOCALUNIQUE USING INDEX LOCAL ( PARTITION P1_LOCALUNIQUE ON P1 TABLESPACE TBS3, PARTITION P2_LOCALUNIQUE ON P2 TABLESPACE TBS2, PARTITION P3_LOCALUNIQUE ON P3 TABLESPACE TBS1 ) ); <질의> 파티션드 테이블 t3에 LOCALUNIQUE 제약과 PERSISTENT 속성을 갖는 i7 컬럼을 추가하되, 생성될 파티션드 인덱스의 각 데이터 정의어 51 파티션이 저장될 테이블스페이스를 지정하라. iSQL> ALTER TABLE t3 ADD COLUMN ( i7 INTEGER LOCALUNIQUE SET PERSISTENT=ON USING INDEX LOCAL ( PARTITION p1_localunique ON p1 TABLESPACE PMT_TBS, PARTITION p2_localunique ON p2 TABLESPACE PMT_TBS, PARTITION p3_localunique ON p3 TABLESPACE PMT_TBS2, PARTITION p4_localunique ON p4 TABLESPACE PMT_TBS3, PARTITION pd_localunique ON pd TABLESPACE PMT_TBS4 )); Alter success. 칼럼 이름 변경 테이블의 칼럼 이름을 변경할 때 사용한다. 새로운 칼럼 이름은 그 테이블에 있는 다른 칼럼 이름과 같아서는 안 된다. 칼럼 이름이 변경됐을 때, 예전 칼럼과 관련 된 인덱스 및 모든 제약 조건은 새로운 칼럼이 승계한다. 예전 칼럼을 참조하는 저장 프로시저가 존재하면 해당 프로시저는 invalid 한 상태가 된다. 이렇게 된 저장 프로시저를 사용 가능하도록 하려면 사용자는 저장 프로시저내의 칼럼 이름을 새로운 이름으로 변경해야 한다. <질의> 테이블 departments에서 칼럼 이름 dno를 dcode로 변경하라. xdbiSQL> ALTER TABLE departments RENAME COLUMN dno TO dcode; Alter success. DEFAULT 값 설정/삭제 <질의> 테이블 employees에서 sex 칼럼의 기본값을 ‘M’으로 설정하라. xdbiSQL> ALTER TABLE employees ALTER (sex SET DEFAULT 'M'); Alter success. <질의> 테이블 employees에서 sex 칼럼의 기본값 설정을 삭제하라. xdbiSQL> ALTER TABLE employees ALTER (sex DROP DEFAULT); Alter success. 칼럼의 자료형 변경 <질의> 테이블 books의 isbn 칼럼의 자료형을 CHAR(20) 형으로, edition 칼럼의 자료형을 BIGINT 형으로 변경하라. xdbiSQL> ALTER TABLE books MODIFY COLUMN (isbn CHAR(20), edition BIGINT); Alter success. 52 SQL Reference 테이블 이름 변경 <질의> 테이블 books의 이름을 ebooks으로 변경하라. xdbiSQL> RENAME books TO ebooks; Rename success. 또는 xdbiSQL> ALTER TABLE books RENAME TO ebooks; Alter success. PERSISTENT 인덱스 변경 <질의> 테이블 books에 PRIMARY KEY 제약과 PERSISTENT 인덱스를 가진 칼럼 isbn을 추가하라. xdbiSQL> ALTER TABLE books ADD COLUMN (isbn CHAR(10) CONSTRAINT const1 PRIMARY KEY SET PERSISTENT = ON, edition INTEGER DEFAULT 1); Alter success. <질의> 테이블 books에 PRIMARY KEY 제약을 가지고 있는 칼럼 isbn에 PERSISTENT 인덱스를 추가하라. xdbiSQL> ALTER TABLE books ADD COLUMN (isbn CHAR(10) CONSTRAINT const1 PRIMARY KEY, edition INTEGER DEFAULT 1); Alter success. xdbiSQL> ALTER TABLE books DROP COLUMN isbn; Alter success. xdbiSQL> ALTER TABLE books ADD COLUMN (isbn CHAR(10) CONSTRAINT const1 PRIMARY KEY SET PERSISTENT = ON, edition INTEGER DEFAULT 1); Alter success. <질의> 파티션드 테이블 t1에 LOCALUNIQUE 제약과 PERSISTENT 속성을 갖는 i5 컬럼을 추가하라. iSQL> ALTER TABLE t1 ADD COLUMN (i5 INTEGER CONSTRAINT t1_localunique LOCALUNIQUE SET PERSISTENT=ON); Alter success. 인덱스 활성화/비활성화 <질의> 테이블 orders의 모든 인덱스를 비활성하라. xdbiSQL> ALTER TABLE orders ALL INDEX DISABLE; Alter success. 파티션드 테이블 생성 <질의> 범위, 리스트, 해시 파티션드 테이블을 생성하라. CREATE TABLE T1 데이터 정의어 53 ( I1 INTEGER, I2 INTEGER ) PARTITION BY RANGE(I1) ( PARTITION P1 VALUES LESS THAN (100), PARTITION P2 VALUES LESS THAN (200), PARTITION P3 VALUES DEFAULT ) TABLESPACE SYS_TBS_MEM_DATA; CREATE TABLE T2 ( I1 INTEGER, I2 INTEGER ) PARTITION BY LIST (I1) ( PARTITION P1 VALUES (1,2,3,4), PARTITION P2 VALUES (5,6,7,8), PARTITION P3 VALUES DEFAULT ) TABLESPACE SYS_TBS_MEM_DATA; CREATE TABLE T3 ( I1 INTEGER ) PARTITION BY HASH (I1) ( PARTITION P1, PARTITION P2 ) TABLESPACE SYS_TBS_MEM_DATA; 파티션 추가(ADD PARTITION) <질의> 해시 파티션드 테이블에 새로운 파티션을 추가하라.. ALTER TABLE T3 ADD PARTITION P3; 파티션 병합(COALESCE PARTITION) <질의> 해시 파티션드 테이블의 파티션을 병합하라.(T3에는 2개의 해시 파티션만 남는다) ALTER TABLE T3 COALESCE PARTITION; 파티션 삭제(DROP PARTITION) <질의> 테이블 T1에서 파티션 P2를 삭제한다. ALTER TABLE T1 DROP PARTITION P2; 파티션 합병(MERGE PARTITION) <질의> 테이블 T1에 남아있는 파티션인 P1, P3를 P_1_3이라는 새로운 이름을 갖는 파티션으로 합병한다. ALTER TABLE T1 MERGE PARTITIONS P1, P3 INTO PARTITION P_1_3; 54 SQL Reference 파티션 이름 변경(RENAME PARTITION) <질의> 파티션 P1의 이름을 P1_LIST로 변경한다. ALTER TABLE T2 RENAME PARTITION P1 TO P1_LIST; 파티션 분리(SPLIT PARTITION) <질의> 범위 파티션드 테이블 T1에서 기본 파티션인 P3를 350을 기준으로 분리한다. 이를 수행하면 200 ~ 350의 범위를 갖는 P_200_350이라는 이름의 파티션 하나가 생성되고, 기존의 기본 파티션의 이름은 P_OVER_350으로 변경될 것이다. ALTER TABLE T1 SPLIT PARTITION P3 AT ( 350 ) INTO ( PARTITION P_200_350, PARTITION P_OVER_350 ); <질의> 리스트 파티션드 테이블의 경우에는 AT 대신 VALUES를 사용해서 분리한다. ALTER TABLE T2 SPLIT PARTITION P1_LIST VALUES ( 2, 4 ) INTO ( PARTITION P_2_4 TABLESPACE TBS1, PARTITION P_1_3 TABLESPACE TBS2 ); 파티션 데이터 삭제(TRUNCATE PARTITION) <질의> 파티션 P5에 들어있는 모든 데이터를 삭제한다. ALTER TABLE T1 TRUNCATE PARTITION P5; 데이터 정의어 55 ALTER TABLESPACE 구문 alter_tablespace ::= ALTERTABLESPACEtablespace_namemodify_checkpoint_path_clause; backup_clause autoextend_clauseALTER autoextend_clause ::= NEXT AUTOEXTEND OFF ON integer K M G maxsize_clause maxsize_clause ::= MAXSIZE integer UNLIMITED G M K modify_checkpoint_path_clause ::= ADD RENAMEchkpoint_path’TO‘chkpoint_path’ DROP ‘CHECKPOINTPATH CHECKPOINTPATHchkpoint_path’‘ CHECKPOINTPATHchkpoint_path’‘ 56 SQL Reference backup_clause ::= BEGIN END BACKUP 전제 조건 SYS 사용자 또는 ALTER TABLESPACE 시스템 권한을 가진 사용자가 ALTER TABLESPACE 문의 모든 기능을 수행할 수 있다. 설명 ALTER TABLESPACE 문으로 테이블스페이스의 정의를 변경한다. 또한 체크포인트 경로, 자동 확장 관련 설정, 테이블스페이스 상태 등에 대해서도 변경할 수 있다. tablespace_name 변경될 테이블스페이스 이름이다. autoextend_clause 메모리 테이블스페이스의 자동 확장 관련 속성(여부, 확장단위, 최대 크기)을 변경한다. modify_checkpoint_path_clause 체크포인트 이미지 경로를 추가, 변경, 또는 삭제하는 절이다. 체크포인트 이미지 경로 관련 연산들은 CONTROL 구동 단계에서만 가능하다. ADD CHECKPOINT PATH 절 메모리 테이블스페이스에 새로운 체크포인트 경로를 추가한다. DBA는 다른 체크포인트 경로 안에 존재하는 기존의 체크포인트 이미지들을 새로운 체크포인트 경로로 이동해도 된다. 메모리 테이블스페이스를 로드할 때, 알티베이스는 모든 체크포인트 경로에 대해서 체크포인트 이미지 파일을 검색하기 때문에, 체크포인트 이미지는 테이블스페이스의 체크포인트 경로 중 하나에 저장되어 있으면 된다. 새로운 체크포인트 경로를 추가한 후에 체크포인트가 발생하면, 체크포인트 이미지 파일이 새로운 체크포인트 경로까지 포함한 모든 체크포인트 경로에 골고루 분배된다. 데이터 정의어 57 명시한 체크포인트 경로가 존재하지 않거나, 알티베이스 서버를 구동한 사용자 계정이 체크포인트 경로에 적절한 권한 (permission) 을 갖고 있지 않으면 에러가 발생한다. 그러므로, DBA는 추가될 체크포인트 경로를 파일 시스템 상에 직접 생성하고, 그 경로에 대한 적절한 권한을 사용자 계정에 줘야 한다. RENAME CHECKPOINT PATH 절 메모리 테이블스페이스의 기존 체크포인트 경로를 TO 이하 절로 지정한 경로로 변경한다. DBA는 파일 시스템 상에서 실제 체크포인트 경로의 이름을 변경하는 작업을 직접 수행해야 한다. 해당 체크포인트 경로가 존재하지 않거나, 알티베이스 서버를 구동한 사용자 계정이 체크포인트 경로에 대한 적절한 권한(permission)을 갖고 있지 않으면 에러가 발생한다. DROP CHECKPOINT PATH 절 메모리 테이블스페이스의 기존 체크포인트 경로를 삭제한다. DBA는 삭제된 체크포인트 경로의 디렉토리 안에 존재하는 기존의 체크포인트 이미지들을 테이블스페이스에 남아있는 다른 체크포인트 경로로 이동해야 한다. 메모리 테이블스페이스를 로드할 때, 알티베이스는 모든 체크포인트 경로에 대해서 체크포인트 이미지 파일을 검색하기 때문에, 체크포인트 이미지는 테이블스페이스의 체크포인트 경로 중 하나에 저장되어 있으면 된다. 파일 시스템 상에서 실제 체크포인트 경로를 삭제하는 작업은 DBA가 직접 수행하여야 한다. 메모리 테이블스페이스에는 최소한 하나의 체크포인트 경로가 존재해야 한다. 만약 메모리 테이스블스페이스에 남아있는 하나뿐인 유일한 체크포인트 경로를 제거하려고 하는 경우 에러가 발생한다. backup clause 테이블스페이스의 데이터 파일을 복사하는 온라인 백업(핫 백업)의 시작과 완료를 명시하는 구문이다. BEGIN BACKUP 테이블스페이스를 구성하는 모든 데이터 파일들에 온라인 백업 모드를 설정하는 절이다. 이 구문과 END BACKUP사이에 놓인 백업 중인 테이블스페이스에도 트랜잭션의 접근이 가능하다. 사용자는 데이터 파일을 “온라인 백업”(직접 복사)하기 전에 BEGIN BACKUP을 먼저 실행해야 한다. 또한 사용자는 한 개 이상의 테이블스페이스를 동시에 온라인 백업 모드로 설정하는 것도 가능하다. 58 SQL Reference END BACKUP 테이블스페이스의 온라인 백업이 완료되었음을 명시한다. 사용자는 온라인 백업을 완료한 직후에 바로 END BACKUP 구문을 수행해야 한다. 예제 <질의> 체크포인트시의 디스크 입출력 분산을 위해 ‘/home/path’ 체크포인트 경로를 user_memory_tbs 테이블스페이스에 추가하라. 또한, 확장 단위를 256M, 최대 크기를 1G로 변경하라. (경로 추가 작업은 CONTROL 단계에서만 가능하고, 속성 변경은 SERVICE 단계에서 할 수 있다.) iSQL(sysdba)>>startup control; iSQL(sysdba)>>ALTER TABLESPACE user_memory_tbs ADD CHECKPOINT PATH '/home/path'; Alter success. xdbiSQL> ALTER TABLESPACE user_memory_tbs ALTER AUTOEXTEND OFF; xdbiSQL> ALTER TABLESPACE user_memory_tbs ALTER AUTOEXTEND ON NEXT 256M MAXSIZE 1G; Alter success. 데이터 정의어 59 ALTER TRIGGER 구문 alter_trigger ::= ALTERTRIGGERtrigger_name ENABLE DISABLE COMPILEuser_name. ; 전제 조건 SYS 사용자, 트리거가 속한 스키마의 소유자 또는 ALTER ANY TRIGGER 시스템 권한을 가진 사용자만이 이 구문으로 트리거를 변경할 수 있다. 설명 명시한 트리거의 작동을 가능, 불가능하게 하거나 컴파일 한다. user_name 변경될 트리거의 소유자 이름을 명시한다. 생략하면 알티베이스는 현재 세션에 접속한 사용자의 스키마에 속한 것으로 간주한다. trigger_name 변경될 트리거의 이름을 명시한다. ENABLE 명시한 트리거의 작동을 사용 가능하게 한다. DISABLE 명시한 트리거의 작동을 불가능하게 한다. COMPILE 명시한 트리거의 유효성 여부에 관계 없이 명시적으로 컴파일 한다. 명시적 재컴파일은 수행 중에 트리거가 유효하지 않은 경우 암시적으로 컴파일 하는 부하를 제거한다. 60 SQL Reference 예제 <질의> 다음 예는 명시한 트리거의 작동을 불가능하게 한다. 트리거 del_trigger를 생성하는 구문은 CREATE TRIGGER 문의 예제를 참조한다. xdbiSQL> ALTER TRIGGER del_trigger DISABLE; Alter success. 데이터 정의어 61 ALTER USER 구문 alter_user ::= ALTER IDENTIFIED USERuser_name password ACCESStblspace_name OFF ; DEFAULTTABLESPACEtblspace_name BY ON 전제 조건 SYS 사용자 또는 ALTER USER 시스템 권한을 가진 사용자만이 이 구문을 이용해서 사용자 정의를 변경할 수 있다. 그러나 현재 접속한 사용자가 자신의 암호를 변경할 때에는 권한이 필요없다. 설명 사용자의 암호를 변경하는 구문이다. IDENTIFIED 절 사용자의 새로운 암호를 명시한다. 새로운 암호는 BY 뒤에 지정한다. 이외 다른 절의 기능들은 CREATE USER 문의 해당하는 절과 동일하므로 CREATE USER 문을 참고한다. 주의사항 SYSDBA 모드로 접속가능한 SYS 사용자의 암호를 변경하고자 할 경우, 먼저 ALTER USER 문으로 암호를 변경한 후 운영체제의 콘솔 62 SQL Reference (유닉스 쉘 혹은 DOS 창)에서 altipasswd를 실행하여 암호를 한번 더 변경해야 한다. altipasswd에 대한 자세한 내용은 Utilities Manual을 참고한다. 예제 <질의> 사용자 tom의 암호를 ab1rose로 변경하라. xdbiSQL> ALTER USER tom IDENTIFIED BY ab1rose; Alter success. <질의> 사용자의 기본 테이블스페이스를 변경하라. xdbiSQL> ALTER USER tom DEFAULT TABLESPACE uare_data; Alter success. 데이터 정의어 63 ALTER VIEW 구문 alter_view ::= ALTERVIEW user_name. view_nameCOMPILE; 전제 조건 SYS 사용자, 뷰가 속한 스키마의 소유자 또는 ALTER ANY TABLE 시스템 권한을 가진 사용자만이 이 구문으로 뷰를 변경할 수 있다. 설명 뷰가 유효하지 않을 때(invalid) 그 뷰를 재 컴파일 하는데 사용한다. 예를 들어, 뷰의 기반 테이블중에 하나가 ALTER TABLE 문에 의하여 정의가 변경된 경우 명시적으로 뷰를 재 컴파일 하는데 사용할 수 있다. user_name 재 컴파일 될 뷰의 소유자 이름을 명시한다. 생략하면 알티베이스는 현재 세션에 연결된 사용자의 스키마에 속한 것으로 간주한다. view_name 재 컴파일 될 뷰의 이름을 명시한다. 뷰를 재 컴파일 때 알티베이스는 뷰 생성문을 읽어와 다시 컴파일을 수행하므로 뷰 생성 시 발생할 수 있는 오류들이 ALTER VIEW 문 수행 시에도 발생할 수 있다. 뷰를 생성할 때 FORCE 옵션을 사용했다면, ALTER VIEW 문으로 뷰를 컴파일하는데 성공한 후에도 뷰가 여전히 무효인 상태일 수 있다. ALTER VIEW 문은 기존 뷰의 정의를 변경하지 않는다. 뷰를 재 정의하려면 CREATE OR REPLACE VIEW 문을 사용해야 한다. 64 SQL Reference 예제 <질의> 기반 테이블 employees의 정의를 변경 후, 뷰 avg_sal 을 재 컴파일하라. (avg_sal 뷰의 생성은 CREATE VIEW 예제를 참고하라.) xdbiSQL> ALTER TABLE employees ADD COLUMN (email VARCHAR(20)); Alter success. xdbiSQL> ALTER VIEW avg_sal COMPILE; Alter success. xdbiSQL> SELECT * FROM avg_sal; DNO EMP_AVG_SAL --------------------- .. 6 rows selected. 데이터 정의어 65 COMMENT 구문 comment_on ::= user_name TABLE COLUMN .table_name view_name comment COMMENTON user_name.table_name view_name . . column_name IS‘’; 전제 조건 SYS 사용자, 테이블(뷰)이 속한 스키마의 소유자, 테이블(뷰)에 대해 ALTER 객체 권한을 가진 사용자, 또는 ALTER ANY TABLE 시스템 권한을 가진 사용자만이 이 구문으로 주석을 작성할 수 있다. 설명 명시된 테이블, 뷰 또는 칼럼에 대한 주석을 작성하거나 수정하는데 사용한다. user_name COMMENT 문을 실행할 객체의 소유자 이름을 명시한다. 생략하면 알티베이스는 현재 세션에 연결된 사용자의 스키마에 속한 것으로 간주한다. table_name, view_name 주석을 다는 테이블 혹은 뷰의 이름을 명시한다. column_name 주석을 다는 칼럼 이름을 명시한다. 66 SQL Reference comment 주석 내용을 명시한다. 주석은 최대 4000 바이트까지 입력할 수 있다. 주석을 삭제하고자 할 때에는 작은 따옴표(‘) 사이에 주석 내용을 쓰지 말고 COMMENT 문을 실행하여 기존 내용을 지운다. 예제 <질의> 사용자 library의 테이블 books와 그 테이블의 title칼럼에 주석을 추가한다. xdbiSQL> COMMENT ON TABLE library.books IS 'Table of Book Info'; Comment Created. xdbiSQL> COMMENT ON COLUMN library.books.title IS 'Title of Book'; Comment Created. <질의> 사용자 library의 테이블 books 와 그 칼럼의 주석을 조회한다. xdbiSQL> SET VERTICAL ON; xdbiSQL> SELECT * FROM system_.sys_comments_ WHERE user_name = ‘LIBRARY’ AND table_name = ‘BOOKS’; SYS_COMMENTS_.USER_NAME : LIBRARY SYS_COMMENTS_.TABLE_NAME : BOOKS SYS_COMMENTS_.COLUMN_NAME : TITLE SYS_COMMENTS_.COMMENTS : title of book SYS_COMMENTS_.USER_NAME : LIBRARY SYS_COMMENTS_.TABLE_NAME : BOOKS SYS_COMMENTS_.COLUMN_NAME : SYS_COMMENTS_.COMMENTS : table of book info 2 rows selected. <질의> 테이블 books와 그 테이블의 title칼럼의 주석을 제거한다. xdbiSQL> COMMENT ON TABLE library.books IS ’’; Comment created. xdbiSQL> COMMENT ON COLUMN library.books.title IS ’’; Comment created. 데이터 정의어 67 CREATE DATABASE 구문 create_database ::= CREATEDATABASEdatabase_nameintegerINITSIZE= M G ARCHIVELOG NOARCHIVELOG ; CHARACTER NATIONALCHARACTERSET SETcharaset charaset 전제 조건 이 구문은 PROCESS 구동 단계에서만 수행할 수 있으므로, SYS 사용자가 -sysdba 모드로 실행한 iSQL에서만 실행할 수 있다. 설명 데이터베이스를 생성하는 구문이다. 데이터베이스 생성시 딕셔너리 테이블스페이스(Dictionary Tablespace), 언두 테이블스페이스(Undo Tablespace), 임시 테이블스페이스(Temp Tablespace)등 다수의 시스템 테이블스페이스(System Tablespace)가 만들어진다. 생성되는 시스템 테이블스페이스는 시스템에 의해 정의된 이름과 알티베이스 프로퍼티의 기본값을 갖는다. 사용자 정의 테이블스페이스는 이후에 사용자가 추가로 생성할 수 있다. 데이터베이스 생성시 데이터베이스 캐릭터 셋과 내셔널 캐릭터 셋을 반드시 지정해야 한다. database_name 생성할 데이터베이스 이름을 명시한다. 명시하는 데이터베이스 68 SQL Reference 이름은 프로퍼티 파일에 DB_NAME프로퍼티로 지정한 이름과 동일해야 한다. 다른 경우에는 오류가 발생한다. INITSIZE 절 데이터베이스의 초기 크기를 나타내며, 128M 또는 4G 등의 형식으로 사용할 수 있다. 단위 없이 숫자만 명시할 경우, 기본으로 MB(Mega Bytes) 단위로 지정된다. ARCHIVELOG | NOARCHIVELOG 데이터베이스를 archive log 모드 또는 noachive log 모드로 운영할지를 명시한다. 아카이브로그 모드로 운영시 매체 복구에 대비할 수 있는 반면, 노아카이브로그 모드로 운영할 때에는 매체 복구가 불가능하다. 알티베이스 백업과 복구에 대한 자세한 정보는 Administrator’s Manual을 참고하기 바란다. charset 데이터베이스의 캐릭터 셋, 내셔날 캐릭터 셋을 지정한다. 지정 가능한 데이터베이스 캐릭터 셋 US7ASCII KO16KSC5601 MS949 BIG5 GB231280 UTF8 SHIFTJIS EUCJP 지정 가능한 내셔널 캐릭터 셋 UTF8 UTF16 예제 <질의> 이름이 mydb이고, 데이터베이스 캐릭터 셋은 KSC5601, 내셔널 캐릭터 셋은 UTF16인 10MB 크기의 데이터베이스를 생성하라. $ xdbisql -s localhost -u sys -p manager -sysdba .. xdbiSQL> STARTUP PROCESS; Trying Connect to Altibase.. Connected with Altibase. TRANSITION TO PHASE: PROCESS 데이터 정의어 69 Command execute success. xdbiSQL> CREATE DATABASE mydb INITSIZE=10M NOARCHIVELOG CHARACTER SET KSC5601 NATIONAL CHARACTER SET UTF16; . . Create success. 70 SQL Reference CREATE DIRECTORY 구문 CREATE ORREPLACE DIRECTORYdirectory_name AS‘’path_name; 전제 조건 SYS 사용자 또는 CREATE ANY DIRECTORY 시스템 권한을 가진 사용자만이 이 구문으로 디렉토리 객체를 생성할 수 있다. 설명 저장프로시저에서 파일 조작이 가능하다는 것은 운영 체제 파일 시스템상의 텍스트 파일에 대한 읽기 및 쓰기가 가능하다는 것을 의미한다. 이 기능을 이용하여 사용자는 저장프로시저 실행에 대해서 메시지를 파일에 남길 수도 있으며, 파일로 질의 결과를 리포팅 하거나 파일로부터 데이터를 읽어와 테이블에 삽입하는 등 다양한 작업을 수행할 수 있다. CREATE DIRECTORY구문은 이러한 저장프로시저가 사용하는 파일들이 위치하는 디렉토리에 해당하는 데이터베이스 객체를 생성하는데 사용된다. CREATE DIRECTORY문으로 생성된 디렉토리 객체의 소유자는 항상 SYS사용자이다. 실제 디렉토리 객체를 생성한 사용자는 이 객체에 대한 읽기와 쓰기 권한(WITH GRANT OPTION 포함)을 부여받을 뿐이다. CREATE DIRECTORY문의 실행은 SYS_DIRECTORIES_ 메타 테이블에 디렉토리 정보를 기록할 뿐이며, 실제 운영 체제의 파일 시스템에 디렉토리를 생성하지는 않는다. 따라서 사용자는 실제 파일 시스템에 수동으로 디렉토리를 생성해야 한다. 데이터 정의어 71 OR REPLACE 이미 존재하는 디렉토리를 대체하여 같은 이름의 새로운 디렉토리를 생성하기 위한 옵션이다. 파일 시스템상의 실제 디렉토리는 삭제되지 않는다. directory_name 데이터베이스 객체로서의 디렉토리 이름을 명시한다. path_name 운영 체제 파일 시스템 상의 디렉토리의 절대 경로를 문자열로 명시한다. 예제 <질의> /home/altibase/altibase_xdb_home/psm_msg 디렉토리를 가리키는 alti_dir1 디렉토리 객체를 생성하라. xdbiSQL> create directory alti_dir1 as '/home/altibase/altibase_xdb_home/psm_msg'; Create success. <질의> /home/altibase/altibase_xdb_home/psm_result 디렉토리를 가리키는 alti_dir1 디렉토리 객체를 생성하라. 이미 alti_dir1 이름의 디렉토리가 데이터베이스에 존재하는 경우 이를 대체하여 생성하라. xdbiSQL> create or replace directory alti_dir1 as '/home/altibase/altibase_xdb_home/psm_result'; Create success. 72 SQL Reference CREATE INDEX 구문 create_index ::= CREATE memory_index_clause INDEX ON index_name UNIQUEuser_name. table_index_clause; table_index_clause ::= ()column_name ASC DESC , user_name. tbl_name memory_index_clause ::= domain_index_clauseindex_partitioning_clause set_persistent_clausememory_index_attributes index_partitioning_clause ::= LOCAL (index_partition_definition , TABLESPACEtablespace_name ) 데이터 정의어 73 index_partition_definition ::= PARTITIONindex_partition_nametable_partition_nameON domain_index_clause ::= INDEXTYPEISBTREE set_persistent_clause ::= PERSISTENTSET= ON OFF memory_index_attributes ::= TABLESPACEtablespace_name parallel_clause parallel_clause ::= PARALLEL NOPARALLEL parallel_factor 전제 조건 SYS 사용자, CREATE INDEX 시스템 권한을 가진 사용자 또는 인덱스가 생성될 테이블에 대한 INDEX 객체 권한을 가진 사용자만이 이 구문으로 인덱스를 생성할 수 있다. 설명 테이블의 한 개 이상의 칼럼에 대해 인덱스를 생성하는 구문이다. 74 SQL Reference 파티션드 인덱스(즉, 로컬 인덱스)를 생성하려면 LOCALUNIQUE 옵션을 사용해서 로컬 유니크 속성을 부여하면 된다. 파티션드 인덱스는 파티션 키 칼럼과 인덱스 키 칼럼의 관계에 따라 프리픽스드 인덱스(prefixed-index)와 논프리픽스드 인덱스(non- prefixed index)로 구분된다. 파티션 키 칼럼과 인덱스 키 칼럼의 가장 왼쪽 컬럼이 같은 경우 프리픽스드 인덱스이며, 같지 않은 경우 논프리픽스드 인덱스이다. user_name 생성될 인덱스의 소유자 이름을 명시한다. 생략하면 알티베이스는 현재 세션에 연결된 사용자의 스키마에 인덱스를 생성한다. index_name 생성될 인덱스 이름을 명시한다. UNIQUE 중복 값을 허용하지 않는다. LOCALUNIQUE 파티션드 인덱스 생성시 사용할 수 있다. 파티션드 인덱스의 각 인덱스 파티션별로 UNIQUE제약 조건을 만족해야 함을 가리킨다. ASC/DESC 인덱스 키의 각 칼럼이 오름차순인지 내림차순인지를 지정한다. index_partitioning_clause 생성될 인덱스가 파티션드 인덱스임을 명시하고, 인덱스 파티션들이 저장될 테이블스페이스를 지정하는 절이다. 이 절을 생략하면, 인덱스 파티션들은 테이블의 기본 테이블스페이스에 저장될 것이다. 파티션드 인덱스를 생성하는 가장 쉬운 방법은 인덱스 생성시 LOCAL 키워드를 명시하는 것이다. 아니면, 각 테이블 파티션별로 생성될 인덱스 파티션에 대한 속성을 상세히 명시해야 한다. LOCAL 키워드만 명시하면, 각 테이블 파티션별로 인덱스 파티션이 자동으로 생성되며 각 인덱스 파티션의 이름은 시스템에 의해 자동으로 부여된다. 인덱스 파티션 이름은 SYS_IDX1, SYS_IDX2, ... 와 같은 형태로 순차적으로 붙여진다. 모든 테이블 파티션 또는 그 일부에 인덱스 파티션을 직접 명시할 수 있다. 일부에만 명시하는 경우 나머지 테이블 파티션에 대한 인덱스 파티션은 자동적으로 생성되며, 생성 방식은 상기와 동일하다. 파티션드 인덱스 생성시 테이블스페이스를 명시하지 않으면, 각 데이터 정의어 75 인덱스 파티션이 저장될 테이블스페이스는 아래 도표의 과정을 거쳐서 결정된다. LOCAL만 명시한 경우 각각의 인덱스 파티션을 명시한 경우 파티션의 테이블스페이스가 명시되었나? 각 테이블 파티션의 테이블스페이스 명시한 테이블스페이스 해당 테이블 파티션의 테이블스페이스 YESNO 주의: 메모리 테이블에 인덱스를 생성하는 구문에 테이블스페이스를 지정하더라도 메모리 인덱스는 테이블스페이스에 저장되지 않으므로 이는 무시된다. 즉 각 파티션이 저장될 테이블스페이스를 지정하더라도 이는 무시된다. BTREE B+-Tree 인덱스를 생성하도록 지시한다. 이는 범위 검색 시 유용하다. INDEXTYPE IS 절 생략 시 기본으로 B+-Tree 인덱스가 생성된다. SET PERSISTENT 서버가 정상으로 종료 시 메모리 테이블에 대한 인덱스를 디스크에 저장할 것인지 여부를 지정하는 옵션이다. 서버 종료 시 메모리 테이블에 대한 인덱스는 디스크에 저장되지 않고, 서버 구동 시 메모리 테이블스페이스의 모든 인덱스들은 재생성된다. 그러나 PERSISTENT 옵션을 ON으로 인덱스를 생성하면, 서버를 정상 종료할 때 메모리 인덱스는 디스크의 특정 파일에 저장된다. 그리고 서버가 구동될 때 저장된 인덱스 파일들을 읽음으로써 인덱스 재생성 시간이 절약될 수 있다. 기본값은 OFF이다. 서버가 종료될 때 인덱스가 디스크에 저장되도록 하려면 PERSTISTENT 옵션을 ON으로 지정한다. 메모리 파티션드 테이블에 로컬 파티션드 인덱스를 생성하면서 이 옵션을 지정하면 로컬 파티션드 인덱스 전체에 이 옵션이 적용된다. 즉, 각 인덱스 파티션 별로는 이 옵션을 지정할 수 없다. 76 SQL Reference TABLESPACE 절 인덱스가 저장될 테이블스페이스 이름을 명시한다. 이 절을 생략하면 알티베이스는 인덱스를 그 인덱스가 속하는 스키마 소유자의 기본 테이블스페이스에 생성한다. 그러나 메모리 테이블에 인덱스를 생성하는 구문에는 테이블스페이스를 지정하더라도 메모리 인덱스는 테이블스페이스에 저장되지 않으므로 이는 무시된다. parallel_clause 이는 인덱스를 생성하는 쓰레드의 개수를 결정하는 데 사용되는 힌트(hint)로 인덱스 생성시 성능 향상을 목적으로 사용한다. 알티베이스는 사용자가 힌트로 지정한 parallel_factor, 인덱스 생성 대상 테이블의 크기 및 인덱스 생성 시 사용가능한 메모리 양을 고려하여 최적화된 인덱스 생성 쓰레드의 개수를 결정한다. parallel_factor의 입력 가능한 값의 범위는 0 ~ 512이고, 기본값은 알티베이스가 동작중인 호스트 장비의 CPU 개수이다. 인덱스 생성 쓰래드 개수는 위에서 설명한 최적화 방법으로 결정되기 때문에 parallel_factor는 생략해도 무방하다. 이 구문을 생략하거나 0으로 설정한 경우, parallel_factor와 동일한 의미를 갖는 altibase_xdb.properties 파일에 설정된 INDEX_BUILD_THREAD_COUNT 프로퍼티 값이 대신 사용된다. INDEX_BUILD_THREAD_COUNT프로퍼티도 명시되어 있지 않은 경우, CPU 개수에 기반하여 최적화된 인덱스 생성 쓰레드 개수가 결정된다. parallel_factor의 값을 실제 CPU 개수보다 큰 값으로 설정하는 경우, 혹은 최대값인 512를 초과해 설정하는 경우, CPU 개수를 힌트로 사용하여 최적화된 인덱스 생성 쓰레드 개수가 결정된다. 주의 사항 파티션드 테이블에 인덱스(즉, 파티션드 인덱스)를 생성하는 경우, 각 로컬 인덱스가 저장될 테이블스페이스는 index_partitioning_clause 에 따로따로 지정할 수 있다. memory_index_attributes는 파티션드 인덱스 전체를 위한 테이블스페이스를 지정하는데 사용될 수 없다. 즉, 파티션드 인덱스 전체를 위한 테이블스페이스는 지정할 수 없다. 또한 B+-tree 인덱스만 로컬 인덱스가 될 수 있다. LOB 칼럼은 인덱스 키 칼럼이 될 수 없다. 데이터 정의어 77 예제 <질의 1> 사원 테이블의 eno 칼럼 (오름차순)과 dno칼럼 (내림차순)에 인덱스 emp_idx2를 생성하라. xdbiSQL> CREATE INDEX emp_idx2 ON employees (eno ASC, dno DESC); Create success. <질의 2> 사원 테이블의 dno 칼럼에 내림차순의 유니크 인덱스 emp_idx2를 생성하라. (이는 사원 테이블에 레코드가 전혀 없거나 칼럼 dno에 unique한 값들만 존재 할 때 가능하다.) xdbiSQL> CREATE UNIQUE INDEX emp_idx2 ON employees (dno DESC); Create success. <질의 3>테이블 employees의 eno 칼럼에 오름차순으로 B+tree 인덱스 emp_idx3를 생성하라. 이미 사원 테이블의 eno칼럼에 PRIMARY KEY가 존재하기 때문에 인덱스 emp_idx3를 생성하기 전에 기본키 제약을 삭제해야 한다. 그렇지 않으면, 다음 오류가 발생할 것이다: ERR-3104C: Duplicate key columns in an index xdbiSQL> ALTER TABLE employees DROP PRIMARY KEY; Alter success. xdbiSQL> CREATE INDEX emp_idx3 ON employees (eno ASC) INDEXTYPE IS BTREE; Create success. <질의 4> 테이블 employees의 eno칼럼(내림차순)과 dno 칼럼(오름차순)에 PERSISTENT 속성을 가진 B+tree인덱스 emp_idx1을 생성하라. xdbiSQL> CREATE INDEX emp_idx1 ON employees (eno DESC, dno ASC) INDEXTYPE IS BTREE SET PERSISTENT = ON; Create success. <질의 5> user_data 테이블스페이스에 table_user 테이블의 i1칼럼에 인덱스 idx1을 생성하라. xdbiSQL> CREATE INDEX idx1 ON table_user (i1) TABLESPACE user_data; Create success. <질의 6> user_data 테이블스페이스에 table_user 테이블의 i1 칼럼에 인덱스 idx2을 병렬 옵션으로 생성하라. xdbiSQL> CREATE INDEX idx1 ON table_user (i1) TABLESPACE user_data PARALLEL 4; Create success. <질의 7> 로컬 인덱스, 즉 i1을 기준으로 메모리 파티션드 테이블 78 SQL Reference t1의 각 파티션에 대응하는 파티션별로 인덱스를 생성하라. 또한, 이름이 t1_idx이며 PERSISTENT 속성을 가지는 B+tree 인덱스로 생성하라. CREATE INDEX t1_idx ON t1(i1) LOCAL INDEXTYPE IS BTREE SET PERSISTENT=ON; <질의 8> 각각의 인덱스 파티션을 지정해서 메모리 파티션드 테이블 products에 로컬 인덱스를 생성하라. CREATE INDEX prod_idx ON products(product_id) LOCAL ( PARTITION p_idx1 ON p1 TABLESPACE tbs_mem1, PARTITION p_idx3 ON p3 TABLESPACE tbs_mem3 ) INDEXTYPE IS BTREE SET PERSISTENT=ON; 데이터 정의어 79 CREATE QUEUE 구문 create_queue ::= size; CREATEQUEUEqueue_name FIXED ) variable_clause ( 설명 큐에 삽입 가능한 최대 메시지의 길이를 지정하여 큐를 생성하는 구문이다. 큐 테이블에 저장 가능한 최대 레코드 수도 지정할 수 있다. queue_name 큐의 이름을 지정한다. 최대로 가능한 큐 이름의 길이는 28 바이트이다. size 큐에 저장될 메시지의 최대 크기(단위: 바이트)를 지정한다. 지정 가능한 값의 범위는 1에서 32000바이트이다. FIXED|variable_clause 메시지의 저장 방식을 지정한다. (자세한 설명은 General Reference를 참고한다.) 주의사항 큐 생성시에 데이터베이스 내부적으로 “큐 이름”+ “_NEXT_MSG_ID”라는 명칭의 테이블 객체가 생성된다. 따라서 생성 하고자 하는 큐의 이름 또는 “큐 이름”+ “_NEXT_MSG_ID”과 동일한 80 SQL Reference 이름의 테이블, 뷰, 시퀀스, 시노님, 또는 저장 프로시저가 이미 존재하는 경우에 에러가 발생한다. 예제 <질의> 메시지의 길이가 최대 40인 Q1이라는 이름의 큐를 생성하라. CREATE QUEUE Q1(40); 데이터 정의어 81 CREATE REPLICATION 구문 create_replication ::= WITH'replication_host_ip',replication_host_port_no , FROM;TOreplication_item LAZY EAGER AS MASTER AS SLAVE CREATEREPLICATIONreplication_name replication_item replication_item ::= .user_nametbl_name partition_namePARTITION 설명 이중화 객체를 생성하는 구문으로, 이는 지역 서버에서 원격 서버로의 이중화 연결을 설정한다. 한 이중화 객체는 최대 32개의 다른 원격 서버와 연결할 수 있다. 이중화는 테이블 간에 1:1 로 일어난다. 즉, 한 테이블은 상대편의 오직 하나의 테이블에만 매칭된다. 데이터 충돌을 해결하기 위해 이중화 생성 구문에 AS MASTER 또는 AS SLAVE를 지정하여 Master-Slave scheme을 사용할 수 있다. 이중화 충돌 해결에 대한 자세한 내용은 Replication Manual을 참고한다. replication_name 이중화 이름을 명시한다. 지역 서버와 원격 서버의 이중화 객체의 이름이 동일해야 한다. 82 SQL Reference replication_host_ip 원격 서버의 IP 주소를 입력한다. replication_host_port_no 원격 서버의 수신 쓰레드가 사용하는 포트번호를 입력한다. 이는 원격 서버 altibase_xdb.properties 파일의 REPLICATION_PORT_NO프로퍼티 값과 일치해야 한다. user_name 이중화 대상 테이블의 소유자 이름을 명시한다. tbl_name 이중화 대상 테이블 이름을 명시한다. partition_name 이중화 대상 파티션 이름을 명시한다. 예제 <질의> 다음 조건에 부합하는 이중화 rep1을 생성하라. 지역 서버의 IP 주소가 192.168.1.60 이고 포트 번호가 25524 원격 서버의 IP 주소가 192.168.1.12 이고 포트 번호가 35524 employees 테이블과 departments 테이블을 이중화 지역 서버의 경우 (IP: 192.168.60) xdbiSQL> CREATE REPLICATION rep1 WITH '192.168.1.12',35524 FROM sys.employees TO sys.employees, FROM sys.departments TO sys.departments; Create success. 원격 서버의 경우 (IP: 192.168.1.12) xdbiSQL> CREATE REPLICATION rep1 WITH '192.168.1.60',25524 FROM sys.employees TO sys.employees, FROM sys.departments TO sys.departments; Create success. 데이터 정의어 83 CREATE SEQUENCE 구문 create_sequence ::= CREATESEQUENCEseq_name integer MAXVALUEinteger NOMAXVALUE MINVALUEinteger NOMINVALUE CYCLE CACHE ; INCREMENT WITHSTART integer user_name. BY 전제 조건 SYS 사용자 또는 CREATE SEQUENCE 시스템 권한을 가진 사용자만이 이 구문으로 시퀀스를 생성할 수 있다. 만약 다른 사용자의 스키마에 시퀀스를 생성하려면, CREATE ANY SEQUENCE 권한을 가져야한다. 설명 이 구문은 명시된 시퀀스 이름으로 새로운 시퀀스를 생성한다. 생성된 시퀀스는 시퀀스 번호를 자동으로 생성하는데 사용된다. user_name 생성될 시퀀스의 소유자 이름을 명시한다. 생략하면 알티베이스는 현재 세션에 연결된 사용자의 스키마에 시퀀스를 생성한다. seq_name 84 SQL Reference 생성될 시퀀스 이름을 명시한다. START WITH 시퀀스의 시작값을 명시한다. 이는 MINVALUE와 MAXVALUE 사이의 값으로 지정 가능하다. 이 값이 생략되고 INCREMENT BY의 값이 0보다 크면, 기본값은 시퀀스의 최소값과 동일하다. 이 값이 생략되고 INCREMENT BY의 값이 0보다 작으면, 기본값은 시퀀스의 최대값과 동일하다. INCREMENT BY 시퀀스의 증감분을 명시한다. 기본값은 1이다. 이 값의 절대값은 MAXVALUE와 MINVALUE의 차이보다 작아야 한다. MAXVALUE 시퀀스의 최대값을 명시한다. 이는 -9223372036854775807부터 9223372036854775806까지의 범위내에서 지정 가능하다. 생략할 경우, INCREMENT BY의 값이 0보다 크면 기본값은 9223372036854775806이다. INCREMENT BY의 값이 0보다 작으면, 기본값은 -1이다. MINVALUE 시퀀스의 최소값을 명시한다. 이는 -9223372036854775807부터 9223372036854775806까지의 범위내에서 지정 가능하다. 생략할 경우, INCREMENT BY의 값이 0보다 크면 기본값은 1이다. INCREMENT BY의 값이 0보다 작으면, 기본값은 - 9223372036854775807이다. CYCLE 이는 시퀀스가 최대값 또는 최소값 한계에 도달했을 때 다음 시퀀스 값을 계속 생성할지 여부를 지정하는 옵션이다. 오름차순 시퀀스의 경우는 시퀀스의 다음 값은 최소값에서 다시 순환되고, 내림차순 시퀀스의 경우는 최대값부터 다시 순환된다. CACHE 시퀀스 값을 더 빠르게 액세스 하기 위하여 명시된 개수 만큼의 시퀀스 값들이 메모리에 캐시된다. 캐시는 시퀀스가 처음 참조될 때 채워지며 다음 시퀀스 값을 요청할 때마다 캐시된 시퀀스에서 검색된다. 캐시된 마지막 시퀀스 값을 사용한 이후의 다음 시퀀스 값 요청시에 시퀀스 값들이 메모리에 캐시된다. 이 값을 생략하면 기본값은 20이다. * 새로 생성된 시퀀스에 대한 sequence_name.CURRVAL시도는 실패한다. sequence_name.CURRVAL로 새로 생성된 시퀀스에 데이터 정의어 85 접근하려면 먼저 sequence_name.NEXTVAL을 사용해야만 한다. 예제 다음 SQL문들을 이용하여 새로운 시퀀스를 정의하고 시퀀스 값과 정보를 확인해본다. xdbiSQL> CREATE TABLE seqtbl(i1 INTEGER); Create success. xdbiSQL> CREATE OR REPLACE PROCEDURE proc1 AS BEGIN FOR i IN 1 .. 10 LOOP INSERT INTO seqtbl VALUES(i); END LOOP; END; / Create success. xdbiSQL> EXEC proc1; Execute success. <질의> 13 부터 시작해서 3씩 증가하고 최소값이 0, 최대값이 무한대인 seq1시퀀스를 생성하라. xdbiSQL> CREATE SEQUENCE seq1 START WITH 13 INCREMENT BY 3 MINVALUE 0 NOMAXVALUE; Create success. xdbiSQL> INSERT INTO seqtbl VALUES(seq1.NEXTVAL); 1 row inserted. xdbiSQL> INSERT INTO seqtbl VALUES(seq1.NEXTVAL); 1 row inserted. xdbiSQL> SELECT * FROM seqtbl; SEQTBL.I1 -------------- 1 2 3 4 5 6 7 8 9 10 13 16 12 rows selected. <질의> 시퀀스 seq1을 50씩 증가 시키되 최대값 100에 도달한 경우에는 다시 최소값부터 시작하도록 변경하라. xdbiSQL> ALTER SEQUENCE sys.seq1 INCREMENT BY 50 MAXVALUE 100 CYCLE; Alter success. xdbiSQL> INSERT INTO sys.seqtbl VALUES(seq1.NEXTVAL); 1 row inserted. 86 SQL Reference xdbiSQL> INSERT INTO sys.seqtbl VALUES(seq1.NEXTVAL); 1 row inserted. xdbiSQL> INSERT INTO sys.seqtbl VALUES(seq1.NEXTVAL); 1 row inserted. xdbiSQL> INSERT INTO sys.seqtbl VALUES(seq1.NEXTVAL); 1 row inserted. xdbiSQL> SELECT * FROM sys.seqtbl; SEQTBL.I1 -------------- 1 2 3 4 5 6 7 8 9 10 13 16 66 0 50 100 16 rows selected. <질의> 새 번호 생성 전에 시퀀스 seq1의 현재 값을 확인하라. xdbiSQL> SELECT seq1.CURRVAL FROM dual; SEQ1.CURRVAL ----------------------- 100 1 row selected. <질의> 칼럼 i1의 값을 seq1 시퀀스의 다음 값인 0으로 갱신하라. xdbiSQL> UPDATE SEQTBL SET i1 = seq1.NEXTVAL; 16 rows updated. <질의> 시퀀스 seq1의 현재 값을 확인하라. xdbiSQL> SELECT seq1.CURRVAL FROM dual; SEQ1.CURRVAL ----------------------- 0 1 row selected. <질의> 빠른 액세스를 위해 명시된 값 (25개) 만큼 시퀀스 값들을 메모리에 캐시하도록 시퀀스 seq1을 변경하라. xdbiSQL> ALTER SEQUENCE seq1 INCREMENT BY 2 MAXVALUE 200 CACHE 25; Alter success. xdbiSQL> CREATE OR REPLACE PROCEDURE proc2 AS BEGIN FOR i IN 1 .. 30 LOOP INSERT INTO sqqtbl VALUES(seq1.NEXTVAL); END LOOP; END; / Create success. xdbiSQL> EXEC proc2; Execute success. 데이터 정의어 87 xdbiSQL> SELECT * FROM seqtbl; SEQTBL.I1 -------------- 0 50 100 0 50 100 0 50 100 0 50 100 0 50 100 0 2 4 6 8 10 12 14 . . . 58 60 46 rows selected. SYS 계정으로 데이터베이스에 접속한 경우 아래 쿼리는 모든 시퀀스들의 정보를 출력한다. xdbiSQL> SELECT * FROM SEQ; USER_NAME -------------------------------------------- SEQUENCE_NAME CURRENT_VALUE INCREMENT_BY ------------------------------------------------ MIN_VALUE MAX_VALUE CYCLE CACHE_SIZE ------------------------------------------------ SYS SEQ1 60 2 0 200 YES 25 1 row selected. 다음 SQL문들을 이용하여 여러 계정에서 새로운 시퀀스를 정의하고 시퀀스 값과 정보를 확인해본다. xdbiSQL> CONNECT sys/manager; Connect success. xdbiSQL> CREATE USER user1 IDENTIFIED BY user1; Create success. xdbiSQL> CREATE USER user2 IDENTIFIED BY user2; Create success. xdbiSQL> CONNECT user1/user1; Connect success. xdbiSQL> CREATE SEQUENCE seq1 MAXVALUE 100 CYCLE; Create success. xdbiSQL> CREATE SEQUENCE seq2; Create success. <질의> user1이 생성한 모든 시퀀스의 정보를 출력한다. xdbiSQL> SELECT * FROM SEQ; 88 SQL Reference SEQUENCE_NAME CURRENT_VALUE INCREMENT_BY ------------------------------------------------ MIN_VALUE MAX_VALUE CYCLE CACHE_SIZE ------------------------------------------------ SEQ1 1 1 1 100 YES 20 SEQ2 1 1 1 9223372036854775806 NO 20 2 rows selected. xdbiSQL> CONNECT user2/user2; Connect success. xdbiSQL> CREATE SEQUENCE seq1 INCREMENT BY -30; Create success. xdbiSQL> CREATE SEQUENCE seq2 INCREMENT BY -10 MINVALUE - 100; Create success. xdbiSQL> CONNECT sys/manager; Connect success. xdbiSQL> CREATE SEQUENCE seq2 START WITH 20 INCREMENT BY 30; Create success. xdbiSQL> CREATE SEQUENCE seq3 CACHE 40; Create success. <질의> SYS 계정으로 데이터베이스에 접속한 경우 아래 쿼리는 모든 시퀀스의 정보를 출력한다. xdbiSQL> SELECT * FROM SEQ; USER_NAME -------------------------------------------- SEQUENCE_NAME CURRENT_VALUE INCREMENT_BY ------------------------------------------------ MIN_VALUE MAX_VALUE CYCLE CACHE_SIZE ------------------------------------------------ SYS SEQ1 60 2 0 200 YES 25 SYS SEQ2 20 30 1 9223372036854775806 NO 20 SYS SEQ3 1 1 1 9223372036854775806 NO 40 USER1 SEQ1 1 1 1 100 YES 20 USER1 SEQ2 1 1 1 9223372036854775806 NO 20 USER2 SEQ1 -1 -30 -9223372036854775806 -1 NO 20 USER2 SEQ2 -1 -10 -100 -1 NO 20 7 rows selected. <질의> 다음 SQL문을 이용하여 시퀀스 객체로부터 정보를 확인한다. xdbiSQL> select * from v$seq; ->이 구문은 생성되어 있는 모든 시퀀스 객체에 대한 정보를 읽어 들인다. Select * from seq와 달리 다른 사용자의 시퀀스 정보도 데이터 정의어 89 확인할 수 있다. V$SEQ 성능 뷰에 대한 자세한 내용은 Administrator's Manual의 데이터 딕셔너리 장의 성능 뷰 절을 참고한다. 90 SQL Reference CREATE SYNONYM 구문 create_synonym ::= CREATEsynonym_nameSYNONYM ; PUBLICuser_name. user_name. FORobject_name 전제 조건 SYS 사용자 또는 CREATE SYNONYM 시스템 권한을 가진 사용자만 이 구문으로 시노님을 생성할 수 있다. 또한 다른 사용자의 스키마에 시노님를 생성하려면 SYS 사용자이거나 CREATE ANY SYNONYM 시스템 권한을 가져야 하며, PUBLIC 시노님 생성을 위해서는 SYS 사용자이거나 CREATE PUBLIC SYNONYM 시스템 권한을 가져야 한다. 설명 이 구문은 시노님을 생성하는 SQL문으로, 시노님이란 다음 객체들에 대한 별칭을 의미한다. 테이블 뷰 시퀀스 저장 프로시저 및 저장 함수 다른 시노님 데이터 정의어 91 다음 SQL문에서 시노님을 사용할 수 있다. DML 문 DDL 문 SELECT INSERT UPDATE DELETE MOVE LOCK TABLE GRANT REVOKE PUBLIC 시노님과 PRIVATE 시노님 PUBLIC 시노님은 모든 사용자가 사용할 수 있는 시노님이며, PRIVATE 시노님은 그 시노님의 소유자만 사용할 수 있는 시노님이다. PUBLIC 시노님을 생성하려면 이 구문에 PUBLIC을 명시해야 한다. 이를 명시하지 않으면 기본으로 PRIVATE 시노님이 생성된다. user_name 시노님 앞에 위치하는 사용자명은 시노님 소유자명이다. PUBLIC 시노님을 생성하는 경우에는 소유자명을 명시하지 않는다. PRIVATE 시노님을 생성하는 경우에 소유자명을 명시할 수 있다. 소유자명을 명시하지 않을 경우 시노님은 CREATE SYNONYM문을 수행하는 세션에 연결된 사용자의 스키마에 생성된다. synonym_name 생성할 시노님 이름과 동일한 이름의 테이블, 뷰, 시퀀스, 저장프로시저, 저장함수, 또는 다른 시노님이 존재할 경우에는 오류가 반환된다. 시노님은 이들 객체와 동일한 이름 영역 (namespace)에 저장되므로, 시노님의 이름은 자신이 속할 스키마 내에서 유일해야 한다. FOR clause 별칭을 제공할 대상 객체를 명시하는 절이다. user_name 별칭을 제공할 대상 객체의 소유자명을 명시한다. 지정하지 않을 경우에 알티베이스는 현재 세션에 접속되어 시노님을 생성하고 있는 사용자의 스키마에 속하는 것으로 간주한다. object_name 별칭을 제공할 대상 객체명을 명시한다. 만약 그 객체가 데이터베이스 내에 존재하지 않더라도 시노님 생성 92 SQL Reference 시에는 오류가 리턴되지 않고 시노님 생성은 성공한다. 즉, 시노님 생성시에는 대상 스키마 객체가 현재 존재하지 않아도 되며, 별칭을 제공할 객체에 대한 권한이 없어도 된다. 권한과 시노님 시노님에 대한 DML문을 수행하기 위해서는 사용자가 시노님의 대상 객체에 대한 DML 실행 권한을 가지고 있어야 한다. 시노님에 대하여 DML 실행 권한을 부여 또는 박탈할 때, 실제로는 시노님의 대상이 되는 객체에 그 권한이 부여되거나 박탈된다. 따라서 시노님에 대한 DML문 수행 시 권한 오류가 발생하는 경우, 시노님 대상 객체에 대한 DML 실행 권한이 사용자에게 부여되어 있는지 SYS_GRANT_SYSTEM_ 또는 SYS_GRANT_OBJECT 메타 테이블에서 확인해야 한다. 사용자에게 적절한 권한이 없는 경우 권한을 부여해야 한다. 사용자에게 권한을 부여할 때, 대상 객체에 대한 권한을 부여하여도 되고 시노님에 대한 권한을 부여해도 된다. 사용자에게 대상 객체에 대한 적절한 권한이 이미 있다면 시노님을 생성한 후 시노님에 대한 권한까지 부여할 필요는 없다. 또한 시노님에 대한 권한을 부여함으로써 객체에 대한 권한이 부여된 경우, 해당 시노님이 삭제되더라도 객체에 대한 권한은 그대로 유지된다. 이는 시노님에 대한 권한을 부여하더라도 실제로는 시노님 자체에 대한 권한이 아니라 시노님 대상 객체에 대한 권한이 부여되기 때문이다. 객체 이름 검색 우선 순위 SQL문에서 참조되는 객체가 데이터베이스 내의 어떤 객체인지를 결정하기 위해서, 알티베이스는 테이블, 뷰, 시퀀스, 저장프로시저, 또는 저장함수의 이름을 먼저 찾아본다. 여기에 존재하지 않으면 그 이름의 시노님을 찾는다. 시노님 내에서는 PRIVATE 시노님이 PUBLIC 시노님보다 검색 우선 순위가 높다. 예를 들어 SQL문에서 참조되는 이름을 가지는 객체가 데이터베이스에 존재하는지 알티베이스가 검사하는 순서는 다음과 같다. SELECT * FROM NAME 1. “NAME”이라는 이름의 테이블 또는 뷰를 찾는다. 데이터 정의어 93 2. 이름이 “NAME”인 테이블 또는 뷰가 존재하지 않으면 현재 세션 에 접속한 사용자의 스키마에서 그 이름의 PRIVATE 시노님을 찾는다. 3. 그 이름의 PRIVATE 시노님이 존재하지 않으면 PUBLIC 시노님 을 찾는다. SELECT * FROM USER.NAME 1. “USER” 스키마에서 “NAME”이라는 이름의 테이블 또는 뷰를 찾는다. 2. 이름이 “NAME”인 테이블 또는 뷰가 존재하지 않으면 “USER” 스키마에서 그 이름의 PRIVATE 시노님을 찾는다. 3. 그 이름의 PRIVATE 시노님이 존재하지 않으면, PUBLIC 시노님 을 찾지는 않는다. 대신 오류를 반환한다. 예제 <질의> 사용자 altibase가 소유한 dept 테이블에 별칭으로 my_dept라는 시노님을 현재 사용자 소유로 생성하고 이 시노님을 이용해서 DML문을 수행한다. xdbiSQL> CONNECT altibase/altibase; Connect success. xdbiSQL> CREATE TABLE dept ( id integer, name char(10), location varchar(40), member integer ); Create success. xdbiSQL> GRANT INSERT ON dept TO mylee; Grant success. xdbiSQL> GRANT SELECT ON dept TO mylee; Grant success. xdbiSQL> CONNECT mylee/mylee; Connect success. xdbiSQL> CREATE SYNONYM mylee.my_dept FOR altibase.dept; Create success. xdbiSQL> INSERT INTO my_dept VALUES (1,'rndn1',NULL,4); 1 row inserted. xdbiSQL> SELECT * FROM my_dept; MY_DEPT.ID MY_DEPT.NAME MY_DEPT.LOCATION ------------------------------------------------------- MY_DEPT.MEMBER ----------------- 1 rndn1 4 1 row selected. 94 SQL Reference CREATE TABLE 구문 create_table ::= CREATETABLEtbl_name() column_definition table_constraint , user_name. table_partitioning_clause table_compression_clause tablespace_clause log_compression_clauselob_column_properties subqueryAS ; access_mode_clause column_definition ::= column_name , variable_clausedefault_clause column_constraint in_row_clause data_type TIMESTAMP variable_clause::= FIXED VARIABLE 데이터 정의어 95 in_row_clause::= INROWinteger default_clause::= DEFAULTexpr column_constraint ::= CONSTRAINTconstraint_name NOT NULL unique_clause references_clause unique_clause ::= sort_order_clauseset_persistent_clauseusing_index_clause unique_specification unique_specification ::= LOCALUNIQUE KEYPRIMARY UNIQUE sort_order_clause ::= ASC DESC 96 SQL Reference set_persistent_clause ::= PERSISTENTSET= OFF ON using_index_clause ::= INDEXUSING memory_index_attributes references_clause::= REFERENCEStbl_name user_name.column_name)( ON INSERT UPDATE NOACTIONDELETE DELETECASCADE table_constraint ::= CONSTRAINTconstraint_namereferential_constraint table_unique_clause table_unique_clause ::= sort_order_clause unique_specificationcolumn_name() , set_persistent_clauseusing_index_clause 데이터 정의어 97 referential_constraint ::= column_name(FOREIGNKEY) , REFERENCEStbl_name user_name.column_name() ON INSERT UPDATE NOACTIONDELETE DELETECASCADE , , table_partitioning_clause ::= range_partitioning hash_partitioning list_partitioningrow_movement_clause range_partitioning ::= PARTITIONBYRANGE()column , (partition_default_clause partition_range_clause, ) 98 SQL Reference partition_default_clause ::= PARTITIONpartition_nameVALUESDEFAULT table_partition_description table_partition_description ::= TABLESPACEtablespace_namelob_column_propertiesaccess_mode_clause partition_range_clause ::= VALUESvalue)( , LESSTHAN PARTITIONpartition_name table_partition_description hash_partitioning ::= PARTITIONBYHASH()column , (PARTITIONpartition_nametable_partition_description) , list_partitioning ::= PARTITIONBYLIST()column , (partition_default_clause partition_list_clause, ) 데이터 정의어 99 partition_list_clause ::= VALUESvalue)( , PARTITIONpartition_name table_partition_description row_movement_clause ::= DISABLE ENABLE ROWMOVEMENT access_mode_clause ::= READ ONLY WRITE APPEND tablespace_clause ::= TABLESPACEtablespace_name log_compression_clause ::= COMPRESSED LOGGING UNCOMPRESSED LOGGING lob_column_properties ::= LOB_storage_clause 100 SQL Reference lob_storage_clause ::= LOB()LOB_item , STOREAS()lob_attributes lob_attributes ::= TABLESPACEtablespace_name LOGGING NOLOGGING BUFFER NOBUFFER 전제 조건 SYS 사용자와 CREATE TABLE 시스템 권한을 가진 사용자만이 이 구문으로 테이블을 생성할 수 있다. 설명 명시된 이름의 새로운 테이블을 생성한다. user_name 생성될 테이블 소유자 이름을 명시한다. 생략하면 알티베이스는 현재 세션에 연결된 사용자의 스키마에 테이블을 생성한다. tbl_name 생성될 테이블 이름을 명시한다. column_definition DEFAULT 칼럼에 DEFAULT 절을 명시하지 않고 테이블을 생성한 경우, 데이터 삽입시 해당 칼럼의 값을 명시하지 않으면 NULL이 입력된다. 데이터 정의어 101 TIMESTAMP TIMESTAMP 칼럼은 여러 면에서 다른 데이터 타입들처럼 다뤄진다. 예를 들어, CREATE TABLE 문에 칼럼의 데이터 타입으로 TIMESTAMP를 명시한 경우 내부적으로 데이터 크기가 8Byte인 TIMESTAMP 칼럼이 생성된다. 그러나 TIMESTAMP 칼럼의 값은 시스템에 의해 결정되기 때문에 명시적으로 DEFAULT 값을 설정할 수 없다. 또한 TIMESTAMP 칼럼은 한 테이블에 하나만 생성할 수 있다. column constraint 새로운 테이블을 생성할 때 칼럼에 대한 제약조건을 설정한다. 명시적으로 제약조건의 이름을 지정할 수 있다. LOCALUNIQUE 제약조건은 파티션드 테이블에 사용될 수 있다. PRIMARY KEY UNIQUE LOCALUNIQUE (NOT) NULL 참조 무결성(referential integrity) PERSISTENT: CREATE INDEX 참고 TIMESTAMP PRIMARY KEY 기본키의 값은 테이블 내에서 유일해야 하며 기본키에 속하는 칼럼은 널(NULL) 값을 가질 수 없다. 한 테이블 내에 정의 가능한 기본키의 개수는 하나이며, 최대 32개 칼럼들의 조합에 대해 기본 키를 생성할 수 있다. UNIQUE UNIQUE 제약조건을 정의하면 유니크 키에 해당하는 칼럼 (또는 칼럼의 조합)은 같은 값을 2개 이상 가질 수 없다. 단, 널 값은 허용된다. 같은 칼럼 또는 같은 칼럼의 조합에 대해 유니크 제약조건과 기본키를 동시에 정의할 수 없다. 또한, 같은 칼럼 또는 같은 칼럼의 조합에 대해 2개 이상의 유니크 제약조건도 존재할 수 없다. 그러나 다른 칼럼 또는 다른 칼럼들의 조합에는 존재할 수 있다. 최대 32개 칼럼의 조합에 대해 유니크 제약조건을 생성할 수 있다. NULL 해당 칼럼이 널 값을 가질 수 있다는 것을 의미한다. 102 SQL Reference NOT NULL 해당 칼럼이 널 값을 가질 수 없다는 것을 의미한다. PERSISTENT SET PERSISTENT 절을 사용하지 않은 경우 기본값은 OFF이다. 자세한 정보는 CREATE INDEX 문의 설명을 참고한다. table_constraint 한 칼럼 또는 칼럼들의 조합에 대한 제약조건을 명시하는 절이다. 다음의 테이블 제약조건이 있다. PRIMARY KEY UNIQUE LOCALUNIQUE 참조 무결성(referential integrity) using_index_clause 제약조건을 위해 자동으로 생성되는 인덱스가 저장될 테이블스페이스를 지정하는 절이다. PRIMARY KEY , UNIQUE 또는 LOCALUNIQUE 제약을 명시할 경우, 자동으로 생성되는 로컬 인덱스가 저장될 테이블스페이스를 각 인덱스 파티션 별로 지정할 수 있다. 자세한 설명은 CREATE INDEX 구문의 index_partitioning_clause를 참조한다. referential_constraint 외래키를 정의하는 절이다. 외래키에 의해 참조되는 다른 테이블의 참조키(referenced key)는 그 테이블에서 유니크 제약조건에 해당하거나 그 테이블의 기본키이어야 한다. 만약 이 절에 참조키의 칼럼들을 명시하지 않은 경우, 해당 테이블의 기본키가 자동으로 참조키가 된다. NO ACTION “부모(parent) 테이블” (참조키가 있는 테이블)에 대해 INSERT, DELETE, 또는 UPDATE 구문을 실행하면, 알티베이스는 “자식(child) 테이블” (참조키를 참조하는 외래키를 가진 테이블)에 대한 무결성 검사를 한 후에 이 구문을 수행한다. NO ACTION은 무결성 검사 후에 자식 테이블에 대해서는 어떠한 작업도 하지 않음을 명시하는 옵션이다. 예를 들어 다음과 같이 employees 테이블을 생성하면, departments 테이블에서 어떤 부서를 삭제하려 할 때, employees 테이블의 데이터 정의어 103 레코드가 이 부서 번호를 참조하고 있다면, 삭제 시도는 실패하고 에러가 발생할 것이다. CREATE TABLE employees ( ENO INTEGER PRIMARY KEY, DNO INTEGER, NAME CHAR(10), FOREIGN KEY(DNO) REFERENCES departments(DNO) ON DELETE NO ACTION ); ON DELETE CASCADE 이는 부모 테이블의 행이 삭제되면 외래 키 값을 가진 자식 테이블에서 이 행을 참조하는 모든 행도 삭제될 것을 명시하는 옵션이다. 예를 들어 예를 들어 다음과 같이 employees 테이블을 생성하면, departments 테이블에서 어떤 부서를 삭제하려 할 때, employees 테이블에서 이 부서 번호를 참조하는 모든 행도 삭제된다. CREATE TABLE employees ( ENO INTEGER PRIMARY KEY, DNO INTEGER, NAME CHAR(10), FOREIGN KEY(DNO) REFERENCES departments (DNO) ON DELETE CASCADE ); table_partitioning_clause 파티션드 테이블을 생성하는 절이다. 범위 파티셔닝(range partitioning), 해시 파티셔닝(hash partitioning), 리스트 파티셔닝(list partitioning) 방법으로 파티션드 테이블을 생성할 수 있다. 파티션드 테이블을 생성할 때 row_movement_clause도 명시할 수 있다. range_partitioning 범위 파티션드 테이블 생성시 파티션 키 값의 범위를 명시하는 절이다. 주로 DATE 자료형에 많이 사용된다. 사용자가 지정한 값을 기준으로 테이블이 분할되기 때문에, 파티션별로 데이터의 고른 분포는 보장되지 않는다. 각 파티션의 범위는 그 범위의 최대값을 설정함으로써 결정된다. 명시된 범위 외의 모든 값과 NULL은 기본 파티션(default partition)에 속하게 된다. 기본 파티션 절은 생략할 수 없다. 여러 칼럼들의 조합으로 파티션 키를 정의할 수 있다. table_partition_description 파티션별로 테이블스페이스를 지정할 수 있다. 또한 테이블에 한 개 이상의 LOB 컬럼이 있을 경우, 각 LOB 컬럼의 속성을 따로 명시할 수 있다. 그리고 파티션에 대한 접근 모드를 설정할 수 있다. 테이블스페이스 절이 생략되면, 그 파티션은 해당 테이블의 기본 104 SQL Reference 테이블스페이스(default tablespace)에 저장된다. 또한 LOB 컬럼이 저장될 테이블스페이스를 지정하지 않으면 LOB 데이터는 해당 파티션의 테이블스페이스에 저장된다. 다음의 예제에서 사용자의 기본 테이블스페이스는 tbs_05이다. CREATE TABLE print_media_demo ( product_id INTEGER, ad_photo BLOB, ad_print BLOB, ad_composite BLOB ) PARTITION BY RANGE (product_id) ( PARTITION p1 VALUES LESS THAN (3000) TABLESPACE tbs_01 LOB (ad_photo) STORE AS (TABLESPACE tbs_02 ), PARTITION p2 VALUES DEFAULT LOB (ad_composite) STORE AS (TABLESPACE tbs_03) ) TABLESPACE tbs_04; 파티션 p1의 테이블스페이스는 명시적으로 지정되었으므로 tbs_01테이블스페이스에 저장된다. 그리고 해당 파티션의 ad_photo 컬럼은 tbs_02테이블스페이스에 저장된다. 기본 파티션인 p2의 테이블스페이스는 지정되지 않았으므로 print_media_demo 테이블의 기본 테이블스페이스인 tbs_04에 저장된다. 만약 이 테이블의 테이블스페이스를 지정하지 않았다면 사용자의 기본 테이블스페이스인 tbs_05에 저장될 것이다. 위의 설명을 그림으로 나타내면 다음과 같다. 지정한 테이블스페이스 LOB컬럼의 테이블스페이스 명시 지정한 테이블스페이스 지정한 테이블스페이스 파티션의 테이블스페이스 명시 테이블의 테이블스페이스 명시 사용자 기본 테이블스페이스 YES YES YES NO NO NO partition_range_clause 파티션에 저장될 상한값(noninclusive)을 지정한다. 이 값은 다른 파티션의 상한값과 겹치지 않아야 한다. hash_partitioning 이 절은 파티션 키 값에 대응하는 해시 값을 기준으로 테이블을 분할할 것을 명시한다. 이는 데이터가 파티션별로 고르게 분산되기를 데이터 정의어 105 원하는 경우에 적합하다. 여러 칼럼들의 조합으로 파티션 키를 정의할 수 있다. list_partitioning 이 절은 값의 집합을 기준으로 테이블을 분할할 것을 명시한다. 명시된 다른 파티션에 속하도록 명시되지 않은 값들은 자동으로 기본 파티션에 포함되기 때문에 기본 파티션은 생략할 수 없다. 기본 파티션에 속해 있던 값들의 집합으로 새로운 파티션을 추가하면 기본 파티션에서는 그 값이 제거될 것이다. 각 파티션이 가질 수 있는 값들은 서로 중복될 수 없기 때문이다. 리스트 파티션드 테이블을 위한 파티션 키는 단일 칼럼에만 정의될 수 있다. partition_list_clause 각 리스트 파티션은 적어도 1개 이상의 값을 가져야 한다. 한 리스트의 값은 다른 어떤 리스트에도 있을 수 없다. row_movement_clause 파티션드 테이블의 레코드가 갱신되어 파티션 키에 해당하는 칼럼의 값이 다른 파티션에 속하는 값으로 변경된 경우, 이 절은 그 레코드를 자동으로 다른 파티션으로 이동시킬지 아니면 에러를 발생시킬 것인지를 결정한다. 이 절을 생략하면 DISABLE ROW MOVEMENT옵션이 기본으로 설정된다. CREATE TABLE … AS SELECT 테이블 생성시, 다른 테이블에서 새로운 테이블로 칼럼의 속성과 데이터를 그대로 복사하려면 이 구문을 사용한다. 새로운 테이블의 칼럼 수는 SELECT 절로 검색되는 칼럼의 개수와 동일해야 한다. 또한 새로운 칼럼의 데이터 타입은 명시할 수 없고, 데이터가 검색되는 원래 칼럼의 데이터 타입과 동일하게 된다. 생성될 테이블의 칼럼 명을 명시하지 않을 경우에는 검색되는 칼럼의 이름이 그래도 사용된다. 검색 대상이 칼럼이 아니고 표현식인 경우 alias가 반드시 존재해야 한다. 이 alias가 새로운 테이블의 칼럼명이 될 것이다. access_mode_clause 데이터에 대한 접근 모드를 설정할 수 있다. 읽기 전용(Read-Only) 모드, 읽기/쓰기(READ/WRITE) 모드 또는 읽기/추가(READ/APPEND) 모드 중에서 선택할 수 있으며, 생략하면 기본으로 '읽기/쓰기' 모드로 설정된다. * 주의: 테이블이나 파티션에 대한 접근 모드가 '읽기 전용' 또는 '읽기/추가'로 설정되어 있어도 이중화에 의한 복제, TRUNCATE 구문 106 SQL Reference 수행, DataPort에 의한 데이터 변경, LOB 칼럼 변경은 허용된다. tablespace_clause 테이블이 저장될 테이블스페이스를 지정하는 절이다. 테이블스페이스는 CREATE TABLE 문으로만 지정할 수 있다. 즉 테이블 생성 후 ALTER TABLE문으로는 변경할 수 없다. 이 절을 생략할 경우 테이블은 이 테이블을 생성하려 하는 사용자의 기본 테이블스페이스에 저장될 것이다. 사용자 생성 시 DEFAULT TABLESPACE를 생략했었다면 테이블은 시스템 메모리 기본 테이블스페이스(SYSTEM MEMORY DEFAULT TABLESPACE)에 생성된다. CREATE TABLE 문 내에 UNIQUE 또는 PRIMARY KEY 제약조건이 명시된 경우 이들을 위한 인덱스는 테이블이 저장되는 테이블스페이스에 생성될 것이다. LOB_storage_clause LOB 칼럼 데이터는 LOB 칼럼이 속한 테이블과 별도의 테이블스페이스에 저장될 수 없다. 즉, 테이블과 동일한 테이블스페이스에만 저장될 수 있다. 주의 사항 다음은 테이블 생성시 유념해야 할 몇가지 사항이다. 정의한 칼럼 크기가 최대 허용 크기를 넘거나 최소 크기 보다 작으면 오류가 발생한다. 최대와 최소 크기는 각 데이터 타입마다 다르다. 한 테이블의 최대 칼럼 수는 1024개이다. 기본키는 한 테이블에 한 개만 존재할 수 있다. 참조 제약조건의 경우 외래키와 참조키의 칼럼 개수는 동일해야 한다. 또한 외래키와 참조키의 각 칼럼 데이터 타입은 동일해야 한다. 한 테이블에 생성할 수 있는 인덱스, 기본키 및 유니크 키의 총 개수는 1024개를 넘을 수 없다. CREATE TABLE AS SELECT의 경우 칼럼 명을 명시하였다면 그 개수는 검색 대상에 명시한 칼럼 개수와 동일해야 한다. CREATE TABLE AS SELECT문 실행시 CREATE TABLE 문에 칼럼 명을 명시하지 않고 SELECT문의 검색 대상에는 표현식을 사용한 경우, 반드시 새로운 테이블의 칼럼 이름으로 사용될 별명(alias name)을 표현식에 명시해야 한다. 데이터 정의어 107 범위 파티션드 테이블과 해시 파티션드 테이블을 위한 파티션 키 컬럼은 최대 32개로 구성될 수 있다.(인덱스 생성 시 인덱스 키 칼럼의 개수 제한과 동일하다.) 예제 테이블 생성 다음 테이블들을 생성하라. 테이블 이름: employees 칼럼: 사원번호, 사원이름과 성, 직책, 전화번호, 부서번호, 월급, 성별, 생일, 입사일자, 상태 xdbiSQL> CREATE TABLE employees( eno INTEGER PRIMARY KEY, e_lastname CHAR(20) NOT NULL, e_firstname CHAR(20) NOT NULL, emp_job VARCHAR(15), emp_tel CHAR(15), dno SMALLINT, salary NUMBER(10,2) DEFAULT 0, sex CHAR(1), birth CHAR(6), join_date DATE, status CHAR(1) DEFAULT 'H'); Create success. 테이블 이름: orders 칼럼: 주문번호, 주문일자, 판매사원, 고객번호, 상품번호, 주문수량, 도착 예정일자, 주문상태 xdbiSQL> CREATE TABLE orders( ono BIGINT, order_date DATE, eno INTEGER NOT NULL, cno BIGINT NOT NULL, gno CHAR(10) NOT NULL, qty INTEGER DEFAULT 1, arrival_date DATE, processing CHAR(1) DEFAULT '0', PRIMARY KEY(ono, order_date)); Create success. CREATE TABLE … AS SELECT 사용 다음 질의는 직원 테이블에서 부서 번호가 1002인 조건을 만족하는 데이터를 가진 테이블 dept_1002를 생성한다. xdbiSQL> CREATE TABLE dept_1002 AS SELECT * FROM employees WHERE dno = 1002; Create success. TIMESTAMP 타입 칼럼을 가지는 테이블을 생성한다. xdbiSQL> CREATE TABLE tbl_timestamp( 108 SQL Reference i 1 TIMESTAMP CONSTRAINT const2 PRIMARY KEY, i2 INTEGER, i3 DATE, i4 Byte(8)); Create success. * 테이블 tbl_timestamp의 속성은 다음과 같다. [ TABLESPACE : SYS_TBS_MEM_DATA ] [ ATTRIBUTE ] ----------------------------------------------------------- ------------------- NAME TYPE IS NULL ----------------------------------------------------------- ------------------- I1 TIMESTAMP FIXED NOT NULL I2 INTEGER FIXED I3 DATE FIXED I4 BYTE(8) FIXED [ INDEX ] ----------------------------------------------------------- ------------------- NAME TYPE IS UNIQUE COLUMN ----------------------------------------------------------- ------------------- CONST2 BTREE UNIQUE I1 ASC [ PRIMARY KEY ] ----------------------------------------------------------- ------------------- I1 명시적으로 Byte(8) 데이터 타입을 선언한 칼럼 i4와 TIMESTAMP 데이터 타입 칼럼인 i1을 구별하는 방법은 SYS_CONSTRAINTS_와 SYS_CONSTRAINT_COLUMNS_ 메타 테이블을 조회해서 칼럼 타입이 TIMESTAMP 인지를 확인하는 것이다. * 참고: INSERT나 UPDATE 수행 시 사용자가 TIMESTAMP 칼럼 값을 DEFAULT로 명시한 경우, 당시의 시스템 시간값이 그 TIMESTAMP 칼럼에 쓰여진다. xdbiSQL> INSERT INTO tbl_timestamp VALUES(DEFAULT, 2, '02- FEB-01', Byte'A1111002'); 1 row inserted. xdbiSQL> UPDATE tbl_timestamp SET i1 = DEFAULT, i2 = 102, i3 = '02-FEB-02', i4 = Byte'B1111002' WHERE i2 = 2; 1 row updated. xdbiSQL> SELECT * FROM tbl_timestamp; I1 I2 I3 I4 ----------------------------------------------------------- ------- 4E3778C900037AE9 102 02-FEB-2002 B111100200000000 1 row selected. 마찬가지로 INSERT나 UPDATE 수행 시 사용자가 TIMESTAMP 칼럼 값을 명시하지 않은 경우, 당시의 시스템 시간 값이 INSERT 또는 UPDATE 수행에 사용된다. xdbiSQL> INSERT INTO tbl_timestamp(i2, i3, i4) VALUES(4, '02-APR-01', Byte'C1111002'); 데이터 정의어 109 1 row inserted. xdbiSQL> UPDATE tbl_timestamp SET i2=104, i3='02-APR-02', i4=BYTE'D1111002' WHERE i2=4; 1 row updated. xdbiSQL> SELECT * FROM tbl_timestamp; I1 I2 I3 I4 ----------------------------------------------------------- ------- 4E3778C900037AE9 102 02-FEB-2002 B111100200000000 4E37794900083702 104 02-APR-2002 D111100200000000 2 rows selected. 질의에서 지정한 테이블스페이스에 테이블을 생성하라. <질의> 테이블 소유자가 uare1인 테이블 tbl1을 생성하라. (사용자 생성 시 기본 테이블스페이스가 지정되지 않았다.) xdbiSQL> CONNECT uare1/rose1; Connect success. xdbiSQL> CREATE TABLE tbl1( i1 INTEGER, i2 VARCHAR(3)); Create success. * 참고: 사용자 생성 시 기본 테이블스페이스가 지정되지 않은 경우 시스템 메모리 기본 테이블스페이스에 테이블이 생성 된다. <질의> 사용자 생성 시 지정된 기본 테이블스페이스 user_data에 다음 조건을 만족하는 테이블 books과 inventory를 생성하라. books 칼럼: 책번호, 책이름, 저자, 판, 출판연도, 가격, 출판사코드 inventory 칼럼: 예약구독번호, 책번호, 상점코드, 구입날짜, 구입량, 지불여부 xdbiSQL> CREATE TABLE books( isbn CHAR(10) CONSTRAINT const1 PRIMARY KEY SET PERSISTENT = ON, title VARCHAR(50), author VARCHAR(30), edition INTEGER DEFAULT 1, publishingyear INTEGER, price NUMBER(10,2), pubcode CHAR(4)) TABLESPACE user_data; Create success. xdbiSQL> CREATE TABLE inventory( subscriptionid CHAR(10) PRIMARY KEY, isbn CHAR(10) CONSTRAINT fk_isbn REFERENCES books (isbn), storecode CHAR(4), purchasedate DATE, quantity INTEGER, paid CHAR(1)) TABLESPACE user_data; Create success. 또는 xdbiSQL> CREATE TABLE inventory( subscriptionid CHAR(10), isbn CHAR(10), storecode CHAR(4), purchasedate DATE, quantity INTEGER, 110 SQL Reference paid CHAR(1), PRIMARY KEY(subscriptionid), CONSTRAINT fk_isbn FOREIGN KEY(isbn) REFERENCES books(isbn)) TABLESPACE user_data; Create success. 각 인덱스 파티션을 위한 테이블스페이스 지정 <질의> I1 컬럼에 대한 UNIQUE 제약을 갖는 파티션드 테이블 T1을 생성하라. CREATE TABLE T1 ( I1 INTEGER UNIQUE USING INDEX LOCAL ( PARTITION P1_UNIQUE ON P1 TABLESPACE TBS3, PARTITION P2_UNIQUE ON P2 TABLESPACE TBS2, PARTITION P3_UNIQUE ON P3 TABLESPACE TBS1 ) ) PARTITION BY RANGE (I1) ( PARTITION P1 VALUES LESS THAN (100), PARTITION P2 VALUES LESS THAN (200) TABLESPACE MEM_TBS1, PARTITION P3 VALUES DEFAULT TABLESPACE MEM_TBS2 ) TABLESPACE SYS_TBS_MEM_DATA; 범위 파티셔닝(range partitioning) <질의 1> 아래 그림과 같이 2006년의 각 분기별로 파티셔닝하여 range_sales 테이블을 생성한다. TO_DATE (‘01-APR-2006’) TO_DATE (‘01-JUL-2006’) TO_DATE (‘01-OCT-2006’) Q1_2006Q2_2006Q3_2006Q4_2006 ∞-∞ DEF TO_DATE (‘01-JAN-2007’) CREATE TABLE range_sales ( prod_id NUMBER(6), cust_id NUMBER, time_id DATE ) PARTITION BY RANGE (time_id) ( PARTITION Q1_2006 VALUES LESS THAN (TO_DATE('01-APR- 2006')), PARTITION Q2_2006 VALUES LESS THAN (TO_DATE('01-JUL- 2006')), PARTITION Q3_2006 VALUES LESS THAN (TO_DATE('01-OCT- 2006')), PARTITION Q4_2006 VALUES LESS THAN (TO_DATE('01-JAN- 2007')), PARTITION DEF VALUES DEFAULT ) TABLESPACE SYS_TBS_MEM_DATA; <질의 2> 파티션의 테이블스페이스를 지정하여 파티션드 테이블 생성 CREATE TABLE T1 데이터 정의어 111 ( I1 INTEGER, I2 INTEGER ) PARTITION BY RANGE (I1) ( PARTITION P1 VALUES LESS THAN (100), PARTITION P2 VALUES LESS THAN (200) TABLESPACE TBS1, PARTITION P3 VALUES DEFAULT TABLESPACE TBS2 ) TABLESPACE SYS_TBS_MEM_DATA; <질의 3> 다중 컬럼을 파티션 키로 갖는 파티션드 테이블 생성 CREATE TABLE T1 ( I1 DATE, I2 INTEGER ) PARTITION BY RANGE (I1, I2) ( PARTITION P1 VALUES LESS THAN (TO_DATE('01-JUL-2006'), 100), PARTITION P2 VALUES LESS THAN (TO_DATE('01-JAN-2007'), 200), PARTITION P3 VALUES DEFAULT ) TABLESPACE SYS_TBS_MEM_DATA; <질의 4> 필요시 데이터가 자동으로 다른 파티션으로 옮겨지는 파티션드 테이블 생성 CREATE TABLE T1 ( I1 INTEGER, I2 INTEGER ) PARTITION BY LIST (I1) ( PARTITION P1 VALUES (100, 200), PARTITION P2 VALUES (150, 250), PARTITION P3 VALUES DEFAULT ) ENABLE ROW MOVEMENT TABLESPACE SYS_TBS_MEM_DATA; 리스트 파티셔닝(list partitioning) <질의> nls_territory 컬럼의 값이 ‘CHINA’ 또는 ‘THAILAND’인 asia 파티션, ‘GERMANY’, ‘ITALY’, ‘SWITZERLAND’인 europe 파티션, ‘AMERICA’인 west 파티션, ‘INDIA’인 east 파티션, 그 외 나머지 값은 기본 파티션으로 분할되는 list_customers 테이블을 생성한다. CREATE TABLE list_customers ( customer_id NUMBER(6), cust_first_name VARCHAR(20), cust_last_name VARCHAR(20), nls_territory VARCHAR(30), cust_email VARCHAR(30) ) PARTITION BY LIST (nls_territory) ( PARTITION asia VALUES ('CHINA', 'THAILAND'), PARTITION europe VALUES ('GERMANY', 'ITALY', 'SWITZERLAND'), PARTITION west VALUES ('AMERICA'), PARTITION east VALUES ('INDIA'), PARTITION rest VALUES DEFAULT 112 SQL Reference ) TABLESPACE SYS_TBS_MEM_DATA; 해시 파티셔닝(hash partitioning) <질의> product_id에 따라서 4개의 해시 파티션으로 분할되는 테이블을 생성한다. CREATE TABLE hash_products ( product_id NUMBER(6), product_name VARCHAR(50), product_description VARCHAR(2000) ) PARTITION BY HASH (product_id) ( PARTITION p1, PARTITION p2, PARTITION p3, PARTITION p4 ) TABLESPACE SYS_TBS_MEM_DATA; <질의> LOB 데이터를 별도의 테이블스페이스에 저장하되, image1칼럼은 테이블스페이스 lob_data1에, image2 칼럼은 테이블스페이스 lob_data2에 저장하는 테이블을 생성한다. CREATE TABLE lob_products ( product_id integer, image1 BLOB, image2 BLOB ) TABLESPACE SYS_TBS_MEM_DATA LOB(image1) STORE AS ( TABLESPACE lob_data1 ) LOB(image2) STORE AS ( TABLESPACE lob_data2 ); 데이터 정의어 113 CREATE MEMORY TABLESPACE 구문 create_memory_tablespace ::= CREATE ; TABLESPACEMEMORYtablespace_name DATA initsize_clause autoextend_clausecheckpoint_path_clausesplitsize_clause initsize_clause ::= SIZEinteger K M G autoextend_clause ::= NEXT AUTOEXTEND OFF ON integer K M G maxsize_clause 114 SQL Reference maxsize_clause ::= MAXSIZE integer K M G UNLIMITED checkpoint_path_clause ::= CHECKPOINTcheckpoint_pathPATH‘’ , splitsize_clause ::= integer K M G SPLITEACH 전제 조건 테이블스페이스는 SYS 사용자이거나 CREATE TABLESPACE 시스템 권한을 가진 사용자만이 테이블스페이스를 생성할수 있다. 설명 데이터베이스 내에 데이터베이스 객체를 저장할 수 있는 메모리 데이터 테이블스페이스를 생성하는 구문이다. 이 구문으로 생성된 테이블스페이스에는 메모리 테이블이 저장될 수 있다. MEMORY 메모리 테이블스페이스를 생성할 것을 지정한다. 데이터 정의어 115 DATA 사용자의 데이터를 저장할 테이블스페이스를 생성할 것을 지정한다. DATA 키워드 없이 CREATE TABLESPACE 구문을 수행하여도 기본적으로 데이터 테이블스페이스가 생성된다. tablespace_name 생성될 테이블스페이스의 이름을 명시한다. initsize_clause 생성될 테이블스페이스의 초기 크기를 지정한다. SIZE 테이블스페이스의 초기 크기를 명시한다. 이는 메모리 테이블스페이스의 기본 확장 크기의 배수여야 한다. (즉, EXPAND_CHUNK_PAGE_COUNT 프로퍼티에 지정된 페이지 개수 * 메모리 테이블스페이스의 한 페이지 크기 (32kB)) 예를 들어 EXPAND_CHUNK_PAGE_COUNT프로퍼티를 128로 지정했다면, 메모리 테이블스페이스의 기본 확장 크기는 128 * 4MB가 될 것이다. 그러므로 초기 크기는 4MB의 배수여야 한다. 이 값은 Kilobytes(K), Megabytes(M), 또는 Gigabytes(G) 단위로 명시할 수 있다. 단위를 명시하지 않을 경우 기본 단위는 Kilobytes이다. autoextend_clause 테이블스페이스가 자동으로 확장될 지 여부를 명시한다. 이 절을 생략하면, AUTOEXTEND는 기본으로 꺼진다. ON AUTOEXTEND 옵션이 켜진다. OFF AUTOEXTEND 옵션이 꺼진다. NEXT 테이블스페이스가 자동으로 크기가 증가될 때 증가할 양을 명시한다. 단, 이 크기는 메모리 테이블스페이스의 기본 확장 크기의 배수여야 한다. (EXPAND_CHUNK_PAGE_COUNT 프로퍼티에 지정된 페이지 개수 * 메모리 테이블스페이스의 한 페이지 크기 (32kB)) AUTOEXTEND를 ON으로 지정하고 이 값을 명시하지 않을 경우, 기본값은 EXPAND_CHUNK_PAGE_COUNT프로퍼티에 지정한 116 SQL Reference 값이다. AUTOEXTEND가 OFF일 때 이 값은 의미없다. 이 값은 Kilobytes(K), Megabytes(M), 또는 Gigabytes(G) 단위로 명시할 수 있다. 단위를 명시하지 않을 경우 기본 단위는 Kilobytes이다. maxsize_clause 테이블스페이스 자동 확장 시 확장할 수 있는 최대 크기를 명시한다. AUTOEXTEND는 ON 으로 지정하고 이 값을 명시하지 않을 경우 기본값은 UNLIMITED이다. AUTOEXTEND가 OFF이면 이 값은 의미없다. 이 값은 Kilobytes(K), Megabytes(M), 또는 Gigabytes(G) 단위로 명시할 수 있다. 단위를 명시하지 않을 경우 기본 단위는 Kilobytes이다. UNLIMITED 테이블스페이스가 자동 확장되는 크기에 제한이 없음을 명시한다. 이 옵션이 사용되면, 테이블스페이스는 그 크기가 데이터베이스내의 모든 메모리 테이블스페이스와 모든 휘발성 테이블스페이스의 총 크기가 MEM_MAX_DB_SIZE 프로퍼티에 지정된 크기에 도달할 때까지 자동으로 증가될 것이다. checkpoint_path_clause 메모리 테이블스페이스에 저장된 데이터의 영속성을 보장하기 위해 데이터는 파일에 저장되어야 한다. 이러한 메모리 테이블스페이스의 데이터 저장 파일을 “체크포인트 이미지”라고 한다. checkpoint_path절은 체크포인트 이미지 파일이 저장될 체크포인트 경로(Path)들을 지정한다. 체크포인트 경로를 지정하지 않은 경우 MEM_DB_DIR 프로퍼티에 지정한 경로가 기본 경로로 사용된다. checkpoint_path 메모리 테이블스페이스의 체크포인트시 체크포인트 이미지가 저장되는 경로이다. 체크포인트 및 테이블스페이스 로딩시 디스크 입출력 비용을 분산할 수 있도록 다수의 경로가 지정될 수 있다. split_each_clause 이 절은 체크포인트 파일을 좀 더 작은 파일로 분리시키기 위해 사용된다. 이는 메모리 테이블스페이스의 크기가 운영체제에서 데이터 정의어 117 지원하는 최대 파일 크기를 초과할 때, 또는 입출력 비용을 분산하기 위해서 유용하다. 분할된 파일의 크기는 사용자가 지정할 수 있다. 크기를 지정하지 않을 경우 DEFAULT_MEM_DB_FILE_SIZE 프로퍼티에 지정된 값이 기본으로 사용된다. 이 값은 Kilobytes(K), Megabytes(M), 또는 Gigabytes(G) 단위로 명시할 수 있다. 단위를 명시하지 않을 경우 기본 단위는 Kilobytes이다. 예제 <질의 1> 초기 크기가 512MB이고, 자동 확장되지 않는 사용자 정의 메모리 데이터 테이블스페이스를 생성한다. (체크포인트 이미지는 MEM_DB_DIR 프로퍼티에 지정된 경로에 저장된다. 분할될 체크포인트 이미지 파일의 크기는 DEFAULT_MEM_DB_FILE_SIZE 프로퍼티의 값을 따른다.) xdbiSQL> CREATE MEMORY DATA TABLESPACE user_data SIZE 512M; Create success. <질의 2> 초기 크기가 512MB이고, 128MB 단위로 자동 확장되는1 사용자 정의 메모리 데이터 테이블스페이스를 생성한다. (체크포인트 이미지는 MEM_DB_DIR 프로퍼티에 지정된 경로에 저장된다. 분할될 체크포인트 이미지 파일의 크기는 DEFAULT_MEM_DB_FILE_SIZE 프로퍼티의 값을 따른다.) xdbiSQL> CREATE MEMORY DATA TABLESPACE user_data SIZE 512M AUTOEXTEND ON NEXT 128M; Create success. <질의 3> 초기 크기가 512MB 이고, 최대 1GB까지 128MB 단위로 자동 확장되는 사용자 정의 메모리 데이터 테이블스페이스를 생성한다. (체크포인트 이미지는 다중화를 위해 3개의 디렉토리에 나누어 저장하고, 분할될 체크포인트 이미지 파일의 크기를 256M로 한다.) xdbiSQL> CREATE MEMORY DATA TABLESPACE user_data SIZE 512M AUTOEXTEND ON NEXT 128M MAXSIZE 1G CHECKPOINT PATH ‘/dbs/path1’, ‘/dbs/path2’, ‘/dbs/path3’ SPLIT EACH 256M; Create success. 1 테이블스페이스의 최대 크기를 MAXSIZE절을 이용하여 지정하지 않았으므로, 기본적으로 UNLIMITTED를 지정한 것과 같다. 이 경우 시스템에 존재하는 모든 메모리 테이블스페이스와 휘발성 테이블스페이스의 크기의 총합이 MEM_MAX_DB_SIZE 프로퍼티에 지정된 값을 벗어나지 않는 한도 내에서 테이블스페이스의 확장이 이루어진다. 118 SQL Reference CREATE TRIGGER 구문 create_trigger ::= ; CREATETRIGGERtrigger_name AFTER trigger_eventONtbl_name OLD NEW REFERENCINGalias_name , trigger_action .user_name BEFORE.user_name ROWAS trigger_event ::= INSERT DELETE UPDATE OFcolumn_name , 데이터 정의어 119 trigger_action::= FOREACHROW STATEMENT WHENsearch_condition psm_body () psm_body::= AS ISdeclare_section BEGIN statement EXCEPTIONexception_handler END 전제 조건 SYS 사용자와 CREATE TRIGGER 시스템 권한을 가진 사용자만이 트리거를 생성할 수 있다. 또한, 다른 사용자 소유의 테이블에 트리거를 생성하기 위해서는 SYS 사용자이거나 CREATE ANY TRIGGER 시스템 권한이 있어야 한다. 설명 명시된 이름으로 트리거를 생성한다. user_name 생성될 트리거의 소유자 이름을 명시한다. 생략하면 알티베이스는 현재 사용자가 소유한 테이블에 트리거를 생성한다. trigger_name 120 SQL Reference 생성될 트리거의 이름을 명시한다. AFTER 트리거가 동작될 시점을 지정한다. AFTER 옵션은 trigger_event가 수행된 후에 트리거가 동작될 것을 지정한다. BEFORE BEFORE 옵션은 trigger_event가 수행되기 전에 트리거가 동작될 것을 지정한다. trigger_event 이는 테이블의 데이터를 변경시키는 이벤트로 트리거의 동작을 유발시킨다. 단 데이터베이스의 무결성을 지키기 위해 이중화 수신자에 의해 적용되는 테이블 데이터의 변경은 트리거 이벤트로 처리되지 않는다 (즉, 트리거 동작을 유발시키지 않는다). trigger_event로 다음의 세 가지 유형의 DML문을 지정할 수 있다. DELETE 해당 테이블의 데이터를 삭제하는 DELETE 구문 수행 시 트리거 동작이 유발된다. INSERT 해당 테이블에 데이터를 삽입하는 INSERT 구문 수행 시 트리거 동작이 유발된다. UPDATE 해당 테이블의 데이터를 변경하는 UPDATE 구문 수행 시 트리거 동작이 유발된다. UPDATE 트리거 이벤트에 OF 절을 사용할 경우 OF 절에 명시된 컬럼이 변경될 경우에만 트리거를 동작시킨다. 현재 BEFORE UPDATE … FOR EACH ROW 구문의 트리거는 지원되지 않는다. ON table_name 트리거가 동작할지를 결정하기 위해 참조하는 테이블을 지정한다. 트리거는 table_name에 정의된 테이블의 변경에 따라 동작이 유발될 것이다. 트리거는 일반 테이블만 참조할 수 있다. 뷰, 시퀀스, 저장 프로시저와 같은 객체를 기반으로 트리거를 생성할 수 없다. 이중화에 포함되어 있는 테이블에는 트리거를 생성할 수 없다. 그러나, 트리거가 이미 존재하는 테이블에 대한 이중화 생성은 가능하다. 데이터 정의어 121 User_name이 생략되면, 알티베이스는 현재 사용자 소유의 테이블을 기반으로 트리거를 생성할 것이다. REFERENCING 절 트리거의 특성상 old row와 new row의 개념을 갖는다. 즉, 트리거가 참조하는 테이블의 데이터 변경시, 변경된 각 row는 이전 값과 이후 값을 갖게 된다. REFERENCING 절을 사용해서 old row 및 new row를 참조할 수 있다. REFERENCING 절은 다음과 같은 제약을 갖는다. REFERENCING 절은 FOR EACH ROW 옵션과 함께인 경우에만 사용할 수 있다. REFERENCING 절은 trigger_action 절에서 참조할 수 있도록 다음과 같은 구조를 가져야 한다. {OLD|OLD ROW|OLD ROW AS|OLD AS} alias_name 변경되기 이전의 로우(row)를 의미한다. 이는 WHEN 절 또는 trigger_action의 psm_body 내에서 참조될 수 있다. 트리거 이벤트가 INSERT문일 때는 이전의 값이 없기 때문에 이전 값 참조는 불가능하다. {NEW|NEW ROW|NEW ROW AS|NEW AS} alias_name 변경된 후의 로우(row)를 의미한다. 단, BEFORE TRIGGER의 경우 트리거 바디 내에서 이들 데이터를 변경하는 것이 가능하다. 트리거 이벤트가 DELETE문일 경우 이후 값이 없기 때문에 이후 값 참조는 불가능하다. trigger_action 트리거 작동 절은 다음과 같은 세 가지 부분으로 구성된다. Action granularity: 트리거가 수행되는 단위 지정 (ROW 또는 STATEMENT) Action WHEN condition: 트리거 동작 여부를 결정하는 추가 조건을 선택적으로 명시 Action body: 트리거가 실제로 무엇을 수행하는지 명시 FOR EACH {ROW|STATEMENT} 트리거 수행 단위를 명시한다. 테이블의 데이터 변경시 여기에 명시된 단위에 따라서 트리거가 발생한다. 기본값은 FOR EACH STATEMENT이다. FOR EACH ROW: trigger_event에 의해 영향을 받고 WHEN 절의 조건을 만족하는 각 row에 대해서 트리거의 action body 가 수행된다. 122 SQL Reference REFERENCING 절 또는 WHEN 절을 사용하기 위해서는 반드시 FOR EACH ROW 절을 사용하여야 한다. FOR EACH STATEMENT: 트리거 동작을 유발하는 DML 구문의 수행 후 또는 전에 한 번만 트리거가 동작하게 된다. WHEN search_condition 트리거가 동작 여부를 결정하는 조건을 명시한다. WHEN 절의 search_condition이 TRUE 인 경우에만 트리거의 action body가 수행되며, FALSE인 경우에는 트리거의 action body가 수행되지 않는다. WHEN 절이 명시되지 않으면, 트리거 이벤트 발생 시 항상 트리거의 action body가 수행된다. WHEN 절에 조건을 사용하기 위해서는 다음과 같은 제약을 만족해야 한다. WHEN 절은 반드시 FOR EACH ROW 절과 함께인 경우에만 사용할 수 있다. WHEN 절에는 REFERENCING절에 정의된 alias_name만을 사용할 수 있다. WHEN 절에는 부질의를 사용할 수 없다. WHEN 절에는 저장 프로시저를 사용할 수 없다. psm_body 트리거의 “action body”를 의미하며, 트리거가 수행할 구문이 여기에 기술된다. 저장 프로시저의 블록 구문과 동일한 방법으로 기술할 수 있다. Psm_body는 다음과 같은 제약을 만족하여야 한다. 트리거의 특성 및 개념 상 action body를 위한 SQL statement 구문은 다음과 같은 것을 사용할 수 없다. COMMIT 또는 ROLLBACK 등과 같은 트랜잭션 관련구문을 사용할 수 없다. CONNECT 등과 같은 세션 관련구문을 사용할 수 없다. CREATE TABLE 등과 같은 스키마 관련구문을 사용할 수 없다. 저장 프로시저를 호출할 수 없다. 회기하는 트리거, 즉 trigger_event에 명시된 연산을 수행하는 트리거는 생성할 수 없다. 저장 프로시저의 블록 구에 대한 자세한 설명은 Stored Procedures Manual을 참조하기 바란다. 데이터 정의어 123 주의 사항 트리거의 수행 순서 하나의 테이블에 대하여 하나 이상의 트리거를 정의할 수 있다. 여러 개의 트리거가 정의되어 있을 때 트리거가 동작되는 순서는 일정하지 않다. 트리거 동작 순서가 중요할 경우에는 여러 개의 트리거를 하나로 통합하여 재작성 하여야 한다. 트리거의 수행 실패 트리거를 수행하던 도중 오류가 발생하면, 해당 트리거를 발생시킨 DML 구문도 실패하게 된다. 트리거 내에서 참조되는 테이블에 발생하는 DDL 테이블이 삭제되면 그 테이블에 대해 생성되어 있는 모든 트리거도 삭제된다. 그러나 트리거의 action body내에서 참조하는 테이블이 변경되거나 삭제될 경우에는 트리거는 제거되지 않는다. 참조 테이블이 삭제되어 해당 트리거의 action body가 수행될 수 없는 경우, 그 트리거를 발생시킨 DML 구문은 실패할 것이다. 참조 테이블이 변경된 경우에는 트리거 발생시에 트리거가 내부적으로 재 컴파일되어 정상적으로 수행될 것이다. 트리거와 이중화 이중화로 인해 반영되는 테이블 데이터의 변경은 트리거 동작을 발생시키지 않는다. 트리거와 LOB 트리거를 발생시키는 테이블은 LOB 타입 칼럼을 포함할 수 없다. LOB 칼럼을 포함하는 테이블에 대해서 트리거를 생성하려고 하면 에러가 발생할 것이다. Psm_body 내에서 LOB 칼럼의 값을 사용할 수 없다. 그러나, psm_body 내에서 LOB 칼럼을 포함하는 테이블을 참조하는 것은 가능하다. 예제 <질의> 다음 예제는 행의 삭제를 추적하기 위해 트리거를 어떻게 사용하는지를 보여준다. 이 예제에서 배달이 완료(processing=’D’)된 주문에 관련된 데이터가 orders 테이블에서 삭제될 때, 트리거는 FOR EACH ROW 기준으로 동작되고 orders 테이블의 ono, cno, qty 및 arrival_date 칼럼의 원래 값을 참조한다. 이 트리거는 orders 테이블에서 삭제된 행의 값을 log_tbl에 입력한다. xdbiSQL> CREATE TABLE log_tbl( ono BIGINT, cno BIGINT, qty INTEGER, 124 SQL Reference arrival_date DATE, sysdate DATE); Create success. xdbiSQL> CREATE TRIGGER del_trigger AFTER DELETE ON orders REFERENCING OLD ROW old_row FOR EACH ROW AS BEGIN INSERT INTO log_tbl VALUES(old_row.ono, old_row.cno, old_row.qty, old_row.arrival_date, sysdate); END; / Create success. xdbiSQL> DELETE FROM orders WHERE processing = 'D'; 2 rows deleted. xdbiSQL> SELECT * FROM log_tbl; ONO CNO QTY ARRIVAL_DATE ----------------------------------------------------------- ------------- SYSDATE --------------- 11290011 17 1000 05-DEC-2011 25-APR-2012 11290100 11 500 07-DEC-2011 25-APR-2012 2 rows selected. <질의> 다음의 예제에서, 트리거는 scores 테이블에 레코드가 입력될 때, score 칼럼의 값이 지정되어 있지 않으면(NULL이면) 이 값을 0으로 변경한다. 이를 위해서 FOR EACH ROW 기준으로 발생되는 BEFORE INSERT 트리거를 생성하면 된다. xdbiSQL> CREATE TABLE scores( id INTEGER, score INTEGER ); Create success. xdbiSQL> CREATE TRIGGER scores_trigger BEFORE INSERT ON scores REFERENCING NEW ROW NEW_ROW FOR EACH ROW AS BEGIN IF NEW_ROW.SCORE IS NULL THEN NEW_ROW.SCORE := 0; END IF; END; / Create success. xdbiSQL> INSERT INTO scores VALUES( 1, 20 ); 1 row inserted. xdbiSQL> INSERT INTO scores VALUES( 5, NULL ); 1 row inserted. xdbiSQL> INSERT INTO scores VALUES( 17, 75 ); 1 row inserted. xdbiSQL> SELECT * FROM SCORES; ID SCORE --------------------------- 1 20 5 0 17 75 3 rows selected. 데이터 정의어 125 CREATE USER 구문 create_user ::= CREATEIDENTIFIEDUSERuser_namepassword ACCESStblspace_name ; DEFAULTTABLESPACEtblspace_name ON OFF BY 전제 조건 SYS 사용자와 CREATE USER 시스템 권한을 가진 사용자만이 사용자를 생성할 수 있다. 설명 명시된 사용자 명, 암호, 및 테이블스페이스 접근 권한으로 데이터베이스 사용자를 생성하는 구문이다. user_name 생성될 사용자 이름을 명시한다. 사용자의 이름은 데이터베이스 내에서 유일해야 한다. IDENTIFIED BY password 알티베이스는 암호를 사용해서 사용자를 인증한다. 즉, 사용자는 데이터베이스 로그온시 암호를 입력해야만 한다. 사용자 암호의 최대 길이는 운영체제에 따라 16바이트 또는 22바이트이다. Solaris x86 2.8과 Windows에서 비밀번호의 최대 길이는 22바이트이다. 그 외 다른 운영체제에서 비밀번호의 최대 126 SQL Reference 길이는 16바이트이다. 만일 이보다 더 긴 문자열의 암호를 명시하여 사용자를 생성하려 하면, 오류가 반환될 것이다. DEFAULT TABLESPACE 절 사용자가 생성한 객체를 저장할 기본 테이블스페이스를 명시한다. 이 절을 생략하면 시스템 메모리 기본 테이블스페이스가 사용자의 기본 테이블스페이스가 된다. 기본 테이블스페이스는 한 사용자에 하나만 지정할 수 있다. ACCESS 절 명시한 (tablespace_name) 테이블스페이스에 접근 가능 여부를 지정하는 절이다. ACCESS tablespace_name ON으로 지정한 테이블스페이스에 대해서는 사용자는 접근 권한을 부여 받는다. OFF로 명시한 테이블스페이스에 대해서는 사용자가 접근이 불가능하다. 물론, ALTER TABLESPACE 시스템 권한이 부여된 사용자는 테이블스페이스 접근이 가능하다. 제한 사항 한 사용자는 여러 데이터 테이블스페이스를 사용할 수 있다. 그러나 한 사용자는 임시 테이블스페이스는 하나만 사용할 수 있다. 사용자가 명시적으로 시스템 언두 테이블스페이스에 접근하거나, 언두 테이블스페이스 내에 테이블이나 인덱스 등을 생성하는 것은 불가능하다. 또한, 시스템 언두 테이블스페이스는 데이터베이스 내에 오직 하나만 존재하며, 사용자가 이를 생성하거나 삭제할 수 없다. 예제 <질의> 사용자 명이 uare1이고 암호가 rose1인 사용자를 생성하라. xdbiSQL> CREATE USER uare1 IDENTIFIED BY rose1; Create success. <질의> 사용자 이름이 uare4이고 암호가 rose4인 사용자를 생성하라. 또한 user_data를 사용자의 기본 테이블스페이스로, temp_data 테이블스페이스를 임시 테이블스페이스로 사용하며, 메모리 테이블스페이스인 SYS_TBS_MEMORY에 대해 접근 권한을 가지고 있다. xdbiSQL> CREATE USER uare4 IDENTIFIED BY rose4 데이터 정의어 127 DEFAULT TABLESPACE user_data TEMPORARY TABLESPACE temp_data ACCESS SYS_TBS_MEMORY ON; Create success. 128 SQL Reference CREATE VIEW 구문 create_view ::= CREATE ORREPLACE NO FORCE VIEW user_name, view_name () ; alias_name , ASsubquery query_restriction_clause query_restriction_clause ::= WITHREADONLY 전제 조건 SYS 사용자와 CREATE VIEW 시스템 권한을 가진 사용자만이 뷰를 생성할 수 있다. 또한, 다른 사용자의 스키마에 뷰를 생성하려면 CREATE ANY VIEW 권한을 가져야 한다. 뷰가 저장된 스키마의 소유자는 뷰의 기반이 되는 테이블 또는 뷰로부터 SELECT 문을 수행하는데 필요한 권한을 가지고 있어야 한다. 데이터 정의어 129 설명 명시된 이름으로 새로운 뷰를 생성한다. 뷰(view)란 하나 이상의 테이블 또는 뷰를 기반으로 하는 논리적인 테이블(logical table)이다. 뷰는 실제 데이터를 가지고 있지 않다. 뷰의 기반이 된 테이블을 베이스 테이블(base table)이라 한다. OR REPLACE 이 절은 뷰가 이미 존재한다면 같은 이름의 뷰로 교체할 때 사용된다. 즉, 이 절은 존재하는 뷰를 제거한 후 재 생성하는 대신에 기존 뷰의 정의를 변경하는 기능을 제공한다. FORCE 뷰의 베이스 테이블 존재 여부와 뷰를 내포하고 있는 스키마 소유자의 권한 유무에 상관없이 뷰가 생성되도록 하는 옵션이다. 이는 의미상으로 오류를 내포한 무효한 상태의 뷰가 생성될 수 있음을 의미한다. 이런 경우, 뷰에 대해 SELECT 문 수행 시 오류가 발생할 것이기 때문에, FORCE 옵션을 사용해 뷰를 생성한 후에는 뷰를 SELECT 해보거나 SYS_VIEWS_ 메타 테이블을 조회해 뷰의 상태를 확인해야 한다. NO FORCE 이 옵션을 사용하면 뷰의 베이스 테이블이 존재하고 뷰를 내포하고 있는 스키마 소유자가 권한을 가지고 있을 때만 뷰가 생성된다. 이 옵션이 기본값이다. user_name 생성될 뷰의 소유자 이름을 명시한다. 생략하면 알티베이스는 현재 세션에 연결된 사용자의 스키마에 뷰를 생성한다. view_name 생성될 뷰의 이름을 명시한다. alias_name 베이스 테이블로부터 검색하는 대상이 표현식인 경우 표현식을 위한 별칭을 명시해야 한다. 이 별칭이 뷰의 칼럼 명이 된다. 별칭의 개수는 subquery의 검색 대상(표현식과 칼럼)의 총 개수와 동일해야 한다. subquery 베이스 테이블로부터 조회하는 열과 행을 식별하는 부질의를 명시한다. 130 SQL Reference WITH READ ONLY 뷰가 읽기 전용임을 지정한다. 뷰에 대해서는 INSERT, UPDATE, 및 DELETE 같은 변경 연산을 수행할 수 없으므로 이 옵션을 명시하지 않아도 기본적으로 읽기 전용 뷰가 생성된다. 뷰의 부질의에 대한 제한 사항 베이스 테이블에 대한 SELECT문의 검색 대상에 명시할 수 있는 표현식의 개수는 최대 1024개이다. CURRVAL과 NEXTVAL 의사열을 베이스 테이블에 대한 SELECT문의 검색 대상에 사용할 수 없다. 예제 뷰 생성하기 <질의> 다음 예제는 employees 테이블을 기반으로 한 이름이 avg_sal인 뷰를 생성한다. 뷰는 각 부서의 평균 월급을 부서별로 보여준다. xdbiSQL> CREATE VIEW avg_sal AS SELECT dno, AVG(salary) emp_avg_sal FROM employees GROUP BY dno; Create success. xdbiSQL> SELECT * FROM avg_sal; AVG_SAL.DNO AVG_SAL.EMP_AVG_SAL ------------------------------------ A001 2066.66667 C001 1576.66667 C002 1660 D001 2075.75 F001 1845 6 rows selected. 부질의 내에서 표현식 AVG(salary)에 대한 별칭으로 emp_avg_sal이 제공되어 있기 때문에, 뷰의 칼럼을 위한 별칭은 명시할 필요가 없다. 조인 뷰1 생성하기 <질의> 다음 뷰는 주문된 상품을 담당하고 있는 사원 이름과 상품을 1 조인 뷰는 뷰의 부질의에 조인을 내포하는 것을 의미한다. 데이터 정의어 131 주문한 고객의 이름을 보여준다. xdbiSQL> CREATE VIEW emp_cus AS SELECT DISTINCT e.e_firstname, e.e_lastname, c.c_firstname, c.c_lastname FROM employees e, customers c, orders o WHERE e.eno = o.eno AND o.cno = c.cno; Create success. xdbiSQL> SELECT * FROM emp_cus; E_FIRSTNAME E_LASTNAME C_FIRSTNAME C_LASTNAME ----------------------------------------------------------- ---------------------------------- Alvar Marquez Estevan Sanchez Sandra Hammond Pierre Martin . . . William Blake Saeed Pahlavi Sandra Hammond Saeed Pahlavi 22 rows selected. 132 SQL Reference DROP DATABASE 구문 drop_database ::= DROPDATABASEdatabase_name; 전제 조건 이 구문은 SYS 사용자가 -sysdba 관리자 모드에서만 수행할 수 있으며, PROCESS 구동 단계에서만 수행할 수 있다. 설명 시스템에서 데이터베이스를 삭제하는 구문이다. database_name 삭제할 데이터베이스 이름을 명시한다. 이 구문이 실행되면 해당 데이터베이스가 사용하고 있던 데이터 파일과 로그 파일, 로그 앵커 파일 등이 모두 삭제된다. 예제 <질의> mydb라는 이름의 데이터베이스를 삭제하라. iSQL(sysdba)> DROP DATABASE mydb; Checking Log Anchor files [Ok] /home /altibase_xdb_home/logs/loganchor0 Exist. [Ok] /home /altibase_xdb_home/logs/loganchor1 Exist. [Ok] /home /altibase_xdb_home/logs/loganchor2 Exist. Removing DB files Removing Log files Removing Log Anchor files Drop success. 데이터 정의어 133 DROP DIRECTORY 구문 drop_directory ::= DROPDIRECTORYdirectory_name; 전제 조건 SYS 사용자와 DROP ANY DIRECTORY 시스템 권한을 가진 사용자만이 디렉토리 객체를 삭제할 수 있다. 설명 디렉토리를 제거하는 구문이다. 단, 실제 파일 시스템상의 디렉토리가 삭제되지는 않고 데이터베이스내의 디렉토리 객체만 삭제된다. directory_name 제거할 디렉토리 이름을 명시한다. 예제 <질의> 이름이 alti_dir1인 디렉토리 객체를 삭제하라. xdbiSQL> DROP DIRECTORY alti_dir1; Drop success. 134 SQL Reference DROP INDEX 구문 drop_index ::= DROPINDEXindex_name; user_name. 전제 조건 SYS 사용자, 인덱스 소유자, 및 DROP ANY INDEX 시스템 권한을 가진 사용자만이 인덱스를 삭제할 수 있다. 설명 데이터베이스에서 인덱스를 제거하는 구문이다. user_name 제거될 인덱스 소유자 이름를 명시한다. 생략하면 알티베이스는 현재 세션에 연결된 사용자의 스키마에 속한 것으로 간주한다. index_name 제거할 인덱스 이름을 명시한다. 예제 <질의> 인덱스 emp_idx1을 삭제하라. xdbiSQL> DROP INDEX emp_idx1; Drop success. 데이터 정의어 135 DROP QUEUE 구문 drop_queue ::= DROPQUEUEqueue_name; 설명 지정한 이름의 큐을 삭제하는 구문이다. 큐를 삭제하면 큐와 함께 생성되었던 큐 테이블, 큐 테이블의 인덱스, 및 큐 테이블의 MSGID값을 생성하는데 사용되었던 시퀀스도 삭제된다. 예제 <질의> Q1이라는 이름을 가지는 메시지 큐와 부속 객체들을 모두 삭제하라. DROP QUEUE Q1; 136 SQL Reference DROP REPLICATION 구문 drop_replication ::= DROPREPLICATIONreplication_name; 전제 조건 SYS 사용자만이 이중화 객체를 삭제할 수 있다. 설명 이중화 객체를 제거하는 SQL 문이다. replication_name 제거할 이중화 객체의 이름을 명시한다. 주의 사항 실행중인 이중화 객체는 제거할 수 없다. 즉 이중화 개시(ALTER REPLICATION START)가 되어있을 경우 삭제할 수 없고, 이중화 종료(ALTER REPLICATION STOP) 후에 삭제할 수 있다. 예제 <질의> 이중화 rep1을 삭제하라. DROP REPLICATION rep1; 데이터 정의어 137 DROP SEQUENCE 구문 drop_sequence ::= DROPSEQUENCE user_name. seq_name; 전제 조건 SYS 사용자, 시퀀스의 소유자, 및 DROP ANY SEQUENCE 시스템 권한을 가진 사용자만이 시퀀스를 삭제할 수 있다. 설명 명시된 시퀀스를 삭제하는 구문이다. user_name 제거될 시퀀스의 소유자 이름을 명시한다. 생략하면 알티베이스는 현재 세션에 연결된 사용자의 스키마에 속한 것으로 간주한다. seq_name 제거할 시퀀스 이름을 명시한다. 예제 <질의> 시퀀스 seq1을 삭제하라. xdbiSQL> DROP SEQUENCE seq1; Drop success. 138 SQL Reference DROP SYNONYM 구문 drop_synonym ::= DROPSYNONYM user_name. synonym_name; PUBLIC 전제 조건 SYS 사용자, 시노님의 소유자, 및 DROP ANY SYNONYM 시스템 권한을 가진 사용자만이 시노님을 삭제할 수 있다. 또한, SYS 사용자와 DROP PUBLIC SYNONYM 시스템 권한을 가진 사용자만이 PUBLIC 시노님을 삭제할 수 있다. 설명 명시된 시노님을 데이터베이스에서 삭제하는 구문이다. PUBLIC PUBLIC 시노님을 삭제하기 위해서는 PUBLIC을 명시해야 한다. PUBLIC을 명시하지 않으면 명시한 이름의 PRIVATE 시노님이 삭제될 것이다. PUBLIC을 명시한 경우 user_name은 명시할 수 없다. user_name 삭제할 시노님의 소유자 이름을 명시한다. 생략하면 알티베이스는 현재 세션에 연결된 사용자의 스키마에 속한 것으로 간주한다. synonym_name 삭제할 시노님의 이름을 명시한다. 데이터 정의어 139 예제 <질의> my_dept 시노님을 삭제하라. xdbiSQL> DROP SYNONYM my_dept; Drop success. <질의> PUBLIC 시노님인 dept를 삭제하라. xdbiSQL> DROP PUBLIC SYNONYM dept; Drop success. 140 SQL Reference DROP TABLE 구문 drop_table ::= DROPTABLE user_name. table_name; CASCADE CONSTRAINTS 전제 조건 SYS 사용자, 테이블의 소유자, 및 DROP ANY TABLE 시스템 권한을 가진 사용자만이 테이블을 삭제할 수 있다. 설명 명시된 테이블과 테이블의 데이터를 데이터베이스에서 제거하는 구문이다. user_name 제거될 테이블의 소유자 이름을 명시한다. 생략하면 알티베이스는 현재 세션에 연결된 사용자의 스키마에 속한 것으로 간주한다. table_name 제거될 테이블의 이름을 명시한다. {CASCADE | CASCADE CONSTRAINTS} 삭제될 테이블의 기본 키, 유니크 키를 참조하는 다른 테이블들의 참조 무결성 제약조건(referential integrity constraint)도 함께 삭제된다. 데이터 정의어 141 예제 <질의> employees 테이블을 삭제하라. xdbiSQL> DROP TABLE employees; Drop success. 142 SQL Reference DROP TABLESPACE 구문 drop_tablespace ::= DROPTABLESPACEtblspace_name INCLUDINGCONTENTS ANDDATAFILESCASCADECONSTRAINTS ; 전제 조건 SYS 사용자와 DROP TABLESPACE 시스템 권한을 가진 사용자만이 테이블스페이스를 삭제할 수 있다. 설명 데이터베이스에서 테이블스페이스를 제거하는 구문이다. tblspace_name 제거할 테이블스페이스를 명시한다. INCLUDING CONTENTS 테이블스페이스 내의 모든 내용도 삭제된다. 만약 테이블스페이스 내에 하나 이상의 객체가 존재할 경우 테이블스페이스를 삭제하려면 반드시 이 절을 명시해야 한다. 그렇지 않은 경우 알티베이스는 오류를 발생시키고 DROP TABLESPACE문의 수행은 실패한다. AND DATAFILES INCLUDING CONTENTS 절과 함께 AND DATAFILES 절을 명시하면 파일 시스템에서 삭제될 테이블스페이스와 관련된 모든 파일이 삭제된다. 테이블스페이스를 삭제할 경우 테이블스페이스의 모든 체크포인트 이미지 파일들이 파일 시스템으로부터 삭제된다. 그러나, 체크포인트 데이터 정의어 143 경로는 삭제되지 않는다. CASCADE CONSTRAINTS 삭제될 테이블스페이스 내에 존재하는 테이블들의 기본 키, 유니크 키를 참조하는 다른 테이블스페이스에 존재하는 테이블들의 참조 무결성 제약조건(referential integrity constraint)들도 함께 제거하려면 이 절을 명시해야 한다. 즉, 이런 참조 무결성 제약조건이 존재하는 상태에서 이 절을 명시하지 않고 수행하면 알티베이스는 오류를 발생시키고 DROP TABLESPACE문의 수행은 실패할 것이다. 제한 사항 다음 테이블스페이스는 시스템 테이블스페이스로, 사용자가 삭제할 수 없다. SYS_TBS_MEM_DIC SYS_TBS_MEM_DATA 예제 <질의 1> 테이블스페이스 user_data를 제거하라. xdbiSQL> DROP TABLESPACE user_data; Drop success. <질의 2> 메모리 테이블스페이스 user_data의 모든 객체(object)와 데이터 파일들과 함께 테이블스페이스를 삭제하라. xdbiSQL> DROP TABLESPACE user_memory_tbs INCLUDING CONTENTS AND DATAFILES; Drop success. <질의 3> 테이블스페이스 user_data의 모든 객체(object)와 거기에 저장된 모든 테이블의 기본 키 또는 유니크 키를 참조하는 다른 테이블스페이스에 존재하는 테이블들의 모든 참조 무결성 제약조건들을 테이블스페이스와 함께 삭제하라. xdbiSQL> DROP TABLESPACE user_data INCLUDING CONTENTS CASCADE CONSTRAINTS; Drop success. 144 SQL Reference DROP TRIGGER 구문 drop_trigger ::= ;DROPTRIGGERtrigger_name user_name. 전제 조건 SYS 사용자, 트리거의 소유자, 및 DROP ANY TRIGGER 시스템 권한을 가진 사용자만이 트리거를 삭제할 수 있다. 설명 데이터베이스에서 명시된 트리거를 제거하는 구문이다. user_name 제거될 트리거의 소유자 이름을 명시한다. 생략하면 알티베이스는 현재 사용자의 스키마 내에 속한 트리거를 제거한다. trigger_name 제거될 트리거의 이름을 명시한다. 예제 <질의> 트리거 del_trigger을 삭제하라. xdbiSQL> DROP TRIGGER del_trigger; Drop success. 데이터 정의어 145 DROP USER 구문 drop_user ::= DROPUSERuser_name CASCADE ; 전제 조건 SYS 사용자와 DROP USER 시스템 권한을 가진 사용자만이 사용자를 삭제할 수 있다. 설명 데이터베이스에서 명시된 사용자를 제거하는 구문이다. user_name 제거될 사용자 이름을 명시한다. CASCADE 데이터베이스 사용자 뿐만 아니라 그 사용자의 스키마에 속한 모든 객체를 삭제한다. 또한 해당 사용자 소유 테이블에 정의된 기본키 또는 유니크 키를 참조하는 다른 테이블들의 참조 무결성 제약조건(referential integrity constraint)들도 함께 삭제된다. 삭제될 사용자 스키마에 객체가 있는 경우 CASCADE를 생략하면, 에러가 반환되고 사용자 삭제 구문 실행은 실패할 것이다. 예제 <질의> 사용자 uare1을 삭제하라. xdbiSQL> DROP USER uare1; Drop success. 146 SQL Reference <질의> 사용자 uare4와 그것에 속한 모든 objects를 삭제하라. xdbiSQL> DROP USER uare4 CASCADE; Drop success. 데이터 정의어 147 DROP VIEW 구문 drop_view ::= DROPVIEW user_name. view_name; 전제 조건 SYS 사용자, 뷰의 소유자, 및 DROP ANY VIEW 시스템 권한을 가진 사용자만이 뷰를 삭제할 수 있다. 설명 데이터베이스에서 명시된 뷰를 제거하는 구문이다. user_name 제거될 뷰의 소유자 이름을 명시한다. 생략하면 알티베이스는 현재 사용자의 스키마 내에 속하는 뷰를 제거한다. view_name 제거될 뷰의 이름을 명시한다. 예제 <질의> 뷰 avg_sal을 제거하라. xdbiSQL> DROP VIEW avg_sal; Drop success. 148 SQL Reference GRANT 구문 grant ::= GRANT; grant_object_privilege grant_system_privilege grant_system_privilege ::= TO ALLPRIVILEGES system_privilege PUBLIC user ,, grant_object_privilege ::= object object_privilege , , WITHGRANTOPTION ALL user PUBLIC TO ON PRIVILEGESdirectory_nameDIRECTORY 전제 조건 SYS 사용자와 GRANT ANY PRIVILEGES 시스템 권한을 가진 사용자만이 시스템 권한을 부여할 수 있다. SYS 사용자와 객체의 소유자만이 객체에 대한 권한을 부여할 수 있다. 또한 GRANT OPTION을 사용해서 객체에 대한 권한을 데이터 정의어 149 부여받은 사용자는 그 객체에 대한 권한을 다른 사용자에게 부여할 수 있다. 설명 명시된 사용자에게 데이터베이스와 객체에 접근하기 위한 권한들을 부여하는 구문이다. 권한은 시스템 권한과 객체 권한으로 분류된다. grant_system_privilege 시스템 권한은 일반적으로 SYS 사용자에 의해 관리된다. SYS 사용자는 사용자들에게 특정 데이터베이스 작업을 수행하는 것을 허용하기 위해서 제한한 시스템 권한을 부여할 수 있다. 시스템 권한은 모든 스키마에 있는 객체들을 제어하는 광범위한 권한으로 볼 수 있다. 시스템 권한은 DDL문과 DCL문을 수행하기 위해서 필요하다. grant_object_privilege 사용자가 특정 객체에 대한 권한을 부여 받으면, 그 사용자는 그 객체에 접근/조작이 가능하다. 객체 접근 권한은 일반적으로 객체 소유자에 의해 관리된다. 시스템 권한이 없으면, DML문을 수행을 위해서 객체 권한이 필요하다. 150 SQL Reference 시스템 권한 (System Privilege) system_privilege 부여될 시스템 접근 권한의 이름을 명시한다. ALL PRIVILEGES 모든 시스템 권한을 사용자에게 부여하기 위해 사용되는 옵션이다. TO user 시스템 권한을 부여할 사용자 이름을 명시한다. TO PUBLIC 모든 사용자에게 시스템 권한을 부여함을 명시하는 옵션이다. 주의 사항 SYS 사용자와 GRANT ANY PRIVILEGES 권한을 가진 사용자는 모든 시스템 권한을 다른 사용자에게 부여할 수 있다. SYS 사용자는 모든 시스템 권한을 가진다. 시스템 권한 중 ANY 키워드는 모든 스키마에 대한 권한을 가진다. 예를 들어 SELECT ANY TABLE 권한은 데이터베이스 내에 있는 모든 테이블을 SELECT 할 수 있다. CREATE 권한은 객체를 생성할 수 있는 권한이며, 해당 객체를 삭제하는 권한도 포함한다. CREATE TABLE 객체 권한은 테이블 뿐만 아니라 인덱스를 생성하는 권한을 포함한다. 이 인덱스 생성 권한은 시스템 권한이 아니라 객체 권한이다. 새로운 사용자가 생성될 때 기본적으로 CREATE SESSION, CREATE TABLE, CREATE SEQUENCE, CREATE SYNONYM, CREATE PROCEDURE, CREATE VIEW, CREATE TRIGGER 권한이 그 사용자에게 부여된다. 다음 쿼리를 사용하면 알티베이스가 지원하는 모든 시스템 권한들의 목록을 볼 수 있다. xdbiSQL> SELECT * FROM SYSTEM_.SYS_PRIVILEGES_ where PRIV_TYPE = 2; 알티베이스는 다음과 같은 총 51개의 시스템 접근 권한을 지원한다. PrivID System privilege Name Purpose 1 ALL 향후 지원 예정 (현재는 이 권한을 사용자에게 부여해도 데이터 정의어 151 PrivID System privilege Name Purpose ALTER DATABASE, DROP DATABASE, MANAGER TABLESPACE 권한은 부여되지 않는다.) 201 DATABASE ALTER SYSTEM 알티베이스 프로퍼티 설정을 동적으로 변경할 수 있다. 233 ALTER DATABASE SYS 사용자 외의 다른 사용자에게는 부여되지 않는다. 234 DROP DATABASE SYS 사용자 외의 다른 사용자에게는 부여되지 않는다. 250 DIRECTORY CREATE ANY DIRECTORY 저장프로시저내에서 파일 제어를 위해 사용되는 디렉토리 객체를 생성할 수 있다. 251 DROP ANY DIRECTORY 디렉토리 객체를 삭제할 수 있다. 202 INDEXES CREATE ANY INDEX 자신의 스키마 뿐 아니라 다른 사용자의 스키마 내에서도 인덱스 생성이 가능하다. 203 ALTER ANY INDEX 데이터베이스에 존재하는 모든 인덱스의 정의를 변경할 수 있다. 204 DROP ANY INDEX 데이터베이스에 존재하는 모든 인덱스를 삭제할 수 있다. 205 PROCEDURES CREATE PROCEDURE 자신의 스키마 내에 저장 프로시저나 함수를 생성할 수 있다. 206 CREATE ANY PROCEDURE 자신의 스키마 뿐 아니라 다른 사용자의 스키마 내에 저장 프로시저나 함수를 생성할 수 있다. 207 ALTER ANY PROCEDURE 데이터베이스에 존재하는 모든 저장 프로시저나 함수를 재컴파일 할 수 있다. 208 DROP ANY 데이터베이스에 존재하는 152 SQL Reference PrivID System privilege Name Purpose PROCEDURE 모든 저장 프로시저나 함수를 삭제할 수 있다. 209 EXECUTE ANY PROCEDURE 데이터베이스에 존재하는 모든 저장 프로시저나 함수를 실행할 수 있다. 210 SEQUENCES CREATE SEQUENCE 자신의 스키마 내에 시퀀스를 생성할 수 있다. 211 CREATE ANY SEQUENCE 자신의 스키마 뿐 아니라 다른 사용자의 스키마 내에서도 시퀀스 생성이 가능하다. 212 ALTER ANY SEQUENCE 데이터베이스에 존재하는 모든 시퀀스의 정의를 변경할 수 있다. 213 DROP ANY SEQUENCE 데이터베이스에 존재하는 모든 시퀀스를 삭제할 수 있다. 214 SELECT ANY SEQUENCE 데이터베이스에 존재하는 모든 시퀀스를 조회할 수 있다. 215 SESSIONS CREATE SESSION 서버에 연결할 수 있다. 216 ALTER SESSION 자동으로 모든 사용자에게 부여된다. 향후 지원 예정. 245 SYNONYM CREATE SYNONYM 자기 소유의 시노님 (private synonym)을 생성할 수 있다. 246 CREATE PUBLIC SYNONYM PUBLIC 시노님을 생성할 수 있다. 247 CREATE ANY SYNONYM 자신의 스키마 뿐 아니라 다른 사용자의 스키마 내에서도 PRIVATE 시노님을 생성할 수 있다. 248 DROP ANY SYNONYM PRIVATE 시노님을 삭제할 수 있다. 249 DROP PUBLIC SYNONYM PUBLIC 시노님을 삭제할 수 있다. 217 TABLES CREATE TABLE 자신의 스키마 내에 테이블을 생성할 수 있다. 218 CREATE ANY TABLE 자신의 스키마 뿐 아니라 다른 사용자의 스키마 데이터 정의어 153 PrivID System privilege Name Purpose 내에서도 테이블 생성이 가능하다. 219 ALTER ANY TABLE 데이터베이스에 존재하는 모든 테이블에 대해서 truncate(모든 레코드 삭제)하거나 모든 테이블의 정의를 변경할 수 있다. 220 DELETE ANY TABLE 데이터베이스에 존재하는 모든 테이블의 레코드를 삭제 할 수 있다. 221 DROP ANY TABLE 데이터베이스에 존재하는 모든 테이블을 삭제할 수 있다. 222 INSERT ANY TABLE 데이터베이스에 존재하는 모든 테이블에 새로운 레코드를 삽입할 수 있다. 223 LOCK ANY TABLE 데이터베이스에 존재하는 모든 테이블에 테이블 잠금을 할 수 있다. 224 SELECT ANY TABLE 데이터베이스에 존재하는 모든 테이블의 데이터를 조회할 수 있다. 225 UPDATE ANY TABLE 데이터베이스에 존재하는 모든 테이블의 데이터를 변경할 수 있다. 226 USERS CREATE USER 새로운 사용자를 생성할 수 있다. 227 ALTER USER 모든 사용자의 암호를 변경할 수 있다. 228 DROP USER 사용자를 제거할 수 있다. 229 VIEWS CREATE VIEW 자신의 스키마 내에 뷰를 생성할 수 있다. 230 CREATE ANY VIEW 자신의 스키마 뿐 아니라 다른 사용자의 스키마 내에서도 뷰 생성이 가능하다. 231 DROP ANY VIEW 데이터베이스에 존재하는 모든 뷰를 삭제 할 수 있다. 232 MISCELLANEOUS GRANT ANY 모든 시스템 권한을 다른 154 SQL Reference PrivID System privilege Name Purpose PRIVILEGES 사용자에게 부여할 수 있다. 235 TABLESPACES CREATE TABLESPACE 테이블스페이스를 생성할 수 있다. 236 ALTER TABLESPACE 테이블스페이스 정의를 변경할 수 있다. 237 DROP TABLESPACE 테이블스페이스를 삭제할 수 있다. 238 MANAGE TABLESPACE SYS 사용자 외의 다른 사용자에게는 부여되지 않는다. 240 SYSDBA SYS 사용자 외의 다른 사용자에게는 부여되지 않는다. 241 TRIGGER CREATE TRIGGER 자신의 스키마 내에 새로운 트리거를 생성할 수 있다. 242 CREATE ANY TRIGGER 자신의 스키마 뿐 아니라 다른 사용자의 스키마 내에서도 트리거 생성이 가능하다. 243 ALTER ANY TRIGGER 데이터베이스에 존재하는 모든 트리거의 정의를 변경할 수 있다. 244 DROP ANY TRIGGER 데이터베이스에 존재하는 모든 트리거를 제거할 수 있다. 객체 권한 (Object privilege) object_privilege 어떤 객체에 대한 특정 권한만을 부여하고자 할 때 사용되는 절이다. (이 절의 아래에 어떤 객체에 대해서 어떤 권한이 지원되는지를 보여주는 표가 있다.) ALL [PRIVILEGES] 객체에 대한 모든 가능한 권한을 부여하는 옵션이다. ON object 어느 객체에 대해서 권한을 부여할 것인지를 명시하는 절이다. 객체에는 테이블, 시퀀스, 저장 프로시저가 있다. 데이터 정의어 155 ON DIRECTORY directory_name 권한을 부여할 대상인 저장 프로시저 내에서 사용하는 디렉토리 객체의 이름을 명시한다. TO user 객체에 대한 객체 권한을 부여 받는 사용자를 명시한다. TO PUBLIC 모든 사용자에게 객체 권한을 부여한다. WITH GRANT OPTION 권한 수여자가 다른 사용자들에게 자신이 받은 객체 권한을 부여할 수 있는 옵션이다. 요약 정리 객체의 소유자란 객체를 생성한 사용자를 말한다. 객체의 소유자이거나, WITH GRANT OPTION으로 객체 권한을 부여 받은 사용자만이 그 객체에 대한 권한을 다른 사용자에게 부여할 수 있다. 객체의 소유자는 자동적으로 해당 객체에 대한 모든 객체 권한을 가진다. 다음 쿼리로 알티베이스에서 지원하는 모든 객체 권한들에 대한 정보를 볼 수 있다. SELECT * FROM SYSTEM_.SYS_PRIVILEGES_ where PRIV_TYPE = 1; 알티베이스는 다음과 같은 객체 접근 권한을 지원한다. PrivID Object privileges Table Sequence PSM View directory 101 ALTER O O 102 DELETE O 103 EXECUTE O 104 INDEX O 105 INSERT O 106 REFERENCES O 107 SELECT O O O 108 UPDATE O 109 READ O 110 WRITE O 모든 사용자는 자동으로 메타 테이블에 대한 SELECT 권한을 가진다. 156 SQL Reference 예제 시스템 접근 권한 <질의1> 다음은 사용자 uare5에게 EXECUTE ANY PROCEDURE, SELECT ANY TABLE, ALTER ANY SEQUENCE, INSERT ANY TABLE, SELECT ANY SEQUENCE 등의 시스템 권한을 부여하는 예제이다. xdbiSQL> CREATE TABLE seqtbl(i1 INTEGER); Create success. xdbiSQL> CREATE OR REPLACE PROCEDURE proc1 AS BEGIN FOR i IN 1 .. 10 LOOP INSERT INTO seqtbl VALUES(i); END LOOP; END; / Create success. xdbiSQL> CREATE USER uare5 IDENTIFIED BY rose5; Create success. xdbiSQL> GRANT EXECUTE ANY PROCEDURE, SELECT ANY TABLE TO uare5; Grant success. xdbiSQL> CONNECT uare5/rose5; Connect success. xdbiSQL> EXEC sys.proc1; Execute success. xdbiSQL> SELECT * FROM sys.seqtbl; SEQTBL.I1 -------------- 1 2 3 4 5 6 7 8 9 10 10 rows selected. xdbiSQL> CONNECT sys/manager; Connect success. xdbiSQL> CREATE SEQUENCE seq1 START WITH 13 INCREMENT BY 3 MINVALUE 0 NOMAXVALUE; Create success. xdbiSQL> INSERT INTO seqtbl VALUES(seq1.NEXTVAL); 1 row inserted. xdbiSQL> INSERT INTO seqtbl VALUES(seq1.NEXTVAL); 1 row inserted. xdbiSQL> SELECT * FROM seqtbl; SEQTBL.I1 -------------- 1 2 3 4 5 6 7 데이터 정의어 157 8 9 10 13 16 12 rows selected. xdbiSQL> GRANT ALTER ANY SEQUENCE, INSERT ANY TABLE, SELECT ANY SEQUENCE TO uare5; Grant success. xdbiSQL> CONNECT uare5/rose5; Connect success. xdbiSQL> ALTER SEQUENCE sys.seq1 INCREMENT BY 50 MAXVALUE 100 CYCLE; Alter success. xdbiSQL> INSERT INTO sys.seqtbl VALUES(sys.seq1.NEXTVAL); 1 row inserted. xdbiSQL> INSERT INTO sys.seqtbl VALUES(sys.seq1.NEXTVAL); 1 row inserted. xdbiSQL> INSERT INTO sys.seqtbl VALUES(sys.seq1.NEXTVAL); 1 row inserted. xdbiSQL> INSERT INTO sys.seqtbl VALUES(sys.seq1.NEXTVAL); 1 row inserted. xdbiSQL> SELECT * FROM sys.seqtbl; SEQTBL.I1 -------------- 1 2 3 4 5 6 7 8 9 10 13 16 66 0 50 100 16 rows selected. 객체 권한 <질의1> 사용자 uare6가 WITH GRANT OPTION으로 employees 테이블에 대한 SELECT와 DELETE 객체 권한을 부여 받은 후, 같은 권한을 다른 사용자 uare7과 uare8에게 부여한다. xdbiSQL> CREATE USER uare6 IDENTIFIED BY rose6; Create success. xdbiSQL> GRANT CREATE USER TO uare6; Grant success. xdbiSQL> @schema.sql xdbiSQL> GRANT SELECT, DELETE ON employees TO uare6 WITH GRANT OPTION; Grant success. xdbiSQL> CONNECT uare6/rose6; Connect success. xdbiSQL> CREATE USER uare7 IDENTIFIED BY rose7; Create success. xdbiSQL> GRANT SELECT, DELETE ON sys.employees TO uare7; Grant success. 158 SQL Reference xdbiSQL> CONNECT uare7/rose7; Connect success. xdbiSQL> DELETE FROM SYS.employees WHERE eno = 12; 1 row deleted. xdbiSQL> SELECT eno, ename FROM sys.employees WHERE eno = 12; ENO ENAME ------------------------------------- No rows selected. xdbiSQL> CONNECT sys/manager; Connect success. xdbiSQL> CREATE USER uare8 IDENTIFIED BY rose8; Create success. xdbiSQL> CONNECT uare6/rose6; Connect success. xdbiSQL> GRANT SELECT, DELETE ON sys.employees TO uare8; Grant success. WITH GRANT OPTION 으로 객체권한을 부여받은 사용자 uare6는 자신이 생성한 사용자 uare7 뿐만 아니라 원래의 권한 부여자(SYS)가 생성한 사용자 uare8에게도 객체 권한을 부여할 수 있다. xdbiSQL> CONNECT uare8/rose8; Connect success. xdbiSQL> DELETE FROM sys.employees WHERE eno = 13; 1 row deleted. xdbiSQL> SELECT eno, e_firstname, e_lastname FROM sys.employees WHERE eno = 13; ENO ENAME ------------------------------------- No rows selected. <질의 2> 다음은 사용자에게 시스템 권한, 객체 권한을 부여한 후 각각의 권한을 해제하는 예제이다. 1. SYS 사용자가 uare9에게 모든 시스템 권한을 부여한다. xdbiSQL> CONNECT sys/manager; Connect success. xdbiSQL> CREATE TABLE book( isbn CHAR(10) PRIMARY KEY, title VARCHAR(50), author VARCHAR(30), edition INTEGER DEFAULT 1, publishingyear INTEGER, price NUMBER(10,2), pubcode CHAR(4)); Create success. xdbiSQL> CREATE TABLE inventory( subscriptionid CHAR(10) PRIMARY KEY, storecode CHAR(4), purchasedate DATE, quantity INTEGER, paid CHAR(1)); Create success. xdbiSQL> CREATE USER uare9 IDENTIFIED BY rose9; Create success. xdbiSQL> GRANT ALL PRIVILEGES TO uare9; Grant success. 2. SYS는 사용자uare9에게 객체 book에 대한 REFERENCES 권한을 WITH GRANT OPTION 으로 부여한다. 데이터 정의어 159 xdbiSQL> GRANT REFERENCES ON book TO uare9 WITH GRANT OPTION; Grant success. 사용자uare9은 SYS로부터 객체 book에 대한 REFERENCES 권한을 WITH GRANT OPTION 으로 부여 받았기 때문에, uare9은 다른 사용자(uare10)에게 객체 book에 대해 REFERENCES 객체 권한을 부여할 수 있다. 3. uare9이 SYS의 객체인 book 테이블에 데이터를 입력한다. xdbiSQL> CONNECT uare9/rose9; Connect success. xdbiSQL> INSERT INTO sys.book VALUES ('0070521824', 'Software Engineering', 'Roger S. Pressman', 4, 1982, 100000, 'CHAU'); 1 row inserted. xdbiSQL> INSERT INTO sys.book VALUES ('0137378424', 'Database Processing', 'David M. Kroenke', 6, 1972, 80000, 'PREN'); 1 row inserted. uare9이 SYS의 객체인 inventory 테이블에 데이터를 입력한다. xdbiSQL> INSERT INTO sys.inventory VALUES('BORD000002', 'BORD', '12-Jun-2003', 6, 'N'); xdbiSQL> INSERT INTO sys.inventory VALUES('MICR000001', 'MICR', '07-Jun-2003', 7, 'N'); 1 row inserted. 4. uare9이 SYS의 객체인 book 테이블을 조회한다. xdbiSQL> SELECT * FROM sys.book; BOOK.ISBN BOOK.TITLE ------------------------------------------------ BOOK.AUTHOR BOOK.EDITION BOOK.PUBLISHINGYEAR BOOK.PRICE ------------------------------------------------ BOOK.PUBCODE ---------------- 0070521824 Software Engineering Roger S. Pressman 4 1982 100000 CHAU 0137378424 Database Processing David M. Kroenke 6 1972 80000 PREN 2 rows selected. uare9이 SYS의 객체인 inventory 테이블을 조회한다. xdbiSQL> SELECT * FROM sys.inventory; INVENTORY.SUBSCRIPTIONID INVENTORY.STORECODE INVENTORY.PURCHASEDATE ------------------------------------------------ INVENTORY.QUANTITY INVENTORY.PAID -------------------------------------- BORD000002 BORD 2003/06/12 00:00:00 6 N MICR000001 MICR 2003/06/07 00:00:00 7 N 2 rows selected. xdbiSQL> CREATE TABLE book( isbn CHAR(10) PRIMARY KEY, title VARCHAR(50), 160 SQL Reference author VARCHAR(30), edition INTEGER DEFAULT 1, publishingyear INTEGER, price NUMBER(10,2), pubcode CHAR(4)); Create success. xdbiSQL> CREATE TABLE inventory( subscriptionid CHAR(10) PRIMARY KEY, isbn CHAR(10) CONSTRAINT fk_isbn REFERENCES book(isbn), storecode CHAR(4), purchasedate DATE, quantity INTEGER, paid CHAR(1)); Create success. 5. uare9은 SYS로부터 ALL PRIVILEGES를 부여 받았으므로 다른 사용자를 생성할 수 있다. xdbiSQL> CREATE USER uare10 IDENTIFIED BY rose10; Create success. 6. SYS는 uare9에게 REFERENCES 권한을 WITH GRANT OPTION으로 부여했기 때문에, uare9는 다른 사용자(uare10)에게 이 권한을 부여할 수 있다. xdbiSQL> GRANT REFERENCES ON sys.book TO uare10; Grant success. 7. GRANT ANY PRIVILEGES를 부여 받은 uare9이 다른 사용자(uare10)에게 시스템 권한을 부여한다. xdbiSQL> GRANT ALTER ANY TABLE, INSERT ANY TABLE, SELECT ANY TABLE, DELETE ANY TABLE TO uare10; Grant success. 8. 사용자 uare10은 ALTER ANY TABLE과 REFERENCE 권한이 있기 때문에, 다른 사용자 소유의 테이블에 제약조건을 추가할 수 있다. xdbiSQL> CONNECT uare10/rose10; Connect success. xdbiSQL> ALTER TABLE sys.inventory ADD COLUMN (isbn CHAR(10) CONSTRAINT fk_isbn REFERENCES sys.book(isbn)); Alter success. 9. 사용자 uare10은 INSERT ANY TABLE 권한이 있기 때문에, 사용자 uare9가 소유한 테이블에 데이터를 입력할 수 있다. xdbiSQL> INSERT INTO uare9.book VALUES('0471316156', 'JAVA and CORBA', 'Robert Orfali', 2, 1998, 50000, 'PREN'); 1 row inserted. xdbiSQL> INSERT INTO uare9.inventory VALUES('TOWE000001', '0471316156', 'TOWE', '01-Jun-2003', 5, 'N'); 1 row inserted. 사용자 uare10은 INSERT ANY TABLE 권한이 있기 때문에, SYS소유의 테이블에 데이터를 입력할 수 있다. xdbiSQL> INSERT INTO sys.book VALUES('053494566X', 'Working Classes', 'Robert Orfali', 1, 1999, 80000, 'WILE'); 1 row inserted. 데이터 정의어 161 xdbiSQL> INSERT INTO sys.inventory VALUES('MICR000005', 'WILE', '28-JUN-1999', 8, 'N', '053494566X'); 1 row inserted. 10. 사용자 uare10은 SELECT ANY TABLE 권한이 있기 때문에, uare9소유의 테이블을 조회할 수 있다. xdbiSQL> SELECT * FROM uare9.book; BOOK.ISBN BOOK.TITLE ------------------------------------------------ BOOK.AUTHOR BOOK.EDITION BOOK.PUBLISHINGYEAR BOOK.PRICE ------------------------------------------------ BOOK.PUBCODE ---------------- 0471316156 JAVA and CORBA Robert Orfali 2 1998 50000 PREN 1 row selected. xdbiSQL> SELECT * FROM uare9.inventory; INVENTORY.SUBSCRIPTIONID INVENTORY.ISBN INVENTORY.STORECODE ------------------------------------------------ INVENTORY.PURCHASEDATE INVENTORY.QUANTITY INVENTORY.PAID ------------------------------------------------ TOWE000001 0471316156 TOWE 2003/06/01 00:00:00 5 N 1 row selected. 사용자 uare10은 SELECT ANY TABLE 권한이 있기 때문에, SYS소유의 테이블을 조회할 수 있다. xdbiSQL> SELECT * FROM sys.book; BOOK.ISBN BOOK.TITLE ------------------------------------------------ BOOK.AUTHOR BOOK.EDITION BOOK.PUBLISHINGYEAR BOOK.PRICE ------------------------------------------------ BOOK.PUBCODE ---------------- 0070521824 Software Engineering Roger S. Pressman 4 1982 100000 CHAU 0137378424 Database Processing David M. Kroenke 6 1972 80000 PREN 053494566X Working Classes Robert Orfali 1 1999 80000 WILE 3 rows selected. xdbiSQL> SELECT * FROM sys.inventory; INVENTORY.SUBSCRIPTIONID INVENTORY.STORECODE INVENTORY.PURCHASEDATE ------------------------------------------------ INVENTORY.QUANTITY INVENTORY.PAID INVENTORY.ISBN ------------------------------------------------ BORD000002 BORD 2003/06/12 00:00:00 6 N MICR000001 MICR 2003/06/07 00:00:00 7 N MICR000005 WILE 1999/06/28 00:00:00 8 N 053494566X 3 rows selected. 11. 사용자 uare10은 DELETE ANY TABLE 권한이 있기 때문에, 162 SQL Reference SYS와 uare9소유의 테이블의 데이터를 삭제할 수 있다. xdbiSQL> DELETE FROM uare9.inventory WHERE subscriptionid = 'TOWE000001'; 1 row deleted. xdbiSQL> SELECT * FROM uare9.inventory; INVENTORY.SUBSCRIPTIONID INVENTORY.ISBN INVENTORY.STORECODE ------------------------------------------------ INVENTORY.PURCHASEDATE INVENTORY.QUANTITY INVENTORY.PAID ------------------------------------------------ No rows selected. xdbiSQL> DELETE FROM sys.inventory WHERE subscriptionid = 'MICR000005'; 1 row deleted. xdbiSQL> SELECT * FROM sys.inventory; INVENTORY.SUBSCRIPTIONID INVENTORY.STORECODE INVENTORY.PURCHASEDATE ------------------------------------------------ INVENTORY.QUANTITY INVENTORY.PAID INVENTORY.ISBN ------------------------------------------------ BORD000002 BORD 2003/06/12 00:00:00 6 N MICR000001 MICR 2003/06/07 00:00:00 7 N 2 rows selected. 12. 사용자 uare9이 REVOKE ALL 구문을 사용하지 않고 uare10으로부터 모든 권한을 해제한다. xdbiSQL> CONNECT uare9/rose9; Connect success. xdbiSQL> REVOKE ALTER ANY TABLE, INSERT ANY TABLE, SELECT ANY TABLE, DELETE ANY TABLE FROM uare10; Revoke success. 13. 사용자 uare10의 REFERENCES 권한과 함께 관련된 참조 무결성 제약조건(referential integrity constraints)도 같이 삭제한다. xdbiSQL> REVOKE REFERENCES ON sys.book FROM uare10 CASCADE CONSTRAINTS; Revoke success. 14. 사용자 uare9의 모든 시스템 권한을 해제한다. xdbiSQL> CONNECT sys/manager; Connect success. xdbiSQL> REVOKE ALL PRIVILEGES FROM uare9; Revoke success. 15. 사용자 uare9의 GRANT ANY PRIVILEGES 권한을 해제한다. xdbiSQL> REVOKE GRANT ANY PRIVILEGES FROM uare9; Revoke success. 16. 사용자 uare9의 REFERENCES 권한을 해제한다. xdbiSQL> REVOKE REFERENCES ON book FROM uare9; Revoke success. 데이터 정의어 163 RENAME TABLE 구문 rename ::= RENAMEtbl_namenew_tbl_name user_name. ;TO 전제 조건 SYS 사용자, 테이블의 소유자, 및 ALTER ANY TABLE 시스템 권한을 가진 사용자만이 테이블 이름을 변경할 수 있다. 설명 명시된 테이블의 이름을 새로운 이름으로 변경한다. 테이블의 이름만 변경되고 그 안에 저장된 데이터는 유지된다. user_name 이름이 변경될 테이블의 소유자 이름을 명시한다. 생략하면 알티베이스는 현재 세션에 연결된 사용자의 스키마에 속한 것으로 간주한다. old_name 테이블의 현재 이름을 명시한다. new_name 테이블에 주어질 새로운 이름을 명시한다. 주의 사항 이중화 대상 테이블일 경우 테이블의 이름을 변경할 수 없다. 164 SQL Reference 예제 <질의> 테이블 employees의 이름을 emp1으로 변경하라. xdbiSQL> RENAME employees TO emp1; Rename success. 또는 xdbiSQL> ALTER TABLE employees RENAME TO emp1; Alter success. 데이터 정의어 165 REVOKE 구문 revoke ::= REVOKE revoke_system_privilege revoke_object_privilege , ; revoke_system_privilege ::= ALLPRIVILEGES system_privilege , PUBLIC user , FROM revoke_object_privilege ::= object object_privilege , , CASCADECONSTRAINT ALL user PUBLIC FROM ON PRIVILEGESdirectory_nameDIRECTORY 전제 조건 SYS 사용자와 원래 그 권한을 부여한 사용자만이 해당 권한을 해제할 수 있다. 166 SQL Reference 설명 명시된 사용자가 가진 시스템 권한 또는 특정 객체에 대한 객체 권한을 해제하는 구문이다. 시스템 및 객체 접근 권한를 해제하려면 GRANT 명령으로 직접 부여 되었던 권한들에 대해서만 해제할 수 있다. 시스템 접근 권한 (System privilege) system_privilege 해제할 시스템 권한을 명시하는 절이다. 시스템 권한의 목록은 GRANT구문의 설명을 참고한다. ALL PRIVILEGES 이 REVOKE 문을 실행하는 사용자에 의해서 부여된 모든 시스템 권한을 해제하는 옵션이다. ALL PRIVILEGES 옵션으로 부여된 시스템 권한은 ALL PRIVILEGES 옵션을 사용해서 해제하거나 각각의 권한을 따로따로 해제해도 된다. FROM user 시스템 권한을 해제할 사용자를 명시한다. FROM PUBLIC 모든 사용자로부터 시스템 권한을 해제하는 옵션이다. Note: PUBLIC옵션으로 부여된 시스템 권한은 PUBLIC옵션으로 해제할 수 있다. 객체 권한 (Object privilege) object_privilege 해제할 객체 권한을 명시하는 절이다. 객체 권한의 목록은 GRANT구문의 설명을 참고한다. ALL [PRIVILEGES] 이 REVOKE 문을 실행하는 사용자에 의해서 부여된 모든 객체 권한을 해제하는 옵션이다. ALL PRIVILEGES 옵션으로 권한을 해제하면, 사용자에게 부여된 모든 객체 권한이 해제된다. 즉, ALL [PRIVILEGES] 옵션을 사용하지 않고 부여된 객체 권한도 해제된다. 예을 들어, 다음 구문으로 부여된 객체 권한은: 데이터 정의어 167 GRANT SELECT ON object TO user; 다음 방법으로 명시적으로 해제될 수 있다: REVOKE SELECT ON object FROM user; 또한, 다음 구문을 사용하면 모든 다른 권한도 함께 해제된다: REVOKE ALL ON object FROM user; ON object 어느 객체(테이블, 시퀀스, 저장 프로시저 등)에 대한 권한을 해제할지를 명시하는 절이다. ON DIRECTORY directory_name 어느 디렉토리 객체에 대한 객체 권한을 해제할지를 명시하는 절이다. FROM user 객체 권한을 해제할 사용자를 명시하는 절이다. FROM PUBLIC 모든 사용자로부터 객체 권한을 해제하는 옵션이다. CASCADE CONSTRAINTS REFERENCES 권한 또는 ALL [PRIVILEGS]를 사용해서 해제할 때 사용할 수 있는 옵션이다. 이 옵션을 사용해서 사용자의 권한을 해제하면 관련된 모든 참조 무결성 제약조건(referential integrity constraints)도 함께 삭제된다. 예제 <질의> 객체 권한을 해제하라 xdbiSQL> CONNECT uare6/rose6; Connect success. xdbiSQL> REVOKE SELECT, DELETE ON sys.employees FROM uare7, uare8; Revoke success. xdbiSQL> CONNECT uare7/rose7; Connect success. xdbiSQL> SELECT eno, e_lastname FROM sys.employees WHERE eno = 15; [ERR-311B1: The user must have the SELECT_ANY_TABLE privilege(s) to execute this statement.] employees 테이블에 대한 SELECT와 DELETE 권한 해제 후, 그 테이블에 SELECT 문을 실행하면 오류 메시지를 볼 수 있다. 168 SQL Reference TRUNCATE TABLE 구문 truncate ::= ;TRUNCATETABLE user_name. tbl_name 전제 조건 SYS 사용자, 테이블 소유자, 및 DROP ANY TABLE 시스템 권한을 가진 사용자만이 이 구문을 실행할 수 있다. 설명 명시된 테이블의 모든 레코드를 삭제하는 구문이다. user_name 레코드가 삭제될 테이블의 소유자 이름을 명시한다. 생략하면 알티베이스는 현재 세션에 연결된 사용자의 스키마에 속한 것으로 간주한다. tbl_name 레코드가 삭제될 테이블 이름을 명시한다. table_name 에는 큐 테이블 명을 지정하여 ENQUE된 메시지를 한꺼번에 삭제할 수 있다. TRUNCATE vs. DELETE TRUNCATE 문을 수행한 경우는 해당 테이블에 할당된 모든 페이지가 데이터베이스에 free page로 반납된다. 따라서 이 페이지들은 다른 테이블에 의해 사용될 수 있다. 그러나 DELETE 문을 수행하여 해당 테이블의 모든 레코드를 삭제한 경우는 free 데이터 정의어 169 page가 생기더라도 데이터베이스에 다시 반납되지 않고 해당 테이블 내에 유지되기 때문에 메모리 사용량이 줄지 않는다. TRUNCATE 구문은 DDL구문이므로 이 구문을 성공적으로 수행한 후에는 rollback이 불가능하다. 주의 사항 레코드의 삭제가 성공적으로 수행되었다면 삭제된 레코드는 복구될 수 없다. 그러나 수행 완료 전에 오류가 발생한 경우나 서버가 죽은 경우엔 롤백이 가능하다. 예제 <질의> 테이블 employees의 모든 데이터를 삭제하라. xdbiSQL> TRUNCATE TABLE employee; Truncate success. 데이터 조작어 171 3. 데이터 조작어 이 장에서는 데이터 조작에 사용되는 DML 구문에 대해서 상세히 설명한다. 172 SQL Reference DELETE 구문 delete ::= DELETE hints where_clause ; from_clause limit_clause PARTITIONpartition_name() from_clause ::= FROM tbl_name user_name. where_clause ::= WHEREcondition limit_clause ::= row_offset, LIMITrow_count 데이터 조작어 173 hints ::= +/**/ fullscan_hint index_hint noindex_hint indexasc_hint indexdesc_hint plancache_hint fullscan_hint ::= FULLSCAN()tbl_name index_hint ::= INDEXtbl_name( index_name ), noindex_hint ::= INDEXtbl_nameNO)( index_name , indexasc_hint ::= index_name INDEX ASC (tbl_name), 174 SQL Reference indexdesc_hint ::= index_name INDEX DESC (tbl_name), plancache_hint ::= NO_PLAN_CACHEKEEP_PLAN 전제 조건 SYS 사용자, 테이블 소유자, DELETE ANY TABLE 시스템 권한을 가진 사용자 및 테이블에 대한 DELETE 객체 권한을 가진 사용자만이 이 구문으로 해당 테이블의 레코드를 삭제할 수 있다. 설명 조건을 만족하는 레코드를 해당 테이블에서 삭제하는 구문이다. 또한 이 구문으로 특정 파티션에 있는 데이터를 삭제할 수도 있다. WHERE 절은 SELECT구문의 WHERE 절과 동일하다. WHERE 절을 생략하면 테이블의 모든 데이터가 삭제된다. user_name 레코드를 삭제할 테이블의 소유자 이름을 명시한다. 생략하면 알티베이스는 테이블이 현재 세션에 연결된 사용자의 스키마에 속한 것으로 간주한다. tbl_name 삭제될 레코드를 포함한 테이블 이름을 명시한다. HINTS 옵션 알티베이스는 SQL문 내에 주석의 형태로 힌트를 포함시켜 쿼리 옵티마이저로 전달하는 것을 지원한다. 쿼리 옵티마이저는 실행 계획을 선택할 때 가능하면 이러한 힌트를 따른다. 데이터 조작어 175 플러스 기호(+)는 그 주석이 힌트임을 알티베이스에 알려주는 역할을 한다. 다음처럼 플러스 기호(+)는 주석 구분자 바로 뒤에 공백 없이 위치해야 한다: /*+ FULL SCAN */ 힌트에 문법 오류가 있어도 쿼리 자체는 실행되지만, 힌트는 무시된다. FULL SCAN 테이블에 이용 가능한 인덱스가 존재하더라도 인덱스를 사용하지 않고 테이블 전체를 검색하도록 하는 힌트이다. INDEX 명시된 인덱스를 사용하여 해당 테이블에 대해서 인덱스 스캔을 수행하도록 하는 힌트이다. INDEX ASC’ 명시된 인덱스를 사용하여 해당 테이블에 대해서 인덱스 스캔을 수행하되, 오름 차순으로 탐색한다. INDEX DESC 명시된 인덱스를 사용하여 해당 테이블에 대해서 인덱스 스캔을 수행하되, 내림 차순으로 탐색한다. NO INDEX 명시된 인덱스를 사용해서 해당 테이블에 대한 인덱스 스캔을 수행하지 않도록 하는 힌트이다 plancache_hint plan cache 관련된 힌트는 NO_PLAN_CACHE와 KEEP_PLAN이 있다. NO_PLAN_CACHE는 생성된 플랜을 플랜 캐시에 저장하지 않도록 하는 힌트이다. KEEP_PLAN는 한 번 생성된 플랜이 참조하는 테이블의 통계 정보가 변경되더라도 플랜이 재생성되는 것을 방지하고 그대로 사용하도록 하는 힌트이다. KEEP_PLAN 힌트는 쿼리의 direct/execute 수행뿐 아니라 prepare/execute 수행시에도 사용 가능하다. 각 힌트의 문법과 자세한 설명은 Administrator’s Manual 의 “SQL 튜닝”장을 참고하기 바란다. 176 SQL Reference 예제 단순 데이터 삭제 <질의> 테이블의 모든 데이터를 삭제하라. DELETE FROM orders; <질의> T1 테이블의 P2 파티션의 모든 데이터를 삭제한다 DELETE FROM T1 PRTITION (P2); <질의> 직원 ’William’이 받은 주문들을 삭제한다. DELETE FROM orders WHERE eno = (SELECT eno FROM employees WHERE e_firstname = 'William'); 데이터 조작어 177 INSERT 구문 insert ::= tbl_name DEFAULTVALUES ;)column_name , values_clause subquery user_name. ( PARTITIONpartition_name() INSERTINTO insert_hints values_clause ::= VALUES expr DEFAULT , () insert_hints ::= /**/+plancache_hint 전제 조건 SYS 사용자, 테이블 소유자, INSERT ANY TABLE 시스템 권한을 가진 사용자 및 테이블에 대한 INSERT 객체 권한을 가진 사용자만이 이 구문으로 해당 테이블에 레코드를 삽입할 수 있다. 178 SQL Reference 설명 명시한 테이블 또는 특정 파티션에 새로운 레코드를 삽입하는 구문이다. 만약 해당 테이블에 인덱스가 존재할 경우엔 인덱스 데이터도 변경될 것이다. user_name 레코드가 삽입될 테이블의 소유자 이름을 명시한다. 생략하면 알티베이스는 그 테이블이 현재 세션에 연결된 사용자의 스키마에 속한 것으로 간주한다. tbl_name 레코드가 삽입될 테이블의 이름을 명시한다. NULL 일부 칼럼의 값은 명시하고 일부 칼럼의 값은 명시하지 않고 데이터를 삽입할 경우, 값을 주지 않은 칼럼에 기본값이 설정되어 있지 않으면 널이 삽입된다. ( TIMESTAMP 칼럼의 기본값은 INSERT 연산이 수행된 시점의 시스템 시각 값이다. 따라서 TIMESTAMP 칼럼의 입력 값을 명시하지 않을 경우 널이 아닌 시스템 시각 값이 삽입된다. ) VALUES 절에 명시적으로 널을 지정하면 널이 삽입된다. DEFAULT VALUES 절에 DEFAULT를 명시하면 해당 칼럼에 정의된 기본값이 삽입된다. 전체 칼럼들에 대해 기본값을 삽입하려면 DEFAULT VALUES 절을 사용한다. TIMESTAMP 칼럼에 DEFAULT를 명시하면 시스템 시각 값이 삽입될 것이다. INSERT ~ SELECT SELECT 질의 결과를 테이블에 삽입하는 구문이다. 삽입할 테이블과 조회하는 테이블이 같아도 된다. 삽입할 칼럼의 개수와 조회하는 칼럼의 개수는 동일해야 하며, 대응하는 칼럼은 서로 호환 가능한 데이터 타입이어야 한다. HIINTS 옵션 알티베이스는 SQL문 내에 주석의 형태로 힌트를 포함시켜 쿼리 옵티마이저로 전달하는 것을 지원한다. 쿼리 옵티마이저는 실행 데이터 조작어 179 계획을 선택할 때 가능하면 이러한 힌트를 따른다. 플러스 기호(+)는 그 주석이 힌트임을 알티베이스에 알려주는 역할을 한다. 플러스 기호(+)는 주석 구분자 바로 뒤에 공백 없이 위치해야 한다: 주의 사항 INSERT 문으로 데이터 입력시, 다음의 사항들을 유념해야 한다. 명시한 칼럼의 개수와 삽입할 값들의 개수는 동일해야 하며 호환 가능한 데이터형 이어야 한다. 파티션을 지정할 경우 해당 파티션에 일치하지 않는 값은 입력할 수 없다. 기본값이 정의되어 있지 않고 NOT NULL 제약이 없는 칼럼에 입력값을 명시하지 않고 INSERT를 수행할 경우, NULL이 삽입된다. 예제 단순 데이터 입력 <질의> 이름이 Louise Leroux인 고객 정보 입력 INSERT INTO customers VALUES ( '25', 'Leroux', 'Louise', 'student', '025282222', 'F', '0101', 150763, '#3 825 - 17th Ave SW Calgary Canada'); <질의> Rosalia Jung인 고객의 정보 중 사번, 이름, 성별만 입력 INSERT INTO employees(eno, e_firstname, e_lastname, sex) VALUES( 21, 'Rosalia', 'Jung', 'F'); 복합 데이터 입력 <질의> 지연중인 주문에 대한 고객 번호와 주문일을 orders 테이블에서 delayed_processing 테이블로 복사하라. xdbiSQL> CREATE TABLE delayed_processing( cno CHAR(14), order_date DATE); Create success. xdbiSQL> INSERT INTO delayed_processing SELECT cno, order_date FROM orders WHERE PROCESSING = 'D'; 1 row inserted. 180 SQL Reference 파티션에 데이터 입력 CREATE TABLE T1 ( I1 INTEGER, I2 INTEGER ) PARTITION BY RANGE ( I1 ) ( PARTITION P1 VALUES LESS THAN ( 300 ), PARTITION P2 VALUES LESS THAN ( 400 ), PARTITION P3 VALUES DEFAULT ) TABLESPACE SYS_TBS_MEM_DATA; INSERT INTO T1 PARTITION ( P1 ) VALUES ( 123, 456 ); 1 row inserted. 데이터 조작어 181 LOCK TABLE 구문 lock_table ::= LOCKTABLE MODEIN WAIT NOWAIT ; integer tbl_name lock_mode user_name. 전제 조건 SYS 사용자, 테이블의 소유자와 LOCK ANY TABLE 시스템 권한을 가진 사용자만이 이 구문으로 테이블 잠금을 할 수 있다. 설명 특정한 모드내에서 테이블 자체에 잠금(lock table)을 거는 기능이다. 테이블에 잠금이 걸리면 관련 트랜잭션이 커밋되거나 롤백될 때까지 계속 그 잠금이 유지된다. user_name 잠금이 걸릴 테이블의 소유자 이름을 명시한다. 생략하면 알티베이스는 그 테이블이 현재 세션에 연결된 사용자의 스키마에 속한 것으로 간주한다. tbl_name 잠금이 걸릴 테이블의 이름을 명시한다. lock_mode 테이블에 잠금을 걸 때, 다음의 잠금 모드 중의 하나를 명시해야 한다. 182 SQL Reference ROW SHARE 이 잠금이 걸린 테이블에 다른 트랜잭션에 의한 동시 접근을 허용한다. 그러나 다른 사용자들이 독점적인 접근을 위해 이 테이블에 EXCLUSIVE 모드로 잠금을 거는 것은 금한다. SHARE UPDATE ROW SHARE와 같은 잠금 모드이다. ROW EXCLUSIVE 다른 트랜잭션이 SHARE 모드로 잠금을 요청하는 것을 금하는 것을 제외하면 ROW SHARE 모드와 동일하다. 데이터를 갱신, 삽입하거나 또는 삭제할 때 자동으로 이 잠금이 획득된다. SHARE ROW EXCLUSIVE 전체 테이블을 보는 것을 허용한다. 그러나 다른 트랜잭션들이 SHARE 모드로 잠금을 요청하거나 행들을 갱신하는 것을 금한다. SHARE 다른 트랜잭션이 이 잠금이 걸린 테이블을 읽는 것은 허용하지만 갱신하는 것은 금한다. EXCLUSIVE 현재 트랜잭션이 이 잠금이 걸린 테이블을 읽거나 갱신하는 것은 허용하지만 다른 트랜잭션이 그 테이블에 접근하는 것은 금한다. WAIT | NOWAIT 잠금이 획득될 때까지 대기할 지 여부를 지정하는 옵션이다. 생략하면, 행 단위 잠금이 획득될 때까지 무한정 기다린다. WAIT n 트랜잭션이 행 단위 잠금(row lock)이 걸리기까지 n 초 만큼 기다리고도 획득에 실패하면 에러가 반환될 것이다. NOWAIT 트랜잭션이 잠금 획득이 즉시 안 될 경우 행 단위 잠금이 걸리기까지 기다리지 않는다. 이 경우 이미 다른 사용자에 의해서 해당 테이블에 이미 잠금이 걸려 있다는 것을 나타내는 에러를 반환한다. SQL Statement Mod e of Table Lock Lock Modes Permitted? IS IX S SIX X SELECT … FROM tbl_name … IS Y(IS) Y(IX) Y(S) Y(SIX) N(X) INSERT INTO tbl_name … IX Y(IX) Y(IX) N(SIX) N(SIX) N(X) 데이터 조작어 183 UPDATE tbl_name … IX Y*(IX) Y*(IX) N(SIX) N(SIX) N(X) DELETE FROM tbl_name … IX Y*(IX) Y*(IX) N(SIX) N(SIX) N(X) SELECT … FROM tbl_name FOR UPDATE … IS Y*(IX) Y*(IX) Y*(S) Y*(SIX ) N(X) LOCK TABLE tbl_name IN ROW SHARE MODE IS Y(IS) Y(IX) Y(S) Y(SIX) N(X) LOCK TABLE tbl_name IN ROW EXCLUSIVE MODE IX Y(IX) Y(IX) N(SIX) N(SIX) N(X) LOCK TABLE tbl_name IN SHARE MODE S Y(S) N(SIX) Y(S) N(SIX) N(X) LOCK TABLE tbl_name IN SHARE ROW EXCLUSIVE MODE SIX Y(SIX) N(SIX) N(SIX) N(SIX) N(X) LOCK TABLE tbl_name IN EXCLUSIVE MODE X N(X) N(X) N(X) N(X) N(X) IS: row share (Intent share lock) IX: row exclusive (Intent exclusive lock) S: share SIX: share row exclusive (Share with Intent exclusive lock) X: exclusive * Y: 다른 트랜잭션에 의해 행 잠금 충돌이 일어나지 않은 경우, 그 트랜잭션은 잠금 획득이 가능하다. 그렇지 않으면 기다림이 발생한다. 괄호 내에 표시된 잠금 타입은: 1. 다른 트랜잭션에 의해 현재의 잠금 모드 전환이 허용되는 경우(Y), 현재 걸려있는 잠금 타입이 괄호 안의 타입으로 전환된다. 2. 다른 트랜잭션에 의해 현재의 잠금 모드 전환이 허용되지 않는 경우(N), 잠금 타입은 현재 잠금을 획득하고 있는 트랜잭션이 새로운 잠금을 획득할 때만 괄호 안의 타입으로 전환이 가능하다. [표 3-1] Summary of Table Locks 예제 다음은 LOCK TABLE과 SELECT 문이 사용 될 때 알티베이스가 데이터 동시성, 무결성, 그리고 일관성을 어떻해 관리하는가를 보여주는 예제이다. Transaction A Time Point Transaction B xdbiSQL> AUTOCOMMIT OFF; xdbiSQL> AUTOCOMMIT OFF; 184 SQL Reference Set autocommit off success. Set autocommit off success. 1 (request X lock on employees) xdbiSQL> LOCK TABLE employees IN EXCLUSIVE MODE; Command execute success. (acquire X lock on employees) xdbiSQL> DROP TABLE employees; [ERR-11170: The transaction has exceeded the lock timeout specified by the user.] 2 3 xdbiSQL> UPDATE employees SET salary = 2500000 WHERE eno = 15; 1 row updated. (request S lock on employees) xdbiSQL> LOCK TABLE employees IN SHARE MODE; (the request conflicts with the X lock already held by transaction B) wait wait wait 4 5 xdbiSQL> COMMIT; Commit success. (release X lock on employees) (resume) Lock success. (acquire S lock on employees) xdbiSQL> SELECT salary FROM employees WHERE eno = 15; SALARY -------------- 2500 1 row selected. (커밋된 데이터가 보인다.) 6 xdbiSQL> ROLLBACK; Rollback success. (release S lock on employees) 7 xdbiSQL> LOCK TABLE employees IN EXCLUSIVE MODE; Lock success. (acquire X lock on employees) 8 xdbiSQL> SELECT SALARY 데이터 조작어 185 FROM employees WHERE eno = 15; wait wait wait xdbiSQL> UPDATE employees SET eno = 30 WHERE eno = 15; 1 row updated. 10 xdbiSQL> COMMIT; Commit success. (release X loc on employees) 11 12 (resume) SALARY -------------- 2500 1 row selected. 186 SQL Reference SELECT 구문 select ::= ; for_update_clause subquery subquery ::= select_clause order_by_clauselimit_clause select_clause ::= select_listSELECT hintsALL DISTINCT FROM where_clausehierarchical_query_clausegroup_by_clause HAVINGconditionUNION ALL INTERSECT MINUS select_clause , tbl_reference joined_table 데이터 조작어 187 select_list ::= alias_name AS tbl_name. , * * user_name. expr tbl_reference ::= AS alias_nametbl_name user_name. ()subquery pivot_clause pivot_clause ::= AS alias (aggregate_function(expr) , )pivot_for_clausepivot_in_clause PIVOT pivot_for_clause ::= FOR column_name column_name() , 188 SQL Reference pivot_in_clause ::= IN expr expr() , ( AS alias ) , joined_table ::= tbl_reference join_type tbl_referenceconditionJOINON join_type ::= LEFT INNER RIGHT FULL OUTER where_clause ::= WHEREcondition AND OR hierarchical_query_clause ::= CONNECTcondition STARTWITHconditionIGNORELOOP BY 데이터 조작어 189 group_by_clause ::= GROUP , expr HAVINGcondition BY order_by_clause ::= ORDERlocation ASC DESC , BY expr c_alias limit_clause ::= LIMIT row_offset row_count , for_update_clause ::= FORUPDATE WAIT NOWAIT integer 190 SQL Reference hints ::= fullscan_hint index_hint noindex_hint indexasc_hint indexdesc_hint ordered_hint rule_hint cost_hint dnf_hint cnf_hint use_nl_hint use_hash_hint use_sort_hint use_merge_hint hash_bucket_count_hint group_bucket_count_hint set_bucket_count_hint /*+*/ temp_table_type_hint group_method_hint distinct_method_hint view_opt_hint push_pred_hint 데이터 조작어 191 fullscan_hint ::= FULLSCAN()tbl_name index_hint ::= INDEXtbl_name( index_name ), noindex_hint ::= INDEXtbl_nameNO)( index_name , indexasc_hint ::= index_name INDEX ASC (tbl_name), indexdesc_hint ::= index_name INDEX DESC (tbl_name), ordered_hint ::= ORDERED rule_hint ::= RULE cost_hint ::= COST 192 SQL Reference cnf_hint ::= CNF dnf_hint ::= DNF use_nl_hint ::= USE_NL(tbl_name,)tbl_name use_hash_hint ::= USE_HASH(tbl_name,)tbl_name use_sort_hint ::= USE_SORT(tbl_name,)tbl_name use_merge_hint ::= USE_MERGE(tbl_name,)tbl_name hash_bucket_count_hint ::= integerBUCKETCOUNTHASH group_bucket_count_hint ::= integerBUCKETCOUNTGROUP 데이터 조작어 193 set_bucket_count_hint ::= integerBUCKETCOUNTSET temp_table_type_hint ::= TEMP_TBS_MEMORY TEMP_TBS_DISK group_method_hint ::= GROUP_HASH GROUP_SORT distinct_method_hint ::= DISTINCT_HASH DISTINCT_SORT view_opt_hint ::= NO_PUSH_SELECT_VIEW PUSH_SELECT_VIEW push_pred_hint ::= PUSH_PRED()view_name 194 SQL Reference 전제 조건 SYS 사용자, 테이블 소유자, SELECT ANY TABLE 시스템 권한을 가진 사용자 및 테이블에 대한 SELECT 객체 권한을 가진 사용자만이 이 구문으로 해당 테이블에서 데이터를 조회할 수 있다. 설명 한 개 이상의 테이블 또는 뷰에서 데이터를 검색하는 구문이다. select_list 절 DISTINCT를 명시할 경우 결과 집합에서 중복된 레코드는 제거된다. 만약 GROUP BY 절이 존재한다면 상수, 집계 함수(aggregate functions), GROUP BY 절에 명시된 표현식과 이들을 조합한 표현식만 SELECT 리스트에 명시 가능하다. SELECT 리스트에 집계 함수가 하나 이상 존재할 경우 SELECT 리스트의 다른 표현식도 GROUP BY 절에 존재하는 표현식들 중 하나이거나 집계 함수이어야 한다. SELECT 키워드 검색 바로 다음에 힌트를 명시할 수 있다. 힌트는 다음과 같이 구분된다: /*+ your_hint */ 힌트에 대한 자세한 설명은 Administrator’s Manual 의 “SQL 튜닝”장을 참고하기 바란다. FROM 절 같은 별명(alias_name)을 FROM 절에 두 번 이상 사용할 수 없다. 같은 테이블 명을 FROM절에 여러 번 사용할 때, 다른 별명을 주어야 한다. 즉, 별명을 명시하지 않고 같은 테이블 명을 두 번 이상 사용할 수 없다. FROM절에 사용되는 테이블 또는 뷰의 최대 개수는 32개이다. OUTER JOIN 조인 조건을 만족하지 않는 데이터를 처리하기 위한 JOIN의 확장 형태이다. (INNER) JOIN이 두 테이블에서 키 값이 일치하는 데이터만 가져오는 것에 비해 OUTER JOIN은 어느 한 쪽의 데이터를 모두 가져온다. 즉, 한 테이블의 행에 대응하는 행이 다른 테이블에 존재하지 않을 때, 빈 칼럼들에 대해서 결과 집합에는 NULL로 채워져서 반환된다. 데이터 조작어 195 인라인 뷰(Inline View) FROM 절에 오는 부질의(subquery)를 인라인 뷰라고 한다. pivot_clause pivot_clause는 데이터 집계 연산 및 별개의 행으로 존재하는 데이터를 칼럼으로 재배열하여 보여주기 위해 사용할 수 있다. 이것은 GROUP BY 절에 두 개의 칼럼을 사용할 때보다 데이터를 더 읽기 쉽게 보여준다. 편의상, 많은 수의 칼럼 출력 또는 변형 연산의 결과로 생기는 특정 칼럼들의 이름을 명시하는 어려움을 방지하기 위해서 pivot_clause는 일반적으로 인라인 뷰와 함께 사용된다. Pivot_clause는 다음의 단계를 수행한다. 1. 먼저 pivot_clause 는 마치 GROUP BY 절처럼 그룹 연산을 수 행한다. 그 결과는 pivot_clause내의 참조되지 않은 모든 칼럼 과 pivot_in_clause에 명시된 값에 대해 그룹화된다. 2. 다음으로 pivot_clause는 결과로 나온 그룹화된 칼럼들과 집계 된 값들을 회전된 표 형식으로 배열한다. pivot_for_clause pivot_for_clause는 그 값 (pivot_in_clause에 명시된 값)이 칼럼 형태로 바꾸어지는 한 개 이상의 원천 칼럼을 명시한다. pivot_in_clause pivot_for_clause에 명시된 칼럼들에 존재하는 값을 이 절에 명시할 수 있다. 이 값들은 pivot 연산에서 칼럼 이름으로 사용될 것이다. where 조건절 WHERE 절의 조건에 대한 설명은 8장 조건 연산자를 참고한다. Hierarchical Query 절 계층적 질의(Hierarchical query)란 데이터 조회시 계층적 구조로 출력되도록 하는 쿼리문이다. 테이블에 부모, 자식 관계를 가지는 데이터가 존재하는 경우 이 쿼리문을 이용해서 부모, 자식 관계를 계층적으로 출력할 수 있다. 즉, 주어진 검색 조건을 갖는 루트 행에 대하여, 그 행과 그의 종속 행에 대한 계층적 조건을 만족하는 행들을 검색한다. 계층적 데이터를 조회할 때, ORDER BY 또는 GROUP BY 절을 사용하면 안 된다. 왜냐하면 이는 CONNECT BY절로 수립된 계층적 순서를 깨기 때문이다. START WITH 절 계층적 질의의 루트 행으로 사용될 행을 식별하는 조건을 명시하는 196 SQL Reference 절이다. 이 조건을 만족하는 모든 행들이 루트 행으로 사용된다. 이 절을 생략하면 알티베이스는 테이블에 있는 모든 행들을 루트 행으로 사용한다. CONNECT BY 절 없이 이 절을 사용할 수 없다. CONNECT BY 절이 있을 경우 이 절은 생략 가능하다. ROWNUM 의사칼럼은 이 절에 사용될 수 없다. CONNECT BY 절 계층 구조의 부모 행들과 자식 행들간의 관계를 식별하는 조건을 명시하는 절이다. 이전에 검색된 행과 현재 행을 구분하기 위해서 PRIOR 연산자를 사용한다. 즉, 부모행을 언급하기 위해 반드시 PRIOR 연산자를 사용해야만 한다. PRIOR 연산자는 CONNECT BY 절을 포함하는 질의문의 SELECT 리스트, WHERE 절, 또는 CONNECT BY 절에서만 사용 가능하다. CONNECT BY 절은 부질의를 포함할 수 없고 조인과 함께 사용될 수도 없다. CONNECT BY 절은 WHERE 절 이후 ORDER BY, GROUP BY, HAVING 절 이전에 사용하여야 한다. 집합 연산자 (UNION, INTERSECT, 등)가 쿼리에 사용되었을 ?, PRIOR 연산자는 ORDER BY 절에 올 수 없다. LEVEL 의사칼럼 계층적 질의를 포함하는 SQL문은 select_list에 LEVEL 의사칼럼을 포함할 수 있다. LEVEL 의사칼럼은 루트 행과 종속 행간의 계층적 거리를 나타낸다. 즉, 루트 행의 LEVEL은 1이고, 자식 행의 LEVEL은 2, 손자 행의 LEVEL은 3, 등이 된다. LEVEL의사칼럼은 WHERE 절, ORDER BY 절, GROUP BY 절, HAVING 절에서도 사용 가능하다. 또한, LEVEL 의사칼럼은 다음 예처럼 쿼리문에 CONNECT BY 절이 없더라도 select_list 에 올 수 있다: select level from t1; IGNORE LOOP 행들간 계층 관계가 순환 형태를 이룰 경우 알티베이스는 오류를 반환한다. (여기서 순환이란 한 행이 다른 행의 부모 행도 되고 자식 행도 되는 경우를 말한다.) 단, IGNORE LOOP이 명시되었을 경우, 데이터 조작어 197 질의 수행시의 순환 형성이 오류를 발생시키지 않고, 순환 형태의 행들이 질의 결과 집합에서 제거된다. GROUP BY 절 GROUP BY 절은 주어진 하나 이상의 표현식에 대해서 같은 값을 가지는 레코드들끼리 그룹짓고, 각 그룹별로 집계한 정보를 한 행으로 반환받기 위해 사용되는 절이다. WHERE 조건을 사용하여 반환되는 그룹을 제한할 수 없다. 대신에, HAVING 절을 사용하여 반환되는 그룹을 제한할 수 있다. HAVING 및 GROUP BY 절은 WHERE 절과 hierarchical_clause 뒤에 위치시킨다. 만약 ORDER BY 절이 있다면 이는 쿼리문의 맨 마지막에 와야 한다. HAVING 조건절 HAVING 절에는 상수, 집계 함수(aggregate functions), GROUP BY 절에 명시된 표현식과 이들을 조합한 표현식만 올 수 있다. 이 절은 명시된 조건이 참인 그룹에 해당하는 레코드만 반환한다. HAVING 절의 조건문에 대한 자세한 설명은 "8장 조건 연산자"를 참고하기 바란다. UNION (ALL), INTERSECT, MINUS 집합 연산자는 두 SELECT 문의 결과 집합을 하나로 결합한다. 각 질의가 반환하는 칼럼들의 개수와 데이터 타입이 동일해야 하지만, 칼럼 길이는 달라도 된다. 집합 연산자의 앞 부분에 위치하는 select_list 의 표현식 이름이 전체 결과 집합의 칼럼 이름이 될 것이다. 집합 연산자에 대한 자세한 설명은 5장 집한 연산자를 참고한다. ORDER BY 절 검색된 레코드들을 정렬하는 절이다. 결과 집합은 오름차순 또는 내림차순으로 정렬 가능하다. 기본으로 오름차순 정렬된다. ORDER BY 절 없이 같은 질의를 반복해서 수행할 때, 결과 집합이 일관되게 정렬된다는 보장이 없다. ORDER BY 절은 SELECT 문에서 한번만 올 수 있다. 이는 부질의 (subquery)에서는 사용할 수 없다. ORDER BY 절에 표현식을 명시한 경우에는 표현식 연산의 결과 값에 대해 정렬된다. 표현식은 select_list 또는 FROM 절의 테이블 또는 뷰의 컬럼을 기반으로 작성될 것이다. ORDER BY 절에 상수를 명시한 경우에는 select_list 내에서의 그 위치에 해당하는 검색 대상 198 SQL Reference 값에 대해 정렬 한다. 집합 연산자(UNION, INTERSECT 등)를 사용한 경우, 위치(position) 또는 검색 대상의 별명만 ORDER BY 절에 사용 가능하다. GROUP BY가 존재할 경우 그룹 표현식만 사용 가능하다. ORDER BY 절에 다수의 표현식도 올 수 있다. 결과 집합은 먼저 첫 번째 표현식의 값을 기준으로 정렬되고, 첫번째 표현식의 값이 같은 레코드들은 두번째 표현식의 값을 기준으로 정렬되며, 같은 방식으로 이 후 표현식에 대해서도 정렬된다. 오름차순의 인덱스가 정렬 기준 칼럼에 존재한다면, 오름차순으로 정렬할 때는 다른 모든 것들의 뒤에, 그리고 내림차순으로 정렬할 때는 다른 다른 것들의 앞에, NULL 이 정렬된다. 내림차순의 인덱스가 정렬 기준 칼럼에 존재한다면, 오름차순으로 정렬할 때는 다른 모든 것들의 앞에, 그리고 내림차순으로 정렬할 때는 다른 다른 것들의 뒤에, NULL 이 정렬된다. 인덱스가 정렬 기준 칼럼에 존재하지 않는다면, 정렬 순서에 상관없이 NULL은 다른 모든 것들의 뒤에 나타난다. 검색 대상에 DISTINCT를 사용하면, ORDER BY 절에는 SELECT 리스트내의 표현식 또는 이들 표현식의 조합만 올 수 있다. GROUP BY 절이 있다면, 다음의 표현식이 ORDER BY 절에 올 수 있다. 상수 집계 함수 (aggregate functions) GROUP BY 절의 표현식 위의 조합으로 이루어진 표현식 LIMIT 절 LIMIT 절은 반환되는 행의 개수를 제한하기 위해 사용된다. row_offset: 반환할 첫번째 레코드를 지정한다. 생략하면 전체 결과 집합의 첫번째 레코드부터 반환될 것이다. row_count: 반환할 레코드의 개수를 지정한다. 부질의에서도 LIMIT절을 사용할 수 있다. FOR UPDATE 절 현재 트랜잭션이 끝날 때 까지 다른 사용자들이 행(row)을 잠그거나 수정할 수 없도록 선택된 행을 잠근다. WAIT 옵션은 테이블의 잠금을 획득하기 위해 얼마나 대기할지를 지정한다. 반면, NOWAIT 옵션은 잠금을 획득할 테이블이 이미 다른 데이터 조작어 199 트랜잭션에 의해 잠금이 걸린 상태라면 기다리지 말 것을 지시한다. FOR UPDATE 절은 최 상위 SELECT 문에서만 사용 가능하다. 즉, 부질의에는 사용할 수 없다. 그러므로 다음과 같은 질의는 사용할 수 없다: select eno from employees where (select eno from departments for update); FOR UPDATE 절은 DISTINCT, GROUP BY절, 집계 함수, 집합 연산자(UNION, INTERSECT 등)와 함께 사용 할 수 없다. HINTS 절 각각의 힌트에 대한 문법과 자세한 설명은 Administrator’s Manual 의 11장 SQL튜닝을 참고하기 바란다. 제약사항 알티베이스는 SQL질의 및 저장프로시저 수행에 있어 다음과 같은 제약을 가진다. 최대 65536개까지의 내부 튜플2만 질의 처리에 사용될 수 있다. FROM절에에 최대 32개 까지의 테이블 또는 뷰를 사용할 수 있다. WHERE, GROUP BY, ORDER BY 같은 연산식이 사용 가능한 절에 최대 32개까지의 테이블 또는 뷰를 사용할 수 있다. 위와 같은 제약을 위배하게 되면 다음과 같은 에러가 발생하게 된다. qpERR_ABORT_QTC_TUPLE_SHORTAGE : There are too many DML statements in the stored procedure, or the SQL query is too long. qpERR_ABORT_QTC_TOO_MANY_TABLES : Too many tables are referenced in a phrase. 예제 단순 조회 <질의>모든 사원의 이름, 고용일, 월급을 검색하라. 2 내부 튜플(internal tuple)은 알티베이스가 질의 처리를 위해 할당하는 메모리의 단위이다 200 SQL Reference xdbiSQL> SELECT e_firstname, e_lastname, join_date, salary FROM employees; E_FIRSTNAME E_LASTNAME JOIN_DATE SALARY ----------------------------------------------------------- ------------ Chan-seung Moon Susan Davenport 18-NOV-2009 1500 Ken Kobain 11-JAN-2010 2000 . . . 20 rows selected. 파티션을 사용한 조회 CREATE TABLE T1 (I1 INTEGER) PARTITION BY RANGE (I1) ( PARTITION P1 VALUES LESS THAN (100), PARTITION P2 VALUES LESS THAN (200), PARTITION P3 VALUES DEFAULT ) TABLESPACE SYS_TBS_MEM_DATA; INSERT INTO T1 VALUES (55); INSERT INTO T1 VALUES (123); SELECT * FROM T1 PARTITION (P1); I1 ---------- 55 SELECT * FROM T1 PARTITION (P2); I1 ---------- 123 SELECT * FROM T1 PARTITION (P3); No rows selected. 검색 조건 사용 <질의> 월급이 100만원 이하인 직원의 이름, 업무, 입사일, 월급을 월급 순서로 정렬하라. xdbiSQL> SELECT e_firstname, e_lastname, emp_job, salary FROM employees WHERE salary < 1500 ORDER BY 4 DESC; E_FIRSTNAME E_LASTNAME EMP_JOB SALARY ----------------------------------------------------------- ------------- Takahiro Fubuki PM 1400 Curtis Diaz planner 1200 Jason Davenport webmaster 1000 Mitch Jones PM 980 Gottlieb Fleischer manager 500 5 rows selected. Hierachical query 사용 검색 <질의> id 열의 값이 0인 행을 루트로 하는 행들을 얻기 위한 계층적 데이터 조작어 201 질의문은 다음과 같다. xdbiSQL> CREATE TABLE hier_order(id INTEGER, parent INTEGER); Create success. xdbiSQL> INSERT INTO hier_order VALUES(0, NULL); 1 row inserted. xdbiSQL> INSERT INTO hier_order VALUES(1, 0); 1 row inserted. xdbiSQL> INSERT INTO hier_order VALUES(2, 1); 1 row inserted. xdbiSQL> INSERT INTO hier_order VALUES(3, 1); 1 row inserted. xdbiSQL> INSERT INTO hier_order VALUES(4, 1); 1 row inserted. xdbiSQL> INSERT INTO hier_order VALUES(5, 0); 1 row inserted. xdbiSQL> INSERT INTO hier_order VALUES(6, 0); 1 row inserted. xdbiSQL> INSERT INTO hier_order VALUES(7, 6); 1 row inserted. xdbiSQL> INSERT INTO hier_order VALUES(8, 7); 1 row inserted. xdbiSQL> INSERT INTO hier_order VALUES(9, 7); 1 row inserted. xdbiSQL> INSERT INTO hier_order VALUES(10, 6); 1 row inserted. xdbiSQL> SELECT ID, parent, LEVEL FROM hier_order START WITH id = 0 CONNECT BY PRIOR id = parent ORDER BY level; ID PARENT LEVEL ------------------------------------------------ 0 1 6 0 2 5 0 2 1 0 2 10 6 3 4 1 3 7 6 3 3 1 3 2 1 3 8 7 4 9 7 4 11 rows selected. 202 SQL Reference [그림 3-1] 계층적 구조 데이터 <질의> START WITH 절을 생략하여 테이블 내의 모든 행을 루트 행으로 사용하고 PRIOR id = parent 조건을 만족하는 질의이다. xdbiSQL> SELECT id, parent, level FROM hier_order CONNECT BY PRIOR id = parent ORDER BY id; ID PARENT LEVEL ------------------------------------------------ 0 1 1 0 1 1 0 2 2 1 1 2 1 3 2 1 2 3 1 2 3 1 1 3 1 3 4 1 1 4 1 2 4 1 3 5 0 1 5 0 2 6 0 2 6 0 1 7 6 1 7 6 2 7 6 3 8 7 3 8 7 1 8 7 2 8 7 4 9 7 2 9 7 3 9 7 4 9 7 1 10 6 1 10 6 2 10 6 3 30 rows selected. Level 3 4 2 1 0, NULL 1, 0 5, 0 6, 0 2, 1 3, 1 4, 1 7, 6 10, 6 8, 7 9, 7 루트/부모 부모/자식 자식/리프 부모/자식 자식/리프 자식/리프 자식/리프 자식/리프 자식/리프 자식/리프 부모/자식 데이터 조작어 203 <질의> 다음 계층적 질의문은 순환을 형성하는 행을 제외한 결과 집합을 얻기 위하여 IGNORE LOOP 절을 사용한 예이다. xdbiSQL> CREATE TABLE triple( num INTEGER, tri INTEGER, PRIMARY KEY(num, tri)); Create success. xdbiSQL> CREATE OR REPLACE PROCEDURE proc_tri AS v1 INTEGER; BEGIN FOR v1 IN 1 .. 1000 LOOP INSERT INTO triple VALUES(v1, v1 * 3); END LOOP; INSERT INTO triple VALUES(1, 1); END; / Create success. xdbiSQL> EXEC proc_tri; Execute success. xdbiSQL> SELECT num, tri, level FROM triple WHERE num < 3001 START WITH num = 1 CONNECT BY PRIOR tri = num IGNORE LOOP; NUM TRI LEVEL ------------------------------------------------ 1 1 1 1 3 2 3 9 3 9 27 4 27 81 5 81 243 6 243 729 7 729 2187 8 1 3 1 3 9 2 9 27 3 27 81 4 81 243 5 243 729 6 729 2187 7 15 rows selected. GROUP BY를 이용한 조회 <질의> 부서별 급여 평균을 계산하라. xdbiSQL> SELECT dno, AVG(salary) AS avg_sal FROM employees GROUP BY dno; DNO AVG_SAL --------------------------- 1001 2150 1002 1340 1003 2438.25 2001 1400 3001 1800 3002 2500 4001 1550 4002 1396.66667 1500 9 rows selected. 204 SQL Reference SELECT 목록의 열 중 집계 함수가 사용되지 않은 모든 열은 GROUP BY 절에 있어야 한다. 칼럼에 별명을 주거나, 칼럼 이름과 다른 별명을 사용하고 싶으면 위의 AS avg_sal 처럼 칼럼의 이름 뒤에 사용하고 싶은 별명을 적어주면 된다. 칼럼 별명을 만들 때 AS 키워드는 생략 가능하다. 하이픈 두개 (“--“)가 오면 그 줄의 이후 부분은 모두 주석(comment) 으로 처리된다. <질의> 여러 열에 GROUP BY 절을 사용해서 각 부서내에서 각 직위별로 지급되는 급여 총액을 출력하라. xdbiSQL> SELECT dno, emp_job, COUNT(emp_job) num_emp, SUM(salary) sum_sal FROM employees GROUP BY dno, emp_job; DNO EMP_JOB NUM_EMP SUM_SAL ----------------------------------------------------------- -------- 3002 CEO 1 designer 1 1500 1001 engineer 1 2000 3001 PL 1 1800 3002 PL 1 2500 1002 programmer 1 1700 4002 manager 1 500 4001 manager 1 4001 planner 2 3100 1003 programmer 1 4000 1003 webmaster 2 3750 4002 sales rep 3 3690 1002 PM 1 980 1003 PM 1 2003 1001 manager 1 2300 2001 PM 1 1400 16 rows selected. <질의> 평균 급여가 $1500 USD를 넘는 부서의 평균 급여를 출력하라. xdbiSQL> SELECT dno, AVG(salary) FROM employees WHERE AVG(salary) > 1500 GROUP BY dno; [ERR-31061 : An aggregate function is not allowed here. 0003 : WHERE AVG(SALARY) > 1500000 ^ ^ ] HAVING 절을 사용하여 위의 오류를 수정할 수 있다. xdbiSQL> SELECT dno, AVG(salary) FROM employees GROUP BY dno HAVING AVG(salary) > 1500; DNO AVG(SALARY) --------------------------- 1001 2150 1003 2438.25 3001 1800 3002 2500 4001 1550 데이터 조작어 205 5 rows selected. <질의> 3개 이상 주문된 상품번호와 그 상품들의 총 수를 출력하라. xdbiSQL> SELECT gno, COUNT(*) FROM orders GROUP BY gno HAVING COUNT(*) > 2; GNO COUNT ------------------------------------ A111100002 3 C111100001 4 D111100008 3 E111100012 3 4 rows selected. <질의> 12월 한 달 동안 2개 이상 주문된 상품번호와 그 상품들의 평균 주문양을 평균 주문양 순서대로 출력하라. xdbiSQL> SELECT gno, AVG(qty) month_avg FROM orders WHERE order_date BETWEEN '01-Dec-2000' AND '31-Dec-2000' GROUP BY gno HAVING COUNT(*) > 1 ORDER BY AVG(qty); GNO MONTH_AVG --------------------------- A111100002 35 D111100003 300 D111100004 750 C111100001 1637.5 D111100010 1750 D111100002 1750 E111100012 4233.33333 D111100008 5500 8 rows selected. ORDER BY를 이용한 조회 <질의> 모든 사원의 이름, 부서 번호 및 급여를 부서 번호를 기준으로 정렬한 후 급여를 기준으로 해서 내림차순으로 출력하라. xdbiSQL> SELECT e_firstname, e_lastname, dno, salary FROM employees ORDER BY dno, salary DESC; E_FIRSTNAME E_LASTNAME DNO SALARY ----------------------------------------------------------- -------------- Wei-Wei Chen 1001 2300 Ken Kobain 1001 2000 Ryu Momoi 1002 1700 Mitch Jones 1002 980 Elizabeth Bae 1003 4000 . . . 20 rows selected. <질의> 다음은 모든 사원의 이름 및 급여를 부서 번호를 기준으로 정렬한 후 급여를 기준으로 해서 내림차순으로 출력하는 질의이다. (SELECT 목록에 없는 열을 기준으로 정렬할 수도 있다.) xdbiSQL> SELECT e_firstname, e_lastname, salary FROM employees 206 SQL Reference ORDER BY dno, salary DESC; E_FIRSTNAME E_LASTNAME SALARY ----------------------------------------------------------- - Wei-Wei Chen 2300 Ken Kobain 2000 Ryu Momoi 1700 Mitch Jones 980 Elizabeth Bae 4000 . . . 20 rows selected. 연산자 사용 조회 <질의> 재고 상품의 이름, 각 제품의 재고 값을 출력하라. xdbiSQL> SELECT gname, (stock*price) inventory_value FROM goods; GNAME INVENTORY_VALUE ------------------------------------- IM-300 78000000 IM-310 9800000 NT-H5000 27924000 . . . 30 rows selected. 별명(alias_name)을 사용한 조회 <질의> 부서 위치에 별명(지역명)을 지정하여 검색하라. xdbiSQL> SELECT dname, 'District Name', dep_location location FROM departments; DNAME 'District Name' LOCATION ------------------------------------------------ Applied Technology Team District Name Mapo Engine Development Team District Name Yeoido Marketing Team District Name Gangnam Planning t Team District Name Gangnam Sales Team District Name Shinchon 5 rows selected. LIMIT절을 사용한 조회 <질의> employees테이블에서 사원 이름을 3번째 레코드 부터 5명만 출력하라. xdbiSQL> SELECT e_firstname first_name, e_lastname last_name FROM employees LIMIT 3, 5; FIRST_NAME LAST_NAME ----------------------------------------------- Ken Kobain Aaron Foster Farhad Ghorbani Ryu Momoi Gottlieb Fleischer 5 rows selected. 데이터 조작어 207 <질의> 관리자 테이블에서 첫 번째 레코드에 해당하는 사원의 이름과 급여를 출력하라. xdbiSQL> CREATE TABLE managers( mgr_no INTEGER PRIMARY KEY, m_lastname VARCHAR(20), m_firstname VARCHAR(20), address VARCHAR(60)); Create success. xdbiSQL> INSERT INTO managers VALUES(7, 'Fleischer', 'Gottlieb', '44-25 YouIDo-dong Youngdungpo-gu Seoul Korea'); 1 row inserted. xdbiSQL> INSERT INTO managers VALUES(8, 'Wang', 'Xiong', '3101 N Wabash Ave Brooklyn NY'); 1 row inserted. xdbiSQL> INSERT INTO managers VALUES(12, 'Hammond', 'Sandra', '130 Gongpyeongno Jung-gu Daegu Korea'); 1 row inserted. xdbiSQL> SELECT e_firstname, e_lastname, salary FROM employees WHERE eno = (SELECT mgr_no FROM managers LIMIT 1); E_FIRSTNAME E_LASTNAME SALARY ----------------------------------------------------------- - Gottlieb Fleischer 500 1 row selected. FOR UPDATE를 사용한 조회 Transaction A Time Point Transaction B xdbiSQL> AUTOCOMMIT OFF; Set autocommit off success. xdbiSQL> AUTOCOMMIT OFF; Set autocommit off success. (request X lock on employees) xdbiSQL> LOCK TABLE employees IN EXCLUSIVE MODE; Lock success. (acquire X lock on employees) xdbiSQL> SELECT e_lastname FROM employees WHERE eno = 15; E_LASTNAME ------------------------ Davenport 1 row selected. 1 2 xdbiSQL> SELECT e_lastname FROM employees WHERE eno = 15 FOR UPDATE; (request conflicts with the X lock already held by transaction A) wait 208 SQL Reference wait wait xdbiSQL> UPDATE employees SET ENO = 30 WHERE eno = 15; 1 row updated. xdbiSQL> SELECT e_lastname FROM employees WHERE eno = 30; E_LASTNAME ------------------------ Davenport 1 row selected. 3 xdbiSQL> COMMIT; Commit success. 4 5 (resume) E_LASTNAME ------------------------ No rows selected. HINTS를 사용한 조회 Table Access Method Hints - full scan, index scan, index ascending order scan, index descending order scan, no index scan 다음은 사원들 중 모든 여사원의 번호, 이름, 직업을 검색하는 질의이다. SELECT eno, e_firstname, e_lastname, emp_job FROM employees WHERE sex = 'F'; 예를 들어, 많은 수의 사원들이 있는 사원 테이블의 성별(SEX) 칼럼에 인덱스가 정의되어 있고, 이 칼럼의 값은 ‘M’ 또는 ‘F’이다. 만약, 남자 직원과 여자 직원의 비율이 같다면 full scan으로 전체 테이블을 검색하는 것이 index scan으로 검색하는 것보다 더 빠를 것이다. 그러나, 만약 여자 직원의 비율이 남자 직원보다 상대적으로 적다면, index scan이 전체 테이블의 full scan 보다 빠를 것이다. 즉, 칼럼이 서로 다른 두 개의 값만을 가지고 있을 때, 쿼리 옵티마이저는 각 값의 행들이 50%씩 존재한다고 가정해서 비용 기반 접근 방식으로서 index scan 보다 전체 테이블의 full scan을 선택한다. 아래의 질의들에서 access 회수를 비교해 보면 각각 20과 4인 것을 알수 있다. 데이터 조작어 209 <질의> 성별이 여자인 직원의 사원 번호, 이름, 직업을 출력하라. (full scan 이용) xdbiSQL> SELECT /*+ FULL SCAN(employees) */ eno, e_firstname, e_lastname, emp_job FROM employees WHERE sex = 'F'; ENO E_FIRSTNAME E_LASTNAME EMP_JOB ------------------------------------------------ . . . ------------------------------------------------ PROJECT ( COLUMN_COUNT: 4, TUPLE_SIZE: 65 ) SCAN ( TABLE: EMPLOYEES, FULL SCAN, ACCESS: 20, SELF_ID: 2 ) ------------------------------------------------ <질의> 성별이 여자인 직원의 사원 번호, 이름, 직업을 출력하라. (index 이용) xdbiSQL> CREATE INDEX gender_index ON employees(sex); Create success. xdbiSQL> SELECT /*+ INDEX(employees, gender_INDEX) use gender_index because there are few female employees */ eno, e_firstname, e_lastname, emp_job FROM employees WHERE sex = 'F'; ENO E_FIRSTNAME E_LASTNAME EMP_JOB ------------------------------------------------ . . . ------------------------------------------------ PROJECT ( COLUMN_COUNT: 4, TUPLE_SIZE: 65 ) SCAN ( TABLE: EMPLOYEES, INDEX: GENDER_INDEX, ACCESS: 4, SELF_ID: 2 ) ------------------------------------------------ <질의> 1사분기(1월에서 3월까지) 동안의 모든 주문에 대한 주문번호, 상품번호, 주문량을 출력하라 (index 이용). 각 월에 해당하는 주문 테이블의 이름이 orders_## 라고 가정한다. create view orders as select ono, order_date, eno, cno, gno, qty from orders_01 union all select ono, order_date, eno, cno, gno, qty from orders_02 union all select ono, order_date, eno, cno, gno, qty from orders_03; create index order1_gno on orders_01(gno); create index order2_gno on orders_02(gno); create index order3_gno on orders_03(gno); xdbiSQL> select /*+ index( orders, orders1_gno, orders2_gno,orders3_gno ) */ ONO, GNO, QTY from orders; ONO GNO QTY ------------------------------------------------- . . . ------------------------------------------------ PROJECT ( COLUMN_COUNT: 3, TUPLE_SIZE: 24 ) VIEW ( ORDERS, ACCESS: 14, SELF_ID: 6 ) 210 SQL Reference PROJECT ( COLUMN_COUNT: 6, TUPLE_SIZE: 48 ) VIEW ( ACCESS: 14, SELF_ID: 5 ) BAG-UNION PROJECT ( COLUMN_COUNT: 6, TUPLE_SIZE: 48 ) SCAN ( TABLE: ORDERS_01, INDEX: ORDERS1_GNO, ACCESS: , SELF_ID: 0 ) PROJECT ( COLUMN_COUNT: 6, TUPLE_SIZE: 48 ) SCAN ( TABLE: ORDERS_02, INDEX: ORDERS2_GNO, ACCESS: 4, SELF_ID: 1 ) PROJECT ( COLUMN_COUNT: 6, TUPLE_SIZE: 48 ) SCAN ( TABLE: ORDERS_03, INDEX: ORDERS3_GNO, ACCESS: 7, SELF_ID: 4 ) ------------------------------------------------ Join Order Hints (ordered, optimized) <질의> 주문된 상품을 담당하고 있는 직원의 사원번호, 이름과 해당 고객의 이름을 출력하라. (employees 테이블과 customers 테이블을 조인하고, 그 결과를 orders 테이블과 조인하기 위해 ORDERED 힌트를 사용하라.) xdbiSQL> SELECT /*+ ORDERED */ DISTINCT o.eno, e.e_lastname, c.c_lastname FROM employees e, customers c, orders o WHERE e.eno = o.eno AND o.cno = c.cno; ENO E_LASTNAME C_LASTNAME ------------------------------------------------ . . . ------------------------------------------------ PROJECT ( COLUMN_COUNT: 3, TUPLE_SIZE: 48 ) DISTINCT ( ITEM_SIZE: 40, ITEM_COUNT: 21, BUCKET_COUNT: 1024, ACCESS: 21, SELF_ID: 4, REF_ID: 3 ) JOIN JOIN SCAN ( TABLE: EMPLOYEES E, FULL SCAN, ACCESS: 20, SELF_ID: 1 ) SCAN ( TABLE: CUSTOMERS C, FULL SCAN, ACCESS: 400, SELF_ID: 2 ) SCAN ( TABLE: ORDERS O, FULL SCAN, ACCESS: 12000, SELF_ID: 3 ) ------------------------------------------------ <질의> 주문된 상품을 담당하고 있는 직원의 사원번호, 이름과 해당 고객의 이름을 출력하라. (FROM 절의 테이블들의 순서에 상관없이 옵티마이저에 의해서 테이블 조인 순서가 결정되도록 하라.) xdbiSQL> SELECT DISTINCT o.eno, e.e_lastname, c.c_lastname FROM employees e, customers c, orders o WHERE e.eno = o.eno AND o.cno = c.cno; ENO E_LASTNAME C_LASTNAME ------------------------------------------------ . . . ------------------------------------------------ PROJECT ( COLUMN_COUNT: 3, TUPLE_SIZE: 48 ) DISTINCT ( ITEM_SIZE: 40, ITEM_COUNT: 21, BUCKET_COUNT: 1024, ACCESS: 21, SELF_ID: 4, REF_ID: 1 ) JOIN JOIN SCAN ( TABLE: CUSTOMERS C, FULL SCAN, ACCESS: 20, SELF_ID: 2 ) 데이터 조작어 211 SCAN ( TABLE: ORDERS O, INDEX: ODR_IDX2, ACCESS: 30, SELF_ID: 3 ) SCAN ( TABLE: EMPLOYEES E, INDEX: __SYS_IDX_ID_366, ACCESS: 30, SELF_ID: 1 ) ------------------------------------------------ Optimizer Mode Hints (rule, cost) xdbiSQL> SELECT /*+ RULE */ * FROM t1, t2 WHERE t1.i1 = t2.i1; xdbiSQL> SELECT /*+ COST */ * FROM t1, t2 WHERE t1.i1 = t2.i1; Normal Form Hints (CNF, DNF) xdbiSQL> SELECT /*+ CNF */ * FROM t1 WHERE i1 = 1 OR i1 = 2; xdbiSQL> SELECT /*+ DNF */ * FROM t1 WHERE i1 = 1 OR i1 = 2; Join Method Hints (nested loop, hash, sort, sort merge) xdbiSQL> SELECT /*+ USE_NL (t1,t2) */ * FROM t1, t2 WHERE t1.i1 = t2.i1; xdbiSQL> SELECT /*+ USE_HASH (t1,t2) */ * FROM t1, t2 WHERE t1.i1 = t2.i1; xdbiSQL> SELECT /*+ USE_SORT (t1,t2) */ * FROM t1, t2 WHERE t1.i1 = t2.i1; xdbiSQL> SELECT /*+ USE_MERGE (t1,t2) */ * FROM t1, t2 WHERE t1.i1 = t2.i1; Hash Bucket Size Hints (hash bucket count, group bucket count, set bucket count) xdbiSQL> SELECT /*+ HASH BUCKET COUNT (20) */ DISTINCT * FROM t1; xdbiSQL> SELECT * FROM t1 GROUP BY i1, i2; xdbiSQL> SELECT /*+ GROUP BUCKET COUNT (20) */ * FROM t1 GROUP BY i1, i2; xdbiSQL> SELECT * FROM t1 INTERSECT SELECT * FROM t2; xdbiSQL> SELECT /*+ SET BUCKET COUNT (20) */ * FROM t1 INTERSECT SELECT * FROM t2; Push Predicate Hints <질의> 1사분기(1월에서 3월까지) 동안 발생한 주문 중에서 한번의 주문수량이 10000개이상인 고객의 명단과 상품번호을 구하라.(고객 테이블과 주문 테이블을 조인하기 위해 Push Predicate 힌트를 사용하라.) create view orders as select ono, order_date, eno, cno, gno, qty from orders_01 union all select ono, order_date, eno, cno, gno, qty from orders_02 union all select ono, order_date, eno, cno, gno, qty from orders_03; xdbiSQL> select /*+ PUSH_PRED(orders) */ c_lastname, gno 2 from customers, orders 3 where customers.cno = orders.cno 4 and orders.qty >= 10000; C_LASTNAME GNO ------------------------------------- . . . 212 SQL Reference ------------------------------------------------ PROJECT ( COLUMN_COUNT: 2, TUPLE_SIZE: 34 ) JOIN SCAN ( TABLE: CUSTOMERS, FULL SCAN, ACCESS: 20, SELF_ID: 2 ) FILTER [ FILTER ] AND OR ORDERS.QTY >= 10000 VIEW ( ORDERS, ACCESS: 1, SELF_ID: 8 ) PROJECT ( COLUMN_COUNT: 6, TUPLE_SIZE: 48 ) VIEW ( ACCESS: 1, SELF_ID: 7 ) BAG-UNION PROJECT ( COLUMN_COUNT: 6, TUPLE_SIZE: 48 ) SCAN ( TABLE: ORDERS_01, INDEX: ODR1_IDX2, ACCESS: 3, SELF_ID: 3 ) [ VARIABLE KEY ] OR AND [ FILTER ] AND OR PROJECT ( COLUMN_COUNT: 6, TUPLE_SIZE: 48 ) SCAN ( TABLE: ORDERS_02, INDEX: ODR2_IDX2, ACCESS: 4, SELF_ID: 4 ) [ VARIABLE KEY ] OR AND [ FILTER ] AND OR PROJECT ( COLUMN_COUNT: 6, TUPLE_SIZE: 48 ) SCAN ( TABLE: ORDERS_03, INDEX: ODR3_IDX2, ACCESS: 7, SELF_ID: 6 ) [ VARIABLE KEY ] OR AND [ FILTER ] AND OR ------------------------------------------------ OUTER JOIN을 이용한 조회 <질의> 모든 부서에 대한 부서 번호와 사원 이름을 출력하라. (단, 사원이 전혀 없는 부서 번호 5001도 출력되게 하라.) xdbiSQL> INSERT INTO departments VALUES('5001', 'Quality Assurance', 'Jonglo', 22); 1 row inserted. xdbiSQL> SELECT d.dno, e.e_lastname FROM departments d LEFT OUTER JOIN employees e ON d.dno = e.dno ORDER BY d.dno; DNO E_LASTNAME ------------------------------- . 5001 . <질의> 모든 부서에 대한 부서 번호와 사원 이름을 출력하라. (단, 부서에 소속이 되어 있지 않은 CEO도 출력되게 하라.) xdbiSQL> SELECT d.dno, e.e_lastname 데이터 조작어 213 FROM departments d RIGHT OUTER JOIN employees e ON d.dno = e.dno ORDER BY d.dno; DNO E_LASTNAME ------------------------------- . Davenport . <질의> 부서의 위치와 상품을 모아 놓은 장소가 같은 곳에 해당하는 부서의 부서번호, 부서 이름, 상품 번호를 출력하라. xdbiSQL> INSERT INTO departments VALUES('6002', 'headquarters', 'CE0002', 100); 1 row inserted. xdbiSQL> SELECT d.dno, d.dname, g.gno FROM departments d FULL OUTER JOIN goods g ON d.dep_location = g.goods_location; DNO DNAME GNO ----------------------------------------------------------- - . 6002 headquarters E111100005 . In-line View를 이용한 조회 <질의> 자신이 속한 부서의 평균 급여보다 급여를 많이 받는 모든 사원의 이름, 급여, 부서 번호 및 그 부서의 평균 급여를 출력하라. xdbiSQL> SELECT e.e_last name, e.salary, e.dno, v1.salavg FROM employees e, (SELECT dno, AVG(salary) salavg FROM employees GROUP BY dno) v1 WHERE e.dno = v1.dno AND e.salary > v1.salavg; ENAME SALARY DNO SALAVG ------------------------------------------------ . . . PIVOT 절을 이용한 조회 <질의> 각 부서별 남자와 여자 직원의 수를 구하라. xdbiSQL> SELECT * FROM (SELECT d.dname, e.sex FROM departments d, employees e WHERE d.dno = e.dno) PIVOT (COUNT(*) FOR sex in ('M', 'F')) ORDER BY dname; DNAME 'M' 'F' ----------------------------------------------------------- ----------- BUSINESS DEPT 3 1 CUSTOMERS SUPPORT DEPT 1 0 MARKETING DEPT 3 0 PRESALES DEPT 2 0 QUALITY ASSURANCE DEPT 1 0 RESEARCH DEVELOPMENT DEPT 1 1 1 RESEARCH DEVELOPMENT DEPT 2 2 0 SOLUTION DEVELOPMENT DEPT 3 1 8 rows selected. 214 SQL Reference <질의> 다음 예제는 비교를 위해서 GROUP BY와 ORDER BY 절을 이용한 질의를 보여준다. 같은 정보를 출력하지만, 읽기가 더 힘든 것을 알 수 있다. xdbiSQL> SELECT d.dname, e.sex, count(*) FROM departments d, employees e WHERE d.dno = e.dno GROUP BY d.dname, e.sex ORDER BY d.dname, e.sex DESC; DNAME SEX COUNT ----------------------------------------------------------- --- BUSINESS DEPT M 3 BUSINESS DEPT F 1 CUSTOMERS SUPPORT DEPT M 1 MARKETING DEPT M 3 PRESALES DEPT M 2 QUALITY ASSURANCE DEPT M 1 RESEARCH DEVELOPMENT DEPT 1 M 1 RESEARCH DEVELOPMENT DEPT 1 F 1 RESEARCH DEVELOPMENT DEPT 2 M 2 SOLUTION DEVELOPMENT DEPT M 3 SOLUTION DEVELOPMENT DEPT F 1 11 rows selected. 데이터 조작어 215 UPDATE 구문 update ::= UPDATEtbl_name hints t_alias where_clause update_set_clause; user_name. limit_clause AS PARTITIONpartition_name() update_set_clause ::= SET column_name (column_name)= = subquery expr expr subquery () )( , , , where_clause ::= WHEREcondition limit_clause ::= row_offset, LIMITrow_count 216 SQL Reference hints ::= +/**/ fullscan_hint index_hint noindex_hint indexasc_hint indexdesc_hint plancache_hint fullscan_hint ::= FULLSCAN()tbl_name index_hint ::= INDEXtbl_name( index_name ), noindex_hint ::= INDEXtbl_nameNO)( index_name , indexasc_hint ::= index_name INDEX ASC (tbl_name), indexdesc_hint ::= index_name INDEX DESC (tbl_name), 데이터 조작어 217 전제 조건 SYS 사용자, 테이블 소유자, UPDATE ANY TABLE 시스템 권한을 가진 사용자 및 테이블에 대한 UPDATE 객체 권한을 가진 사용자만이 이 구문으로 해당 테이블의 데이터를 갱신할 수 있다. 설명 조건을 만족하는 레코드를 찾아 명시한 칼럼들의 값을 변경하는 구문이다. 파티션을 명시할 경우 해당 파티션에서 조건을 만족하는 레코드의 칼럼 값을 변경한다. user_name 변경될 레코드가 속한 테이블의 소유자 이름을 명시한다. 생략하면 알티베이스는 테이블이 현재 세션에 연결된 사용자의 스키마에 속한 것으로 간주한다. tbl_name 변경될 레코드가 속한 테이블의 이름을 명시한다. 부질의 (subquery) SET 절에 부질의 사용이 가능하다. 부질의는 하나의 행을 반환해야 한다. SET 절에 단지 한 칼럼만을 명시하면, 부질의는 오로지 하나의 값만을 반환할 수 있다. SET 절에 여러 칼럼들을 명시하면, 부질의의 검색 대상 개수는 명시된 칼럼들의 개수와 동일해야 한다. SET 절에 사용된 부질의의 결과로서 반환되는 행이 없으면 명시된 칼럼은 널 값으로 갱신된다. TIMESTAMP 칼럼의 데이터 수정 TIMESTAMP 칼럼에 대해 UPDATE문 수행 시 기본적으로 칼럼 값이 시스템 시간 값으로 갱신된다. 따라서 TIMESTAMP 칼럼의 데이터 수정 시 값을 명시하지 않으면 널이 아닌 시스템 시간 값으로 변경된다. TIMESTAMP 칼럼의 값을 시스템 시간으로 변경하는 또다른 방법은 칼럼 값에 DEFAULT키워드를 사용하는 것이다. 218 SQL Reference HINTS 옵션 자세한 설명은 DELETE 구문의 HINTS 옵션 절을 참고한다. 주의 사항 SET 절에 같은 칼럼을 두번 이상 사용할 수 없다. 파티션 키 칼럼의 값이 수정되어 그 데이터가 포함된 레코드가 다른 파티션으로 이동해야 할 필요가 있을 경우, 파티션드 테이블이 ENABLE ROW MOVEMENT 옵션을 이용해서 생성되었거나 ALTER TABLE ENABLE ROW MOVEMENT 구문으로 테이블 속성이 변경되었다면 레코드가 자동으로 이동되지만, 그렇지 않을 때에는 에러가 발생한다. 널 제약조건이 있는 칼럼에 널을 삽입하거나 그 칼럼의 값을 널로 변경할 수 없다. 예제 칼럼 데이터 갱신 <질의> 이름이 Davenport인 직원의 월급을 갱신하라. xdbiSQL> UPDATE employees SET salary = 2500 WHERE e_lastname = 'Davenport'; 1 row updated. <질의> 전 직원의 월급을 7% 인상하라. xdbiSQL> UPDATE employees SET salary = salary * 1.07; 20 rows updated. WHERE 절에 부질의를 사용해서 데이터 갱신 <질의> MYLEE 직원이 받은 주문들의 수량을 50개씩 빼라. xdbiSQL> UPDATE orders SET qty = qty - 50 WHERE eno IN( SELECT eno FROM employees WHERE e_lastname ='Hammond'); 9 rows updated. 파티션드 테이블의 데이터 갱신 iSQL> UPDATE T1 PARTITION(P1) SET I1 = 200; 데이터 조작어 219 SET 절에 부질의를 갖는 데이터 갱신 <질의> 다음 예제는 두개의 중첩된 SELECT 부질의를 갖는 UPDATE 문의 구조를 보여준다. xdbiSQL> CREATE TABLE bonuses (eno INTEGER, bonus NUMBER(10, 2) DEFAULT 100, commission NUMBER(10, 2) DEFAULT 50); Create success. xdbiSQL> INSERT INTO bonuses(eno) (SELECT e.eno FROM employees e, orders o WHERE e.eno = o.eno GROUP BY e.eno); 3 rows inserted. xdbiSQL> SELECT * FROM bonuses; BONUSES.ENO BONUSES.BONUS BONUSES.COMMISSION ------------------------------------------------ 12 100 50 19 100 50 20 100 50 3 rows selected. xdbiSQL> UPDATE bonuses SET eno = eno + 100, (bonus, commission) = (SELECT 1.1 * AVG(bonus), 1.5 * AVG(commission) FROM bonuses) WHERE eno IN (SELECT eno FROM orders WHERE qty >= 10000); 1 row updated. xdbiSQL> SELECT * FROM bonuses; BONUSES.ENO BONUSES.BONUS BONUSES.COMMISSION ------------------------------------------------ 12 100 50 20 100 50 119 110 75 3 rows selected. Note: WHERE 절의 부질의 결과가 한 건도 없으면 어떠한 레코드도 영향을 받지 않으나, SET 절의 부질의 결과가 한 건도 없으면 해당 칼럼은 널값으로 갱신될 것이다. xdbiSQL> UPDATE orders SET qty = qty - 50 WHERE eno IN( SELECT eno FROM employees WHERE e_lastname ='Frederick'); No rows updated. xdbiSQL> UPDATE employees SET dno = (SELECT dno FROM departments WHERE dep_location = 'Timbuktu'); 20 rows updated. xdbiSQL> SELECT e_lastname, dno FROM employees WHERE eno = 12; E_LASTNAME DNO ------------------------------- Hammond 1 row selected. 220 SQL Reference MOVE 구문 move ::= MOVE hints INTO column_commalist FROMsource_tbl_name limit_clausewhere_clause expression_commalist user_name. user_name. target_tbl_name ; PARTITIONpartition_name() column_commalist ::= ()column_name , expression_commalist ::= ()expr , limit_clause ::= LIMIT row_offset row_count , 데이터 조작어 221 전제 조건 테이블의 레코드를 이동(MOVE)하기 위해서는 테이블에서 레코드를 삭제할 수 있는 권한과 테이블에 레코드를 삽입할 수 있는 권한이 있어야 한다. 데이터 이동은 삽입과 삭제로 수행되기 때문이다. INTO 절에 명시된 테이블에 레코드를 삽입하기 위해서는 SYS 사용자이거나 테이블의 소유자이거나 INSERT ANY TABLE 시스템 권한을 가진 사용자, 또는 그 테이블에 대한 INSERT 객체 권한을 가진 사용자이어야 한다. FROM 절에 명시된 테이블에서 레코드를 삭제하기 위해서는 SYS 사용자이거나 테이블의 소유자이거나 DELETE ANY TABLE 시스템 권한을 가진 사용자, 또는 그 테이블에 대한 DELETE 객체 권한을 가진 사용자이어야 한다. 설명 한 테이블에서 조건을 만족하는 레코드를 찾아 다른 테이블로 이동하는 구문이다. 또한 특정 파티션에 있는 데이터도 이동이 가능하다. hints FROM절에 대한 힌트를 제공한다. 이는 SELECT구문에서 사용하는 힌트와 동일하다. source_tbl_name, target_tbl_name 데이터 이동에 관련된 테이블(원본 테이블과 대상 테이블)을 명시한다. 여기에는 뷰나 메타 테이블이 올 수 없다. column_commalist 대상 테이블에 속하는 실제 칼럼들의 리스트이다. expression_commalist 쉼표로 구분된 표현식들의 리스트이다. 각 표현식은 FROM 테이블에 속한 칼럼, 상수, 또는 표현식일 수 있다. where_clause SELECT 구문의 WHERE 절과 구조가 동일하다. limit_clause SELECT구문의 LIMIT 절과 구조가 동일하다. 222 SQL Reference 주의 사항 동일한 테이블간의 데이터 이동은 불가능하다. 파티션을 지정할 경우 해당 파티션에 맞지 않는 값은 입력될 수 없다. 예제 <질의> t2테이블의 i1, i2 칼럼으로부터 t2.i2=4조건을 만족하는 모든 레코드를 t1 테이블의 i1, i2 칼럼에 삽입하고 t2 테이블에서 삭제한다. xdbiSQL> MOVE INTO T1(I1, I2) FROM T2(I1, I2) WHERE T2.I2 = 4; <질의> t2테이블의 i1, i2, i3 칼럼으로 이루어진 레코드를 t1 테이블에 삽입하고 t2테이블에서 삭제한다. (테이블t1에는 t2의 i1, i2, i3 칼럼에 대응되는 칼럼이 있어야 하며 칼럼 개수가 서로 동일해야 한다.) xdbiSQL> MOVE INTO T1 FROM T2(I1, I2, I3); 데이터 조작어 223 ENQUEUE 구문 enqueue ::= ENQUEUEINTOqueue_name;()column_name , values_clause values_clause ::= VALUES expr DEFAULT () , 설명 큐에 메시지를 삽입하는 구문이다. ENQUEUE 구문은 INSERT 구문과 유사한 구조를 가지는데 INTO 절 이후에 반드시 하나 이상의 큐 칼럼 명을 명시해야 한다. 일반적인 경우 사용자는 자신이 저장할 메시지만 지정하여 메시지를 입력하는데, 메시지를 구분하거나 분류하여 차별화 할 필요가 있을 때에는 Correlation ID를 명시적으로 지정하여 입력할 수 있다. 예제 <질의> “This is a message”라는 메시지를 Q1메시지 큐에 입력하라. ENQUEUE INTO Q1(message) VALUES ('This is a message'); <질의> “This is a message”라는 메시지를 237이라는 Correlation ID로 Q1메시지 큐에 입력하라. ENQUEUE INTO Q1(message,corrid) VALUES ('This is a message', 237); 224 SQL Reference DEQUEUE 구문 dequeue ::= DEQUEUEqueue_column_listFROMqueue_name where_clause WAITinteger ;fifo_option fifo_option ::= FIFO LIFO 설명 DEQUEUE 구문은 where_clause 절의 조건에 맞는 메시지를 얻어 오고 해당 메시지를 큐에서 삭제한다. fifo_option FIFO 옵션이 설정되어 있거나 아무 옵션도 설정하지 않은 경우에는 조건에 맞는 메시지 중 가장 오래된 메시지를 얻어 오고, LIFO 옵션이 설정된 경우에는 가장 최신의 메시지를 얻어 온다. WAIT integer DEQUEUE 문은 큐에 메시지가 하나도 없을 경우에 큐에 메시지가 들어올 때까지 대기하는데, WAIT 절에 명시한 시간만큼 대기한다. 대기 시간이 설정되지 않은 경우, DEQUEUE 문은 무한정 대기할 것이다. 데이터 조작어 225 주의사항 DEQUEUE 구문의 사용시에 다음과 같은 점에 주의해야 한다. queue_column_list에는 큐 테이블 내의 칼럼명만 지정 가능하다. DEQUEUE문은 SELECT 구문의 일부 특징을 가지고 있지만 DEQUEUE문의 FROM 절에는 단 하나의 큐 테이블 이름만 지정이 가능하다. 두개 이상의 큐 테이블 이름이 오면 에러가 발생한다. DEQUEUE구문의 WHERE 절에는 부질의(Subquey)가 올 수 없다. 예제 <질의> 메시지 큐 Q1에서 Correlation ID가 237인 메시지들을 모두 읽어라. DEQUEUE MESSAGE, CORRID FROM Q1 WHERE CORRID=237; 데이터 제어어 227 4. 데이터 제어어 이장에서는 사용자 세션 제어와 트랜잭션을 제어하는 SQL문에 대해서 설명한다. 228 SQL Reference ALTER SESSION 구문 alter_session::= ;ALTERSESSIONalter_session_set_clause replication_mode_set_clause alter_session_set_clause::= SETproperty_name=property_value replication_mode_set_clause::= SET=REPLICATION DEFAULT NONE 설명 현재 세션(Session)의 속성을 변경하는 구문이다. alter_session_set_clause alter_session_set_clause 절의 property_name과 property_ value에 관한 자세한 내용은 알티베이스 매뉴얼 중 General Reference의 알티베이스 프로퍼티 장을 참조한다. replication_mode_set_clause replication_mode_set_clause는 현재 세션에서 수행하는 트랜잭션을 위한 이중화 모드 속성을 설정하는 절이다. DEFAULT를 명시하면 이중화는 이중화 객체 생성시 기본모드로 채택된 모드로 동작할 것이다. 그러나 NONE을 명시하면 세션에서 데이터 제어어 229 수행되는 모든 DDL, DML, DCL 문이 이중화 대상에서 제외된다. 이중화 모드에 대한 보다 자세한 내용은 Replication Manual을 참조한다. 230 SQL Reference ALTER SYSTEM 구문 alter_system ::= ALTER SET ; START STOP LOG RESET LOGFILE SYSTEM CHECKPOINT MEMORY ARCHIVE SWITCH COMPACT SQL_PLAN_CACHE COMPACT alter_system_set_clause alter_system_set_clause ::= property_nameproperty_value= 설명 알티베이스의 시스템 프로퍼티를 변경하는 구문이다. SYS 사용자 또는 ALTER SYSTEM 권한을 가진 사용자만이 ALTER SYSTEM 문의 모든 기능을 수행할 수 있다. CHECKPOINT 체크포인트를 수행하는 옵션이다. COMPACT 메모리 콤팩션을 수행하는 구문이다. 이 구문은 IBM AIX플랫폼에서만 동작한다. ARCHIVE LOG START/STOP START를 실행하면 아카이브로그 쓰레드가 시작되고, STOP하면 종료된다. 알티베이스가 아카이브로그 모드로 운영중일때만 이 데이터 제어어 231 구문을 실행할 수 있다. 알티베이스가 아카이브로그 모드로 운영중인지 여부는 V$LOG 또는 V$ARCHIVE 성능 뷰에서 확인이 가능하다. 아카이브로그 모드에 대한 자세한 내용은 Administrator’s Manual의 10장 백업 및 복구를 참고한다. SWITCH LOGFILE 로그파일을 강제로 아카이브하는 구문이다. 현재 로그파일이 꽉 차지 않았더라도, 이 구문을 실행하면 알티베이스 XDB는 사용중이던 로그파일을 닫고 다음 로그파일에 로깅을 계속한다. SET alter_system_set_clause 알티베이스 프로퍼티 값을 변경하는 구문이다. 현재 버전의 알티베이스 XDB에서는 이 구문으로 프로퍼티 값을 변경하는 것이 불가능하다. 이 기능은 다음 버전에서 지원될 예정이다. 프로퍼티에 대한 자세한 내용은 General Reference의 알티베이스 프로퍼티를 참조한다. 예제 <질의> 아카이브로그 모드일 경우 아카이브 로그 쓰레드를 시작시킨다. xdbiSQL> ALTER SYSTEM ARCHIVE LOG START; 232 SQL Reference COMMIT 구문 commit::= COMMIT; FORCEglobal_tx_id 설명 현재의 트랜잭션을 데이터베이스에 명시적으로 커밋하는 구문이다. AUTOCOMMIT 모드가 FALSE일때 사용할 수 있다. FORCE global_tx_id XA환경에서 트랜잭션이 in-doubt 상태가 될 경우에 이를 강제로 커밋하는 구문이다. global_tx_id는 글로벌 트랜잭션의 포맷(format) 아이디, 글로벌 트랜잭션(global transaction) 아이디, 브랜치 수식자(branch qualifier)를 문자열로 나타낸 것이다. 주의 사항 AUTOCOMMIT 모드 시에 이 문장을 수행할 수 없다. 예제 다음 구문은 트랜잭션이 이전에 수행한 모든 명령들을 데이터베이스에 반영한다.. xdbiSQL> COMMIT; Commit success. 데이터 제어어 233 SAVEPOINT 구문 savepoint::= SAVEPOINTsavepoint_name; 설명 저장점을 생성하는 구문이다. 저장점의 생성은 지금까지 실행된 트랜잭션 처리의 결과를 임시로 저장하는 것을 의미한다. 즉, 저장점은 트랜잭션 내에서 롤백할 지점을 명시적으로 지정한 것이다. 저장점은 AUTOCOMMIT 모드가 FALSE 일 때 유효하다. 주의 사항 자동반영(AUTOCOMMIT) 모드 일때 사용할 수 없다. 예제 xdbiSQL> AUTOCOMMIT OFF; Set autocommit off success. xdbiSQL> CREATE TABLE savept(num INTEGER); Create success. xdbiSQL> INSERT INTO savept VALUES(1); 1 row inserted. xdbiSQL> SAVEPOINT sp1; Savepoint success. xdbiSQL> INSERT INTO savept VALUES(2); 1 row inserted. xdbiSQL> SELECT * FROM savept; SAVEPT.NUM -------------- 1 2 2 rows selected. 저장점 sp1 지점까지 트랜잭션을 롤백한다. xdbiSQL> ROLLBACK TO SAVEPOINT sp1; Rollback success. xdbiSQL> SELECT * FROM savept; SAVEPT.NUM -------------- 234 SQL Reference 1 1 row selected. xdbiSQL> COMMIT; Commit success. 데이터 제어어 235 ROLLBACK 구문 rollback ::= ROLLBACK TOSAVEPOINTsavepoint_name ; FORCEglobal_tx_id 설명 ROLLBACK (TO SAVEPOINT) 현재의 트랜잭션을 모두 롤백하거나 (이전에 정의한) 저장점까지 부분 롤백하는 구문이다. FORCE global_tx_id XA환경에서 “in-doubt”상태의 트랜잭션을 강제로 롤백하는 구문이다. global_tx_id는 글로벌 트랜잭션의 포맷(format) 아이디, 글로벌 트랜잭션(global transaction) 아이디, 브랜치 수식자(branch qualifier)를 문자열로 나타낸 것이다. 주의 사항 이 구문은 AUTOCOMMIT 모드일 때는 사용할 수 없다. 예제 xdbiSQL> AUTOCOMMIT OFF; Set autocommit off success. xdbiSQL> UPDATE employees SET salary = 2300 WHERE eno = 3; 1 row updated. xdbiSQL> SAVEPOINT emp3_sal; Savepoint success. xdbiSQL> DELETE FROM employees WHERE eno = 19; 1 row deleted. xdbiSQL> SAVEPOINT emp19_ret; Savepoint success. 236 SQL Reference xdbiSQL> INSERT INTO employees(eno, e_lastname, e_firstname, salary, sex) VALUES(21, 'Templeton', 'Kimmie', 3000, 'F'); 1 row inserted. xdbiSQL> SAVEPOINT emp21_join; Savepoint success. xdbiSQL> UPDATE employees SET salary = 2200 WHERE eno=18; 1 row updated. xdbiSQL> SELECT eno, e_lastname, e_firstname, salary FROM employees WHERE eno in (3, 18, 19, 21); ENO E_LASTNAME E_FIRSTNAME SALARY ----------------------------------------------------------- -------------- 3 Kobain Ken 2300 18 Huxley John 2200 21 Templeton Kimmie 3000 3 rows selected. 저장점 emp21_join 지점까지 트랜잭션을 롤백한다. xdbiSQL> ROLLBACK TO SAVEPOINT emp21_join; Rollback success. xdbiSQL> SELECT eno, e_lastname, e_firstname, salary FROM employees WHERE eno in (3, 18, 19, 21); ENO E_LASTNAME E_FIRSTNAME SALARY ----------------------------------------------------------- -------------- 3 Kobain Ken 2300 18 Huxley John 1900 21 Templeton Kimmie 3000 3 rows selected. 저장점 emp19_ret 지점까지 트랜잭션을 롤백한다. xdbiSQL> ROLLBACK TO SAVEPOINT emp19_ret; Rollback success. xdbiSQL> SELECT eno, e_lastname, e_firstname, salary FROM employees WHERE eno in (3, 18, 19, 21); ENO E_LASTNAME E_FIRSTNAME SALARY ----------------------------------------------------------- -------------- 3 Kobain Ken 2300 18 Huxley John 1900 2 rows selected. 첫 번째 UPDATE 문, 첫번째 DELETE문과 마지막 DML문 (두 번째 INSERT문)에 의해 수행된 모든 변경을 커밋한다. 모든 다른 DML 문들의 변경사항은 COMMIT 되기 전에 롤백되어 사라졌다. 또한 저장점 emp21_join은 더 이상 유효하지 않다. xdbiSQL> ROLLBACK TO SAVEPOINT emp21_join; [ERR-11016 : Savepoint not found] xdbiSQL> INSERT INTO employees(eno, e_lastname, e_firstname, sex, join_date) VALUES(22, 'Chow', 'May', 'F', TO_DATE('2011-11-19 00:00:00', 'YYYY-MM-DD HH:MI:SS')); 1 row inserted. xdbiSQL> COMMIT; Commit success. xdbiSQL> SELECT eno, e_lastname, e_firstname, salary FROM employees; ENO E_LASTNAME E_FIRSTNAME SALARY ----------------------------------------------------------- -------------- 1 Moon Chan-seung 2 Davenport Susan 1500 4 Foster Aaron 1800 5 Ghorbani Farhad 2500 데이터 제어어 237 6 Momoi Ryu 1700 7 Fleischer Gottlieb 500 8 Wang Xiong 9 Diaz Curtis 1200 10 Bae Elizabeth 4000 11 Liu Zhen 2750 12 Hammond Sandra 1890 13 Jones Mitch 980 14 Miura Yuu 2003 15 Davenport Jason 1000 16 Chen Wei-Wei 2300 17 Fubuki Takahiro 1400 18 Huxley John 1900 20 Blake William 3 Kobain Ken 2300 22 Chow May 0 20 rows selected. xdbiSQL> COMMIT; Commit success. 238 SQL Reference SET TRANSACTION 구문 set_transaction ::= ; READONLY READWRITE ISOLATIONLEVEL READCOMMITTED REPEATABLEREAD SERIALIZABLE TRANSACTIONSET 설명 현재 트랜잭션을 read only, read/write 또는 고립화 수준(isolation level)을 설정하기 위해 SET TRANSACTION 구문을 사용할 수 있다. 고립화 수준을 READ COMMITTED 또는 SERIALIZABLE 로 설정하면 행 수준 잠금과 다중버전 제어기법의 조합을 통하여 높은 수준의 데이터 일관성, 동시성 그리고 성능을 제공한다. SET TRANSACTION 구문에 의해 수행된 동작들은 다른 사용자들이나 다른 트랜잭션이 아닌 오로지 현재 트랜잭션에만 영향을 미친다. 다음과 같은 3개의 고립화 수준 중 하나를 설정할 수 있다. READ COMMITTED 테이블 내의 커밋된 데이터에 대해 읽기를 허용하며, 커밋되지 않은 데이터에 대해서는 이전 버전의 값을 읽도록 동작한다. 알티베이스의 기본 고립화 수준은 READ COMMITTED이다. REPEATABLE READ 트랜잭션이 읽어간 데이터에 대해 그 트랜잭션이 완료될 때까지 데이터 제어어 239 잠금을 걸어서, 해당 데이터에 대한 다른 트랜잭션의 변경을 금지한다. 이러한 동작은 반복적으로 그 값을 다시 읽었을 때도 항상 같은 값이 반환될 것을 보장한다. 그러나 잠금이 걸려 있는 상태에서도 읽어간 검색 범위안에 포함되는 새로운 레코드를 다른 트랜잭션이 삽입하는 것은 가능하다. 이러한 레코드는 잠금을 걸고 있는 읽기 트랜잭션에 의한 최초 조회시에는 보이지 않았지만 삽입 이후에는 보일 것이다. 이를 “Phantom Reads”라고 한다. SERIALIZABLE 이는 가장 높은 고립화 수준이다. 이는 한번 SELECT하여 가져간 모든 데이터에 공유잠금을 걸뿐만 아니라, 그 검색 범위안에 있는 모든 키 값에 대해서도 잠금을 걸게 된다. 이는 “phantom reads”를 방지하는 효과를 내어 트랜잭션의 독립성(isolation)을 보장한다. 주의 사항 현재 세션이 AUTOCOMMIT 모드일 경우에는 이 구문을 사용할 수 없다. 활성화된 트랜잭션이 있을 경우에는 이 구문을 사용할 수 없다. 예제 xdbiSQL> AUTOCOMMIT OFF; Set autocommit off success. xdbiSQL> SET TRANSACTION ISOLATION LEVEL READ COMMITTED; Command execute success. xdbiSQL> SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; Command execute success. Transaction A Time Point Transaction B xdbiSQL> AUTOCOMMIT OFF; Set autocommit off success. xdbiSQL> AUTOCOMMIT OFF; Set autocommit off success. xdbiSQL> SET TRANSACTION READ ONLY; Command execute success. 1 240 SQL Reference xdbiSQL> SELECT e_last name FROM employees WHERE eno = 20; E_LASTNAME ------------------------ Blake 1 row selected. 2 3 xdbiSQL> UPDATE employees SET e_lastname = 'Jung' WHERE eno = 20; 1 row updated. xdbiSQL> SELECT e_lastname FROM employees WHERE eno = 20; E_LASTNAME ------------------------ Blake 1 row selected. 4 5 xdbiSQL> commit; Commit success. xdbiSQL> SELECT e_lastname FROM employees WHERE eno = 20; E_LASTNAME ------------------------ Jung 1 row selected. 6 집합 연산자 241 5. 집합 연산자 이 장에서는 SQL 질의 실행 결과 집합을 대상으로 연산하는 집합 연산자들에 대해서 설명한다. 242 SQL Reference UNION 구문 SELECT statement1 UNION SELECT statement2 설명 두 질의문의 결과를 모두 반환하는 연산자이다. 단, 양쪽 질의의 결과에 동일한 값이 있을 경우 한건만 반환된다. 예제 <질의> 생일이 1980년 이후인 사원과 100개 미만의 주문량을 받은 사원의 사원번호를 출력하라. 중복된 사원번호는 한번만 출력되게 하라. xdbiSQL> SELECT eno FROM employees WHERE birth > '800101' UNION SELECT eno FROM orders WHERE qty < 100; ENO -------------- 4 7 8 12 13 15 20 7 rows selected. 집합 연산자 243 UNION ALL 구문 SELECT statement1 UNION ALL SELECT statement2 설명 두 질의문의 결과를 모두 반환하는 연산자이다. 양쪽 질의의 결과에 동일한 값이 있을 경우에 중복된 값이 모두 반환된다. 예제 <질의> 생일이 1980년 이후인 사원과 100개 미만의 주문량을 받은 사원의 사원번호를 출력하라. 중복된 사원번호도 모두 출력되게 하라. xdbiSQL> SELECT eno FROM employees WHERE birth > '800101' UNION ALL SELECT eno FROM orders WHERE qty < 100; ENO -------------- 4 7 8 12 13 15 12 20 20 9 rows selected. 244 SQL Reference INTERSECT 구문 SELECT statement1 INTERSECT SELECT statement2 설명 두 질의문의 결과 중 공통된 행을 반환하는 연산자이다. 예제 <질의> 한번이라도 주문된 적이 있는 상품을 모두 출력하라. xdbiSQL> SELECT gno FROM goods INTERSECT SELECT gno FROM orders; GNO -------------- . . . 집합 연산자 245 MINUS 구문 SELECT statement1 MINUS SELECT statement2 설명 첫번째 검색 결과에서 두 번째 검색 결과를 제외한 결과를 반환하는 연산자이다. 예제 <질의> 한번도 주문된 적이 없는 상품들의 제품번호를 출력하라. xdbiSQL> SELECT gno FROM goods MINUS SELECT gno FROM orders; GNO -------------- . . . 246 SQL Reference 연산 순서 연산의 순서 즉, 연산자 우선 순위는 데이터베이스 서버가 수식 내의 연산자들을 처리하는 순서이다. 다수의 연산자를 포함하는 수식이 처리될 때, 높은 우선순위의 연산자가 낮은 우선순위의 연산자보다 먼저 처리된다. 같은 우선순위를 갖는 연산자는 수식 내에서 나열된 순서 즉, 왼쪽에서 오른쪽으로 처리된다. 설명 SQL 연산자의 연산 우선순위를 내림차순으로 다음 표에 보여주고 있다. 수식 내에 괄호를 사용하여 우선순위 규칙보다 우선 적용되게 할수 있다. 우선순위 레벨 연산자 1 모든 비교 연산자 2 NOT 3 AND 4 OR 예제 <질의> 월급이 1850 달러를 넘는 엔지니어의 이름, 직위, 급여와 급여에 상관없이 모든 영업 사원의 이름, 직위, 급여를 출력하라. xdbiSQL> SELECT e_firstname, e_lastname, emp_job, salary FROM employees WHERE emp_job = 'sales rep' OR emp_job = 'engineer' AND salary >= 1850; E_FIRSTNAME E_LASTNAME EMP_JOB SALARY ----------------------------------------------------------- ------------------- Ken Kobain engineer 2000 Sandra Hammond sales rep 1890 Alvar Marquez sales rep 1800 William Blake sales rep 4 rows selected. <질의> 월급이 1850 달러를 넘는 엔지니어의 이름, 직위, 급여와 월급이 1850 달러를 넘는 영업 사원의 이름, 직위, 급여를 출력하라. xdbiSQL> SELECT e_firstname, e_lastname, emp_job, salary FROM employees WHERE (emp_job = 'sales rep' OR emp_job = 'engineer') AND salary >= 1850; 집합 연산자 247 E_FIRSTNAME E_LASTNAME EMP_JOB SALARY ----------------------------------------------------------- ------------------- Ken Kobain engineer 2000 Sandra Hammond sales rep 1890 2 rows selected. SQL 함수 249 6. SQL 함수 250 SQL Reference SQL 함수 소개 알티베이스에 내장되어 제공되는 SQL 함수들은 다양한 SQL 구문 내에서 사용할 수 있다. 내장된 SQL 함수 외에 사용자가 저장 함수를 정의하는 것도 가능하다. 이에 대해서는 Stored Procedures Manual을 참고하기 바란다. SQL 함수 호출 시 정의된 데이터 타입이 아닌 다른 데이터 타입의 인자를 입력할 경우, 알티베이스는 SQL 함수 수행 전에 인자로 넘어온 데이터를 SQL함수에 정의된 데이터 타입으로 변환한다. SQL 함수 호출 시 NULL 인자를 넘기면, SQL 함수는 NULL을 반환한다. 이 절은 알티베이스 XDB가 제공하는 SQL 함수의 목록을 보여주고, 그들이 어떻게 분류되는지를 설명한다. SQL 함수 분류 SQL 함수는 크게 다음의 표처럼 분류된다. 함수 구분 설명 집계 함수 (aggregate functions) 질의의 결과를 그룹별로 하나의 결과를 반환하는 함수이다. 이 함수는 select_list, ORDER BY, HAVING 절에 올 수 있다. 집계 함수에는 AVG, COUNT, MAX, MIN, STDDEV, SUM, VARIANGE가 있다. 분석 함수 (analytic functions) 알티베이스 XDB는 두 종류의 분석 함수, 즉 분석 집계 함수와 분석 랭킹 함수를 제공한다. 위에 나열한 모든 집계 함수는 분석 함수 용도로 사용이 가능하다. 이들은 분석 집계 함수 또는 분석 랭킹 함수의 형태로 올 수 있다. 또한 알티베이스 XDB는 RANK, DENSE_RANK, ROW_NUMBER 분석 함수도 제공한다. 이들은 분석 랭킹 함수의 형태로만 올 수 있다. 숫자 함수 숫자 입력 값에 대한 작업을 수행하고 숫자 값을 반환한다.. ABS, ACOS, ASIN, ATAN, ATAN2, CEIL, COS, COSH, EXP, FLOOR, LN, LOG, MOD, POWER, RANDOM, ROUND, SIGN, SIN, SINH, SQRT, TAN, TANH, TRUNC, BITAND, BITOR, BITXOR, BITNOT 문자 함수 문자열 입력 값에 대한 작업을 수행하고 문자열이나 숫자 값을 반환한다. SQL 함수 251 문자열 반환 함수 CHR, CONCAT, DIGITS, INITCAP, LOWER, LPAD, LTRIM, NCHR, REPLICATE, REPLACE2, REVERSE_STR, RPAD, RTRIM, STUFF, SUBSTRB(SUBSTRING), TRANSLATE, TRIM, UPPER 숫자 값 반환 함수 ASCII, CHAR_LENGTH(CHARACTER_LENGTH,LENGTH), DIGEST,INSTR(POSITION, INSTRB), OCTET_LENGTH(LENGTHB), SIZEOF 날짜 함수 날짜 및 시간 입력 값에 대한 작업을 수행하며 문자열, 숫자 또는 날짜/시간 값을 반환한다. ADD_MONTHS, DATEADD, DATEDIFF, DATENAME, EXTRACT(DATEPART), LAST_DAY, MONTHS_BETWEEN, NEXT_DAY, SYSDATE, SYSTIMESTAMP 변환 함수 입력 값(문자, 숫자 또는 날짜/시간)에 대해 문자, 날짜/시간, 또는 숫자 값으로 변환한다. ASCIISTR, BIN_TO_NUM, CONVERT, HEX_TO_NUM, OCT_TO_NUM, TO_BIN, TO_CHAR(datetime), TO_CHAR(number), TO_DATE, TO_HEX, TO_NCHAR(character), TO_NCHAR(datetime), TO_NCHAR(number), TO_NUMBER, TO_OCT, UNISTR 암호화 함수 문자열에 대해 DES 암호화와 복호화를 수행한다. DESENCRYPT, DESDECRYPT 기타 함수 BINARY_LENGTH, CASE2, DECODE, DUMP, GREATEST, LEAST, NVL, NVL2 등 252 SQL Reference 집계 함수 여러 행에 대해 처리하여 단일 값을 반환하는 함수이다. 집계 함수는 SELECT 목록이나 ORDER BY 또는 HAVING 절 안에 나타날 수 있다. SELECT 문에 GROUP BY 절이 포함되었다면 상수, 집계 함수(aggregate functions), GROUP BY 절에 명시된 표현식과 이들을 조합한 표현식만 SELECT 목록에 올 수 있다. AVG 구문 AVG ( [ALL | DISTINCT] expression) 설명 입력된 expression의 평균값을 구하는 함수이다. NULL은 계산에서 제외된다. 이 함수는 FLOAT 타입의 값을 반환한다. 예제 <질의> 상품 테이블에서 평균 가격을 계산하여 출력하라. xdbiSQL> SELECT AVG(price) FROM goods; AVG(PRICE) -------------- 30406.173 1 row selected. COUNT 구문 COUNT ( [ * | [ALL | DISTINCT] expression ] ) 설명 질의에 의해 검색되는 행의 수를 반환하는 함수이다. 칼럼의 값이 널인 행은 계산 되지 않는다. SQL 함수 253 예제 <질의> 사원 테이블의 전체 레코드의 개수를 출력하라. xdbiSQL> SELECT COUNT(*) Rec_count FROM employees; REC_COUNT ----------------------- 20 1 row selected. <질의> 사원 테이블 생일 자료의 개수를 출력하라. xdbiSQL> SELECT COUNT(birth) Rec_count FROM employees; REC_COUNT ----------------------- 13 1 row selected. MAX 구문 MAX ([ALL | DISTINCT] expression) 설명 입력된 expression중에서 최대값을 구하는 함수이다. 예제 <질의> 상품 테이블에서 가장 비싼 가격을 출력하라. xdbiSQL> SELECT MAX(price) FROM goods; MAX(PRICE) -------------- 100000 1 row selected. MIN 구문 MIN ([ALL | DISTINCT] expression) 설명 입력된 expression중에서 최소값을 구하는 함수이다. 254 SQL Reference 예제 <질의> 상품 테이블의 가장 싼 가격을 출력하라. xdbiSQL> SELECT MIN(price) FROM goods; MIN(PRICE) -------------- 966.99 1 row selected. STDDEV 구문 STDDEV ([ALL | DISTINCT] expression) 설명 STDDEV는 입력된 expression 들의 표준편차를 반환한다. 시스템 호출에 의한 반복적인 실수 연산의 오차 누적에 따라 반환 값의 오차가 발생할 수 있다. 예제 <질의> 직원 테이블에서 급여의 표준편차를 구하라. xdbiSQL> SELECT STDDEV(salary) standard_deviation FROM employees; STANDARD_DEVIATION ------------------------- 797.706786762566 1 row selected. SUM 구문 SUM ([ALL | DISTINCT] expression) 설명 입력된 expression의 합을 구하는 함수이다. 예제 <질의> 상품 테이블에서 모든 보관 수량의 합을 구하라. xdbiSQL> SELECT SUM(stock) FROM goods; SQL 함수 255 SUM(STOCK) ----------------------- 379420 1 row selected. VARIANCE 구문 VARIANCE ([ALL | DISTINCT] expression) 설명 VARIANCE는 입력된 expression들의 변동량을 반환한다. 시스템 호출에 의한 반복적인 실수 연산의 오차 누적에 따라 반환 값의 오차가 발생할 수 있다. 예제 <질의> 직원 테이블에서 급여의 변동량을 구하라. xdbiSQL> SELECT VARIANCE(salary) variance FROM employees; VARIANCE ------------------------- 636336.117647059 256 SQL Reference 분석 함수 분석 함수는 OVER 절을 가진다는 점에서 집계 함수 (aggregate functions)와 다르다. OVER절은 PARTITION BY 식을 포함할 수도, 하지 않을 수도 있다. 분석 함수는 OVER 절이 ORDER BY 식 (주질의에 포함된 ORDER BY절과 구분하기 위해 식이라 칭함)을 포함하는지 여부에 따라 분석 집계 함수와 랭킹 함수로 분류된다. 현재, 알티베이스 XDB는 분석 집계 함수 형태의 분석 함수만 제공한다. 모든 집계 함수 (AVG, COUNT, MAX, MIN, STDDEV, SUM 및VARIANCE)는 분석 함수로 사용될 수 있다. 분석 함수는 SELECT 목록 또는 ORDER BY 절에만 올 수 있다. 분석 함수가 포함된 질의가 처리되는 단계는 다음과 같다. 1단계: 분석 함수와 ORDER BY 절 (만약 존재하면)을 제외한 질의 처리 2단계: 분석 함수에 PARTITION BY 식이 포함된 경우, 1단계의 질의 결과를 분석 함수가 적용될 파티션으로 분리 3단계: 분석 함수 계산 수행 4단계: ORDER BY 절이 있는 경우 처리 분석 집계 함수 형태 분석 함수의 OVER절이 ORDER BY식을 포함하지 않을 때, 집계 함수는 분석 집계 함수로 여겨진다. 집계 함수 (AVG, MAX, MIN 등)가 분석 집계 함수 형태로 사용될 때, 결과 값은 모든 행에 대해 각각 반환된다. 이것이 집계 함수의 일반적인 사용 형태와 다른 점으로, 집계 함수의 경우에는 결과 값이 한 번만 반환된다. 구문 analytic_aggregate_function ::= SQL 함수 257 analytic_aggregate_function() arg_expr OVER(); partition_by_expr partition_by_expr::= PARTITIONBYexpr , 설명 analytic_aggregate_funciton 분석 집계 함수로 사용할 집계 함수의 이름을 명시한다. 위에서 설명한 바와 같이, 알티베이스는 모든 집계 함수에 대해서 분석 집계 함수로 사용되는 것을 지원한다. arg_expr 분석 함수를 위한 인자로 사용될 수식을 명시한다. OVER 이 함수가 분석 집계 함수임을 질의 처리기가 인식하도록 하는 키워드이다. partition_by_expr PARTITION BY 식은 그룹을 묶을 칼럼 명을 명시하는 절이다. 즉, 분석 함수의 계산 대상 그룹을 지정한다. 예제 <질의> 자신이 속한 부서의 최고 급여에 대한 자신의 급여 비율을 모든 사원에 대해 구하라. iSQL(sysdba)> SELECT e_lastname, dno, salary, ROUND(salary/MAX(salary) OVER (PARTITION BY dno)*100) rel_sal FROM employees; E_LASTNAME DNO SALARY REL_SAL ----------------------------------------------------------- ---- Kobain 1001 2000 87 Chen 1001 2300 100 . 258 SQL Reference . . Di az 40 01 12 00 63 Fleischer 4002 500 26 Marquez 4002 1800 95 Blake 4002 Hammond 4002 1890 100 Davenport 1500 100 20 rows selected. SQL 함수 259 숫자 함수 이 함수는 매개 변수로 숫자 값을 입력 받아 계산 작업을 수행하고 숫자 값을 반환한다. ABS 구문 ABS (number) 설명 입력된 숫자의 절대값을 반환하는 함수이다. 예제 <질의> 세 숫자의 절대 값을 출력하라. xdbiSQL> SELECT ABS(-1), ABS(0.0), ABS(1) FROM dual; ABS(-1) ABS(0.0) ABS(1) ---------------------------------------- 1 0 1 1 row selected. <질의> 상품 테이블에서 가장 비싼 품목의 가격과 가장 싼 품목의 가격 차이를 구하라. xdbiSQL> SELECT ABS(MIN(price) - MAX(price)) absolute_value FROM goods; ABSOLUTE_VALUE ----------------- 99033.01 1 row selected. ACOS 구문 ACOS (number) 설명 아크코사인, 즉 역코사인을 반환하는 함수이다. 아크코사인은 코사인 값이 number인 각도이다. number는 -1에서 1 까지의 값이어야 한다. 입력 값이 이 범위에 속하지 않으면 0.000000을 반환한다. 이 260 SQL Reference 함수는 0에서 π(pi)사이의 DOUBLE타입 숫자 값을 라디안 단위로 반환한다. 1 라디안(radian) = 180º/pi 예제 <질의> xdbiSQL> SELECT ACOS(.3) Arc_Cosine FROM dual; ARC_COSINE -------------- 1.2661036727795 1 row selected. ASIN 구문 ASIN (number) 설명 아크사인, 즉 역사인을 반환하는 함수이다. 아크사인은 사인 값이 number인 각도이다. number는 -1에서 1 까지의 값이어야 한다. 입력 값이 이 범위에 속하지 않으면 0.000000을 반환한다. 이 함수는 -π/2에서 π/2사이의 DOUBLE타입 숫자 값을 라디안 단위로 반환한다. 예제 <질의> xdbiSQL> SELECT ASIN(.3) Arc_Sine FROM dual; ARC_SINE -------------- 0.304692654015398 1 row selected. ATAN 구문 ATAN (number) SQL 함수 261 설명 아크탄젠트, 즉 역탄젠트를 반환하는 함수이다. 아크탄젠트는 탄젠트 값이 number인 각도이다. 이 함수는 -π/2에서 π/2사이의 DOUBLE타입 숫자 값을 라디안 단위로 반환한다. 예제 <질의> xdbiSQL> SELECT ATAN(.3) Arc_Tangent FROM dual; ARC_TANGENT -------------- 0.291456794477867 1 row selected. ATAN2 구문 ATAN2 (n, m) 설명 이 함수는 실수 타입의 두 입력 인자를 가지며, n / m의 아크탄젠트 값을 반환한다. 이 함수는 -π(exclusive)에서 π(inclusive)사이의 DOUBLE타입 숫자 값을 라디안 단위로 반환한다. 예제 <질의> xdbiSQL> SELECT ATAN2(.3, .2) Arc_Tangent2 FROM dual; ARC_TANGENT2 --------------- 0.982793723247329 1 row selected. CEIL 구문 CEIL (number) 설명 입력된 값 이상의 가장 작은 정수를 반환하는 함수이다. 262 SQL Reference 예제 <질의> 각 입력 값에 대해 입력 값 이상의 가장 작은 정수를 구하라. xdbiSQL> SELECT CEIL(99.9), CEIL(-99.9) FROM dual; CEIL(99.9) CEIL(-99.9) --------------------------- 100 -99 1 row selected. <질의> 상품 테이블에서 가장 비싼 품목의 가격과 가장 싼 품목의 가격 차이를 구해 그 값 이상의 가장 작은 정수를 구하라. xdbiSQL> SELECT CEIL(ABS (MIN(price) - MAX(price))) Smallest_int FROM goods; SMALLEST_INT --------------- 99034 1 row selected. COS 구문 COS (number) 설명 라디안 단위의 부동 소수점 숫자 입력 값의 코사인 값을 라디안 단위로 반환하는 함수이다. 반환 데이터 타입은 DOUBLE이다. 예제 <질의> xdbiSQL> SELECT COS(180 * 3.14159265359/180) Cos_of_180_degrees FROM dual; COS_OF_180_DEGREES --------------------- -1 1 row selected. COSH 구문 COSH (number) SQL 함수 263 설명 입력 값의 쌍곡선 코사인(hyperbolic 코사인) 값을 반환하는 함수이다. 반환 데이터 타입은 DOUBLE이다. COSH(n) = ( e n + e -n )/2 예제 <질의> xdbiSQL> SELECT COSH(0) FROM dual; COSH(0) -------------- 1 1 row selected. EXP 구문 EXP (n) 설명 이 함수는 e의 n제곱을 반환한다. (e = 2.71828183…) 반환 데이터 타입은 DOUBLE이다. 예제 <질의> xdbiSQL> SELECT EXP(2.4) FROM dual; EXP(2.4) -------------- 11.0231763806416 1 row selected. FLOOR 구문 FLOOR (number) 설명 입력된 값 이하의 가장 큰 정수를 반환하는 함수이다. 264 SQL Reference 예제 <질의> 각 입력 값에 대해 입력 값 이하의 가장 큰 정수를 구하라. xdbiSQL> SELECT FLOOR(99.9), FLOOR(-99.9) FROM dual; FLOOR(99.9) FLOOR(-99.9) ---------------------------- 99 -100 1 row selected. <질의> 상품 테이블에서 가장 비싼 품목의 가격과 가장 싼 품목의 가격 차이를 구해 그 값 이하의 가장 큰 정수를 구하라. xdbiSQL> SELECT FLOOR(ABS(MIN(price) - MAX(price))) Largest_int FROM goods; LARGEST_INT -------------- 99033 1 row selected. LN 구문 LN (n) 설명 LN 함수는 n의 자연로그를 반환한다. 입력 값은 0 보다 커야 된다. 예제 <질의> xdbiSQL> SELECT LN(2.4) FROM dual; LN(2.4) -------------- 0.8754687373539 1 row selected. LOG 구문 LOG (m, n) 설명 LOG 함수는 밑이 m인 n의 로그를 반환한다. 밑 m은 0과 1이 아닌 양수이어야 하고, n은 양수이어야 한다. SQL 함수 265 예제 <질의> xdbiSQL> SELECT LOG(10, 100) FROM dual; LOG(10, 100) --------------- 2 1 row selected. MOD 구문 MOD (m, n) 설명 m을 n 으로 나눈 나머지를 반환하는 함수이다. 예제 <질의> 10을 3으로 나눈 나머지를 구하라. xdbiSQL> SELECT MOD(10, 3) FROM dual; MOD(10, 3) -------------- 1 1 row selected. <질의> 모든 사람의 급여의 합을 가장 적은 사람의 급여로 나눈 나머지를 구하라. xdbiSQL> SELECT MOD(SUM(salary), MIN(salary)) Remainder FROM employees; REMAINDER -------------- 223000 1 row selected. POWER 구문 POWER (m, n) 설명 POWER 함수는 m의 n 제곱을 반환한다. m과 n은 임의의 숫자일 수 있고, m이 음수이면 n은 정수이어야 한다. 266 SQL Reference 예제 <질의> xdbiSQL> SELECT POWER(3, 2) FROM dual; POWER(3, 2) -------------- 9 1 row selected. RANDOM 구문 RANDOM (number) 설명 이 함수는 의사 랜덤 정수형 값(pseudo random integer value)을 반환한다. 반환 값의 범위는 0 부터 INTEGER 형의 최대값, 즉 2,147,483,647이다. number가 0이 아니면 이 값을 random seed 값으로 사용해서 구한 의사 랜덤 정수를 반환한다. 0이 아닌 같은 seed 값을 사용해서 반복적으로 RANDOM 함수를 호출하면, 같은 값이 반환될 것이다. 예제 <질의> xdbiSQL> SELECT RANDOM(0) FROM dual; RANDOM(0) -------------- 16838 1 row selected. <질의> xdbiSQL> SELECT RANDOM(100) FROM dual; RANDOM(100) -------------- 12662 1 row selected. ROUND 구문 ROUND ( n1 [ , n2 ] ) SQL 함수 267 설명 반올림 함수이다. n1를 소수점 아래 n2 + 1 번째 자리에서 반올림하여 n2번째 자리까지 반환한다. n2를 생략하면 소수점 아래 첫번째 자리에서 반올림하여 정수값을 반환한다. n2가 음수일 경우 소수점 앞 n2번째 자리에서 반올림한 값을 반환한다. 예제 <질의> 다음 ROUND 함수로 표현한 두 개의 식의 결과를 출력하라: ROUND(123.9994, 3), ROUND(123.9995, 3) xdbiSQL> SELECT ROUND(123.9994, 3), ROUND(123.9995, 3) FROM dual; ROUND(123.9994, 3) ROUND(123.9995, 3) ----------------------------------------- 123.999 124 1 row selected. <질의> 가장 싼 상품의 값을 정수값으로 반올림해서 출력하라. xdbiSQL> SELECT ROUND( MIN(price) ) FROM goods; ROUND( MIN(PRICE) ) ---------------------- 967 1 row selected. 예제 결과 ROUND(748.58, -1) 750 ROUND(748.58, -2) 700 ROUND(748.58, -3) 1000 ROUND는 항상 값을 반환한다. n2가 음수이고 이 값이 소수점 앞의 자릿수보다 클 경우 이 함수는 0을 반환한다. 예제 결과 ROUND(748.58, -4) 0 SIGN 구문 SIGN (number) 268 SQL Reference 설명 number의 부호를 반환하는 함수이다. 입력 값이 양수이면 1, 입력 값이 음수이면 -1, 입력 값이 0이면 0을 돌려준다. 예제 <질의> xdbiSQL> SELECT SIGN(15), SIGN(0), SIGN(-15) FROM dual; SIGN(15) SIGN(0) SIGN(-15) ---------------------------------------- 1 0 -1 1 row selected. <질의> 급여가 1000달러보다 많으면 1, 적으면 -1, 1000달러이면 0을 출력하라. xdbiSQL> SELECT e_firstname, e_lastname, SIGN(salary-1000) As Wage_class 2 FROM employees; E_FIRSTNAME E_LASTNAME WAGE_CLASS ----------------------------------------------------------- - Chan-seung Moon Susan Davenport 1 Ken Kobain 1 . . . 20 rows selected. SIN 구문 SIN (n) 설명 입력한 n (라디안 단위)의 사인 값을 구하는 삼각 함수이다. 반환 데이터 타입은 DOUBLE이다. 예제 <질의> xdbiSQL> SELECT SIN (30 * 3.14159265359/180) Sine_of_30_degrees FROM dual; SINE_OF_30_DEGREES --------------------- 0.5 1 row selected. SQL 함수 269 SINH 구문 SINH (n) 설명 입력한 n의 hyperbolic 사인을 반환하는 함수이다. SINH(n) = ( e n - e -n )/2 예제 <질의> xdbiSQL> SELECT SINH(1) Hyperbolic_sine_of_1 FROM dual; HYPERBOLIC_SINE_OF_1 ----------------------- 1.175201 1 row selected. SQRT 구문 SQRT (n) 설명 SQRT 함수는 n의 제곱근을 반환한다. n은 음수가 아니어야 한다. 예제 <질의> 10의 제곱근을 구하라. xdbiSQL> SELECT SQRT(10) FROM dual; SQRT(10) -------------- 3.162278 1 row selected. TAN 구문 TAN (n) 270 SQL Reference 설명 입력한 n의 탄젠트를 반환하는 삼각 함수이다. 입력 인수는 라디안 단위이며 반환 값은 DOUBLE 타입이다. 예제 <질의> 135도 각도의 탄젠트를 구하라. xdbiSQL> SELECT TAN (135 * 3.14159265359/180) Tangent_of_135_degrees FROM dual; TANGENT_OF_135_DEGREES ------------------------- -1 1 row selected. TANH 구문 TANH (n) 설명 입력한 n의 hyperbolic 탄젠트를 반환하는 함수이다. 예제 <질의> xdbiSQL> SELECT TANH(.5) Hyperbolic_tangent_of_ FROM dual; HYPERBOLIC_TANGENT_OF_ ------------------------- 0.462117 1 row selected. TRUNC(number) 구문 TRUNC ( n1 [ , n2 ] ) 설명 n1을 소수점아래 n2 번째 자리에서 버림한여 FLOAT 타입 값을 반환한다. n2이 생략될 경우 0으로 취급하여 소수점 아래 자리를 모두 버린 SQL 함수 271 정수를 반환한다. n2가 음수일 경우 소수점 앞 n2번째 자리를 버린다. 예제 <질의> 다음의 각 수식에 대해 TRUNC 함수의 결과를 구하라. xdbiSQL> SELECT TRUNC(15.79, 1), TRUNC(15.79, -1) FROM dual; TRUNC(15.79, 1) TRUNC(15.79, -1) ------------------------------------ 15.7 10 1 row selected. <질의> 가장 싼 상품의 정수값을 출력하라. xdbiSQL> SELECT TRUNC(MIN(price)) FROM goods; TRUNC(MIN(PRICE)) -------------------- 966 1 row selected. BITAND 구문 BITAND (bit_a, bit_b) 설명 bit_a와 bit_a의 비트에 대한 AND 연산 결과를 반환하는 함수이다. 예제 xdbiSQL> SELECT TO_CHAR( BITAND( BIT'01010101', BIT'10101010' ) ) FROM DUAL; TO_CHAR( BITAND( BIT'01010101', BIT'1010 -------------------------------------------- 00000000 1 row selected. BITOR 구문 BITOR (bit_a, bit_b) 설명 bit_a와 bit_b의 비트에 대한 OR 연산 결과를 반환하는 함수이다. 272 SQL Reference 예제 xdbiSQL> SELECT TO_CHAR( BITOR( BIT'01010101', BIT'10101010' ) ) FROM DUAL; TO_CHAR( BITOR( BIT'01010101', BIT'10101 -------------------------------------------- 11111111 BITXOR 구문 BITXOR (bit_a, bit_b) 설명 bit_a와 bit_b의 비트에 대한 XOR(exlusive OR) 연산 결과를 반환하는 함수이다. 예제 xdbiSQL> SELECT TO_CHAR( BITXOR( BIT'01010101', BIT'10101010' ) ) FROM DUAL; TO_CHAR( BITXOR( BIT'01010101', BIT'1010 -------------------------------------------- 11111111 1 row selected. BITNOT 구문 BITNOT (bit_a) 설명 bit_a의 비트에 대한 NOT 연산 결과를 반환하는 함수이다. 예제 xdbiSQL> SELECT TO_CHAR( BITNOT( BIT'01010101' ) ) FROM DUAL; TO_CHAR( BITNOT( BIT'01010101' ) ) -------------------------------------- 10101010 1 row selected. SQL 함수 273 문자 함수 문자 함수는 문자 또는 문자열을 입력 받아서 문자나 숫자 값을 반환한다. 이들은 반환하는 데이터 타입에 따라서 크게 두 가지 종류로 분류될 수 있다. 문자 값을 반환하는 문자 함수 CHR, CONCAT, DIGITS, INITCAP, LOWER, LPAD, LTRIM, NCHR, REPLICATE, REPLACE2, REVERSE_STR, RPAD, RTRIM, STUFF, SUBSTRB(SUBSTRING), TRANSLATE, TRIM, UPPER 숫자 값을 반환하는 문자 함수 ASCII, INSTR(POSITION), CHAR_LENGTH(CHARACTER_LENGTH, LENGTH), INSTRB, OCTET_LENGTH(LENGTHB), SIZEOF ASCII 구문 ASCII (expr) 설명 문자 식 expr에서 가장 첫 (즉, 왼쪽) 문자의 ASCII 코드 값을 반환한다. 예제 <질의> 문자 'A'의 ASCII 코드를 출력하라. xdbiSQL> SELECT ASCII('A') FROM dual; ASCII('A') -------------- 65 1 row selected. CHAR_LENGTH, CHARACTER_LENGTH, LENGTH 구문 CHAR_LENGTH (expr) CHARACTER_LENGTH (expr) 274 SQL Reference LENGTH (expr) 설명 입력 문자열의 길이를 돌려준다. 예제 <질의> 관리자 테이블에서 주소의 길이를 출력하라. 단, 데이터베이스 캐릭터 셋이 KO16KSC5601 이다. CREATE TABLE managers( mgr_no INTEGER PRIMARY KEY, m_lastname VARCHAR(20), m_firstname VARCHAR(20), address VARCHAR(60)); INSERT INTO managers VALUES(1, 'Jones', 'Davey', '3101 N. Wabash Ave. Brooklyn, NY'); INSERT INTO managers VALUES(15, 'Min', 'Sujin', ' 서울 마포구 아현 1'); xdbiSQL> SELECT CHAR_LENGTH(address) FROM managers; CHAR_LENGTH (ADDRESS) ------------------------ 32 11 2 rows selected. CHR 구문 CHR (n) 설명 입력 ASCII 코드값을 해당하는 문자로 변환하는 함수이다. 예제 <질의> ‘ALTIBASE’를 ASCII 코드값을 이용해서 출력하기 xdbiSQL> SELECT CHR(65) || CHR(76) || CHR(84) || CHR(73) || CHR(66) || CHR(65) || CHR(83) || CHR(69) mmdbms FROM dual; MMDBMS ------------------------------------ ALTIBASE 1 row selected. <질의> SELECT 질의 결과를 적절한 포맷으로 출력하기 위해 ASCII 코드 값 10을 갖는 줄 바꿈 문자를 이용해라. SQL 함수 275 xdbiSQL> SELECT RTRIM(c_firstname) || ' ' || c_lastname || CHR(10) || sex || ' ' || cus_job || CHR(10) || address cus_info FROM customers WHERE cno = 10; CUS_INFO ------------------------------------------------ Anh Dung Nguyen M 8A Ton Duc Thang Street District 1 HCMC Vietnam 1 row selected. * 참고: 제어 문자 ASCII 코드 값 탭 9 줄 바꿈 10 캐리지 리턴 13 CONCAT 구문 CONCAT (expr1, expr2) 설명 expr1과 expr2를 연결한 문자열을 반환한다. 이 함수는 연결 연산자 (||)와 동일하다. 예제 xdbiSQL> SELECT CONCAT(CONCAT(CONCAT(CONCAT(CONCAT(RTRIM(e_firstname), ' '), RTRIM(e_lastname)), ' is a ' ), emp_job ), '.') Job FROM employees WHERE eno = 10; JOB ----------------------------------------------------------- -------- Elizabeth Bae is a programmer. 1 row selected. DIGITS 구문 DIGITS (n) 276 SQL Reference 설명 입력 정수를 문자열로 반환한다. n의 데이터 형에 따라서 다른 길이의 문자열이 반환된다. SMALLINT 일 경우 5자리, INTEGER일 경우 10자리, BIGINT일 경우 19 자리의 문자열이 반환된다. 입력 수의 자리 수가 문자열의 자리수보다 작을 경우 앞 부분이 0으로 채워진다. 예제 <질의> 다른 숫자 데이터 형의 세 입력 숫자를 문자열로 출력하라. CREATE TABLE T1 (I1 SMALLINT, I2 INTEGER, I3 BIGINT); NSERT INTO T1 VALUES (357, 12, 5000); xdbiSQL> SELECT DIGITS(I1), DIGITS(I2), DIGITS(I3) FROM T1; DIGITS(I1) DIGITS(I2) DIGITS(I3) ------------------------------------------------ 00357 0000000012 0000000000000005000 1 row selected. INITCAP 구문 INITCAP (expr) 설명 이 함수는 입력 문자열의 각 단어의 첫 번째 문자를 대문자로 변환해서 그 결과를 반환한다. 단어는 공백, 또는 문자나 숫자가 아닌 문자로 구분된다. 예제 <질의> 'the soap' 문자열의 각 단어의 첫 문자를 대문자로 출력하라. xdbiSQL> SELECT INITCAP ('the soap') Capital FROM dual; CAPITAL ------------ The soap 1 row selected. SQL 함수 277 INSTR, INSTRB, POSITION 구문 INSTR (expr, substring [, start [, occurrence]]) INSTRB (expr, substring [,start [, occurrence]]) POSITION (expr, substring [,start [, occurrence]]) 설명 INSTR 함수는 입력 expr 문자열에서 substring을 찾아서 substring의 첫 번째 문자의 위치를 반환한다. substring이 없으면 0이 반환된다. INSTRB 함수는 지정한 문자열의 위치를 문자 단위가 아닌 바이트 단위로 반환한다. start는 expr 내에서 탐색을 시작하는 위치를 가리킨다. 기본 start 값은 1, 즉 첫 번째 문자이다. 음수이면 expr 의 맨 끝에서부터 찾기 시작한다. 0으로 지정하면 0이 반환된다. start 값이 expr 의 길이보다 크면 에러가 발생한다. occurrence는 expr내에서 몇 번째 나타나는 substring의 위치를 반환할 지를 가리킨다. 기본값은 1이다. occurrence가 1이면 처음 탐색된 substring의 위치를 반환한다. occurrence가 2이면 두 번째로 나타나는 substring의 위치를 반환한다. 이 값이 0이거나, expr내에서 찾을 수 있는 substring 의 개수보다 더 크면 이 함수는 0을 반환한다. 음수로 설정하면 에러가 발생한다. POSITION 함수는 INSTR과 같은 함수이다. 예제 <질의> 문자열 ‘CORPORATE FLOOR’에서 ‘OR’의 위치를, 앞에서 3번째 문자부터 탐색을 시작하여 2번째로 탐색된 문자열의 위치를 출력하라. xdbiSQL> SELECT INSTR ('CORPORATE FLOOR','OR', 3, 2) Instring FROM dual; INSTRING -------------- 14 1 row selected. <질의> 문자열 ‘알티베이스5 데이터베이스’에서 ‘베이’의 위치를 뒤에서 3번째 문자부터 탐색을 시작하여 2번째로 탐색된 문자열의 위치를 출력하라. (단, 데이터베이스 문자 집합이 KO16KSC5601로 설정되어 있다.) xdbiSQL> SELECT INSTR ('알티베이스5 데이터베이스','베이', 3, 2) Instring FROM dual; 278 SQL Reference INSTRING -------------- 11 1 row selected. LOWER 구문 LOWER (expr) 설명 이 함수는 입력된 문자열의 모든 문자를 소문자로 변환한 문자열을 반환한다. 예제 <질의> 입력 문자열을 소문자로 변환하여 출력하라. xdbiSQL> SELECT LOWER('ONE PAGE PROPOSAL') Lowercase FROM dual; LOWERCASE --------------------- one page proposal 1 row selected. LPAD 구문 LPAD (expr1, n [,expr2]) 설명 이 함수는 expr1의 왼쪽에 expr2를 전체 길이가 n이 될 때까지 반복적으로 삽입하여 그 결과를 반환한다. expr2를 명시하지 않으면, 공백 문자가 삽입된다. 만약, expr1의 길이가 n 보다 길면 expr1의 왼쪽부터 길이 n만큼의 문자열을 반환한다. 단 n 은 바이트의 개수가 아니라 문자 개수를 의미하므로 사용하는 언어(설정된 문자 집합)에 따라 문자열의 바이트 크기는 다를 수 있다. 예제 <질의> 다음은 “abc”라는 문자열의 왼쪽에 “xyz”라는 문자열을 SQL 함수 279 삽입하여 총 10 글자를 반환하는 예이다. xdbiSQL> SELECT LPAD('abc', 10, 'xyz') Lpad_ex FROM dual; LPAD_EX ------------------------------------------------ xyzxyzxabc 1 row selected. LTRIM 구문 LTRIM (expr1 [,expr2]) 설명 expr1의 가장 왼쪽 문자부터 시작해서 expr1의 각 문자들과 expr2의 각 문자들을 비교한다. expr1의 현재 문자가 expr2에 있는 한 문자와 같으면 expr1의 문자를 삭제한다. 이 과정을 expr1의 현재 문자와 일치하는 문자가 expr2에 없을 때까지 삭제하여 그 결과를 출력한다. expr2의 기본값은 한 개의 공백이다. 그러므로, expr2가 생략된 경우 expr1의 앞(왼쪽)에 있는 공백이 모두 제거된다. 예제 <질의> 문자열 'abaAabLEFT TRIM' 중 가장 왼쪽에 나타나 있는 a와 b를 제외한 문자열을 출력하라. xdbiSQL> SELECT LTRIM ('abaAabLEFT TRIM', 'ab') Ltrim_ex FROM dual; LTRIM_EX ------------------- AabLEFT TRIM 1 row selected. <질의> 각 사원의 입사일 정보에서 날짜를 제거하여 입사 년월만 출력하라. xdbiSQL> SELECT e_lastname, LTRIM(LTRIM(join_date, '1234567890'), '-') Join_Month FROM employees; E_LASTNAME JOIN_MONTH ----------------------------------------------------------- . . . Ghorbani DEC-2009 Momoi SEP-2010 Fleischer JAN-2004 Wang NOV-2009 . . . 280 SQL Reference 20 rows selected. NCHR 구문 NCHR (n) 설명 이 함수는 국가 문자 집합(national character set)에서 n 값에 해당하는 문자를 반환한다. 반환 값의 타입은 NVARCHAR이다. 예제 내셔날 캐릭터 셋의 187(U+00BB)을 문자로 나타낸다. xdbiSQL> SELECT NCHR(187) FROM DUAL; NC -- >> 1 row selected. OCTET_LENGTH, LENGTHB 구문 OCTET_LENGTH (expr) 설명 이 함수는 입력된 문자열의 길이를 바이트 단위로 돌려준다. 문자열의 바이트 길이는 데이터베이스 캐릭터 셋 또는 내셔날 캐릭터 셋에 따라 다르다. LENGTHB 는 OCTET_LENGT와 같은 함수이다. 예제 <질의> 문자열 '우리나라'의 길이를 바이트 단위로 출력하라. (단, 데이터베이스 캐릭터 셋이 K016KSC5601로 설정되어 있다.) xdbiSQL> SELECT OCTET_LENGTH('우리나라') FROM dual; OCTET_LENGTH('우리나라') --------------------------- 8 1 row selected. SQL 함수 281 <질의> 관리자 테이블에서 주소의 길이를 바이트 단위로 출력하라. xdbiSQL> SELECT OCTET_LENGTH(address) FROM managers; OCTET_LENGTH(ADDRESS) ------------------------ 32 18 2 rows selected. REPLACE2 구문 REPLACE2 (expr1 , expr2, [expr3]) 설명 이 함수는 expr1내에서 모든 expr2를 expr3으로 치환하여 그 결과를 반환한다. expr3이 생략되거나 NULL인 경우 expr2은 제거된다. 만약 expr2이 NULL이면 expr1 이 그대로 반환된다. TRANSLATE 함수가 각 문자에 대해 하나씩 치환되는 것에 반해 REPLACE2 함수는 문자열을 제거시킬 뿐만 아니라 한 문자열을 다른 문자열로 대치한다. 예제 <질의> departments 테이블의 dname칼럼의 값에서 “team”을 “division”으로 모두 치환하라. xdbiSQL> SELECT REPLACE2(dname, 'team', 'division') FROM departments; REPLACE2(DNAME, 'team', 'division') ------------------------------------------------ Engine Development Division Marketing Division Planning and Management Division Sales Division 5 rows selected. <질의> 다음 예제는 “abcdefghi” 문자열에서 “cde”를 “xx”로 바꾼다. xdbiSQL> SELECT REPLACE2('abcdefghicde', 'cde', 'xx') FROM dual; REPLACE2('abcdefghicde', 'cde', 'xx') ----------------------------------------- abxxfghixx 1 row selected. 282 SQL Reference REPLICATE 구문 REPLICATE (expr, n) 설명 이 함수는 expr 를 n만큼 반복한 문자열을 반환한다. expr 는 문자열이고 n은 양수이어야 한다. 만약 n이 0 또는 음수이면 REPLICATE 함수는 NULL을 반환한다. 예제 <질의> 문자열 “KSKIM”을 3회 반복한 문자열을 출력하라. xdbiSQL> SELECT REPLICATE ('KSKIM', 3) FROM dual; REPLICATE ('KSKIM', 3) ----------------------------------- KSKIMKSKIMKSKIM 1 row selected. RPAD 구문 RPAD (expr1, n [,expr2]) 설명 이 함수는 expr1의 오른쪽 끝에 expr2를 전체 길이가 n이 될 때까지 반복적으로 붙여서 그 결과를 반환한다. expr2를 명시하지 않으면, 공백 문자가 붙는다. 만약, expr1의 길이가 n 보다 길면 expr1의 왼쪽부터 길이 n만큼의 문자열을 반환한다. 단 n 은 바이트의 개수가 아니라 문자 개수를 의미하므로 사용하는 언어(설정된 문자 집합)에 따라 문자열의 바이트 크기는 다를 수 있다. 예제 <질의> 다음은 “123”이라는 문자 식의 오른쪽에 “0” 문자열을 삽입하여 총 10 자리 숫자를 반환하는 예이다. xdbiSQL> SELECT TO_NUMBER(RPAD('123', 10, '0')) rpad_ex FROM dual; RPAD_EX -------------- SQL 함수 283 1230000000 1 row selected. RTRIM 구문 RTRIM (expr1 [, expr2]) 설명 expr1의 가장 오른쪽 문자부터 시작해서 expr1의 각 문자들과 expr2의 각 문자들을 비교한다. expr1의 현재 문자가 expr2에 있는 한 문자와 같으면 expr1의 문자를 삭제한다. 이 과정을 expr1의 현재 문자와 일치하는 문자가 expr2에 없을 때까지 삭제하여 그 결과를 출력한다. expr2의 기본값은 한 개의 공백이다. 그러므로, expr2가 생략된 경우 expr1의 뒤(오른쪽)에서부터 공백이 모두 제거된다. 예제 <질의> 문자열 “RIGHTTRIMbaAbab” 가장 오른쪽에 나타나는 ‘a’와 ‘b’문자를 제거한 문자열을 출력하라. xdbiSQL> SELECT RTRIM ('RIGHTTRIMbaAbab', 'ab') rtrim_ex FROM dual; RTRIM_EX ------------------- RIGHTTRIMbaA 1 row selected. <질의> 각 사원의 입사일 정보에서 년도를 제거하여 입사 일월만 출력하라. xdbiSQL> SELECT e_lastname, RTRIM(RTRIM(join_date, '1234567890'), '-') Join_Date FROM employees; E_LASTNAME JOIN_DATE ----------------------------------------------------------- ---------------- . . . Ghorbani 20-DEC Momoi 09-SEP Fleischer 24-JAN Wang 29-NOV . . . 20 rows selected. 284 SQL Reference SIZEOF 구문 SIZEOF (expr) 설명 이 함수는 문자열의 크기 또는 거기에 할당된 크기를 반환한다. 입력 값은 CHAR, VARCHAR, 또는 숫자형 데이터 타입일 수 있다. 입력 값이 숫자형 데이터 타입이면, VARCHAR로 변환하여 거기에 할당된 크기를 되돌려 준다. OCTET_LENGTH 함수가 입력 문자열의 실제 크기를 반환하는 것에 반해 SIZEOF 함수는 입력 문자열에 할당된 공간의 크기 또는 테이블 생성시 정의된 칼럼의 크기를 반환한다. Note: SIZEOF 함수는 INTEGER, BIGINT, SMALLINT데이터 타입에 대해서는 20을 반환하며, DECIMAL, FLOAT, NUMBER, NUMERIC 타입에 대해서는 47, 그리고DOUBLE, REAL 타입에 대해서는 22를 반환한다. 예제 <질의> 테이블 dual의 칼럼 dummy에 할당된 크기를 출력하라. xdbiSQL> SELECT SIZEOF(dummy) FROM dual; SIZEOF(DUMMY) -------------- 1 1 row selected. SUBSTR, SUBSTRB, SUBSTRING 구문 SUBSTR (expr, start [, length]) 설명 SUBSTR 함수는 expr에서 start번째 문자부터 length 길이만큼의 문자열을 반환한다. start가 양수이면, 이 함수는 입력 문자열의 앞에서 start번째 문자부터 시작해서 length 길이만큼의 문자열을 반환한다. start가 음수이면, 이 함수는 입력 문자열의 끝에서 start번째 문자부터 SQL 함수 285 시작해서 length 길이만큼의 문자열을 반환한다. start가 0이면, 1을 지정한 것처럼 처리된다. length 을 생략하면 문자열의 끝까지 모든 문자가 반환된다. 입력 문자열은 CHAR 또는 VARCHAR 또는 숫자 데이터 타입일 수 있다. 입력 값이 숫자 데이터 타입일 경우, 이는 VARCHAR로 변환된다. 리턴 값의 타입은 VARCHAR이다. SUBSTR 함수가 위치와 길이를 입력 문자열의 문자 단위로 결정하는데 반해, SUBSTRB 함수는 위치와 길이를 문자가 아닌 바이트 단위로 결정한다. SUBSTRING은 SUBSTR와 같은 함수이다. 예제 <질의> 문자열 “SALESMAN”의 첫번째 문자부터 시작해서 길이 5만큼의 substring을 반환하라. xdbiSQL> SELECT SUBSTR('SALESMAN', 1 ,5) Substring FROM dual; SUBSTRING ------------- SALES 1 row selected. <질의> 입력 문자열 “ABCDEFG”의 substring을 반환하라. xdbiSQL> SELECT SUBSTR('ABCDEFG', -5 ,4) Substring FROM dual; SUBSTRING ------------- CDEF 1 row selected. <질의> 문자열 “ABCDEFG”에서 5번째 바이트 부터 2 바이트 길이 만큼의 문자를 출력하라. xdbiSQL> SELECT SUBSTRB('ABCDEFG', 5, 2) Substring_with_bytes FROM dual; SUBSTRING_WITH_BYTES ------------------------ EF 1 row selected. TRANSLATE 구문 TRANSLATE (expr1 , expr2, expr3) 286 SQL Reference 설명 TRANSLATE는 expr1의 각 문자를 체크하여 expr2 중에 있는지 확인한다. 만약 expr2에서 찾을 수 없으면, expr1의 문자는 그대로 남는다. 그러나 만약에 expr2에 같은 문자가 있다면, expr1의 문자는 expr3에서 일치하는 위치의 문자로 교체된다. 이 함수는 이런 방식으로 교체되어 expr1이 수정된 결과를 반환한다. 문자열 expr2의 문자들 개수가 expr3에 있는 문자들 개수보다 많아도 된다. 이 경우, expr2의 끝 부분의 문자들은 expr3에서 대응하는 문자가 없을 것이다. 만약 이런 문자들이 expr1에서 발견된다면, 이 문자는 제거된다. expr1에서 expr2의 모든 문자를 제거하고자 한다면, expr3에 빈 문자열을 입력하라. expr3이 expr2보다 길면, expr3의 나머지 문자들은 무시된다. 같은 문자가 expr2에 여러 개 있으면, 처음 나타나는 문자가 문자가 사용된다. 예제 <질의> 재고량이 50000개가 넘는 상품의 이름에서 “M”을 “L”로 바꾸어라. xdbiSQL> SELECT TRANSLATE(gname, 'M', 'L') FROM goods WHERE stock > 50000; TRANSLATE(GNAME, 'M', 'L') -------------------------------------------- TL-U200 L-190G 2 rows selected. <질의> 문자열의 대문자는 소문자로 변환하라. xdbiSQL> SELECT TRANSLATE('0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijlkmnopqrstuvwxyz') FROM dual; TRANSLATE('0123456789ABCDEFGHIJKLMNOPQRS ------------------------------------------------ 0123456789abcdefghijlkmnopqrstuvwxyz0123456789 1 row selected. <질의> 라이센스 번호에서 알파벳 문자는 제거하고 숫자만 남겨서 반환하라. xdbiSQL> SELECT TRANSLATE('3PQR334', '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ', '0123456789') License FROM dual; LICENSE ------------------ 3334 1 row selected. SQL 함수 287 TRIM 구문 TRIM (expr1 [, expr2]) 설명 TRIM은 expr2에 존재하지 않는 첫번째 문자로 시작하고 expr2에 존재하지 않는 마지막 문자로 끝나는 expr1의 substring을 반환한다. 이들 두 문자 사이의 expr1 일부분이 변환없이 반환된다. 즉, TRIM은 expr2에서 찾을 수 있는 모든 문자를 expr1의 처음과 끝에서 제거하여 그 결과를 반환한다. 그러므로, 이 함수는 LTRIM과 RTRIM을 같은 값의 expr2를 사용해서 함께 실행한 것과 결과가 같다. expr2의 기본 값은 한 개의 공백 문자이다. 이는 expr2가 명시되지 않을 경우, expr1의 양쪽 끝의 모든 공백이 제거됨을 의미한다. 예제 <질의> 문자열 “abbAaBbAbba”에서 양쪽 끝에서부터 a와 b를 제거한 문자열을 출력하라. xdbiSQL> SELECT TRIM ('abbAaBbAbba', 'ab') trim_ex FROM dual; TRIM_EX --------------- AaBbA 1 row selected. UPPER 구문 UPPER (char) 설명 이 함수는 입력 문자열의 모든 문자를 대문자로 바꿔서 반환한다. 예제 <질의> 문자열 “Capital”을 대문자로 출력하라. xdbiSQL> SELECT UPPER('Capital') Uppercase FROM dual; UPPERCASE 288 SQL Reference ------------- CAPITAL 1 row selected. REVERSE_STR 구문 REVERSE_STR (expr) 설명 이 함수는 expr의 문자 순서를 거꾸로 바꾼 결과를 반환한다. 예제 <질의> 문자열 “KSKIM”을 거꾸로 출력하라. xdbiSQL> SELECT REVERSE_STR ('KSKIM') FROM dual; REVERSE_STR ('KSKIM') ------------------------- MIKSK 1 row selected. <질의> 문자열 ‘알티베이스5’를 거꾸로 출력하라. (단, 데이터베이스 문자 집합이 KO16KSC5601로 설정되어 있다.) xdbiSQL> SELECT REVERSE_STR ('알티베이스4') FROM dual; REVERSE_STR ('알티베이스5') ------------------------- 5스이베티알 1 row selected. STUFF 구문 STUFF (expr1, start, length, expr2) 설명 이 함수는 start로 명시한 위치부터 length 길이만큼 제거하고 expr2를 그 자리에 삽입한 문자열을 반환한다. length에 0이 입력되면, expr1에서 아무것도 삭제하지 않고 expr2를 삽입한다. 이 경우 expr2의 삽입 위치는 start가 가리키는 위치의 왼쪽이다. length가 expr1의 start 위치 오른쪽 문자들의 길이보다 크면, start 의 오른쪽에 있는 문자열을 모두 지운 후 SQL 함수 289 expr2를 삽입한다. expr2를 expr1의 맨 뒤에 붙이려면, start를 (expr1의 길이+1)로 지정하고, length 는 0또는 양수로 지정하라. start또는 length 의 값이 음수이거나 start가 (expr1의 길이+1) 보다 클 경우에는 에러가 발생한다. 예제 <질의> STUFF 함수를 이용하여 “KDHONG”을 “KILDONG HONG”으로 변환하라. xdbiSQL> SELECT STUFF (‘KDHONG’, 2, 1, ‘ILDONG ’) FROM dual; STUFF (‘KDHONG’, 2, 1, ‘ILDONG ’) -------------------------------------------------- KILDONG HONG 1 row selected. <질의> expr2을 expr1 앞에 삽입하라. xdbiSQL> SELECT STUFF (‘KDHONG’, 1, 0, ‘ILDONG ’) FROM dual; STUFF (‘KDHONG’, 1, 0, ‘ILDONG ’) -------------------------------------------------- ILDONG KDHONG 1 row selected. <질의> expr2을 expr1 뒤에 삽입하라. xdbiSQL> SELECT STUFF (‘KDHONG’, 7, 0, ‘ILDONG ’) FROM dual; STUFF (‘KDHONG’, 7, 0, ‘ILDONG ’) -------------------------------------------------- KDHONGILDONG 1 row selected. <질의> start의 왼쪽에 expr2가 삽입되도록 length를 0으로 입력하라. xdbiSQL> SELECT STUFF (‘KDHONG’, 2, 0, ‘ILDONG ’) FROM dual; STUFF (‘KDHONG’, 2, 0, ‘ILDONG ’) -------------------------------------------------- KILDONG DHONG 1 row selected. <질의> 데이터베이스 문자 집합이 KO16KSC5601로 설정된 경우 STUFF 함수를 이용해서 입력 문자열의 내용을 변경하라. xdbiSQL> SELECT STUFF ('알티베이스0', 5, 1, '데이터베이스') FROM dual; STUFF ('알티베이스0', 5, 1, '데이터베이스’) ------------------------------------------------ 알티베이데이터베이스0 1 row selected. 290 SQL Reference 날짜시간 함수 이들 함수는 날짜 및 시간 입력 값에 대한 작업을 수행하여 문자, 숫자 또는 날짜/시간 타입의 값을 반환한다. 입력 인자의 값이 문자 데이터 타입이면, 그 값은 ALTIBASE_XDB_DATE_FORMAT 환경변수 또는 DEFAULT_DATE_FORMAT 프로퍼티 (앞의 것이 우선순위가 높음)에 설정된 형식을 따라야 한다. 또한, 이 형식은 iSQL 에서 이들 함수 수행시 반환되는 날짜/시간 값을 출력하는데 사용된다. DATE 데이터 타입과 이 타입의 데이터 반환시 사용되는 날짜형 데이터 형식에 대한 자세한 설명은 General Reference를 참고하기 바란다. ADD_MONTHS 구문 ADD_MONTHS (date, number) 설명 이 함수는 date에 number개월을 더하여 그 결과를 반환한다. 인자 number는 정수이거나 정수로 변환이 가능한 값이면 된다. 예제 <질의> 사원번호가 10인 사원의 입사일과 입사 6개월 후의 날짜를 출력하라. xdbiSQL> SELECT join_date, ADD_MONTHS(join_date, 6) FROM employees WHERE eno = 10; JOIN_DATE ADD_MONTHS(JOIN_DATE, 6) ----------------------------------------- 05-JAN-2010 05-JUL-2010 1 row selected. DATEADD 구문 DATEADD (date, number, date_field_name) SQL 함수 291 설명 이 함수는 date의 date_field_name부분을 number 만큼 증가시켜 그 결과를 반환한다. number가 정수가 아닐 경우 소수점 이하 부분은 버린 후에 적용한다. date_field_name이 ‘SECOND’일 경우에는 number는 68년 이내의 값이어야 하고, ‘MICROSECOND’일 경우에는 number는 30일 이내의 값이어야 한다. DATEADD 함수에 사용할 수 있는 date_field_name은 다음과 같다. Date Field Name 내용 CENTURY date의 년도에 100*number 만큼을 더한다. YEAR date의 년도에 number 만큼을 더한다. QUARTER date의 월에 3*number 만큼을 더한다. MONTH date의 월에 number 만큼을 더한다. WEEK date의 일에 7*number 만큼을 더한다. DAY date의 일에 number 만큼을 더한다. HOUR date의 시에 number 만큼을 더한다. MINUTE date의 분에 number 만큼을 더한다. SECOND date의 초에 number 만큼을 더한다. MICROSECOND date의 마이크로 초에 number 만큼을 더한다. 예제 <질의> 입사한지 40일이 안 된 사원의 수를 구하라. xdbiSQL> SELECT COUNT(*) FROM employees WHERE join_date > DATEADD (SYSDATE, -40, ‘DAY’); COUNT ---------- 5 1 row selected. DATEDIFF 구문 DATEDIFF (startdate, enddate, date_field_name) 설명 이 함수는 enddate에서 startdate를 뺀 값(즉, enddate- 292 SQL Reference startdate)을 date_field_name에 명시한 단위로 반환한다. enddate보다 startdate의 값이 더 크면 음수가 반환된다. 이 함수는 enddate와 startdate의 값을 date_field_name에 명시한 단위의 값으로 각각 구해서 빼는 것으로, DATEDIFF 함수의 결과값은 항상 정수이다. DATEDIFF 함수에 사용 가능한 date_field_name은 다음과 같다. CENTURY YEAR QUARTER MONTH WEEK DAY HOUR MINUTE SECOND MICROSECOND DATEDIFF 함수가 반환하는 값의 범위는 date_field_name의 값에 따라서 한정되어 있다. date_field_name이 ‘MICROSECOND’일 때는 enddate 에서 startdate을 뺀 값이 30일 이내여야 한다. 그리고 초를 나타내는 ‘SECOND’일 경우에 enddate 와 startdate의 차는 68년이다. 이 범위를 초과하면 에러가 발생한다. 이 함수의 반환 데이터 타입은 BIGINT이다. 예제 <질의> 2005년 8월 31일과 2005년 11월 30일 간의 개월 수의 차를 구하라. xdbiSQL> SELECT DATEDIFF ('31-AUG-2005', '30-NOV-2005', 'MONTH') FROM dual; DATEDIFF ('31-AUG-2005', '30-NOV-2005', ------------------------------------------- 3 1 row selected. DATENAME 구문 DATENAME (date, date_field_name) SQL 함수 293 설명 이 함수는 입력 date_field_name에 따라서 지정한 date의 월 또는 요일의 이름을 반환한다. 다음표는 DATENAME 함수에 사용 가능한 date_field_name을 보여준다. Date Field Name 설명 MONTH, Month, month 월의 이름 (전체 이름) MON, Mon, mon 월의 이름 (약자) DAY, Day, day 요일의 이름 (전체 이름) DY, Dy, dy 요일의 이름 (약자) date_field_name별 가능한 출력 결과는 다음과 같다. date_field_name은 대문자, 소문자, 또는 첫문자만 대문자로 입력할 수 있고, 이 값에 일치하는 결과가 출력될 것이다. MONTH JANUARY, FEBRUARY, MARCH, APRIL, MAY, JUNE, JULY, AUGUST, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER MON JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC DAY SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY DY SUN, MON, TUE, WED, THU, FRI, SAT 예제 <질의> 1980년 12월 28일의 월의 이름을 구하라. xdbiSQL> SELECT DATENAME ('28-DEC-1980', 'Month') FROM dual; DATENAME ('28-DEC-1980', 'Month') ------------------------------------- December 1 row selected. EXTRACT, DATEPART 구문 EXTRACT (date, date_field_name) 294 SQL Reference DATEPART (date, date_field_name) 설명 이들 함수는 동일하며, 입력 date에서 date_field_name 에 해당하는 값만 반환한다. Date Field Name 내용 CENTURY 세기 (예를 들어, 2011의 경우 21을 1999의 경우는 20을 반환) YEAR 년 QUARTER 분기 MONTH 월 WEEK 일년 중 몇 번째 주인지 반환함. (그 해의 첫 번째 토요일과 그 앞의 날은 그 해의 첫 번째 주가 된다.) WEEKOFMONTH 그 달의 몇 번째 주인지 반환함. (그 달의 첫 번째 토요일과 그 앞의 날은 그 달의 첫 번째 주가 된다.) DAY 일 DAYOFYEAR 일년 중 몇 번째 날인지 반환함. DAYOFWEEK 주의 몇 번째 날인지 반환함. (일요일 = 1) HOUR 시 MINUTE 분 SECOND 초 MICROSECOND 마이크로 초 예제 <질의> 사원번호가 10인 사원이 입사한 분기를 구하라. xdbiSQL> SELECT DATEPART (join_date, 'QUARTER') FROM employees WHERE eno = 10; DATEPART (JOIN_DATE, 'QUARTER') ---------------------------------- 1 1 row selected. MONTHS_BETWEEN 구문 MONTHS_BETWEEN (date1, date2) SQL 함수 295 설명 이 함수는 date1에서 date2를 뺀 값을 개월 수로 반환한다. date1이 date2보다 작다면 음수가 반환될 것이다. date1과 date2가 같은 달의 같은 날이거나, 다른 달의 같은 날 또는 서로 다른 달의 마지막 날이라면 정수가 반환될 것이다. 이 경우에는 date1과 date2의 시간, 분, 초, 마이크로 초 부분은 무시된다. 다른 경우에는, 반환되는 값은 정수가 아닌 값이며, 이는 한 달을 31일로 간주하여 입력 날짜의 시간, 분, 초, 마이크로 초 부분을 변환해서 소수 부분이 계산된 것이다. 반환형은 DOUBLE이다. 예제 <질의> 1995년 2월 2일에서 1995년 1월 1일을 뺀 값을 개월 수로 구하라. xdbiSQL> SELECT MONTHS_BETWEEN (TO_DATE('02-02-1995','MM- DD-YYYY'), TO_DATE('01-01-1995','MM-DD-YYYY') ) Months FROM DUAL; MONTHS ------------------------- 1.03225806451613 1 row selected. ROUND 구문 ROUND (date [, date_field_name]) 설명 이 함수는 지정한 date_field_name의 단위에 맞춰서 date를 반올림한 날짜를 반환한다. date_field_name의 기본값은 ‘DAY’이다. 다음 표는 ROUND함수에 사용 가능한 date_field_name을 보여준다. Date Field Name 설명 CENTURY 반올림한 세기의 첫번째 날을 반환함. xx51년 이상은 다음 세기로 올림. (단, 세기는 xxx1년부터 시작함) 296 SQL Reference YEAR 7월 1일부터 다음 해로 올림. QUARTER 반올림한 분기의 첫번째 날을 반환함. 분기의 두 번째 달의 16일부터 다음 분기로 올림. MONTH 16일부터 다음 달로 올림. WEEK 목요일부터 다음 주 일요일로 올림. DAY PM 12:00부터 다음 일로 올림. HOUR 30분부터 다음 시로 올림. MINUTE 30초부터 다음 분으로 올림. 예제 <질의> 1980년 12월 27일을 YEAR로 반올림하여 출력하라. xdbiSQL> SELECT ROUND ( TO_DATE('27-DEC-1980', 'DD-MON- YYYY'), 'YEAR') FROM dual; ROUND ( TO_DATE('27-DEC-1980', 'DD-MON-Y ------------------------------------------- 1981/01/01 00:00:00 1 row selected. LAST_DAY 구문 LAST_DAY (date) 설명 이 함수는 date을 포함하는 달의 마지막 일을 반환한다. 반환 타입은 항상 DATE이다. 예제 <질의> 12월의 마지막 일을 출력하라. xdbiSQL> SELECT LAST_DAY(TO_DATE('15-DEC-2001')) FROM dual; LAST_DAY(TO_DATE('15-DEC-2001')) ----------------------------------- 2001/12/31 00:00:00 1 row selected. <질의> 사원들이 입사한 달의 마지막 일을 출력하라. xdbiSQL> SELECT LAST_DAY(join_date ) FROM employee; LAST_DAY(JOIN_DATE ) ----------------------- 1999/11/30 00:00:00 2000/01/31 00:00:00 . . SQL 함수 297 . 20 rows selected. NEXT_DAY 구문 NEXT_DAY (date, weekday) 설명 이 함수는 입력된 날짜(date) 이후에 첫번째로 오는 weekday 로 명시한 요일의 날짜를 반환한다. date의 요일이 weekday와 같다면, 다음 주 같은 요일의 날짜가 반환된다. weekday인자는 요일 중 하나이어야 한다. 대소문자는 구별하지 않고 요일의 전체 이름 또는 약어로 지정 가능하다. 예제 <질의> 각 사원들의 입사일과 입사일 후 첫번째 일요일을 출력하라. xdbiSQL> SELECT join_date, NEXT_DAY(join_date, 'SUNDAY') First_sunday FROM employees; JOIN_DATE FIRST_SUNDAY --------------------------------------------- . . . 24-JAN-2004 25-JAN-2004 29-NOV-2009 06-DEC-2009 14-JUN-2010 20-JUN-2010 05-JAN-2010 10-JAN-2010 . . . 20 rows selected. SYSDATE 구문 SYSDATE 설명 이 함수는 알티베이스가 운영중인 시스템의 현재 날짜와 시간을 출력한다. 298 SQL Reference 예제 <질의> 시스템 날짜(현재 날짜)를 출력하라. xdbiSQL> SELECT SYSDATE System_Date FROM dual; SYSTEM_DATE ----------------------- 2005/01/20 09:49:33 1 row selected. SYSTIMESTAMP 구문 SYSTIMESTAMP 설명 이 함수는 알티베이스가 운영중인 시스템의 현재 날짜와 시간을 출력한다. 이 함수는 SYSDATE 함수의 alias이며 시간대(time zone)은 지원하지 않는다. 예제 <질의> 시스템 날짜(현재 날짜)를 출력하라. xdbiSQL> SELECT SYSTIMESTAMP FROM dual; SYSTIMESTAMP ----------------------- 2005/01/20 09:49:33 1 row selected. TRUNC (date) 구문 TRUNC (date [, ‘fmt’]) 설명 버림 함수이다. 이 함수는 fmt에 명시된 단위까지만 반환한다. 즉, fmt로 명시된 단위보다 낮은 단위에 해당하는 모든 부분은0으로 교체된다. fmt를 생략하면 시간 단위 이하 부분은 제거되고 날짜까지만 반환된다. SQL 함수 299 TRUNC 함수에 사용 가능한 fmt는 다음과 같다. YEAR MONTH DAY HOUR MINUTE SECOND MICROSECOND 예제 <질의> 다음 예는 시스템 시간의 시간을 버림한 결과를 돌려준다. xdbiSQL> SELECT TRUNC(SYSDATE) FROM DUAL; <결과> TRUNC(SYSDATE) ----------------------- 2005/07/19 00:00:00 1 row selected. <질의> 다음 예는 날짜를 버림한 결과를 돌려준다. xdbiSQL> SELECT TRUNC(TO_DATE('2005-JUL-19','YYYY-MON-DD'), 'YEAR') New_Year FROM DUAL; <결과> NEW_YEAR ----------------------- 2005/01/01 00:00:00 1 row selected. 300 SQL Reference 변환 함수 변환 함수는 어떤 데이터 타입의 입력 값을 다른 데이터 타입으로 변환한다. ASCIISTR 구문 ASCIISTR(expr) 설명 이 함수는 임의의 캐릭터 셋을 갖는 문자열을 ASCII 문자열로 변환해서 반환한다. ASCII가 아닌 문자가 expr에 올 경우, \xxxx와 같이 UTF-16 코드로 표현된다. 반환 타입은 VARCHAR이다. 문자열을 국가 문자 집합(national character set)으로 변환하려면, UNISTR 함수를 사용하라. 예제 <질의> 입력 문자열을 ASCII 문자열로 변환하라. xdbiSQL> SELECT ASCIISTR('ABACDE') FROM DUAL; ASCIISTR(' ---------- AB\00C4CDE 1 row selected. SQL> select asciistr('abcano') from dual; ASCIISTR('ABCANO') ------------------ abc\00E5\00F1\00F6 1 row selected. BIN_TO_NUM 구문 BIN_TO_NUM (expr) 설명 이 함수는 expr을 10진수로 변환한다. expr은 이진수 또는 1과 0으로만 이루어진 최대 길이 32의 문자열이어야 한다. 반환형은 SQL 함수 301 INTEGER이다. Note: expr에 산술 연산이 있다면, 숫자들은 10진수로 다뤄진다. 그러나 서버 내부에서는 그 산술 연산의 결과로 생기는 수를 10진수가 아닌 2진수로 받아들이기 때문에 결과 숫자는 0과 1로만 이루어져야 한다. 예제 <질의> 주어진 2진수를 10진수로 변환하라. xdbiSQL> SELECT BIN_TO_NUM ('1010') FROM dual; BIN_TO_NUM ('1010') ---------------------- 10 1 row selected. CONVERT 구문 CONVERT(expr, dest_char_set [, source_char_set] ) 설명 이 함수는 expr을 source_char_set에서 dest_char_set으로 변환한다. dest_char_set과 source_char_set에는 알티베이스가 지원하는 캐릭터 셋이 입력될 수 있다. expr에 source_char_set 에 해당하지 않는 문자가 포함된 경우, 물음표(“?”)가 반환될 것이다. source_char_set을 생략할 경우 현재 데이터베이스에 설정된 데이터베이스 캐릭터 셋이 source_char_set이 된다. 예제 <질의> “ABC”라는 글자를 UTF8에서 US7ASCII캐릭터셋으로 변환한다. SQL> select convert( 'ABC', 'US7ASCII', 'UTF8') from dual; CONVER ------ ABC HEX_TO_NUM 구문 HEX_TO_NUM (expr) 302 SQL Reference 설명 이 함수는 expr을 10진수로 변환한다. expr은 0에서 9까지의 숫자와 A에서 F까지의 알파벳으로 이루어진 최대 길이 8인 문자열이어야 한다. 반환형은 INTEGER이다. 예제 <질의> 주어진 16진수를 10진수로 변환하라. xdbiSQL> SELECT HEX_TO_NUM ('1A') FROM dual; HEX_TO_NUM ('1A') -------------------- 26 1 row selected. OCT_TO_NUM 구문 OCT_TO_NUM (expr) 설명 이 함수는 expr을 8진수로 변환한다. expr은 0에서 7까지의 숫자로 이루어진 최대 길이 11인 문자열이어야 한다. 반환형은 INTEGER이다. Note: expr에 산술 연산이 있다면, 숫자들은 10진수로 다뤄진다. 그러나 서버 내부에서는 그 산술 연산의 결과로 생기는 수를 10진수가 아닌 8진수로 받아들이기 때문에 결과 숫자는 0에서 7까지의 숫자로만 이루어져야 한다. 예제 <질의> 주어진 8진수를 10진수로 변환하라. xdbiSQL> SELECT OCT_TO_NUM ('71') FROM dual; OCT_TO_NUM ('71') -------------------- 57 1 row selected. SQL 함수 303 TO_BIN 구문 TO_BIN (n) 설명 이 함수는 n을 이진수로 변환한다. n은 10진수 또는 0에서 9까지의 숫자로 이루어진 문자열이어야 한다. 가능한 입력 값의 범위는 -2147483647에서 2147483647, 즉 - (231-1) 에서 (231-1)이다. 음수가 입력되면, 그 음수의 절대값을 이진후로 변환하여 모든 비트를 반대로 바꾸고 1을 더한 값이 반환된다. 반환 값은 부호가 있다. 앞 부분의 0은 출력되지 않기 때문에, 양수의 경우 부호 값은 보이지 않는다. 반환형은 VARCHAR이다. 예제 <질의> 주어진 값을 이진수로 변환하라. xdbiSQL> SELECT TO_BIN(1000) FROM dual; TO_BIN(1000) ------------------------------------ 1111101000 1 row selected. TO_CHAR(날짜형) 구문 TO_CHAR (date [, ‘fmt’]) 설명 이 함수는 날짜형의 date를 fmt에 명시된 날짜시간 포맷의 VARCHAR 타입 문자열로 변환하여 반환한다. fmt가 생략되었을 경우 altibase_xdb.properties에 있는 DEFAULT_DATE_FORMAT 프로퍼티에 지정된 형식으로 반환될 것이다. DEFAULT_DATE_FORMAT 프로퍼티의 기본값은 DD-MON-RRRR 이다. 날짜형 데이터의 변환에 이용되는 날짜 데이터 형식에 대한 상세한 설명은 General Reference를 참고하기 바란다. 304 SQL Reference 예제 <질의> 모든 사원의 입사일을 YYYY-MM-DD HH:MI:SS 형식으로 출력하라. xdbiSQL> SELECT e_firstname, e_lastname, TO_CHAR(join_date, 'YYYY-MM-DD HH:MI:SS') Join_date FROM employees; E_FIRSTNAME E_LASTNAME JOIN_DATE ----------------------------------------------------------- ---------------- . . . Farhad Ghorbani 2009-12-20 00:00:00 Ryu Momoi 2010-09-09 00:00:00 Gottlieb Fleischer 2004-01-24 00:00:00 Xiong Wang 2009-11-29 00:00:00 . . . 20 rows selected. TO_CHAR (number) 구문 TO_CHAR (n [,’format’]) 설명 이 함수는 입력된 숫자형 값을 VARCHAR 타입으로 변환하여 반환한다. 반환되는 결과의 형식을 지정하는 것이 가능하다. 문자열이 입력되면, 이는 내부적으로 10진수로 받아들여지며 산술식이 포함된 경우 문자형 데이터로 변환되기 전에 산술 연산이 수행될 수도 있다. format에 가능한 형식은 General Reference 1장의 "숫자형 데이터 형식" 절을 참고하라. 예제 <질의> 다음 SQL문은 문자열과 숫자를 함축적 변환을 사용하여 숫자로 해석한 후 TO_CHAR 함수를 이용하여 문자형으로 변환하여 출력한다. xdbiSQL> SELECT TO_CHAR('01110' + 1) FROM dual; TO_CHAR('01110' + 1) ------------------------------------------------ 1111 1 row selected. SQL 함수 305 <질의> 다음은 숫자를 다양한 형식의 문자열로 출력하는 예를 보여준다. xdbiSQL> SELECT TO_CHAR (123, '99999') FROM dual; TO_CHAR (123, '99999') -------------------------- 123 1 row selected. xdbiSQL> SELECT TO_CHAR (123.4567, '999999') FROM dual; TO_CHAR (123.4567, '999999') -------------------------------- 123 1 row selected. xdbiSQL> SELECT TO_CHAR (1234.578, '9999.99') FROM dual; TO_CHAR (1234.578, '9999.99') --------------------------------- 1234.58 1 row selected. xdbiSQL> SELECT TO_CHAR (1234.578, '999.99999') FROM dual; TO_CHAR (1234.578, '999.99999') ----------------------------------- ########## 1 row selected. TO_DATE 구문 TO_DATE (expr [, ‘fmt’ ]) 설명 TO_DATE는 CHAR, VARCHAR 타입 데이터를 DATE 타입으로 변환한다. fmt는 expr의 날짜 형식을 지정한다. fmt가 생략되었을 경우 expr은 ALTIBASE_XDB_DATE_FORMAT환경 변수 또는 DEFAULT_DATE_FORMAT 프로퍼티에 설정된 형식을 따라야 한다. 만약 입력 날짜에 년 또는 월을 명시하지 않은 경우 TO_DATE 함수가 실행된 시점의 년 또는 월의 값이 반환될 것이다. 예를 들어, TO_DATE(TO_CHAR(sysdate,'YYYY'),'YYYY')를 실행한 시각이 2005/08/24 17:32:34일 경우, 실행 결과는 ‘2005/08/01 00:00:00’이 될 것이다. 입력 날짜에 월을 명시하지 않았으므로 실행 시의 월인 8월과, 일, 시, 분, 초는 초기값인 1일 00시 00분 00초가 결과값이 된다. 예제 <질의> 2001년 11월 19일에 입사한 사원의 번호, 이름, 성별과 306 SQL Reference 입사일을 입력하라. xdbiSQL> INSERT INTO employees(eno, e_lastname, e_firstname, sex, join_date) VALUES('Jones', 'Mary', 'F', TO_DATE('2011- 11-19 00:00:00', 'YYYY-MM-DD HH:MI:SS')); 1 row inserted. <질의> 입력 날짜에 월과 일을 명시하지 않은 경우 TO_DATE 결과 xdbiSQL> select to_char(to_date(to_char(sysdate, 'YYYY'), 'YYYY'), 'YYYYMMDD HH24:MI:SS') from dual; TO_CHAR(TO_DATE(TO_CHAR(SYSDATE,'YYYY'), -------------------------------------------- 20080501 00:00:00 1 row selected. (단, SYSDATE = 20080502 13:17:20) TO_HEX 구문 TO_HEX (n) 설명 이 함수는 n을 16진수로 변환한다. n은 10진수 또는 0에서 9까지의 숫자로 이루어진 문자열이어야 한다. 반환형은 VARCHAR이다. 예제 <질의> 주어진 값을 16진수로 변환하라. xdbiSQL> SELECT TO_HEX(1000) FROM dual; TO_HEX(1000) ---------------- 3E8 1 row selected. TO_NCHAR(character) 구문 TO_NCHAR (expr) 설명 이 함수는 문자형 데이터를 데이터베이스 캐릭터셋에서 내셔널 캐릭터셋으로 변환한다. 반환형은 NVARCHAR이다. SQL 함수 307 이 함수는 CONVERT 함수와 동일하다. 예제 <질의> 문자 ‘안’을 내셔널 캐릭터셋 UTF-16으로 변환하여 그 정보(dump)를 출력하라. (단, ‘안’의 code point는 U+C548이다.) xdbiSQL> select dump( to_nchar('안'), 16 ) from dual; DUMP( TO_NCHAR('안'), 16 ) ----------------------------------------------------------- ------------------- Type=NVARCHAR(UTF16) Length=4: 2,0,c5,48 TO_NCHAR(datetime) 구문 TO_NCHAR (datetime [,’fmt’]) 설명 이 함수는 날짜형 데이터를 데이터베이스 캐릭터셋에서 내셔널 캐릭터셋으로 변환한다. 반환형은 NVARCHAR이다. 예제 <질의> 각 사원의 입사일을 내셔널 캐릭터셋으로 변환해서 출력하라. xdbiSQL> SELECT e_lastname, e_firstname, TO_NCHAR(join_date, 'YYYY-MM-DD HH:MI:SS') Join_date FROM employees; E_LASTNAME E_FIRSTNAME JOIN_DATE ----------------------------------------------------------- ---------------- . . . Momoi Ryu 2010-09-09 00:00:00 Fleischer Gottlieb 2004-01-24 00:00:00 Wang Xiong 2009-11-29 00:00:00 Diaz Curtis 2010-06-14 00:00:00 . . . 20 rows selected. TO_NCHAR(number) 구문 TO_NCHAR (n [,’fmt’]) 308 SQL Reference 설명 이 함수는 숫자형 데이터를 데이터베이스 캐릭터셋에서 내셔널 캐릭터셋으로 변환한다. 반환형은 NVARCHAR이다. 예제 xdbiSQL> SELECT TO_NCHAR('01110' + 1) FROM dual; TO_NCHAR('01110' + 1) ------------------------------------------------ 1111 1 row selected. TO_NUMBER 구문 TO_NUMBER (char [, number_fmt] ) 설명 TO_NUMBER 함수는 문자열 char를 숫자 데이터 타입으로 변환한다. 사용자는 원하는 숫자 출력 형식을 지정할 수 있다. 숫자 출력 형식에 대한 자세한 설명은 General Reference를 참고하기 바란다. 반환형은 FLOAT이다. 예제 <질의> 문자열 200.00을 FLOAT로 변환하여 그 값을 이용해서 갱신하라. xdbiSQL> UPDATE employees SET salary = salary + TO_NUMBER( '200.00') WHERE eno = 10; 1 row updated. <질의> 문자열을 다양한 숫자 출력 형식으로 변환하라. xdbiSQL> SELECT TO_NUMBER ( '0123.4500', '0990.9909' ) FROM dual; TO_NUMBER ( '0123.4500', '0990.9909' ) ----------------------------------------- 123.45 1 row selected. xdbiSQL> SELECT TO_NUMBER ( '$12,3.45-', '09,$0.00S' ) FROM dual; TO_NUMBER ( '$12,3.45-', '09,$0.00S' ) ----------------------------------------- -123.45 1 row selected. SQL 함수 309 xdbiSQL> SELECT TO_NUMBER ( '<$183.5>', '$9,000.0PR' ) FROM dual; TO_NUMBER ( '<$183.5>', '$9,000.0PR' ) ----------------------------------------- -183.5 1 row selected TO_OCT 구문 TO_OCT (n) 설명 이 함수는 주어진 n을 8진수로 변환한다. n은 10진수 또는 0에서 9까지의 수로 이루어진 문자열이어야 한다. 반환형은 VARCHAR이다. 예제 <질의> 주어진 값을 8진수로 변환하라. xdbiSQL> SELECT TO_OCT(1000) FROM dual; TO_OCT(1000) ---------------- 1750 1 row selected. UNISTR 구문 UNISTR(expr) 설명 이 함수는 입력 문자열을 내셔널 캐릭터셋으로 변환한다. expr은 유니코드로 인코딩된 값일 수 있다. 유니코드로 인코딩된 값은 \xxxx와 같은 UTF16 코드 유닛으로 입력된다. 반환 타입은 NVARCHAR이다. ASCIISTR 함수와는 반대되는 기능을 하는 함수이다. 310 SQL Reference 예제 <질의> ASCII 문자와 유니코드로 인코딩된 문자가 같이 들어있는 문자열을 내셔널 캐릭터셋으로 변환하라. xdbiSQL> SELECT UNISTR('abc\00e5\00f1\00f6') FROM DUAL; UNISTR ------ abcano 1 row selected. SQL 함수 311 기타 함수 BINARY_LENGTH 구문 BINARY_LENGTH (expr) 설명 이 함수는 BLOB, BYTE, NIBBLE과 같은 이진 데이터 형의 데이터 길이를 반환한다. 예제 <질의> 세 가지 이진 데이터 형 값의 길이를 출력하라. xdbiSQL> CREATE TABLE T1 (I1 BLOB, I2 Byte(10), I3 NIBBLE(10) ); Create success. xdbiSQL> INSERT INTO T1 VALUES ( BLOB'3FD', Byte'123FD', NIBBLE'90BCD'); 1 row inserted. xdbiSQL> SELECT BINARY_LENGTH (I1), BINARY_LENGTH (I2), BINARY_LENGTH (I3) FROM T1; BINARY_LENGTH (I1) BINARY_LENGTH (I2) BINARY_LENGTH (I3) ------------------------------------------------------ 2 10 5 1 row selected. CASE2 구문 CASE2 (expr1, ret_expr1, [,expr2, ret_expr2,..,] [, default]) 설명 이 함수는 expr1이 참이면 ret_expr1 을 반환한다. 만약 expr1이 거짓이면 expr2를 계산해서 참이면 ret_expr2를 반환한다. 참인 수식이 나올 때까지 이 과정을 계속한다. 참인 수식이 나오지 않으면, default 가 반환된다. 참인 수식이 없고 default도 지정되어 있지 312 SQL Reference 않으면 NULL이 반환된다. 예제 <질의> 직원들의 급여를 출력하라. 월급여가 2000 보다 크면 ‘HIGH’를, 1500 보다 작으면 ‘LOW’을 출력하고, 급여 정보가 없으면 NULL을 출력하라. xdbiSQL> SELECT e_lastname, e_firstname, emp_job, CASE2(salary > 2000, 'HIGH', salary < 1500, 'LOW', salary IS NULL, 'NULL', TO_CHAR(salary)) Salary FROM employees; E_LASTNAME E_FIRSTNAME EMP_JOB SALARY ----------------------------------------------------------- ---------------- Moon Chan-seung CEO NULL Davenport Susan designer 1500 Kobain Ken engineer 2000 Foster Aaron PL 1800 Ghorbani Farhad PL HIGH Momoi Ryu programmer 1700 Fleischer Gottlieb manager LOW Wang Xiong manager NULL . . . 20 rows selected. CASE WHEN 구문 CASEEND simple_case_expr searched_case_exprelse_clause simple_case_expr THENexprcomparison_exprWHENreturn_expr searched_case_expr THENconditionWHENreturn_expr SQL 함수 313 else_clause else_exprELSE 설명 CASE WHEN에 searched_case_expr이 사용되면, 이는 CASE2 함수와 동일하다. 즉, 첫 번째 condition이 참이면 첫번째 return_expr을 반환한다. 명시된 condition 모두 거짓이면, else_clause가 있을 경우 else_expr이 반환되고 그렇지 않을 경우 NULL이 반환된다. 이런 방식으로 이 함수를 사용하면 여러 종류의 비교 연산자가 사용될 수 있다. CASE WHEN에 simple_case_expr 이 사용되면, expr은 동등 연산자(=)를 사용해서 각 comparison_expr과 비교될 것이다. 예제 <질의> c1 컬럼의 세 번째 문자가 a이면 ‘aaaaa’를, b이면 ‘bbbbb’를, c이면 ‘ccccc’를 출력하라. create table test (c1 char(10)); insert into test values('abcdefghi'); xdbiSQL> select CASE substring(c1,3,1) WHEN 'a' THEN 'aaaaa' WHEN 'b' THEN 'bbbbb' WHEN 'c' THEN 'ccccc' END from test; CASE SUBSTRING(C1,3,1) ------------------------- ccccc 1 row selected. DECODE 구문 DECODE (expr, comparison_expr1, ret_expr1, [, comparison_expr2, ret_expr2,..,] [, default]) 설명 DECODE 함수는 simple_case_expr이 사용된 CASE WHEN 과 동일하다. 즉, expr이 각각의 comparison_expr과 동등 연산자(=)를 사용해서 순차적으로 비교된 후, 처음으로 그 결과가 참이 되는 314 SQL Reference comparison_expr에 해당하는 ret_expr이 반환된다. 어떤 comparison_expr과의 비교도 참이 아니면, default가 반환된다. 참이 되는 comparison_expr이 없고, default도 명시되지 않았으면, NULL이 반환된다. 예제 <질의> i가 NULL 이면 ‘NULL’, 1 이면 ‘ONE’, 2 이면 ‘TWO’를 반환하라. CREATE TABLE t2(i NUMBER); INSERT INTO t2 VALUES(NULL); INSERT INTO t2 VALUES(1); INSERT INTO t2 VALUES(2); INSERT INTO t2 VALUES(3); xdbiSQL> SELECT DECODE(i, NULL, 'NULL', 1, 'ONE', 2, 'TWO') Revised_i FROM t2; REVISED_I ------------- NULL ONE TWO 4 rows selected. <질의> 모든 사원의 현재 급여를 출력하라. emp_job이 ‘engineer’이면 급여를 10% 인상, ‘sales rep’이면 12% 인상, ‘manager’이면 20% 인상하며, 그 외의 사원은 실제 급여를 출력하라. xdbiSQL> SELECT emp_job, salary, DECODE(RTRIM(emp_job, ' '), 'engineer', salary*1.1, 'sales rep', salary*1.12, 'manager', salary*1.20, salary) Revised_salary FROM employees; EMP_JOB SALARY REVISED_SALARY ------------------------------------------------ CEO designer 1500 1500 engineer 2000 2200 engineer 1800 1980 engineer 2500 2750 programmer 1700 1700 manager 500 600 . . . 20 rows selected. DIGEST 구문 DIGEST(expr, algorithm_name) SQL 함수 315 설명 이 함수는 표준 암호화 해쉬 알고리즘을 사용해서 expr의 해쉬 다이제스트를 VARCHAR타입으로 반환한다. 현재 알티베이스에서 지원하는 알고리즘은 SHA-1뿐이다. 예제 <질의> 입력 문자열에 대한 다이제스트를 SHA-1 알고리즘을 사용해서 구하라. xdbiSQL> SELECT DIGEST('I am a boy.', 'SHA-1') FROM DUAL; DIGEST('I am a boy. ', 'SHA-1') -------------------------------------------- A817613E0B781BBF01816F36A8B0DC7C98B2C0CC 1 row selected. DUMP 구문 DUMP (expr) 설명 이 함수는 입력된 자료를 분석하여 ‘자료형, 길이, 내용’의 형식으로 반환한다. 예제 <질의> 사원의 번호와 이름에 입력된 자료형에 관한 정보를 3개만 출력하라. xdbiSQL> SELECT DUMP(eno) Emp_Number, DUMP(e_lastname) Last_Name, DUMP(e_firstname) First_Name FROM employees LIMIT 3; EMP_NUMBER ----------------------------------------------------------- ----------- LAST_NAME ----------------------------------------------------------- ----------------------------------------------------------- ------------------------ FIRST_NAME ----------------------------------------------------------- ----------------------------------------------------------- ------------------------ Type=INTEGER(ASCII) Length=4: 1,0,0,0 Type=CHAR(ASCII) Length=22: 20,0,77,111,111,110,32,32,32,32,32,32,32,32,32,32,32,32,32, 32,32,32 Type=CHAR(ASCII) Length=22: 20,0,67,104,97,110,45,115,101,117,110,103,32,32,32,32,32,32 ,32,32,32,32 316 SQL Reference Type=INTEGER(ASCII) Length=4: 2,0,0,0 Type=CHAR(ASCII) Length=22: 20,0,68,97,118,101,110,112,111,114,116,32,32,32,32,32,32,32 ,32,32,32,32 Type=CHAR(ASCII) Length=22: 20,0,83,117,115,97,110,32,32,32,32,32,32,32,32,32,32,32,32, 32,32,32 Type=INTEGER(ASCII) Length=4: 3,0,0,0 Type=CHAR(ASCII) Length=22: 20,0,75,111,98,97,105,110,32,32,32,32,32,32,32,32,32,32,32, 32,32,32 Type=CHAR(ASCII) Length=22: 20,0,75,101,110,32,32,32,32,32,32,32,32,32,32,32,32,32,32,3 2,32,32 3 rows selected. GREATEST 구문 GREATEST (expr1 [, expr2, expr3…]) 설명 이 함수는 입력 표현식들 중에서 가장 큰 값, 즉 알파벳 순으로 정렬했을 때 가장 마지막에 오는 값을 반환한다. 반환형은 VARCHAR 이다. 예제 <질의> 입력 식들을 알파벳 순으로 정렬했을 때 가장 마지막에 오는 수식을 반환하라. xdbiSQL> SELECT GREATEST('HARRY', 'HARRIOT', 'HAROLD') Greatest FROM dual; GREATEST ------------ HARRY 1 row selected. LEAST 구문 LEAST(expr1 [, expr2, expr3…]) 설명 이 함수는 입력 표현식들 중에서 가장 작은 값, 즉 알파벳 순으로 정렬했을 때 가장 처음에 오는 값을 반환한다. 반환형은 VARCHAR SQL 함수 317 이다. 예제 <질의> 입력 식들을 알파벳 순으로 정렬했을 때 가장 처음에 오는 수식을 반환하라. xdbiSQL> SELECT LEAST('HARRY','HARRIOT','HAROLD') Least FROM dual; LEAST ----------- HAROLD 1 row selected. ROWNUM 구문 ROWNUM 설명 ROWNUM은 의사 레코드 번호(pseudo rownum)를 BIGINT타입으로 반환한다. 반환 범위는 1부터 BIGINT형의 최대값이다. 레코드 번호는 테이블이나 뷰에 나타나는 레코드 순서에 따라 부여된다. 그러나, ORDER BY, GROUP BY, HAVING 절이 사용되면 순서가 바뀔 수 있다. ROWNUM은 SELECT 문에는 사용할 수 있으나, UPDATE 또는 DELETE 등의 DML문에는 사용할 수 없다.3 예제 <질의> 사원 이름순으로 검색하여 앞에서 3명까지만 사원의 사번, 이름, 전화번호, 상태를 출력하라. xdbiSQL> SELECT eno, e_lastname, e_firstname, emp_tel FROM employees WHERE ROWNUM < 4 ORDER BY e_lastname; ENO E_LASTNAME E_FIRSTNAME EMP_TEL ----------------------------------------------------------- ---------------- 2 Davenport Susan 0113654540 3 UPDATE나 DELETE 문의 경우 LIMIT 절을 사용해서 ROWNUM과 같은 효과를 낼 수 있다. 예) DELETE FROM employees LIMIT 1, 10 ; 318 SQL Reference 3 Ko b ai n Ke n 01 62 58 13 69 1 Mo o n Ch an - se un g 01 1 95 66 23 65 3 rows selected. NVL 구문 NVL (expr1, expr2) 설명 이 함수는 expr1이 NULL이면 expr2를, NULL이 아니면 expr1을 그대로 반환한다. expr1의 데이터 타입은 DATE, CHAR 및 NUMBER일 수 있다. expr2와 expr1의 데이터 타입이 일치해야 한다. 예제 <질의> 모든 사원의 이름과 급여를 출력한다. 급여 데이터가 없는 사원에 대해서는 ‘NOT‘을 출력하라. xdbiSQL> SELECT e_firstname, e_lastname, NVL(TO_CHAR(salary), 'Unknown') FROM employees; E_FIRSTNAME E_LASTNAME NVL(TO_CHAR(SALARY), 'Unknown') ----------------------------------------------------------- ----------------- Chan-seung Moon Unknown Susan Davenport 1500 Ken Kobain 2000 . . . 20 rows selected. NVL2 구문 NVL2 (expr1, expr2, expr3) 설명 expr1이 NULL이 아니면 NVL2는 expr2를 반환하고, NULL이면 expr3를 반환한다. SQL 함수 319 예제 <질의> 사원의 이름과 급여를 출력하되, 급여 데이터가 있을 경우는 10% 인상된 급여를, 없을 경우는 ‘NOT‘을 출력하라. xdbiSQL> SELECT e_firstname, e_lastname, salary, NVL2(TO_CHAR(salary), TO_CHAR(salary * 1.1), 'Unknown') Nvl2_salary FROM employees; E_FIRSTNAME E_LASTNAME SALARY NVL2_SALARY ----------------------------------------------------------- --------------- Chan-seung Moon Unknown Susan Davenport 1500 1650 Ken Kobain 2000 2200 Aaron Foster 1800 1980 . . . 20 rows selected. SENDMSG 구문 SENDMSG ( VARCHAR ipaddr, INTEGER port, VARCHAR msg, INTEGER ttl ) 설명 SENDMSG는 사용자 메시지를 지정된 IP 주소와 포트 번호에 Socket datagram으로 전송한다. 일반 IP 주소를 입력하면 UDP datagram을 전송하며, Multicast IP 주소를 입력하면 Multicast datagram을 전송한다. Multicast IP 주소는 예약된 Multicast group을 제외한 225.0.0.0~238.0.0.255로 제한된다. 사용가능한 포트 번호는 1025에서 65535까지이다. msg는 최대 2048바이트를 넘을 수 없다. ttl은 TimeToLive의 준말로, 이 인자는 Multicast IP 주소로 메시지 전송시 유용하다. 이는 아래와 같이 멀티캐스트 전송시 전송 범위를 제한한다. 가능한 ttl 값의 범위는 0에서 255 까지이다. TTL 범위 320 SQL Reference 0 호스트 내부로 제한되어, 네트워크 인터페이스를 지나서 출력되지 않음. 1 동일 서브넷으로 제한되어, 라우터를 넘어서 포워딩하지 않음. < 32 동일 사이트(SITE)로 제한, 조직이나 부서로 제한됨. < 64 동일 지역(Region)으로 제한. < 128 동일 대륙으로 제한. < 255 무제한, 전세계. 반환값은 전송된 메시지의 길이를 나타내는 INTEGER형이다. 예제 <질의> 일반 IP 주소로 사용자 메시지를 전송하라 (이 경우, ttl 값은 무시된다). xdbiSQL> SELECT SENDMSG( '192.168.1.60', 12345, 'THIS IS A MESSAGE', 1 ) FROM T1; SENDMSG( '192.168.1.60', 12345, 'THIS IS ------------------------------------------- 17 1 row selected. <질의> Multicast IP 주소로 사용자 메시지를 전송하라 (이 경우, ttl 값이 적용된다). xdbiSQL> SELECT SENDMSG( '226.0.0.37', 12345, 'THIS IS A MESSAGE', 0 ) FROM T1; SENDMSG( '192.168.1.60', 12345, 'THIS IS ------------------------------------------- 17 1 row selected. USER_ID 구문 USER_ID() 설명 이 함수는 현재 접속한 사용자의 ID를 반환한다. 반환 타입은 INTEGER이다. 예제 <질의> 현재 접속한 사용자의 모든 테이블 정보를 조회하라. SELECT table_name FROM system_.sys_tables_ WHERE user_id = USER_ID(); SQL 함수 321 USER_NAME 구문 USER_NAME() 설명 이 함수는 현재 접속한 사용자의 이름을 반환한다. 반환 타입은 VARCHAR이다. 예제 <질의> 현재 접속한 사용자의 이름을 조회하라. SELECT user_name(), user_id() FROM dual; SESSION_ID 구문 SESSION_ID() 설명 이 함수는 현재 접속한 사용자의 세션 식별자를 반환한다. 반환 타입은 INTEGER이다. 예제 <질의> 현재 접속한 사용자가 사용중인 캐릭터셋을 조회하라. xdbiSQL> SELECT client_nls FROM v$session WHERE id = SESSION_ID(); CLIENT_NLS -------------------------------------------- US7ASCII 1 row selected. 중첩 함수 설명 단일 행 함수는 여러 번 중첩될 수 있다. 중첩 함수는 가장 안쪽부터 시작해서 바깥쪽으로 계산 된다. 322 SQL Reference 예제 <질의> 각 사원이 입사한 날로부터 여섯 달이 경과한 뒤 첫 번째 월요일의 날짜를 입사일 순으로 출력하라. xdbiSQL> SELECT TO_CHAR(NEXT_DAY(ADD_MONTHS(join_date, 6), 'MONDAY'), 'DD-Mon-YYYY') Monday_six_months FROM employees ORDER BY join_date; MONDAY_SIX_MONTHS -------------------------------------- 26-Jul-2004 21-May-2007 05-May-2008 24-May-2010 . . . 20 rows selected. SQL 함수 323 암호화 함수 알티베이스는 문자열을 암호화 하거나 암호화 된 문자열을 복호화하는 함수를 제공한다. 알티베이스에 사용된 암복호화 알고리즘은 DES(Data Encryption Standard)이다. 알티베이스는 8바이트 블록 암호화 알고리즘으로 CBC(Cipher Block Chaining)을 사용한다. DESENCRYPT 구문 DESENCRYPT (VARCHAR expr, VARCHAR key_string) 설명 expr: 암호화할 문자열이다. 이 문자열의 길이는 8의 배수이어야 한다. key_string: 암호화 키로 사용할 문자열이다. 이 문자열의 최소 길이는 8이다. 9번째와 이후의 문자는 무시된다. 예제 아래 DESDECRYPT 예제를 참조한다. DESDECRYPT 구문 DESDECRYPT (VARCHAR encrypted_string, VARCHAR key_string) 설명 encrypted_string: 복호화할 문자열이다. 이 문자열의 길이는 8의 배수이어야 한다. key_string: 암호화 키로 사용되었던 문자열이다. 이 문자열의 최소 길이는 8이다. 9번째와 이후의 문자는 무시된다. 324 SQL Reference * 주의: 암호화된 문자열을 화면에 출력하면 터미널 에뮬레이터 오류가 발생할 수 있다. 예제1 암호화한 텍스트를 테이블에 저장 및 복호화하여 출력하라. create table t1( encrypted_string varchar(40) ); 1) 암호화한 텍스트를 테이블에 삽입하기 xdbiSQL> insert into t1 values( desencrypt( 'A4 ALTIBASE Corporation.', 'altibase' ) ); 1 row inserted. 2) 암호화된 텍스트를 조회하면 알아볼 수 없을 것이다. xdbiSQL> select * from t1; T1.ENCRYPTED_STRING -------------------------------------------- Z\uf900\u5b87\ub94c]\uffff\uffffu\uffffxE\uffffIXek \uffff 1 row selected. 3) 암호화 할 때 사용한 것과 동일한 키를 이용하여 암호화된 텍스트를 복호화해서 출력하라. xdbiSQL> select desdecrypt(encrypted_string, 'altibase') from t1; DESDECRYPT(ENCRYPTED_STRING, 'altibase') -------------------------------------------- A4 ALTIBASE Corporation. 1 row selected. 예제2 암호화할 문자열의 길이가 8의 배수이고 키 문자열의 최소 길이가 8이어야 하는 제한 없이 암복호화를 시도하라. create table t1( encrypted_string varchar(40) ); 1) 원문의 길이가 8의 배수가 아니기 때문에 에러가 발생할 것이다. xdbiSQL> insert into t1 values( desencrypt( 'Altibase Client Query utility.', 'altibase' ) ); [ERR-2100D : Invalid data type length] 2) 원문의 길이는 8의 배수이나, key의 길이가 8보다 짧아서 에러가 발생할 것이다. xdbiSQL> insert into t1 values( desencrypt( 'Altibase Client Query utility...', 'alti4' ) ); [ERR-2100D : Invalid data type length] 3) RPAD를 사용해서 원문의 길이를 8의 배수로 맞추고, key의 길이를 8로 맞추는 저장 함수를 생성하라. xdbiSQL> create or replace function my_encrypt( input_string in varchar(100), key_string in varchar(40) ) 2 return varchar(100) 3 as SQL 함수 325 4 encrypted_string varchar(100); 5 pieces_of_eight INTEGER; 6 begin 7 pieces_of_eight := ((FLOOR(LENGTH(input_string)/8 + .9)) * 8); 8 9 encrypted_string := desencrypt( RPAD( input_string, pieces_of_eight), 10 RPAD( key_string, 8, '#' ) ); 11 return encrypted_string; 12 end; 13 / Create success. 4) RPAD를 사용해서 key의 길이를 8로 맞춘 다음 복호화하고, 복호화된 텍스트를 trim하는 저장 함수를 생성하라. xdbiSQL> create or replace function my_decrypt( input_string in varchar(100), key_string in varchar(40) ) 2 return varchar(100) 3 as 4 decrypted_string varchar(100); 5 begin 6 decrypted_string := desdecrypt( input_string, 7 RPAD( key_string, 8, '#' ) ); 8 9 return trim(decrypted_string); 10 end; 11 / Create success. 5) 이제 사용자 정의 저장 함수 my_encrypt()를 사용해서 길이가 8의 배수가 아닌 문자열을 암호화하여 저장하라. xdbiSQL> insert into t1 values( my_encrypt( 'Altibase Client Query utility.', 'altibase' ) ); 1 row inserted. 6) 사용자 정의 저장 함수 my_decrypt()를 사용해서 암호화된 텍스트를 복호화하라. xdbiSQL> select my_decrypt( encrypted_string, 'altibase' ) from t1; MY_DECRYPT( ENCRYPTED_STRING, 'altibase' ----------------------------------------------------------- --------------------------------------------- Altibase Client Query utility. 1 row selected. xdbiSQL> delete from t1; 1 row deleted. 7) 길이가 8보다 짧은 key를 사용해서 문자열을 암호화하고 저장하는데 저장 함수 my_encrypt를 사용할 수 있다. xdbiSQL> insert into t1 values( my_encrypt( 'Altibase Client Query utility...', 'alti4' ) ); 1 row inserted. 8) 문자열을 조회하고 복호화하는데 저장 함수 my_decrypt를 사용하라. 암호화시 사용되었던 키가 복호화할 때도 사용된다. 키의 326 SQL Reference 길이가 8보다 짧아도 상관없다. xdbiSQL> select my_decrypt( encrypted_string, 'alti4' ) from t1; MY_DECRYPT( ENCRYPTED_STRING, 'alti4' ) ------------------------------------------------ Altibase Client Query utility... 1 row selected. 산술 연산자 327 7. 산술 연산자 이 장에서는 SQL문에 사용되는 산술연산자들에 대해서 자세히 설명한다. 328 SQL Reference 산술 연산자 산술 연산자는 숫자 값에 대해 부호를 붙이거나, 더하기, 빼기, 곱하기, 및 나누기를 하는데 사용되는 연산자이다. 이런 연자자들 중 일부는 날짜 데이터에 대한 계산을 수행하는데 사용될수도 있다. 산술 연산자는 숫자 데이터 타입 또는 내부적으로 숫자형으로 변환이 가능한 데이터 타입에 대해서 수행될 수 있다. 산술 연산자의 종류 다음은 알티베이스에서 지원하는 산술 연산자의 종류와 이에 대한 간단한 설명이다. 산술 연산자 설명 단항 연산자(+) 명시적으로 양수를 나타낸다 단항 연산자(-) 입력 수의 부호를 반전시킨다 이항 연산자(사칙) 두 입력 수에 대해 계산한다 연결 연산자 두 문자열을 합친다 산술 연산자 329 단항 연산자 양수 부호 구문 + number 설명 이 연산자는 입력된 number를 명시적으로 양수로 표시한다. 음수 부호 구문 - number 설명 이 연산자는 입력한 number의 부호를 반전시킨다. 330 SQL Reference 이항 연산자 더하기 구문 number1 + number2 설명 이 연산자는 number1 와 number2 를 더한 결과를 돌려준다. 빼기 구문 number1 - number2 설명 이 연산자는 number1에서 number2를 뺀 결과를 돌려준다. 곱하기 구문 number1 x number2 설명 이 연산자는 number1과 number1를 곱한 결과를 돌려준다. 나누기 구문 number1 / number2 산술 연산자 331 설명 이 연산자는 number1를 number2로 나눈 결과를 돌려준다. 날짜 타입의 데이터에 산술 연산 수행 구문 DATE 타입의 값에 수를 더하거나 뺄 때, 그 수는 일 단위로 해석된다. 그러므로, DATE 타입 값에 시, 분, 또는 초를 더하거나 빼려면 더하거나 빼고자 하는 시, 분, 초의 숫자를 아래와 같이 일로 변환해서 입력해야 한다. date [ + | - ] n date - date date [ + | - ] days (더하기/빼기 n일: n) date [ + | - ] hours (더하기/빼기 n시간: n/24) ) date [ + | - ] minutes (더하기/빼기 n분: n/(24*60) ) date [ + | - ] seconds (더하기/빼기 n초: n/(24*60*60)) DATE 타입 값에 대한 곱하기 또는 나누기 연산은 불가능하다. 예제 <질의> 부서 4001에 속한 모든 사원의 이름 및 근무한 주 수를 출력하라. xdbiSQL> SELECT e_firstname, e_lastname, (SYSDATE- join_date)/7 Weeks_worked FROM employees WHERE dno = 4001; E_FIRSTNAME E_LASTNAME WEEKS_WORKED ----------------------------------------------------------- ------------ Xiong Wang 115.778199044248 Curtis Diaz 87.6353419013905 John Huxley 224.492484758533 3 rows selected <질의> 현재 시간에서 10분 후의 시간을 출력하라. xdbiSQL> SELECT SYSDATE + (10/(24*60)) '10 MINUTES LATER' FROM dual; 10 MINUTES LATER ----------------------- 2005/01/20 09:59:34 1 row selected. 332 SQL Reference 연결 연산자 구문 char1 || char2 설명 이 연산자는 두개의 문자열 char1과 char2를 합친다. 예제 <질의> 사원 이름과 직책사이에 ‘ is a ’를 삽입하여 하나의 칼럼으로 출력하라. xdbiSQL> SELECT RTRIM(e_firstname) || ' ' || RTRIM(e_lastname) || ' is a ' || emp_job || '.' Job_Description FROM employees; JOB_DESCRIPTION ----------------------------------------------------------- -------- . . . Aaron Foster is a PL. Farhad Ghorbani is a PL. Ryu Momoi is a programmer. Gottlieb Fleischer is a manager. . . . 20 rows selected. 산술 연산자 333 CAST 연산자 구문 CAST (expr AS data_type) 설명 이 연산자는 expr을 명시적으로 주어진 data_type의 값으로 변환한다. (BLOB과 CLOB 타입을 제외한 모든 타입이 지원된다.) 예제 <질의> 문자열을 DOUBLE타입의 값으로 변환하라. xdbiSQL> SELECT CAST(‘3.14159265359’ AS DOUBLE) PI FROM dual; PI ------------------------- 3.14159265359 1 row selected. 조건 연산자 335 8. 조건 연산자 이장에서는 SQL문에 사용되는 조건 연산자들에 대해서 자세히 설명한다. 336 SQL Reference SQL 조건의 개요 SQL 조건은 한 개 이상의 논리 연산자와 수식으로 구성된다. 조건의 반환 값은 TRUE, FALSE, 또는 UNKOWN 셋 중의 하나이다. 조건은 SELECT 구문의 다음 절에 사용될 수 있다: WHERE START WITH CONNECT BY HAVING 또한, 조건은 DELETE 또는 UPDATE 구문의 WHERE 절에도 사용될 수 있다. 이 절은 다양한 종류의 조건에 대해서 상세히 설명한다. 논리 조건 다음의 논리 조건들이 알티베이스에서 지원된다. 다음 표는 각각에 대한 간략한 설명을 보여준다. 논리 연산자 설명 논리곱 (AND) 입력 조건들의 논리곱 결과를 돌려준다. 두 조건이 모두 TRUE이면 TRUE를 반환한다. 둘 중 하나라도 FALSE이면 FALSE를 반환한다. 부정 (NOT) 입력된 값의 반대 결과를 돌려준다. 논리합 (OR) 입력 조건들의 논리합 결과를 돌려준다. 두 조건이 모두 FALSE이면 FALSE를 반환한다. 둘 중 하나라도 TRUE이면 TRUE를 반환한다. 비교 조건 비교 조건은 단순 비교와 그룹 비교로 분류될 수 있다. 단순 비교 조건은 한 수식이 한 수식과 비교되는 것이다. 그룹 비교 조건은 한 수식이 여러 수식들과 비교되거나 부질의에 의해 반환되는 다수의 행과 비교되는 것이다. 조건 연산자 337 그 외의 조건 알티베이스에서 지원되는 다른 조건들이 다음 표에 간략히 설명되어 있다. 조건 타입 설명 BETWEEN 조건 BETWEEN 조건은 비교 조건의 일종으로 어떤 값이 일정 범위 내에 속하는지 검사한다. EXISTS 조건 EXISTS 조건은 부질의가 적어도 하나 이상의 행을 반환하는지 검사한다. IN 조건 IN 조건은 어떤 값이 리스트 또는 부질의가 반환한 결과 중의 하나 이상의 값과 같은지 검사한다. NOT IN 조건은 어떤 값이 리스트 또는 부질의가 반환한 결과 중의 모든 값과 같지 않은지를 검사한다. IS NULL 조건 IS NULL 조건은 어떤 값이 널인지 검사한다. LIKE 조건 LIKE 조건은 패턴 일치 검사 조건으로 문자열이 주어진 패턴을 포함하는지 검사한다. UNIQUE 조건 UNIQUE 조건은 부질의가 오직 하나의 행을 반환하는지 검사한다. 338 SQL Reference 논리 연산자 AND 구문 condition1 AND condition2 설명 AND는 condition1과 condition2를 논리곱 연산한 결과를 돌려준다. 논리곱 연산의 결과는 다음과 같다. Condition1 Condition2 TRUE FALSE UNKNOWN TRUE TRUE FALSE UNKNOWN FALSE FALSE FALSE FALSE UNKNOWN UNKNOWN FALSE UNKNOWN 예제 <질의> 엔지니어이면서 급여가 2000 이상인 직원의 이름, 급여, 입사일을 출력하라. xdbiSQL> SELECT e_firstname, e_lastname, salary, join_date FROM employees WHERE emp_job = 'engineer' AND salary >= 2000; E_FIRSTNAME E_LASTNAME SALARY JOIN_DATE ----------------------------------------------------------- --------------- Ken Kobain 2000 11-JAN-2010 1 row selected. NOT 구문 NOT condition 조건 연산자 339 설명 NOT은 입력 condition의 반대 결과를 돌려준다. Condition TRUE FALSE UNKNOWN NOT 결과 FALSE TRUE UNKNOWN 예제 <질의> 1980년 이전에 태어난 사원을 제외한 사원들의 이름, 부서, 생일을 출력하라. xdbiSQL> SELECT e_lastname, e_firstname, dno, birth FROM employees WHERE NOT birth 재고 수량이 20000 이상이거나 단가가 100000원 이상인 상품의 데이터를 출력하라. 340 SQL Reference xdbiSQL> SELECT * FROM goods WHERE stock > 20000 OR price >= 100000; GOODS.GNO GOODS.GNAME GOODS.GOODS_LOCATION GOODS.STOCK ------------------------------------------------ GOODS.PRICE -------------- C111100001 IT-U950 FA0001 35000 7820.55 D111100008 TM-U200 AC0006 61000 10000 E111100004 M-190G CE0001 88000 5638.76 E111100012 M-U420 CE0003 43200 3566.78 F111100001 AU-100 AC0010 10000 100000 5 rows selected. 조건 연산자 341 비교조건 비교조건은 한 수식이 한개 또는 여러 개의 수식과 비교되는지에 따라서 크게 단순 비교조건과 그룹 비교조건으로 분류될 수 있다. 단순 비교 조건 구문 simple_comparison_condition ::= = != > = <= expr ()subquery = != expr ()subquery (subquery) (expr) , (subquery) (expr) , 설명 단순 비교 조건은 명시된 연산자를 기준으로 양쪽의 수식을 비교하여 TRUE, FALSE 또는 UNKNOWN을 반환한다. 단순 비교 조건은 두 식의 크기를 비교하는 것과 두 식이 동일한지를 판단하는 것으로 분류될 수 있다. 두 개 이상의 수식이 연산자의 양쪽에 존재할 때 (위의 다이어그램에서 아래쪽에 해당), 오직 동등 비교만 수행될 수 있다. 즉, 크기 비교는 불가능하다. 342 SQL Reference 또한, 연산자 왼쪽의 수식 개수는 오른쪽 수식의 개수와 동일해야 한다. 이 규칙은 수식이 부질의(subquery) 형태로 올 경우 SELECT 목록의 개수에도 적용된다. 게다가, 부질의가 단순 비교에 사용될 때 이는 오직 한 레코드만 반환해야 한다. 예제 <질의> 재고금액이 1억원 이상인 상품의 품명, 보관수량, 원가, 재고금액을 출력하라. (재고금액은 보관수량 * 원가이다.) xdbiSQL> SELECT gname, stock, price, stock*price value_of_inv FROM goods WHERE stock*price > 100000000; GNAME STOCK PRICE VALUE_OF_INV ------------------------------------------------ IT-U950 35000 7820.55 273719250 TM-T88 10000 72000 720000000 TM-U950 8000 96200 769600000 . . . 11 rows selected. 조건 연산자 343 그룹 비교 조건 구문 group_comparison_condition ::= = != > = <= expr ()subquery ( = != expr) , ()expr , subquery() () , ANY SOME ALL expr , () ANY SOME ALL 설명 그룹 비교 조건에서는 왼쪽의 수식이 오른쪽의 각 수식 또는 부질의 결과와 비교된다. 다수의 행을 반환하는 부질의도 허용된다. 연산자 왼쪽에 두 개 이상의 수식이 올 경우, 오직 동등 비교만 수행될 수 있고, 크기 비교는 불가능하다. 또한, 오른쪽 수식에는 그룹으로 묶기 위해서 괄호를 사용해야 한다. 각 그룹내의 요소들의 개수 또는 부질의에 의해 반환되는 칼럼의 개수는 왼쪽 수식의 개수와 동일해야 한다. ANY / SOME ANY와 SOME 키워드는 같은 의미를 가지고 있다. 이 키워드를 포함하는 그룹 비교 조건은 왼쪽 수식과 오른쪽 수식들 또는 부질의 결과 중 적어도 하나의 수식과 비교한 결과가 TRUE이면, TRUE를 반환한다. 344 SQL Reference ALL ALL 키워드를 포함하는 그룹 비교 조건은 왼쪽의 수식과 오른쪽의 수식들 또는 부질의 결과 모두를 비교해서 모든 경우에 대해서 TRUE일때, TRUE를 반환한다. 예제 <질의> 성이 “B”로 시작되는 사원이 받은 모든 주문에 대한 정보를 출력하라. xdbiSQL> SELECT ono, order_date, processing FROM orders WHERE eno = ANY (SELECT eno FROM employees WHERE e_lastname LIKE 'B%'); ONO ORDER_DATE PROCESSING -------------------------------------------------- 12300003 29-DEC-2011 P 12300004 30-DEC-2011 P 12300006 30-DEC-2011 P 12300008 30-DEC-2011 P 12300009 30-DEC-2011 P 12300011 30-DEC-2011 P 12300013 30-DEC-2011 P 12310001 31-DEC-2011 O 12310003 31-DEC-2011 O 12310005 31-DEC-2011 O 12310006 31-DEC-2011 O 12310010 31-DEC-2011 O 12 rows selected. 조건 연산자 345 그 외의 조건 BETWEEN 구문 between_condition ::= expr NOT BETWEENexprANDexpr 설명 BEETWEEN 비교는 어떤 값이 주어진 범위에 속하는지를 체크하기 위해 사용된다. ‘column1 between x1 and x2’는 ‘column1 >= x1 and column1 <= x2’와 논리적으로 동일하다. 예제 <질의> 재고금액이 100만원 이상 1000만원 이하인 상품의 품명, 보관수량, 원가, 재고금액을 출력하라. (재고금액은 보관수량 * 원가이다.) xdbiSQL> SELECT gname, stock, price, stock*price value_of_inv FROM goods WHERE stock*price BETWEEN 1000000 AND 10000000; GNAME STOCK PRICE VALUE_OF_INV ------------------------------------------------ IM-310 100 98000 9800000 . . . M-T500 5000 1000.54 5002700 7 rows selected. 346 SQL Reference EXISTS 구문 exists_condition ::= EXISTSsubquery() 설명 EXIST는 부질의의 결과가 적어도 하나 이상 존재하는지 검사한다. 적어도 하나의 행이 존재하면 EXIST는 TRUE를 반환한다. 예제 <질의> 적어도 두 종류 이상의 상품을 주문한 고객의 고객번호를 출력하라. (먼저 부질의에서는 주문 테이블에서 같은 고객번호이지만 다른 상품을 주문한 행의 쌍을 모두 찾는다. 즉, 한 고객이 한 개 이상의 다른 상품을 주문한 것을 의미한다. 만약, 그러한 행의 쌍이 존재하면, EXISTS는 TRUE를 반환하고, 그 고객번호는 출력된다.) xdbiSQL> SELECT DISTINCT cno FROM orders a WHERE EXISTS (SELECT * FROM orders b WHERE a.cno = b.cno AND NOT(a.gno = b.gno)); CNO ------------------ 19 15 14 11 6 5 3 2 1 9 rows selected. <질의> 모든 상품을 주문한 고객의 이름을 출력하라. 맨 아래쪽에 위치하는 가장 안쪽 질의는 주문 테이블에서 고객이 주문한 상품들을 찾는다. 가운데 질의는 그 고객에 의해 주문되지 않은 상품을 찾는다. 만약, 그 고객에 의해 주문되지 않은 상품이 없으면 그 고객의 이름이 출력될 것이다.) xdbiSQL> SELECT customer.cname FROM customers WHERE NOT EXISTS (SELECT * 조건 연산자 347 FROM goods WHERE NOT EXISTS (SELECT * FROM orders WHERE orders.cno = customers.cno AND orders.gno = goods.gno)); CNAME ------------------------ No rows selected. 348 SQL Reference IN 구문 in_condition ::= expr NOT IN ( ()expr , subquery()NOT IN())expr , , ()expr , subquery() 설명 IN 조건은 ‘= ANY’ 조건을 사용한 그룹 비교와 동일하다. 이런 종류의 조건은 왼쪽의 수식이 오른쪽 수식들 중 어느 하나와 일치하면 TRUE를 반환한다. NOT IN 조건은 ‘!= ALL’ 조건을 사용한 그룹 비교와 동일하다. 이런 종류의 조건은 오른쪽 수식들 중 어느 하나도 왼쪽 수식과 일치하지 않을 때 TRUE를 반환한다. 예제 <질의> 응용프로그램 개발 팀 또는 마케팅 팀에서 일하고 있는 사원의 이름, 업무, 전화번호, 입사일을 출력하라. xdbiSQL> SELECT e_firstname, e_lastname, emp_job, emp_tel FROM employees WHERE dno IN (1003, 4001); E_FIRSTNAME E_LASTNAME EMP_JOB EMP_TEL ----------------------------------------------------------- ---------------- Elizabeth Bae programmer 0167452000 . 조건 연산자 349 . . 7 rows selected. 위 SQL문의 WHERE 절은 다음과 같은 의미를 지닌다: WHERE DNO = 1003 or DNO = 4001 <질의> 상품 C111100001을 주문한 고객의 이름을 출력하라. xdbiSQL> SELECT DISTINCT customers.c_lastname, customers.c_firstname FROM customers WHERE customers.cno IN (SELECT orders.cno FROM orders WHERE orders.gno = 'C111100001'); C_LASTNAME C_FIRSTNAME ----------------------------------------------- Martin Pierre Fedorov Fyodor Dureault Phil Sanchez Estevan 4 rows selected. INLIST 구문 isnull_condition ::= NOT (exprcomma_separated_values),INLIST‘‘ 설명 INLIST는 comma_separated_values내 각각의 값들 중 어느 하나가 expr과 일치하면 TRUE를 반환한다. NOT INLIST는 comma_separated_values내 각각의 값들 중 어느 것도 expr과 일치하지 않으면 TRUE를 반환한다. comma_separated_values내의 각 값은 ASCII 문자로만 이루어진 문자열이어야 한다. 예제 xdbiSQL> SELECT dno, e_firstname, e_lastname FROM employees WHERE INLIST (dno, '1003,4001' ); DNO E_FIRSTNAME E_LASTNAME ----------------------------------------------------------- - 1003 Elizabeth Bae 1003 Zhen Liu 1003 Yuu Miura 350 SQL Reference 10 03 Ja so n Da ve np or t 40 01 Xi on g Wa ng 4001 Curtis Diaz 4001 John Huxley 7 rows selected. IS NULL 구문 isnull_condition ::= expr NOT ISNULL 설명 IS NULL 조건은 표현식(expression)이 널(NULL) 인지 아닌지 검사하기 위해 사용된다. 예제 <질의> 생일이 입력 되지 않은 직원의 사원번호, 이름, 업무를 출력하라. xdbiSQL> SELECT eno, e_firstname, e_lastname, emp_job FROM employees WHERE salary IS NULL; ENO E_FIRSTNAME E_LASTNAME EMP_JOB ----------------------------------------------------------- ---------------- 1 Chan-seung Moon CEO 8 Xiong Wang manager 20 William Blake sales rep 3 rows selected. LIKE 구문 like_condition ::= 조건 연산자 351 expr NOT LIKEexpr ESCAPE'indexdesc_hint' 설명 LIKE는 패턴 일치 검사 조건으로 어떤 문자열이 주어진 일련의 문자들(패턴)을 포함하는지를 검사한다. 퍼센트(“%”)와 밑줄(“_”) 문자는 LIKE 조건에서 와일드카드 문자로 사용된다. “%”는 문자열을 나타내고, “_”는 한 문자를 나타낸다. 와일드카드로 사용하지 않고 실제 문자 “%” 또는 “_”를 찾고 싶으면, escape 문자를 정의하기 위해 LIKE 조건의 뒤에 ESCAPE 키워드를 사용하고 이 escape 문자를 “%” 또는 “_” 앞에 덧붙여라. 이렇게 하면 와일드카드 문자로 다뤄지지 않는다. 예제 <질의> 성이 “D”로 시작되는 직원들의 사원번호, 이름, 부서번호, 전화번호 출력하라. xdbiSQL> SELECT eno, e_lastname, e_firstname, dno, emp_tel FROM employees WHERE e_lastname LIKE 'D%'; ENO E_LASTNAME E_FIRSTNAME DNO EMP_TEL ----------------------------------------------------------- ----------------- 2 Davenport Susan 0113654540 9 Diaz Curtis 4001 0165293668 15 Davenport Jason 1003 0119556884 3 rows selected. <질의> 부서 이름에 밑줄(_)이 포함된 모든 부서에 대한 정보를 출력하라. xdbiSQL> INSERT INTO departments VALUES(5002, 'USA_HQ', 'Palo Alto', 100); 1 row inserted. xdbiSQL> SELECT * FROM departments WHERE dname LIKE '%\_%' ESCAPE '\'; DNO DNAME DEP_LOCATION MGR_NO ----------------------------------------------------------- ---------------- 5002 USA_HQ Palo Alto 100 1 row selected. 위 예제에서 백슬래시 (“\”)가 escape 문자로 정의되었다. 이 escape 문자가 밑줄(“_”) 앞에 있으므로 밑줄이 와일드카드로 다뤄지지 않는다. 352 SQL Reference <질의> 이름에 “h”가 들어간 모든 사원의 이름을 출력하라. xdbiSQL> SELECT e_firstname FROM employees WHERE e_firstname LIKE '%h%'; E_FIRSTNAME ------------------------ Chan-seung Farhad Elizabeth Zhen Mitch Takahiro John 7 rows selected. UNIQUE 구문 unique_condition ::= UNIQUEsubquery() 설명 UNIQUE는 부질의가 오직 하나의 레코드만 반환하는지 검사한다. 예제 <질의> CEO가 오직 한명이면, 다음의 메시지를 출력하라: “This is only one CEO.” xdbiSQL> SELECT 'There is only one CEO.' message FROM dual WHERE UNIQUE (SELECT * FROM employees WHERE emp_job = 'CEO'); MESSAGE -------------------------- There is only one CEO. 1 row selected. <질의> 고객 테이블에 여성이 한명만 있을 경우 다음의 메시지를 출력하라: 'There is only one female customer.' xdbiSQL> SELECT 'There is only one female customer.' message FROM dual WHERE UNIQUE (SELECT * FROM customers 조건 연산자 353 WHERE SEX = 'F'); ENAME ------------------------ No rows selected. 찾아보기 355 찾아보기 A ABS function ...................................... 259 ACOS function ................................... 259 ADD_MONTHS function ..................... 290 aggregate functions ........................... 252 ALL PRIVILEGES 절 ............................. 154 ALTER DATABASE statement ................ 18 ALTER INDEX statement ....................... 23 ALTER QUEUE ...................................... 26 ALTER REPLICATION statement ............ 27 ALTER SEQUENCE statement ................ 31 ALTER SESSION statement .................. 228 ALTER SYSTEM statement .................. 230 ALTER TABLE statement ....................... 34 ALTER TABLESPACE statement ............. 55 ALTER TRIGGER statement ................... 59 ALTER USER statement ......................... 61 ALTER VIEW statement ......................... 63 Altibase object ..................................... 10 AND ................................................... 338 Arithmetic Operators .......................... 328 AS SELECT .......................................... 105 ASC 절 ................................................. 74 ASCII function .................................... 273 ASCIISTR ............................................ 300 ASIN function ..................................... 260 ATAN function ................................... 260 ATAN2 function ................................. 261 AVG function ..................................... 252 B BETWEEN ........................................... 345 BIN_TO_NUM function ....................... 300 BINARY_LENGTH function .................. 311 BITAND .............................................. 271 BITNOT ............................................... 272 BITOR ................................................. 271 BITXOR ............................................... 272 BTREE .................................................. 75 C CACHE 절 ...................................... 32, 84 CASCADE .......................................... 102 of DROP TABLE ................................... 140 of DROP USER .................................... 145 CASCADE CONSTRAINTS ................... 167 CASE WHEN function ........................ 312 CASE2 function ................................. 311 CAST 연산자 ...................................... 333 CBC(Cipher Block Chaining) ............... 323 CEIL function ..................................... 261 CHAR_LENGTH function .................... 273 character functions ............................ 273 CHARACTER_LENGTH function .......... 273 CHR function ..................................... 274 comment ............................................... 9 COMMENT statement .......................... 65 COMMIT statement ........................... 232 comparison conditions ....................... 341 CONCAT function .............................. 275 Concatenation Operator .................... 332 CONNECT BY 절 ................................ 196 constraint ............................................ 10 conversion functions .......................... 300 CONVERT .......................................... 301 COS function ..................................... 262 COSH function ................................... 262 COUNT function ................................ 252 CREATE DATABASE statement ............. 67 CREATE DIRECTORY statement ............ 70 CREATE INDEX statement .................... 72 CREATE REPLICATION statement ......... 81 CREATE SEQUENCE statement ............. 83 CREATE SYNONYM statement ............. 90 CREATE TABLE statement .................... 94 CREATE TEMPORARY TABLESPACE statement ...................................... 113 CREATE TRIGGER statement .............. 118 CREATE USER statement .................... 125 CREATE VIEW statement.................... 128 356 SQL User’s Manual CYCLE ............................................ 32, 84 D DATEADD function ............................ 290 DATEDIFF function ............................ 291 DATENAME function ......................... 292 DATEPART function ........................... 293 Datetime Functions ............................ 290 DECODE function .............................. 313 DEFAULT 절..........................................51 DELETE statement ............................. 172 DEQUEUE statement ......................... 224 DES(Data Encryption Standard) ......... 323 DESC 절 ...............................................74 DESDECRYPT function ....................... 323 DESENCRYPT function ....................... 323 DIGEST function ................................ 314 DIGITS function ................................. 275 directory ...............................................10 DISABLE ...............................................47 DROP CONSTRAINT 절 .........................47 DROP DATABASE statement .............. 132 DROP DIRECTORY statement ............. 133 DROP INDEX statement ..................... 134 DROP PRIMARY KEY .............................47 DROP QUEUE statement .................... 135 DROP REPLICATION statement .......... 136 DROP SEQUENCE statement .............. 137 DROP SYNONYM statement .............. 138 DROP TABLE statement ..................... 140 DROP TABLESPACE statement ........... 142 DROP TRIGGER statement ................. 144 DROP UNIQUE ......................................47 DROP USER statement ....................... 145 DROP VIEW statement ....................... 147 DUMP function .................................. 315 E ENABLE ................................................47 Encryption Function ........................... 323 ENQUEUE statement ......................... 223 EXCLUSIVE lock mode ....................... 182 execution plan tree ................................. 8 EXISTS ............................................... 346 EXP function ...................................... 263 EXTRACT function .............................. 293 F FLOOR function ................................. 263 FOR UPDATE 절 ................................. 198 FORCE of CREATE VIEW ................................ 129 FULL SCAN hint .................................. 175 functions ............................................ 250 G GRANT statement .............................. 148 GREATEST function ............................ 316 GROUP BY 절 .................................... 197 H HAVING 조건 ..................................... 197 HEX_TO_NUM function ..................... 301 Hierarchical query 절 .......................... 195 HINTS ................................. 174, 199, 218 I IGNORE LOOP .................................... 196 IN 348 INCREMENT BY 절 ......................... 32, 84 index .................................................... 10 INDEX ASC hint .................................. 175 INDEX DESC hint ................................ 175 INDEX hint ......................................... 175 index_partitioning_clause .................... 74 INITCAP function ................................ 276 In-line view ........................................ 195 INLIST ................................................. 349 INSERT statement ............................... 177 INSTR function ................................... 277 INSTRB function ................................. 277 INTERSECT set operator ..................... 244 INTERSECT 집합 연산자 ...................... 197 IS NULL .............................................. 350 K keyword ............................................... 12 찾아보기 357 L LAST_DAY function ............................ 296 LEAST function ................................... 316 LENGTH function ................................ 273 LENGTHB function.............................. 280 LEVEL ................................................. 196 LIKE .................................................... 350 LIMIT 절 ............................................. 198 LN function ........................................ 264 LOCALUNIQUE ..................................... 74 LOCK TABLE statement ...................... 181 LOG function ..................................... 264 logical conditions ............................... 338 LOWER function ................................. 278 LPAD function .................................... 278 LTRIM function ................................... 279 M MAX function..................................... 253 MAXVALUE 절 ............................... 32, 84 MIN function ...................................... 253 MINUS set operator ............................ 245 MINUS 집합 연산자 ............................. 197 MINVALUE 절 ................................ 32, 84 MOD function .................................... 265 MONTHS_BETWEEN function ............. 294 N Naming Rule ........................................ 10 NCHR function ................................... 280 NEXT_DAY function ........................... 297 NO ACTION ........................................ 102 NO FORCE of CREATE VIEW ................................ 129 NO INDEX hint ................................... 175 NOT ................................................... 338 NOT NULL .................................... 46, 101 NOWAIT ............................................. 182 NULL .................................................... 46 NULL .................................................. 101 numeric functions .............................. 259 NVL function ...................................... 318 NVL2 function .................................... 318 O OCT_TO_NUM function ..................... 302 OCTET_LENGTH function ................... 280 OR ..................................................... 339 ORDER BY 절 ..................................... 197 OUTER JOIN 절 .................................. 194 P parallel_clause ..................................... 76 PERSISTENT ....................................... 101 PERSISTENT 인덱스 변경 ....................... 24 PERSISTENT 절 ............................... 46, 75 POSITION function ............................. 277 POWER function ................................ 265 PRIMARY KEY .................................... 101 prior 연산자 ....................................... 196 private synonym ................................... 91 public synonym .................................... 91 Q QUICKSTART........................................ 28 R RANDOM function ............................. 266 READ COMMITTED ............................ 238 READ ONLY ....................................... 238 READ WRITE ...................................... 238 RENAME TABLE statement................. 163 RENAME TO 절 .................................... 47 REPEATABLE READ ............................ 238 REPLACE2 function ............................ 281 REPLICATE function ........................... 282 replication ............................................ 10 reserved word ...................................... 12 REVERSE_STR function ...................... 288 REVOKE statement ............................ 165 ROLLBACK statement ........................ 235 ROUND .............................................. 295 ROUND function ................................ 266 ROW EXCLUSIVE lock mode ............... 182 ROW SHARE lock mode ..................... 182 row_movement_clause ...................... 105 ROWNUM ......................................... 317 RPAD function ................................... 282 358 SQL User’s Manual RTRIM function .................................. 283 S SAVEPOINT statement ....................... 233 SELECT statement .............................. 186 select_list ........................................... 194 SENDMSG function ........................... 319 sequence ..............................................10 SERIALIZABLE .................................... 239 SESSION_ID function ......................... 321 set operators ..................................... 241 SET TRANSACTION statement ............ 238 SHARE lock mode .............................. 182 SHARE ROW EXCLUSIVE lock mode ... 182 SHARE UPDATE lock mode ................ 182 SIGN function .................................... 267 SIN function ....................................... 268 SINH function .................................... 269 SIZEOF function ................................. 284 SQL ........................................................ 8 SQL 조건 ............................................ 336 SQL 함수 분류 .................................... 250 SQL 함수 소개 .................................... 250 SQL문 분류 ...........................................14 SQRT function ................................... 269 START ...................................................28 START WITH 절 ............................84, 195 STDDEV function ............................... 254 STOP ....................................................29 stored procedure ..................................10 string functions .................................. 273 STUFF function .................................. 288 subquery ................................................ 8 SUBSTR function ................................ 284 SUBSTRB function ...................... 284, 285 SUBSTRING function .......................... 284 SUM function .................................... 254 SYNC ....................................................28 synonym ...............................................10 SYSDATE function ..................... 297, 298 system privilege ................................. 150 T table .....................................................10 table_constraint ................................. 102 table_partitioning_clauses .................. 103 tablespace ............................................ 10 TAN function ..................................... 269 TANH function ................................... 270 TIMESTAMP constraint ......................... 48 TO_ NUMBER function ....................... 308 TO_BIN function ................................. 303 TO_CHAR(datetime) function ............. 303 TO_CHAR(number) function .............. 304 TO_DATE function ............................. 305 TO_HEX function ............................... 306 TO_NCHAR(character) ....................... 306 TO_NCHAR(datetime) ........................ 307 TO_NCHAR(number) .......................... 307 TO_OCT function ............................... 309 TRANSLATE function .......................... 285 trigger .................................................. 10 TRIM function .................................... 287 TRUNC(date) function ........................ 298 TRUNC(number) function ................... 270 TRUNCATE TABLE statement .............. 168 U UNION ALL set operator ..................... 243 UNION set operator ............................ 242 UNION(ALL) 집합 연산자 .................... 197 UNIQUE ............................... 74, 101, 352 UNISTR ............................................... 309 UPDATE statement ..................... 215, 220 UPPER function .................................. 287 user ..................................................... 10 USER_ID function ............................... 320 USER_NAME function ........................ 321 using_index_clause ............................ 102 V VARIANCE function ............................ 255 view ..................................................... 10 W WAIT ................................................. 182 where_clause ..................................... 195 WITH GRANT OPTION ........................ 155 WITH READ ONLY 찾아보기 359 of CREATE VIEW ................................ 130 ㄱ 객체 이름 규칙 ...................................... 10 객체 접근 권한 .................................... 154 구간 (BETWEEN) 조건 ......................... 345 그룹 비교조건 ...................................... 343 ㄴ 날짜시간 함수 ...................................... 290 논리 연산자 ......................................... 338 논리 조건 ............................................ 336 논리곱 ................................................. 338 논리합 ................................................. 339 ㄷ 단순 비교조건 ...................................... 341 단항 연산자 ......................................... 329 데이터 정의어(DDL) ............................... 14 데이터 제어어(DCL) ............................... 16 데이터 조작어(DML) .............................. 15 디렉토리 ................................................ 10 ㅁ 문자 함수 ............................................ 273 ㅂ 변환 함수 ............................................ 300 부연질의 .................................................. 8 분석 집계 함수 형태 ............................ 256 분석 함수 ............................................ 256 뷰 10 비교 조건 ............................................ 336 비교조건 .............................................. 341 ㅅ 사용자 .................................................. 10 산술 연산자 ........................................ 328 산술 연산자의 종류 ............................. 328 세션 제어문 .......................................... 16 숫자 함수 ............................................ 259 시노님 .................................................. 10 시스템 권한 ........................................ 150 시스템 제어문 ....................................... 16 시퀀스 .................................................. 10 ㅇ 알티베이스 객체 .................................... 10 암호화 함수 ........................................ 323 연결 연산자 ........................................ 332 연산 순서 ............................................ 246 예약어 .................................................. 12 이중화 .................................................. 10 이항 연산자 ........................................ 330 인덱스 .................................................. 10 ㅈ 저장 프로시저 ....................................... 10 제약조건 ............................................... 10 주석 ....................................................... 9 중첩 함수 ............................................ 321 집계 함수 ............................................ 252 집합 연산자 ........................................ 241 ㅌ 테이블 .................................................. 10 테이블스페이스 ...................................... 10 트랜잭션 제어문 .................................... 16 트리거 .................................................. 10
-
- [ALTIBASE XDB 6.1.1] SQL Reference_KOR ㅣ 2013-05-24
- TABLESPACE ·······················································································································
-
미리보기
ALTIBASE XDB Application Development SQL Reference Release 6.1.1 (April 26, 2013) ----------------------------------------------------------- ALTIBASE XDB Application Development SQL Reference Release 6.1.1 Copyright ⓒ 2001~2012 ALTIBASE Corp. All Rights Reserved. 본 문서의 저작권은 ㈜알티베이스에 있습니다. 이 문서에 대하여 당사의 동의 없이 무단으로 복제 또는 전용할 수 없습니다. ㈜알티베이스 152-790 서울시 구로구 구로동 182-13 대륭포스트타워Ⅱ 10층 전화: 02-2082-1114 팩스: 02-2082-1099 고객서비스포털: http://support.altibase.com homepage: http://www.altibase.com ----------------------------------------------------------- 목차 I 목 차 서문 ················································································································i 이 매뉴얼에 대하여 ·························································································································· ii 1. 알티베이스 SQL 소개 ···················································································· 7 SQL 개요 ··············································································································································· 8 SQL문 분류 ········································································································································ 14 2. 데이터 정의어 ······························································································ 17 ALTER DATABASE ··························································································································· 18 ALTER INDEX ····································································································································· 23 ALTER QUEUE ··································································································································· 25 ALTER REPLICATION ······················································································································ 26 ALTER SEQUENCE ··························································································································· 31 ALTER TABLE ····································································································································· 34 ALTER TABLESPACE ························································································································ 47 ALTER TRIGGER ································································································································ 51 ALTER USER ······································································································································· 53 ALTER VIEW ······································································································································· 55 COMMENT ········································································································································· 57 CREATE DATABASE ························································································································ 59 CREATE DIRECTORY ······················································································································· 62 CREATE INDEX ·································································································································· 64 CREATE QUEUE ································································································································ 69 CREATE REPLICATION ··················································································································· 71 CREATE SEQUENCE ························································································································ 73 CREATE SYNONYM ························································································································ 80 CREATE TABLE ·································································································································· 84 CREATE MEMORY TABLESPACE ······························································································· 96 CREATE TRIGGER ·························································································································· 101 II SQL Reference CREATE USER·································································································································· 108 CREATE VIEW·································································································································· 111 DROP DATABASE ·························································································································· 115 DROP DIRECTORY ························································································································ 116 DROP INDEX ··································································································································· 117 DROP QUEUE ································································································································· 118 DROP REPLICATION ···················································································································· 119 DROP SEQUENCE ························································································································· 120 DROP SYNONYM·························································································································· 121 DROP TABLE ··································································································································· 123 DROP TABLESPACE ······················································································································ 125 DROP TRIGGER ······························································································································ 127 DROP USER ····································································································································· 128 DROP VIEW ····································································································································· 130 GRANT ··············································································································································· 131 RENAME TABLE ····························································································································· 146 REVOKE ············································································································································· 148 TRUNCATE TABLE ························································································································· 151 3. 데이터 조작어 ···························································································· 153 DELETE ··············································································································································· 154 INSERT ··············································································································································· 159 LOCK TABLE ···································································································································· 162 SELECT ··············································································································································· 167 UPDATE ············································································································································· 195 MOVE ················································································································································· 200 ENQUEUE ········································································································································· 203 DEQUEUE ·········································································································································· 204 4. 데이터 제어어 ···························································································· 207 ALTER SESSION ····························································································································· 208 ALTER SYSTEM ······························································································································· 210 COMMIT ··········································································································································· 212 SAVEPOINT ······································································································································ 213 ROLLBACK ········································································································································ 215 목차 III SET TRANSACTION ····················································································································· 218 5. 집합 연산자 ······························································································· 221 UNION ·············································································································································· 222 UNION ALL ····································································································································· 223 INTERSECT ······································································································································· 224 MINUS ··············································································································································· 225 연산 순서 ········································································································································· 226 6. SQL 함수 ···································································································· 229 SQL 함수 소개 ······························································································································ 230 집계 함수 ········································································································································· 232 분석 함수 ········································································································································· 236 숫자 함수 ········································································································································· 239 문자 함수 ········································································································································· 253 날짜시간 함수 ······························································································································· 270 변환 함수 ········································································································································· 280 기타 함수 ········································································································································· 290 암호화 함수 ···································································································································· 302 7. 산술 연산자 ······························································································· 307 산술 연산자 ···································································································································· 308 단항 연산자 ···································································································································· 309 이항 연산자 ···································································································································· 310 연결 연산자 ···································································································································· 312 CAST 연산자 ·································································································································· 313 8. 조건 연산자 ······························································································· 315 SQL 조건의 개요 ························································································································· 316 논리 연산자 ···································································································································· 318 비교조건 ··········································································································································· 321 그 외의 조건 ·································································································································· 325 찾아보기 ·································································································· 335 서문 i 서문 ii SQL Reference 이 매뉴얼에 대하여 이 매뉴얼은 데이터 베이스에서 사용되는 SQL(Structured Query Language)의 사용법에 대해 설명한다. 대상 사용자 이 매뉴얼은 다음과 같은 알티베이스 XDB 사용자를 대상으로 작성되었다. 데이터베이스 관리자 성능 관리자 데이터베이스 사용자 응용 프로그램 개발자 기술지원부 다음과 같은 배경 지식을 가지고 이 매뉴얼을 읽는 것이 좋다. 컴퓨터, 운영 체제 및 운영 체제 유틸리티 운용에 필요한 기본 지식 관계형 데이터베이스 사용 경험 또는 데이터베이스 개념에 대한 이해 컴퓨터 프로그래밍 경험 데이터베이스 서버 관리, 운영 체제 관리 또는 네트워크 관리 경험 소프트웨어 환경 이 매뉴얼은 데이터베이스 서버로 알티베이스 XDB 버전 6을 사용한다는 가정 하에 작성되었다. 이 매뉴얼의 구성 이 매뉴얼은 다음과 같이 구성되어 있다. 제 1장 알티베이스 SQL 소개 이 장은 알티베이스를 사용하기 위한 SQL의 개요, 분류, 구조에 대해서 설명한다. 서문 iii 제 2장 자료형 이 장은 알티베이스에서 제공하는 데이터 타입에 대해서 설명한다. 제 3장 데이터 정의어 이 장은 알티베이스에서 사용되는 데이터 정의어(DDL)에 대해서 각각 설명한다. 제 4장 데이터 조작어 이 장은 알티베이스에서 사용되는 데이터 조작어(DML)에 대해서 각각 설명한다. 제 5장 데이터 제어어 이 장은 알티베이스에서 사용되는 데이터 제어어(DCL)에 대해서 각각 설명한다. 제 6장 집합 연산자 이 장은 알티베이스의 SQL에서 사용되는 집합 연산자에 대해서 설명한다. 제 7장 함수 이 장은 알티베이스에서 제공하는 함수들에 대해서 설명한다. 제 8장 산술 연산자 이 장은 알티베이스의 SQL에서 사용되는 산술 연산자에 대해서 설명한다. 제 9장 조건 연산자 이 장은 알티베이스의 SQL문에서 조건절에 사용할 수 있는 조건 연산자에 대해서 설명한다. A. 부록 : 스키마 이 장은 예제 테이블 정보와 ER다이어그램과 샘플데이터에 대해서 설명한다. 문서화 규칙 이 절에서는 이 매뉴얼에서 사용하는 규칙에 대해 설명한다. 이 규칙을 이해하면 이 매뉴얼과 설명서 세트의 다른 매뉴얼에서 정보를 쉽게 찾을 수 있다. 여기서 설명하는 규칙은 다음과 같다. 구문 다이어그램 샘플 코드 규칙 구문 다이어그램 이 매뉴얼에서는 다음 구성 요소로 구축된 다이어그램을 사용하여, iv SQL Reference 명령문의 구문을 설명한다. 구성 요소 의미 예약어 명령문이 시작한다. 완전한 명령문이 아닌 구문 요소는 화살표로 시작한다. 명령문이 다음 라인에 계속된다. 완전한 명령문이 아닌 구문 요소는 이 기호로 종료한다. 명령문이 이전 라인으로부터 계속된다. 완전한 명령문이 아닌 구문 요소는 이 기호로 시작한다. ; 명령문이 종료한다. SELECT 필수 항목 NOT 선택적 항목 ADD DROP 선택사항이 있는 필수 항목. 한 항목만 제공해야 한다. ASC DESC 선택사항이 있는 선택적 항목. , ASC DESC 선택적 항목. 여러 항목이 허용된다. 각 반복 앞부분에 콤마가 와야 한다. 샘플 코드 규칙 코드 예제는 SQL, Stored Procedure, iSQL 또는 다른 명령 라인 구문들을 예를 들어 설명한다. 아래 테이블은 코드 예제에서 사용된 인쇄 규칙에 대해 설명한다. 규칙 의미 예제 [ ] 선택 항목을 표시 VARCHAR [(size)] [[FIXED |] VARIABLE] { } 필수 항목 표시. 반드시 하나 이상을 선택해야 되는 표시 { ENABLE | DISABLE | COMPILE } 서문 v | 선택 또는 필수 항목 표시의 인자 구분 표시 { ENABLE | DISABLE | COMPILE } [ ENABLE | DISABLE | COMPILE ] . . . 그 이전 인자의 반복 표시 예제 코드들의 생략되는 것을 표시 SQL> SELECT ename FROM employee; ENAME ------------------------ SWNO HJNO HSCHOI . . . 20 rows selected. 그 밖에 기호 위에서 보여진 기호 이 외에 기호들 EXEC :p1 := 1; acc NUMBER(11,2); 기울임 꼴 구문 요소에서 사용자가 지정해야 하는 변수, 특수한 값을 제공해야만 하는 위치 지정자 SELECT * FROM table_name; CONNECT userID/password; 소문자 사용자가 제공하는 프로그램의 요소들, 예를 들어 테이블 이름, 칼럼 이름, 파일 이름 등 SELECT ename FROM employee; 대문자 시스템에서 제공하는 요소들 또는 구문에 나타나는 키워드 DESC SYSTEM_.SYS_INDICES_; 관련 자료 자세한 정보를 위하여 다음 문서 목록을 참조하기 바란다. ALTIBASE Administration Installation User’s Manual ALTIBASE Administration Administrator’s Manual ALTIBASE Administration Replication User’s Manual ALTIBASE Application Development Precompiler User’s Manual ALTIBASE Application Development ODBC User’s Manual ALTIBASE Application Development Application Program Interface User’s Manual vi SQL Reference ALTIBASE Tools iSQL User’s Manual ALTIBASE Tools Utilities User’s Manual ALTIBASE Message Error Message Reference 온라인 매뉴얼 알티베이스 고객서비스포털(http://support.altibase.com/)에서 국문 및 영문 매뉴얼(PDF, HTML)을 받을 수 있다. 알티베이스는 여러분의 의견을 환영합니다. 이 매뉴얼에 대한 여러분의 의견을 보내주시기 바랍니다. 사용자의 의견은 다음 버전의 매뉴얼을 작성하는데 많은 도움이 됩니다. 보내실 때에는 아래 내용과 함께 고객서비스포털(http://support.altibase.com/)로 보내주시기 바랍니다. 사용 중인 매뉴얼의 이름과 버전 매뉴얼에 대한 의견 사용자의 성함, 주소, 전화번호 이 외에도 알티베이스 기술지원 설명서의 오류와 누락된 부분 및 기타 기술적인 문제들에 대해서 이 주소로 보내주시면 정성껏 처리하겠습니다. 기술적인 부분과 관련하여 즉각적인 도움이 필요한 경우에는 기술지원센터로 연락하시기 바랍니다. 여러분의 의견에 항상 감사드립니다. 알티베이스 SQL 소개 7 1. 알티베이스 SQL 소개 이 장에서는 알티베이스 SQL의 특징과 구성에 대해서 간략하게 소개하고 있다. 8 SQL Reference SQL 개요 SQL(Structured Query Language)은 데이터베이스 객체를 정의하고 관리하며, 데이터베이스의 데이터를 조작하고 검색하기 위한 언어이다. 이 절은 알티베이스의 SQL 특성에 대해 기술한다. 알티베이스 SQL 특징 빠른 질의 성능 알티베이스의 경우 대부분의 질의들에 대해 SQL 준비 (PREPARE)과정 후 실행하기 전까지 시스템 카탈로그 정보가 변하지 않는 점에 착안해서 준비과정에서 최적화된 실행 계획 트리(execution plan tree)를 만들어 두고 실행시에는 이 실행 계획 트리를 사용하도록 하여 실제 질의가 반복 실행될 때의 수행속도를 대폭 향상시켰다. 이와 같은 방법은 초기 데이터베이스 스키마 생성 후 데이터 정의어(DDL) 구문의 수행은 거의 일어나지 않고 데이터 조작어(DML) 구문의 수행이 빈번한 응용 애플리케이션에 매우 유용하다. SQL/92 표준 지원 알티베이스 SQL은 SQL/92 표준 사양을 지원하므로 다른 데이터베이스의 SQL 사용 경험이 있는 사용자들은 별도의 숙지 없이 알티베이스를 쉽게 사용할 수 있다. 강력한 부질의(subquery) 지원 일반적으로 부질의는 SELECT 구문, TABLE ~ AS SELECT 구문, 및 INSERT ~ AS SELECT 구문의 수식과 IN 절에 주로 사용된다. 여기에 사용되는 부질의는 대부분 여러 칼럼의 여러 레코드를 검색해 준다. 알티베이스의 경우 부질의의 결과가 하나의 값(한 레코드의 한 칼럼)일 경우, 그 부질의는 상수값 대신에 사용할 수 있으며 부질의는 빠른 검색을 지원하므로, 여러 SQL문으로 처리하는 것보다 부질의를 포함하는 SQL문으로 처리하는 것이 더 낫다. 따라서 복잡한 응용 애플리케이션에서 부질의는 유용하다. 알티베이스 SQL 소개 9 다양한 시스템 제공 함수 지원 SQL/92의 표준 사양 이외에 알티베이스는 사용자에게 유용한 다양한 시스템 함수를 지원한다. 질의 최적화와 실행 계획 질의 성능을 높이기 위해서는 SQL구문을 효과적으로 작성해야 한다. 알티베이스가 SQL구문을 처리하는 방식을 이해하는 것은 최적화된 SQL구문을 작성하는데 도움이 될 것이다. 알티베이스에서의 SQL문 처리 과정은 크게 준비(PREPARE) 과정과 실행(EXECUTE) 과정으로 나뉘어진다. 준비 과정 SQL문의 문법을 분석하여 정당성을 검사하고 최적화 한 후 실행 계획을 수립해 실행 계획 트리(execution plan tree)를 생성하는 과정이다. 이 과정에서 메타 테이블에 접근해 테이블과 인덱스 정보 등을 읽어서 최적화된 접근 계획을 수립한다. 따라서 클라이언트가 direct execution 대신에 준비와 실행을 나뉘어서 수행한다면, 준비 후 메타의 변경이 일어나지 않아야 준비(PREPARE) 과정에서 생성된 실행 계획 트리가 실행시에 수정 없이 그대로 사용될 수 있다. 예를 들어, 준비 과정에서 존재했던 인덱스가 실행 과정에서는 존재하지 않는다면 준비 과정에서 인덱스를 사용하는 것으로 최적화된 실행 계획 트리는 실행 과정에서는 무효한 것이 되어 사용할 수 없게 된다. 실행 과정 준비 과정에서 생성된 실행 계획에 따라 질의문을 실제로 수행하는 과정이다. 클라이언트가 호스트 변수를 사용한 SQL문을 prepare 한 후 호스트 변수 값을 변경하면서 여러번 수행하는 경우, 준비 과정은 한번 수행되고 변수값 설정과 실행 과정은 여러번 수행된다. 주석 알티베이스에서는 SQL문의 임의의 위치에 다음 두 가지 형식의 주석을 사용할 수 있다. 10 SQL Reference /* */ C언어의 주석 형식과 동일한 방식으로 주석의 시작에 ‘/*’를 명시하고 주석의 끝에 ‘*/’를 명시한다. 여러 줄의 주석을 쓸 때 사용한다. -- 한 줄의 주석을 쓸 때 ‘-‘를 연이어 두 번 명시하여 사용한다. 알티베이스 객체 (Object) 알티베이스에서 제공하는 데이터베이스 객체(object)는 스키가 객체와 비스키마 객체로 구분되며, 그 종류는 다음과 같다. 스키마 객체 제약조건 (constraint) 인덱스 (index) 시퀀스 (sequence) 시노님 (synonym) 테이블 (table) 저장 프로시저 (stored procedure) 뷰 (view) 트리거 (trigger) 비 스키마 객체 사용자 (user) 이중화 (replication) 테이블스페이스 (tablespace) 디렉토리 (directory) 객체 이름 규칙 객체 이름 SQL문에서 객체의 이름을 쓸 때 인용부호를 사용할 수도 있고 사용하지 않을 수도 있다. 인용부호로는 큰따옴표(“)를 사용한다. 객체 생성시 따옴표로 감싸서 이름을 지정하면, 이 후에 그 객체를 참조할 때는 항상 큰따옴표로 감싼 이름을 사용해야 한다. 알티베이스 SQL 소개 11 인용부호가 없는 이름은 아무런 구분자 없이 사용된다. 다음의 규칙은 인용부호 사용 여부에 상관없이 모두 적용된다. 객체의 이름의 최대 길이는 40바이트이다. 인용부호가 없는 이름은 A-Z, a-z, 0-9, _, $ 를 포함할 수 있다. 또한 객체 이름의 첫 글자는 문자이거나 _ 이어야 한다. 그러나 V$, X$ 또는 D$로 시작할 수는 없다. 인용부호가 있는 이름은 문자, 구두점 또는 공백을 포함할 수 있다. 그러나 큰따옴표(“)를 포함할 수는 없다. 알티베이스의 예약어는 객체 이름으로 사용될 수 없다. (알티베이스의 예약어 목록은 아래에 나열해 두었다.) 같은 이름공간(Name Space)내에는 같은 이름의 객체가 존재할 수 없다. 다음의 스키마 객체들은 한 이름공간을 공유한다: 테이블, 뷰, 시퀀스, 시노님, 저장 프로시저 다음의 스키마 객체들은 자신의 이름공간을 따로 소유한다: 제약조건, 인덱스, 트리거 객체 테이블과 뷰는 동일한 이름 공간를 공유하므로 동일한 스키마 내에 같은 이름의 테이블과 뷰는 존재할 수 없다. 그러나 테이블과 인덱스는 서로 다른 이름공간에 존재하기 때문에 동일한 스키마 내에 같은 이름의 테이블과 인덱스가 존재할 수 있다. 사용자, 이중화 객체, 테이블스페이스, 디렉터리 객체 같은 비스키마 객체들은 자신의 이름공간을 소유한다. 인용부호가 없는 이름은 대소문자 구별이 되지 않는다. 알티베이스는 내부적으로 이름을 대문자로 변경한다. 인용부호로 감싼 이름은 대소문자가 구별된다. 다음의 이름은 알티베이스 내에서 같은 이름으로 변경되기 때문에 같은 이름공간의 다른 객체에 사용될 수 없다: employees, EMPLOYEES, “EMPLOYEES” 알티베이스가 제공하는 객체에 대한 자세한 설명은 Administrator’s Manual을 참고하기 바란다. 비밀번호 사용자가 알티베이스에 접속하기 위해 사용하는 비밀번호 역시 객체 이름과 유사한 제약조건을 가진다. 암호에 사용가능한 문자는 A-Z, a- z, 0-9, _, $ 이다. 또한 알티베이스의 예약어는 비밀번호에 사용될 수 없다. 첫 글자는 반드시 문자 또는 _여야 한다. 비밀번호의 최대 12 SQL Reference 길이는 운영체제에 따라 16 또는 22바이트이다. Solaris x86 2.8과 Windows에서 비밀번호의 최대 길이는 22바이트이다. 그 외 다른 운영체제에서 비밀번호의 최대 길이는 16바이트이다. 예약어 다음 단어들은 알티베이스에 예약되어 있는 단어들로 데이터베이스 객체 이름이나 비밀번호로 사용할 수 없다. 데이터베이스 객체 생성시 또는 SQL구문 작성시에 이를 유념해야 한다. ADD ALL ALTER AND ANY AS ASC BEGIN BETWEEN BY CASCADE CASE CHECK CLOSE COLUMN COMMIT CONNECT CONSTANT CONSTRAINT CONSTRAINTS CONTINUE CREATE CUBE CURSOR CYCLE DATABASE DECLARE DEFAULT DELETE DESC DISCONNECT DISTINCT FUNCTION GET GOTO GRANT GROUP GROUPING HAVING IDENTIFIED IF IN INDEX INNER INSERT INTERSECT INTO IS ISOLATION JOIN LEFT LEVEL LIKE LIMIT LOCALUNIQUE LOCK LOOP MAXROWS MINUS MODE NATIVE NO NOCYCLE NOT REPLACE REPLICATION RESTRICT RETURN REVERSE REVOKE RIGHT ROLLBACK ROLLUP ROW ROWCOUNT ROWTYPE SAVEPOINT SEGMENT SELECT SEQUENCE SESSION SET SETS SOME SQLCODE SQLERRM START STEP SYNONYM SYSTEM TABLE TABLESPACE TEMPORARY THEN TO TRANSACTION 알티베이스 SQL 소개 13 DROP ELSE ELSEIF ELSIF END ESCAPE EXCEPTION EXEC EXECUTE EXISTS EXIT EXTENTSIZE FALSE FETCH FIXED FOR FOREIGN FROM FULL NULL OFF OFFLINE ON OPEN OR ORDER OTHERS OUT OUTER PRIMARY PRIOR PRIVILEGES PROCEDURE RAISE READ REFERENCES RENAME TRIGGER TRUE TRUNCATE UNION UNIQUE UNTIL UPDATE USER VALUES VARIABLE VIEW WAIT WHEN WHERE WHILE WITH WORK SWRITE 14 SQL Reference SQL문 분류 알티베이스가 지원하는 전체 SQL문은 다음과 같이 분류된다. 데이터 정의어 (DDL) 데이터 조작어 (DML) 데이터 제어어 (DCL) 이 장에서는 각 SQL문에 대해 간략히 소개한다. 자세한 사용방법은 3장 데이터 정의어, 4장 데이터 조작어, 5장 데이터 제어어를 참조한다. 데이터 정의어(DDL) DDL은 데이터베이스 객체를 정의하고 변경하는데 사용된다. SQL 문 설명 ALTER DATABASE 데이터베이스 정의 변경 ALTER INDEX 인덱스 정의 변경 ALTER REPLICATION 이중화의 시작, 종료 ALTER SEQUENCE 시퀀스의 정의 변경 ALTER TABLE 테이블의 정의 변경 ALTER TABLESPACE 테이블스페이스 정의 변경 ALTER TRIGGER 트리거 정의 변경 ALTER USER 사용자의 암호 변경 ALTER VIEW 뷰 재 컴파일 CREATE DATABASE 데이터베이스 생성 CREATE DIRECTORY 저장 프로시저 내에서 파일 처리를 위한 디렉토리 객체 생성 CREATE INDEX 인덱스 생성 CREATE QUEUE 큐 생성 CREATE REPLICATION 이중화 생성 CREATE SEQUENCE 시퀀스 생성 CREATE SYNONYM 객체의 별칭(시노님) 생성 CREATE TABLE 테이블 생성 CREATE TABLESPACE 테이블스페이스 생성 CREATE TRIGGER 트리거 생성 CREATE USER 사용자 생성 CREATE VIEW 뷰 생성 알티베이스 SQL 소개 15 DROP DIRECTORY 디렉토리 객체 삭제 DROP INDEX 인덱스 삭제 DROP QUEUE 큐 삭제 DROP REPLICATION 이중화 삭제 DROP SEQUENCE 시퀀스 삭제 DROP SYNONYM 시노님 삭제 DROP TABLE 테이블 삭제 DROP TABLESPACE 테이블스페이스 삭제 DROP TRIGGER 트리거 삭제 DROP USER 사용자 삭제 DROP VIEW 뷰 삭제 GRANT 권한 부여 RENAME 테이블 이름 변경 REVOKE 권한 취소 TRUNCATE TABLE 테이블의 모든 레코드 삭제 [표 1-1] 데이터 정의어 목록 메타 정보가 변경되는 위의 DDL 구문들이 수행되면 그 세션의 현재 시작되어 있는 트랜잭션은 종료되고 새로운 트랜잭션으로 그 DDL 문이 처리된 후 그 트랜잭션은 종료된다. 즉 DDL 문은 하나의 트랜잭션으로 처리되는 SQL문들이다. 다시 말해서 AUTOCOMMIT 모드가 비설정(OFF)된 상태에서 데이터 조작어(DML)를 수행하고 명시적으로 커밋(COMMIT)을 호출하지 않았다 하더라도 위의 SQL문들을 수행하면 알티베이스 내부적으로 이전에 수행된 데이터 조작어(DML)들이 모두 묵시적으로 커밋된다. 즉, 위 DDL문을 수행하기 전에 수행된 DML 트랜잭션은 DDL문 수행 후 롤백문을 이용해 철회될 수 없다. 데이터 조작어(DML) DML(Data Manipulation Language) 문은 데이터를 조작하는데 사용된다. 데이터 정의어(DDL)와 달리 AUTOCOMMIT 모드가 비설정(OFF) 되어 있는 상태에서 DML문을 수행하면 수행 후 묵시적으로 커밋되지 않는다. 따라서, AUTOCOMMIT 모드가 비설정(OFF)된 상태에서 어떤 트랜잭션이 여러 개의 DML문을 수행하고 롤백(rollback)을 호출하면 그 트랜잭션은 철회된다. SQL 문 설명 DELETE 데이터의 삭제 INSERT 데이터의 삽입 16 SQL Reference LOCK TABLE 특정한 모드에서 테이블 잠금 SELECT 데이터의 검색 UPDATE 데이터의 변경 MOVE 한 테이블에서 다른 테이블로 데이터 이동 ENQUEUE 메시지를 큐에 삽입 DEQUEUE 메시지를 큐에서 꺼내고 큐에서 삭제 [표 1-2] 데이터 조작어 목록 데이터 제어어(DCL) 시스템 제어문 SQL 문 설명 ALTER SYSTEM 프로퍼티 변경, 체크포인트와 데이터베이스 백업 수행 세션 제어문 SQL 문 설명 ALTER SESSION 세션의 프로퍼티 변경 트랜잭션 제어문 SQL 문 설명 COMMIT 트랜잭션 정상 종료 ROLLBACK or ROLLBACK TO SAVEPOINT savepoint_name 트랜잭션 전체 철회 또는 savepoint_name 시점으로 트랜잭션 부분 철회 SAVEPOINT savepoint_name 트랜잭션내에서 마커 설정 SET TRANSACTION READ-ONLY 또는 READ-WRITE 트랜잭션 시작, 또는 트랜잭션의 ISOLATION LEVEL 설정 변경 위의 세션 제어문과 트랜잭션 제어문은 각 세션에만 영향을 미치고 다른 세션에는 영향을 미치지 않는다. 데이터 정의어 17 2. 데이터 정의어 이 장에서는 데이터베이스 객체를 생성하는데 사용하는 SQL 문장인 DDL 문장의 문법과 특징을 사용 예제를 들어서 상세하게 설명한다. 18 SQL Reference ALTER DATABASE 구문 alter_database ::= ALTER;DATABASE session_clause startup_clausedatabase_name archivelog_option backup_clause recover_clause create_checkpoint_image_clause startup_clause ::= CONTROL SERVICE META UPGRADE RESETLOGS SHUTDOWN NORMAL IMMEDIATE EXIT session_clause ::= numberSESSIONCLOSE archivelog_option ::= ARCHIVELOG NOARCHIVELOG 데이터 정의어 19 backup_clause ::= BACKUP LOGANCHOR ‘’backup_dirTABLESPACE DATABASE TOtablespace_name recover_clause ::= RECOVERDATABASE until_option until_option ::= UNTIL CANCEL TIME‘’YYYY-MM-DD:HH:MM:SS 전제 조건 ALTER DATABASE구문은 알티베이스 다단계 구동에서 서비스 전 단계에서 SYS 사용자가 -sysdba 관리자 모드로 접속한 후 수행할 수 있다. 단 SESSION CLOSE 의 경우에는 -sysdba 모드로 접속하지 않아도 사용할 수 있다. 설명 기존 데이터베이스의 정의를 변경하는 구문이다. database_name 변경될 데이터베이스 이름을 명시한다. startup_clauses 이 절은 알티베이스 구동 단계를 명시하는데 사용된다. CONTROL 데이터베이스 구동 단계를 CONTROL 단계로 변경한다. 이 단계에서 데이터베이스 미디어 복구가 가능하다. 데이터베이스 다단계 구동 단계에 대한 자세한 설명은 Administrator’s Manual을 참조한다. CONTROL 다음 단계인 META단계로 가기 위해서는 다음 구문을 20 SQL Reference 수행해야 한다: ALTER DATABASE dababase_name META; META 데이터베이스 구동 단계를 META 단계로 변경한다. 전 단계인 CONTROL단계에서 이 단계로 오는 중에 데이터베이스 메타 데이터가 로딩된다. 다음 단계로 가기 위해서는 다음 구문을 수행해야 한다: ALTER DATABASE dababase_name SERVICE; SERVICE 데이터베이스 구동 단계를 SERVICE 단계로 변경한다. 이 단계로 오면서 테이블 및 데이터가 공유 메모리로 로딩된다. 이 단계에서 이중화 또는 SNMP 등의 확장 서비스가 모두 구동될 수 있다. 데이터베이스가 이 단계로 성공적으로 구동되었다면, 필요한 복구가 완료되어 시스템이 정상적으로 서비스를 제공하는 상태임을 의미한다. META UPGRADE 이 옵션은 데이터베이스 구동 단계를 META UPGRADE 단계로 변경한다. 데이터베이스가 이 단계로 구동될 때, 모든 복구 작업이 완료된다. 다음 단계로 가기 위해서는 다음 구문을 수행해야 한다: ALTER DATABASE dababase_name SERVICE; META RESETLOGS CONTROL 단계에서 불완전 복구를 수행한 후, 서버를 정상 구동하기 위해 필요한 작업이다. 불완전 복구로 인해 더 이상 필요하지 않게 된 로그 레코드들을 초기화한다. 다음 단계로 가기 위해서는 다음 구문을 수행해야 한다: ALTER DATABASE dababase_name SERVICE; SHUTDOWN NORMAL 서버에 접속한 모든 클라이언트의 연결이 정상적으로 해제될 때까지 대기한 후 서버를 정상 종료한다. SHUTDOWN IMMEDIATE 서버에 접속된 모든 클라이언트의 연결을 강제로 해제한 후, 서버를 정상 종료한다. SHUTDOWN EXIT 이 옵션은 알티베이스 서버를 강제로 종료하는데 사용된다. 이 방법으로 알티베이스가 종료되면, 데이터베이스의 내용이 올바르지 않게 되어 다음 서버 구동시에 복구 작업이 수행될 것이다. 데이터 정의어 21 CREATE CHECKPOINT IMAGE 이 구문은 메모리 체크포인트 이미지파일이 유실되었을 때, 로그 앵커의 정보를 참고하여 체크포인트 이미지 파일을 생성하기 위해 사용된다. 이 구문을 실행한 후에는 매체 완전 복구를 수행하여 메모리 체크포인트 이미지 파일을 복구하도록 한다. 체크포인트 이미지파일은 메모리 테이블스페이스에 정의된 체크포인트 경로에 생성되므로, 경로는 지정할 필요가 없고 파일명만 명시하면 된다. 이 구문은 CONTROL 단계에서만 실행 가능하다. <질의> ‘MEM-TBS-1’ 이름의 체크포인트 이미지파일을 다시 생성한다. iSQL> ALTER DATABASE CREATE CHECKPOINT IMAGE 'MEM-TBS-1'; SESSION CLOSE 이 구문은 세션을 강제로 종료시킨다. SESSION CLOSE 다음에 세션의 ID을 지정하면 된다. 이 구문이 실행되면 그 세션의 트랜잭션은 롤백된다. Note: 세션이 락을 잡기 위해 대기중이라면 즉시 종료되지 않는다. archivelog_option CONTROL 단계에서 아카이브로그 모드와 노아카이브로그 모드를 전환하는데 사용된다. BACKUP LOGANCHOR 데이터베이스가 아카이브로그 모드로 운영중일때, 이 구문은 서비스를 중지하지 않은 상태에서 로그 앵커를 온라인 백업하는데 사용된다. BACKUP TABLESPACE 데이터베이스가 아카이브로그 모드로 운영중일때, 이 구문은 서비스를 중지하지 않은 상태에서 지정된 테이블스페이스를 백업 디렉토리에 백업하는데 사용된다. BACKUP DATABASE 데이터베이스가 아카이브로그 모드로 운영중일때, 이 구문은 서비스를 중지하지 않은 상태에서 모든 테이블스페이스 및 로그앵커를 백업하는데 사용된다. RECOVER DATABASE 이 구문은 매체 완전복구를 수행한다. 아카이브 로그 디렉토리의 로그 파일을 판독하여 매체 오류가 발생한 데이터 파일들을 현재 22 SQL Reference 시점으로 복구한다. RECOVER DATABASE UNTIL TIME 이 구문은 특정 시점으로 매체 불완전 복구를 수행하는데 사용된다. 아카이브 로그 디렉토리의 로그 파일을 판독하여 매체 오류가 발생한 데이터 파일들을 특정 시점으로 복구한다. RECOVER DATABASE UNTIL CANCEL 이 구문은 아카이브 로그 파일들 중 유효한 가장 최근 시점으로 매체 불완전 복구를 수행하는데 사용된다. 아카이브 로그 디렉토리의 로그 파일을 판독하여 매체 오류가 발생한 데이터 파일들을 유효한 시점까지 복구한다. 예제 <질의> 데이터베이스 mydb를 구동하여 정상 서비스를 제공하도록 한다. xdbiSQL> ALTER DATABASE mydb SERVICE; <질의> 아카이브로그 모드로 데이터베이스를 전환한다. xdbiSQL> ALTER DATABASE ARCHIVELOG; <질의> 불완전 복구 수행 후 데이터베이스를 정상 구동한다. xdbiSQL> ALTER DATABASE mydb META RESETLOGS; <질의> SYS_TBS_DISK_UNDO 테이블스페이스를 초기화한다. xdbiSQL> ALTER DATABASE mydb META RESETUNDO; <질의> SYS_TBS_DISK_DATA 테이블스페이스를 /altibase_backup디렉터리에 백업한다. xdbiSQL> ALTER DATABASE TABLESPACE SYS_TBS_DISK_DATA TO ‘/altibase_backup/’; <질의> 이전 백업으로부터 2008년 2월 16일 오후 12시 시점으로 데이터베이스를 복원한다. xdbiSQL> ALTER DATABASE RECOVER DATABASE UNTIL TIME ‘2008- 02-16:12:00:00’’ <질의> 이전 백업으로부터 유실된 로그파일 20001번 이전인 로그파일 20000번까지의 변경이 반영되도록 데이터베이스를 복원한다. xdbiSQL> ALTER DATABASE RECOVER DATABASE UNTIL CANCEL; 데이터 정의어 23 ALTER INDEX 구문 alter_index ::= ALTER ; INDEX set_persistent_clause index_name user_name. RENAMETOnew_name REBUILD set_persistent_clause ::= PERSISTENTSET ON OFF = 전제 조건 SYS 사용자, 인덱스가 속한 스키마의 소유자 또는 ALTER ANY INDEX 시스템 권한을 가진 사용자만이 이 구문으로 인덱스를 변경할 수 있다. 설명 기존 인덱스 정의를 변경하거나 재구축한다. user_name 변경될 인덱스의 소유자 이름을 명시한다. 생략하면 알티베이스는 현재 세션에 연결된 사용자의 스키마에 속한 것으로 간주한다. index_name 24 SQL Reference 변경될 인덱스의 이름을 명시한다. SET PERSISTENT 절 이 절은 non-persistent 인덱스를 persistent 인덱스로, 또는 persistent 인덱스를 non-persistent 인덱스로 변경하기 위해 사용된다. persistent 인덱스에 대한 자세한 내용은 CREATE INDEX 구문을 참고한다 REBUILD 존재하는 인덱스를 재구축한다. RENAME 변경될 인덱스의 이름을 명시한다. 주의 사항 이중화 대상 테이블에 걸려있는 인덱스는 변경될 수 없다. 이중화 대상 테이블에 걸려있는 인덱스에는 ‘ALTER INDEX SET PERSISTENT = ON/OFF’와 ‘ALTER INDEX REBUILD’ 구문만 사용할 수 있다. 예제 PERSISTENT 변경 <질의>인덱스 emp_idx1 을 PERSISTENT 인덱스로 변경하라. xdbiSQL> ALTER INDEX emp_idx1 SET PERSISTENT = ON; <질의> 인덱스 const1 을 PERSISTENT 인덱스로 변경하라. xdbiSQL> ALTER INDEX const1 SET PERSISTENT = ON; 인덱스 이름 변경 <질의> 인덱스 emp_idx1의 이름을 emp_idx2로 변경하라. xdbiSQL> ALTER INDEX emp_idx1 RENAME TO emp_idx2; 데이터 정의어 25 ALTER QUEUE 구문 alter_queue ::= ;ALTERQUEUEqueue_nameCOMPACT user_name. 설명 큐의 정의를 변경한다. COMPACT 큐가 위치하는 테이블스페이스에 데이터가 없는 빈 페이지들을 반환한다. 이 때, 데이터가 실제로 옮겨지지는 않는다. 26 SQL Reference ALTER REPLICATION 구문 alter_replication ::= REPLICATIONreplication_nameALTER ONLY SYNC PARALLELparallel_factorTABLEuser_nametbl_name. , START QUICKSTART STOP ADD DROP TABLE HOST FROMuser_name.tbl_nameTOuser_name.tbl_name remote_host_ip.remote_port_no FLUSH ALLWAITwait_time SETHOSTremote_host_ip.remote_port_no ; RESET recovery_clause ::= SETRECOVERY ENABLE DISABLE 데이터 정의어 27 offline_clause ::= SETOFFLINE WITHlog_dir STARTWITHOFFLINE ENABLE DISABLE , 설명 CREATE REPLICATION 구문으로 이중화 생성 후 이중화의 동작을 제어하는 구문이다. 이중화에 관한 자세한 내용은 Replication Manual 을 참고한다. replication_name 이중화 객체의 이름을 명시한다. SYNC 지역 서버에 있는 이중화 대상 테이블들의 모든 데이터를 원격 서버의 해당 테이블로 전송한 후 이중화가 시작된다. SYNC ONLY 지역 서버에 있는 이중화 대상 테이블들의 모든 데이터를 원격 서버의 해당 테이블로 전송한다. 이중화 송신 쓰레드는 생성되지 않는다. PARALLEL parallel_factor Parallel_factor 값은 생략 가능하다. 생략할 경우 1로 인식된다. Parallel_factor의 최대값은 CPU 개수 * 2이다. 최대값을 초과하여 지정해도 최대 값 이상으로 설정되지 않는다. 0 또는 음수 값을 지정하면 오류 메시지가 반환된다. TABLE user_name.table_name 지역서버의 이중화 대상 테이블 중에서 SYNC로 동기화할 테이블을 지정한다. 이 절이 명시되면 지정된 테이블이 동기화된 후 이전에 마지막으로 이중화를 수행했던 시점부터 이중화가 시작된다. TABLE 절을 사용하지 않았을 때에는 모든 이중화 대상 테이블이 동기화된 28 SQL Reference 후 현재 로그의 위치부터 이중화가 시작된다. START 가장 최근에 마지막으로 이중화했던 시점부터 이중화를 시작한다. QUICKSTART 현재 시점부터 이중화를 시작한다. START/ QUICKSTART RETRY RETRY 옵션을 사용하여 이중화를 START하거나 QUICKSTART하면, 핸드쉐이크가 실패하더라도 송신 쓰레드가 지역서버에 생성된다. 지역서버와 원격서버간의 핸드쉐이크가 이후 성공할 때, 이중화가 시작된다. 이 옵션이 사용되면, iSQL은 첫 핸드쉐이크 시도가 실패하더라도 핸드쉐이크 성공 메시지를 출력한다. 그러므로 사용자는 이 구문의 실행 결과를 트래이스 로그 또는 성능 뷰를 통해서 확인해야 한다. RETRY 옵션 없이 이중화 시작시 첫 핸드쉐이크 시도가 실패하면 ,에러가 발생하고 이중화 시작은 중지된다. 단, RETRY 옵션은 EAGER 모드에서는 지원되지 않는다. STOP 이중화를 중지한다. RESET 이 명령은 이중화 정보(재시작 SN 같은)를 초기화시킨다. 이는 이중화가 중지 중일 때만 실행될 수 있다. 이는 DROP REPLICATION 구문과 CREATE REPLICATION 구문을 연달아 실행한 것과 같은 효과를 낸다. ADD TABLE 이중화 객체에 테이블을 추가한다. 이중화가 중지되어 있는 상태에서만 테이블을 이중화 객체에 추가할 수 있다. user_name 이중화 대상 테이블의 소유자 이름을 명시한다. tbl_name 이중화 대상 테이블 이름을 명시한다. DROP TABLE 이중화 테이블을 이중화 객체로부터 삭제한다. 이중화가 중지되어 있는 상태에서만 이중화 테이블을 삭제할 수 있다. 데이터 정의어 29 FLUSH 이 구문이 실행된 세션은 이중화 송신 쓰레드에 의해서 현재 로그(FLUSH구문이 실행된 시점의 로그) 까지의 변경 내용이 상대방 서버에 전송 되도록 wait_time 초 만큼 기다린다. 만약, ALL옵션이 함께 사용되면 구문이 실행된 세션은 현재 로그가 아닌 가장 최근 로그까지의 변경 내용이 상대방 서버에 전송되도록 기다린다. SET HOST 특정 호스트를 현재 호스트로 지정한다. 이중화를 중지한 상태에서 변경 가능하다. 주의 사항 이중화로 작업을 하는 사용자들이 이중화를 이용하기 전에 명심해야 할 몇가지 사항이 있다. ALTER REPLICATION 구문을 실행하기 전에 Replication Manual을 숙지하기 바란다. 예제 이름이 rep1인 이중화 객체를 시작하라. <질의> 지역서버의 데이터를 원격서버로 전송한 후 이중화를 시작하라. xdbiSQL> ALTER REPLICATION rep1 SYNC; Alter success. <질의> 이중화 rep1이 가장 최근에 마지막으로 수행한 이중화 시점부터 rep1 이중화를 시작하라. xdbiSQL> ALTER REPLICATION rep1 START; Alter success. <질의> 현재 시점부터 이중화를 시작하라. xdbiSQL> ALTER REPLICATION rep1 QUICKSTART; Alter success. 이름이 rep1인 이중화 객체에서 이중화 대상 테이블 employees을 삭제하라. xdbiSQL> ALTER REPLICATION rep1 STOP; Alter success. xdbiSQL> ALTER REPLICATION rep1 DROP TABLE FROM sys.employees TO sys.employees; Alter success. 30 SQL Reference 이름이 rep1인 이중화 객체에 테이블 employees을 추가하라. xdbiSQL> ALTER REPLICATION rep1 STOP; Alter success. xdbiSQL> ALTER REPLICATION rep1 ADD TABLE FROM sys.employees TO sys.employees; Alter success. 이름이 rep1인 이중화 객체의 이중화를 중지하라. <질의> 이중화를 중지하라. xdbiSQL> ALTER REPLICATION rep1 STOP; Alter success. 데이터 정의어 31 ALTER SEQUENCE 구문 alter_sequence ::= ALTERSEQUENCEseq_name INCREMENTinteger MAXVALUEinteger NOMAXVALUE MINVALUEinteger NOMINVALUE CYCLE CACHE ; integer user_name. BY 전제 조건 SYS 사용자, 시퀀스가 속한 스키마의 소유자 또는 ALTER ANY SEQUENCE 시스템 권한을 가진 사용자만이 이 구문으로 시퀀스를 변경할 수 있다. 설명 CREATE SEQUENCE 구문으로 시퀀스 생성 후 시퀀스의 정의를 변경하는 구문이다. 더 자세한 설명은 CREATE SEQUENCE 문을 참고한다. user_name 변경될 시퀀스의 소유자 이름이다. 생략하면 알티베이스는 현재 세션에 연결된 사용자의 스키마에 속한 것으로 간주한다. seq_name 변경될 시퀀스 이름이다. 32 SQL Reference INCREMENT BY 시퀀스 값의 증감분을 명시하는데 사용된다. MAXVALUE 시퀀스의 최대값을 명시하는데 사용된다. MINVALUE 시퀀스의 최소값을 명시하는데 사용된다. CYCLE 이는 시퀀스 값이 최대 또는 최소 한계 값에 도달한 후에도 그 시퀀스의 다음 값이 계속되는 것을 허용한다. 오름차순 시퀀스인 경우는 최대값에 도달한 후 최소값부터 다시 시작된다. 반면 내림차순 시퀀스인 경우는 최대값에 도달한 후 최대값부터 다시 시작된다. CACHE 시퀀스 값을 더 빠르게 액세스 하기 위하여 명시된 개수 만큼의 시퀀스 값들이 메모리에 캐시된다. 캐시는 시퀀스가 처음 참조될 때 채워지며 다음에 시퀀스 값이 요청될 때마다 캐시 된 값이 검색된다. 캐시에서 마지막 시퀀스 값이 사용된 이후 다음 시퀀스 값 요청시 새로운 시퀀스 값들이 메모리 캐시된다. 이 옵션을 생략할 경우 기본값은 20이다. 주의 사항 존재하는 시퀀스의 정의를 변경할 때, 시퀀스가 이미 생성된 이후 이므로 START WITH 절은 사용될 수 없다. 시퀀스에 대한 자세한 설명은 CREATE SEQUENCE 구문의 설명을 참고한다. 예제 <질의> 시퀀스 seq1을 최소값이 0, 최대값이 100이고 1씩 증가하도록 변경하라. xdbiSQL> ALTER SEQUENCE seq1 INCREMENT BY 1 MINVALUE 0 MAXVALUE 100; Alter success. 데이터 정의어 33 <질의> 시퀀스 seq2의 최소값, 최대값을 무한대로 변경하라. xdbiSQL> ALTER SEQUENCE seq2 NOMAXVALUE NOMINVALUE; Alter success. 34 SQL Reference ALTER TABLE 구문 alter_table::= ; ALTERTABLEtable_name constraints_clauses RENAMEnew_tbl_name ALLINDEXENABLE DISABLE user_name. alter_table_properties column_clauses TO COMPACT alter_table_properties::= logging_clause parallel_clause logging_clause::= LOGGING NOLOGGING parallel_clause::= PARALLELinteger NOPARALLEL 데이터 정의어 35 column_clauses::= add_column_clause alter_column_clause drop_column_clause rename_column_clause modify_column_clause add_column_clauses::= ADD COLUMN column_definition() , lob_column_properties column_definition::= column_name , encrypt_clausevariable_clausedefault_clause column_constraint in_row_clause data_type TIMESTAMP 36 SQL Reference alter_column_clause ::= () ALTER column_name SETDEFAULT DROPDEFAULT NULL COLUMNNOT expr LOB_storage_clause LOB()LOB_item , STOREAS()lob_attributes LOGGING NOLOGGING BUFFER NOBUFFER LOB_storage_clause::= lob_attributes::= modify_column_clause::= MODIFY COLUMN() , modify_column_spec modify_column_spec 데이터 정의어 37 modify_column_spec::= column_name data_type FIXED VARIABLE TOLERATEDATALOSS DEFAULTexpr NOT NULL drop_column_clause::= COLUMN( , column_name column_name DROP ) rename_column_clause::= RENAMECOLUMNcolumn_namenew_column_nameTO constraints_clauses::= add_table_constraint_clause drop_constraint_clause modify_constraint_clause rename_constraint_clause add_table_constraint_clauses ::= ADDtable_constraint_for_alter 38 SQL Reference rename_constraint_clauses ::= RENAMEconstraint_namenew_constraint_nameTOCONSTRAINT drop_constraint_clauses ::= DROP CONSTRAINTconstraint_name PRIMARYKEY UNIQUE(column_constraint , ) table_constraint_for_alter::= constraint_state CONSTRAINTconstraint_name column_name() PRIMARYKEY UNIQUE,using_index_clause referential_constraint modify_constraint_clause::= MODIFYCONSTRAINTconstraint_nameconstraint_state constraint_state::= ENABLE VALIDATE NOVALIDATE 전제 조건 SYS 사용자, 테이블이 속한 스키마의 소유자 또는 ALTER ANY TABLE 시스템 권한을 가진 사용자만이 이 구문으로 테이블 정의를 데이터 정의어 39 변경할 수 있다. 설명 ALTER TABLE 구문은 명시된 테이블 정의를 변경하는 SQL문이다. 이 구문의 수행 후 해당 테이블의 메타 정보가 변경된다. user_name 변경될 테이블의 소유자 이름이다. 생략하면 알티베이스는 현재 세션에 연결된 사용자의 스키마에 속한 것으로 간주한다. tbl_name 변경될 테이블 이름이다. COMPACT 데이터가 없는 빈 페이지들을 테이블스페이스에 반환할 것을 지정한다. 콤팩션을 수행할 때, 알티베이스는 실제로 데이터를 옮기지는 않는다. 이 구문은 메모리 테이블과 휘발성 테이블에 대해서만 지원된다. add_column_clause 테이블에 새로운 칼럼을 추가한다. alter_column_clause 기존 칼럼의 기본 값을 변경한다. modify_column_clause 기존 칼럼의 자료형(data type)을 변경한다. 다음의 표는 특정 자료형이 다른 자료형으로 변경가능한지 여부를 나타낸다. △로 표시한 부분은 자료형을 변경했을 때, 테이블의 데이터가 NULL이 아닌 경우 자료 손실(data loss)이 발생할 수 있음을 나타낸다. 만일 이러한 자료 손실을 감수하고서라도 자료형을 변경하고자 하는 경우 TOLERATE DATA LOSS 옵션을 사용하면 된다. DATE 타입 변경시에는 DEFAULT_DATE_FORMAT 프로퍼티에 따라 칼럼의 데이터가 변환된다. 40 SQL Reference 변경후 변경전 c h a r v a r c h a r n c h a r n v a r c h a r c l o b b i g i n t d o u b l e fl o a t i n t e g e r n u m b e r n u m e ri c r e a l s m a ll i n t d a t e b l o b b y t e n i b b l e b it v a r b it g e o m e t r y char o o o o △ △ △ △ △ △ △ △ △ varchar o o o o △ △ △ △ △ △ △ △ △ nchar o o o o △ △ △ △ △ △ △ △ △ nvarchar o o o o △ △ △ △ △ △ △ △ △ clob bigint o o o o o △ △ o △ △ △ o double o o o o △ o △ △ △ △ △ △ float o o o o △ △ △ △ △ △ △ △ integer o o o o o △ △ o △ △ △ o number o o o o △ △ △ △ △ △ △ △ numeric o o o o △ △ △ △ △ △ △ △ real o o o o △ △ △ △ △ △ o △ smallint o o o o o △ △ o △ △ △ o date △ △ △ △ o blob byte o nibble o bit o o varbit o o o geometry o drop_column_clause 하나의 컬럼 혹은 여러 개의 컬럼을 삭제한다. rename_column_clause 칼럼 이름을 변경한다. column_definition DEFAULT 새로운 칼럼을 추가할 때 DEFAULT 절을 명시하지 않으면 각 행의 새로운 칼럼의 초기값은 NULL이다. 그러나 DEFAULT 데이터 정의어 41 절을 명시한 경우에는 기존 행에 칼럼 추가 시 명시한 DEFAULT 값이 입력된다. TIMESTAMP TIMESTAMP 칼럼을 추가한다. column_constraint 새로운 칼럼에 대해 제약조건을 명시한다. NULL/NOT NULL 칼럼에 NULL 값 허용 여부를 지정한다. ALTER TABLE 구문을 사용해서 NULL 값이 허용되지 않는 칼럼을 추가하고자 하면 기본값을 반드시 지정해야 한다. 즉, 테이블에 새로 추가될 칼럼은 NULL 값을 허용하거나 기본값이 지정되어 있어야한다. SET PERSISTENT 자세한 내용은 CREATE INDEX 문을 참고한다 USING INDEX TABLESPACE tablespace_name 제약 조건을 위해 생성되는 인덱스가 저장될 테이블스페이스를 지정한다. * ALTER TABLE 문의 상당수의 절이 CREATE TABLE 문과 같은 기능을 가지고 있다. 그러한 절들에 대한 자세한 정보는 CREATE TABLE문을 참고한다. constraints_clauses 테이블에 제약조건을 추가, 삭제하거나 이름을 변경하는 절이다. add_table_constraints_clause 테이블에 제약조건을 추가하는 절이다. rename_table_constraints_clause 제약조건의 이름을 변경하는 절이다. drop_table_constraints_clause 존재하는 제약조건을 제거하는 절이다. DROP CONSTRAINT 제약조건 삭제 DROP PRIMARY KEY 기본키 삭제 DROP UNIQUE UNIQUE 제약 삭제 RENAME TO 테이블의 이름을 변경한다. ENABLE/DISABLE 42 SQL Reference 해당 테이블(tbl_name)의 모든 인덱스들을 비활성화 또는 활성화 상태로 변경하는 옵션이다. 서버 재구동 시 또는 데이터베이스 운영 중에 인덱스 빌딩 시간을 최소화1하여 성능을 향상시킬 수 있다. 예를 들어, iLoader로 대량의 데이터를 데이터베이스에 적재할 때 (또는 기존 테이블의 내용을 새 테이블로 이동할 때) 데이터가 저장될 테이블에 인덱스가 많은 경우, 인덱스 구축으로 인해 데이터 로딩에 많은 시간이 소요2된다. 그러므로 인덱스를 비활성화(disable)시킨 상태에서 대량의 레코드 삽입 후 인덱스를 다시 활성화(enable) 하면 데이터 로딩 시간이 단축되어 성능을 향상시킬 수 있다. 주의 사항 이중화 대상 테이블의 정의는 변경할 수 없다. 칼럼의 자료형을 변경하는 것은 테이블의 정의를 변경하는 것이므로 이중화 대상 테이블에는 허용되지 않는다. 다른 테이블에 의해 참조되는 기본키(PRIMARY KEY) 또는 유니크 키가 테이블에 존재하면 그 테이블의 정의는 변경할 수 없다. 칼럼 추가 또는 삭제로 테이블의 전체 칼럼 수가 0이 되거나 최대 칼럼 수인 1024개를 초과할 수 없다. 만약 테이블에 VARIABLE 속성의 칼럼이 있다면 그 테이블의 최대 허용 칼럼 수는 IN ROW 절에 지정한 값에 따라 1024개 이하가 될 것이다. 기본키는 한 테이블에 한 개만 존재할 수 있다. 참조 제약의 경우 외래키(foreign key)와 참조키(기본 키 또는 유니크 키)의 칼럼 개수와 각 칼럼의 자료형은 동일해야 한다. 외래키와 관련있는 칼럼의 경우 칼럼의 자료형을 변경할 수 없다. 외래키가 걸려 있는 칼럼이거나 외래키에 의해 참조되는 키 (기본키 또는 유니크 키)가 걸려 있는 칼럼의 경우 데이터 타입 변경이 칼럼의 값을 변경시킬 수 있으므로, 데이터 타입 변경을 허용하지 않는다. 한 테이블에 생성할 수 있는 인덱스의 최대 개수는 64개이다. 한 테이블의 기본키와 유니크 제약조건의 개수의 총합이 64개를 넘을 1 재구동 시의 성능을 극대화시키기 위해 인덱스 병렬 구축을 위한 구문을 제공한다. 또한 서버를 정상으로 종료할 때 인덱스를 디스크에 반영하는 PERSISTENT 인덱스 구문도 사용할 수 있다. 2 데이타베이스에 대량의 데이타를 가진 테이블에 대해서 인덱스 생성시 인덱스 생성 소요 시간은 인덱스의 개수에 비례한다. 하나의 테이블에 대해서 여러 개의 인덱스를 동시에 구축하는 방법은 제공하지 않지만, 각 인덱스 별로 병렬 구축을 수행한다면 인덱스 빌딩 시간을 최대한 단축시킬 수 있다. 데이터 정의어 43 수 없다. 제한 사항 ADD/DROP CONSTRAINT 절을 사용해서 기존 칼럼에 TIMESTAMP 제약조건을 추가 또는 삭제할 수 없다. TIMESTAMP 제약조건을 가진 칼럼에 INSERT 또는 UPDATE 수행 시 기본값으로 시스템 시간 값이 입력된다. 따라서 ALTIER TABLE SET/DROP DEFAULT 문을 이용하여 DEFAULT를 변경 또는 삭제할 수 없다. 자세한 설명은 CREATE TABLE문을 참고한다 예제 칼럼 추가/삭제 <질의> 테이블 books에 다음 칼럼들을 추가하라. isbn: CHAR(10) PRIMARY KEY edition: INTEGER DEFAULT 1 xdbiSQL> ALTER TABLE books ADD COLUMN (isbn CHAR(10) PRIMARY KEY, edition INTEGER DEFAULT 1); Alter success. 또는 xdbiSQL> ALTER TABLE books ADD COLUMN (isbn CHAR(10) CONSTRAINT const1 PRIMARY KEY, edition INTEGER DEFAULT 1); Alter success. <질의> 테이블 books에서 isbn 칼럼을 삭제하라. xdbiSQL> ALTER TABLE books DROP COLUMN isbn; Alter success. <질의> 테이블 books에 TIMESTAMP 칼럼을 추가하라. xdbiSQL> ALTER TABLE books ADD COLUMN (due_date TIMESTAMP); Alter success. <질의> 테이블 books에 isbn, due_date 칼럼인 due_date을 삭제하라. xdbiSQL> ALTER TABLE books DROP COLUMN (isbn, due_date); Alter success. 기존 칼럼에 제약조건 추가/삭제 44 SQL Reference <질의> 테이블 books의 기존 bno(북넘버) 칼럼에 UNIQUE 제약조건을 추가하라. xdbiSQL> ALTER TABLE books ADD UNIQUE(bno); Alter success. 또는 xdbiSQL> ALTER TABLE books ADD CONSTRAINT const1 UNIQUE(bno); Alter success <질의> 테이블 boosk의 const1 제약조건의 이름을 변경하라. xdbiSQL> ALTER TABLE books RENAME CONSTRAINT const1 TO const_unique; Alter success <질의> 테이블 books의 bno 칼럼의 UNIQUE 제약조건을 삭제하라. xdbiSQL> ALTER TABLE books DROP UNIQUE(bno); Alter success. 또는 xdbiSQL> ALTER TABLE books DROP CONSTRAINT const_unique; Alter success <질의> 테이블 inventory에 다음 칼럼 추가 시 books 테이블의 isbn을 참조하는 외래키 fk_isbn을 추가하라. isbn: CHAR(10) xdbiSQL> ALTER TABLE inventory ADD COLUMN(isbn CHAR(10) CONSTRAINT fk_isbn REFERENCES books(isbn)); Alter success. <질의> 테이블 inventory의 제약조건 fk_isbn을 삭제하라. xdbiSQL> ALTER TABLE inventory DROP CONSTRAINT fk_isbn; Alter success. <질의> 테이블 books에서 기본키 제약을 삭제하라. xdbiSQL> ALTER TABLE books DROP PRIMARY KEY; Alter success. <질의> 테이블 books의 칼럼 bno(북넘버)에 PRIMARY KEY 제약을 추가하라. xdbiSQL> ALTER TABLE books ADD PRIMARY KEY (bno) USING INDEX PARALLEL 4; Alter success. 칼럼 이름 변경 테이블의 칼럼 이름을 변경할 때 사용한다. 새로운 칼럼 이름은 그 테이블에 있는 다른 칼럼 이름과 같아서는 안 된다. 칼럼 이름이 변경됐을 때, 예전 칼럼과 관련 된 인덱스 및 모든 제약 조건은 데이터 정의어 45 새로운 칼럼이 승계한다. 예전 칼럼을 참조하는 저장 프로시저가 존재하면 해당 프로시저는 invalid 한 상태가 된다. 이렇게 된 저장 프로시저를 사용 가능하도록 하려면 사용자는 저장 프로시저내의 칼럼 이름을 새로운 이름으로 변경해야 한다. <질의> 테이블 departments에서 칼럼 이름 dno를 dcode로 변경하라. xdbiSQL> ALTER TABLE departments RENAME COLUMN dno TO dcode; Alter success. DEFAULT 값 설정/삭제 <질의> 테이블 employees에서 sex 칼럼의 기본값을 ‘M’으로 설정하라. xdbiSQL> ALTER TABLE employees ALTER (sex SET DEFAULT 'M'); Alter success. <질의> 테이블 employees에서 sex 칼럼의 기본값 설정을 삭제하라. xdbiSQL> ALTER TABLE employees ALTER (sex DROP DEFAULT); Alter success. 칼럼의 자료형 변경 <질의> 테이블 books의 isbn 칼럼의 자료형을 CHAR(20) 형으로, edition 칼럼의 자료형을 BIGINT 형으로 변경하라. xdbiSQL> ALTER TABLE books MODIFY COLUMN (isbn CHAR(20), edition BIGINT); Alter success. 테이블 이름 변경 <질의> 테이블 books의 이름을 ebooks으로 변경하라. xdbiSQL> RENAME books TO ebooks; Rename success. 또는 xdbiSQL> ALTER TABLE books RENAME TO ebooks; Alter success. PERSISTENT 인덱스 변경 <질의> 테이블 books에 PRIMARY KEY 제약과 PERSISTENT 인덱스를 가진 칼럼 isbn을 추가하라. xdbiSQL> ALTER TABLE books 46 SQL Reference ADD COLUMN (isbn CHAR(10) CONSTRAINT const1 PRIMARY KEY SET PERSISTENT = ON, edition INTEGER DEFAULT 1); Alter success. <질의> 테이블 books에 PRIMARY KEY 제약을 가지고 있는 칼럼 isbn에 PERSISTENT 인덱스를 추가하라. xdbiSQL> ALTER TABLE books ADD COLUMN (isbn CHAR(10) CONSTRAINT const1 PRIMARY KEY, edition INTEGER DEFAULT 1); Alter success. xdbiSQL> ALTER TABLE books DROP COLUMN isbn; Alter success. xdbiSQL> ALTER TABLE books ADD COLUMN (isbn CHAR(10) CONSTRAINT const1 PRIMARY KEY SET PERSISTENT = ON, edition INTEGER DEFAULT 1); Alter success. 인덱스 활성화/비활성화 <질의> 테이블 orders의 모든 인덱스를 비활성하라. xdbiSQL> ALTER TABLE orders ALL INDEX DISABLE; Alter success. 데이터 정의어 47 ALTER TABLESPACE 구문 alter_tablespace ::= ALTERTABLESPACEtablespace_namemodify_checkpoint_path_clause; backup_clause autoextend_clause autoextend_clause ::= NEXT AUTOEXTEND OFF ON integer K M G maxsize_clause maxsize_clause ::= MAXSIZE integer UNLIMITED G M K modify_checkpoint_path_clause ::= ADD RENAMEchkpoint_path’TO‘chkpoint_path’ DROP ‘CHECKPOINTPATH CHECKPOINTPATHchkpoint_path’‘ CHECKPOINTPATHchkpoint_path’‘ 48 SQL Reference backup_clause ::= BEGIN END BACKUP 전제 조건 SYS 사용자 또는 ALTER TABLESPACE 시스템 권한을 가진 사용자가 ALTER TABLESPACE 문의 모든 기능을 수행할 수 있다. 설명 ALTER TABLESPACE 문으로 테이블스페이스의 정의를 변경한다. 또한 체크포인트 경로, 자동 확장 관련 설정, 테이블스페이스 상태 등에 대해서도 변경할 수 있다. tablespace_name 변경될 테이블스페이스 이름이다. autoextend_clause 테이블스페이스의 자동 확장 관련 속성(여부, 확장단위, 최대 크기)을 변경한다. modify_checkpoint_path_clause 체크포인트 이미지 경로를 추가, 변경, 또는 삭제하는 절이다. 체크포인트 이미지 경로 관련 연산들은 CONTROL 구동 단계에서만 가능하다. ADD CHECKPOINT PATH 절 메모리 테이블스페이스에 새로운 체크포인트 경로를 추가한다. DBA는 다른 체크포인트 경로 안에 존재하는 기존의 체크포인트 이미지들을 새로운 체크포인트 경로로 이동해도 된다. 메모리 테이블스페이스를 로드할 때, 알티베이스는 모든 체크포인트 경로에 대해서 체크포인트 이미지 파일을 검색하기 때문에, 체크포인트 이미지는 테이블스페이스의 체크포인트 경로 중 하나에 저장되어 있으면 된다. 새로운 체크포인트 경로를 추가한 후에 체크포인트가 발생하면, 체크포인트 이미지 파일이 새로운 체크포인트 경로까지 포함한 모든 체크포인트 경로에 골고루 분배된다. 데이터 정의어 49 명시한 체크포인트 경로가 존재하지 않거나, 알티베이스 서버를 구동한 사용자 계정이 체크포인트 경로에 적절한 권한 (permission) 을 갖고 있지 않으면 에러가 발생한다. 그러므로, DBA는 추가될 체크포인트 경로를 파일 시스템 상에 직접 생성하고, 그 경로에 대한 적절한 권한을 사용자 계정에 줘야 한다. RENAME CHECKPOINT PATH 절 메모리 테이블스페이스의 기존 체크포인트 경로를 TO 이하 절로 지정한 경로로 변경한다. DBA는 파일 시스템 상에서 실제 체크포인트 경로의 이름을 변경하는 작업을 직접 수행해야 한다. 해당 체크포인트 경로가 존재하지 않거나, 알티베이스 서버를 구동한 사용자 계정이 체크포인트 경로에 대한 적절한 권한(permission)을 갖고 있지 않으면 에러가 발생한다. DROP CHECKPOINT PATH 절 메모리 테이블스페이스의 기존 체크포인트 경로를 삭제한다. DBA는 삭제된 체크포인트 경로의 디렉토리 안에 존재하는 기존의 체크포인트 이미지들을 테이블스페이스에 남아있는 다른 체크포인트 경로로 이동해야 한다. 메모리 테이블스페이스를 로드할 때, 알티베이스는 모든 체크포인트 경로에 대해서 체크포인트 이미지 파일을 검색하기 때문에, 체크포인트 이미지는 테이블스페이스의 체크포인트 경로 중 하나에 저장되어 있으면 된다. 파일 시스템 상에서 실제 체크포인트 경로를 삭제하는 작업은 DBA가 직접 수행하여야 한다. 메모리 테이블스페이스에는 최소한 하나의 체크포인트 경로가 존재해야 한다. 만약 메모리 테이스블스페이스에 남아있는 하나뿐인 유일한 체크포인트 경로를 제거하려고 하는 경우 에러가 발생한다. backup clause 테이블스페이스의 데이터 파일을 복사하는 온라인 백업(핫 백업)의 시작과 완료를 명시하는 구문이다. BEGIN BACKUP 테이블스페이스를 구성하는 모든 데이터 파일들에 온라인 백업 모드를 설정하는 절이다. 이 구문과 END BACKUP사이에 놓인 백업 중인 테이블스페이스에도 트랜잭션의 접근이 가능하다. 사용자는 데이터 파일을 “온라인 백업”(직접 복사)하기 전에 BEGIN BACKUP을 먼저 실행해야 한다. 또한 사용자는 한 개 이상의 테이블스페이스를 동시에 온라인 백업 모드로 설정하는 것도 가능하다. END BACKUP 50 SQL Reference 테이블스페이스의 온라인 백업이 완료되었음을 명시한다. 사용자는 온라인 백업을 완료한 직후에 바로 END BACKUP 구문을 수행해야 한다. 예제 <질의> 체크포인트시의 디스크 입출력 분산을 위해 ‘/home/path’ 체크포인트 경로를 user_memory_tbs 테이블스페이스에 추가하라. 또한, 확장 단위를 256M, 최대 크기를 1G로 변경하라. (경로 추가 작업은 CONTROL 단계에서만 가능하고, 속성 변경은 SERVICE 단계에서 할 수 있다.) iSQL(sysdba)>>startup control; iSQL(sysdba)>>ALTER TABLESPACE user_memory_tbs ADD CHECKPOINT PATH '/home/path'; Alter success. xdbiSQL> ALTER TABLESPACE user_memory_tbs ALTER AUTOEXTEND OFF; xdbiSQL> ALTER TABLESPACE user_memory_tbs ALTER AUTOEXTEND ON NEXT 256M MAXSIZE 1G; Alter success. 데이터 정의어 51 ALTER TRIGGER 구문 alter_trigger ::= ALTERTRIGGERtrigger_name ENABLE DISABLE COMPILEuser_name. ; 전제 조건 SYS 사용자, 트리거가 속한 스키마의 소유자 또는 ALTER ANY TRIGGER 시스템 권한을 가진 사용자만이 이 구문으로 트리거를 변경할 수 있다. 설명 명시한 트리거의 작동을 가능, 불가능하게 하거나 컴파일 한다. user_name 변경될 트리거의 소유자 이름을 명시한다. 생략하면 알티베이스는 현재 세션에 접속한 사용자의 스키마에 속한 것으로 간주한다. trigger_name 변경될 트리거의 이름을 명시한다. ENABLE 명시한 트리거의 작동을 사용 가능하게 한다. DISABLE 명시한 트리거의 작동을 불가능하게 한다. COMPILE 명시한 트리거의 유효성 여부에 관계 없이 명시적으로 컴파일 한다. 명시적 재컴파일은 수행 중에 트리거가 유효하지 않은 경우 암시적으로 컴파일 하는 부하를 제거한다. 52 SQL Reference 예제 <질의> 다음 예는 명시한 트리거의 작동을 불가능하게 한다. 트리거 del_trigger를 생성하는 구문은 CREATE TRIGGER 문의 예제를 참조한다. xdbiSQL> ALTER TRIGGER del_trigger DISABLE; Alter success. 데이터 정의어 53 ALTER USER 구문 alter_user ::= ALTER IDENTIFIED USERuser_name password ACCESStblspace_name OFF ; DEFAULTTABLESPACEtblspace_name BY ON 전제 조건 SYS 사용자 또는 ALTER USER 시스템 권한을 가진 사용자만이 이 구문을 이용해서 사용자 정의를 변경할 수 있다. 그러나 현재 접속한 사용자가 자신의 암호를 변경할 때에는 권한이 필요없다. 설명 사용자의 암호를 변경하는 구문이다. IDENTIFIED 절 사용자의 새로운 암호를 명시한다. 새로운 암호는 BY 뒤에 지정한다. 이외 다른 절의 기능들은 CREATE USER 문의 해당하는 절과 동일하므로 CREATE USER 문을 참고한다. 주의사항 SYSDBA 모드로 접속가능한 SYS 사용자의 암호를 변경하고자 할 경우, 먼저 ALTER USER 문으로 암호를 변경한 후 운영체제의 콘솔 54 SQL Reference (유닉스 쉘 혹은 DOS 창)에서 altipasswd를 실행하여 암호를 한번 더 변경해야 한다. altipasswd에 대한 자세한 내용은 Utilities Manual을 참고한다. 예제 <질의> 사용자 tom의 암호를 ab1rose로 변경하라. xdbiSQL> ALTER USER tom IDENTIFIED BY ab1rose; Alter success. <질의> 사용자의 기본 테이블스페이스를 변경하라. xdbiSQL> ALTER USER tom DEFAULT TABLESPACE uare_data; Alter success. 데이터 정의어 55 ALTER VIEW 구문 alter_view ::= ALTERVIEW user_name. view_nameCOMPILE; 전제 조건 SYS 사용자, 뷰가 속한 스키마의 소유자 또는 ALTER ANY TABLE 시스템 권한을 가진 사용자만이 이 구문으로 뷰를 변경할 수 있다. 설명 뷰가 유효하지 않을 때(invalid) 그 뷰를 재 컴파일 하는데 사용한다. 예를 들어, 뷰의 기반 테이블중에 하나가 ALTER TABLE 문에 의하여 정의가 변경된 경우 명시적으로 뷰를 재 컴파일 하는데 사용할 수 있다. user_name 재 컴파일 될 뷰의 소유자 이름을 명시한다. 생략하면 알티베이스는 현재 세션에 연결된 사용자의 스키마에 속한 것으로 간주한다. view_name 재 컴파일 될 뷰의 이름을 명시한다. 뷰를 재 컴파일 때 알티베이스는 뷰 생성문을 읽어와 다시 컴파일을 수행하므로 뷰 생성 시 발생할 수 있는 오류들이 ALTER VIEW 문 수행 시에도 발생할 수 있다. 뷰를 생성할 때 FORCE 옵션을 사용했다면, ALTER VIEW 문으로 뷰를 컴파일하는데 성공한 후에도 뷰가 여전히 무효인 상태일 수 있다. ALTER VIEW 문은 기존 뷰의 정의를 변경하지 않는다. 뷰를 재 정의하려면 CREATE OR REPLACE VIEW 문을 사용해야 한다. 56 SQL Reference 예제 <질의> 기반 테이블 employees의 정의를 변경 후, 뷰 avg_sal 을 재 컴파일하라. (avg_sal 뷰의 생성은 CREATE VIEW 예제를 참고하라.) xdbiSQL> ALTER TABLE employees ADD COLUMN (email VARCHAR(20)); Alter success. xdbiSQL> ALTER VIEW avg_sal COMPILE; Alter success. xdbiSQL> SELECT * FROM avg_sal; DNO EMP_AVG_SAL --------------------- .. 6 rows selected. 데이터 정의어 57 COMMENT 구문 comment_on ::= user_name TABLE COLUMN .table_name view_name comment COMMENTON user_name.table_name view_name . . column_name IS‘’; 전제 조건 SYS 사용자, 테이블(뷰)이 속한 스키마의 소유자, 테이블(뷰)에 대해 ALTER 객체 권한을 가진 사용자, 또는 ALTER ANY TABLE 시스템 권한을 가진 사용자만이 이 구문으로 주석을 작성할 수 있다. 설명 명시된 테이블, 뷰 또는 칼럼에 대한 주석을 작성하거나 수정하는데 사용한다. user_name COMMENT 문을 실행할 객체의 소유자 이름을 명시한다. 생략하면 알티베이스는 현재 세션에 연결된 사용자의 스키마에 속한 것으로 간주한다. table_name, view_name 주석을 다는 테이블 혹은 뷰의 이름을 명시한다. column_name 주석을 다는 칼럼 이름을 명시한다. 58 SQL Reference comment 주석 내용을 명시한다. 주석은 최대 4000 바이트까지 입력할 수 있다. 주석을 삭제하고자 할 때에는 작은 따옴표(‘) 사이에 주석 내용을 쓰지 말고 COMMENT 문을 실행하여 기존 내용을 지운다. 예제 <질의> 사용자 library의 테이블 books와 그 테이블의 title칼럼에 주석을 추가한다. xdbiSQL> COMMENT ON TABLE library.books IS 'Table of Book Info'; Comment Created. xdbiSQL> COMMENT ON COLUMN library.books.title IS 'Title of Book'; Comment Created. <질의> 사용자 library의 테이블 books 와 그 칼럼의 주석을 조회한다. xdbiSQL> SET VERTICAL ON; xdbiSQL> SELECT * FROM system_.sys_comments_ WHERE user_name = ‘LIBRARY’ AND table_name = ‘BOOKS’; SYS_COMMENTS_.USER_NAME : LIBRARY SYS_COMMENTS_.TABLE_NAME : BOOKS SYS_COMMENTS_.COLUMN_NAME : TITLE SYS_COMMENTS_.COMMENTS : title of book SYS_COMMENTS_.USER_NAME : LIBRARY SYS_COMMENTS_.TABLE_NAME : BOOKS SYS_COMMENTS_.COLUMN_NAME : SYS_COMMENTS_.COMMENTS : table of book info 2 rows selected. <질의> 테이블 books와 그 테이블의 title칼럼의 주석을 제거한다. xdbiSQL> COMMENT ON TABLE library.books IS ’’; Comment created. xdbiSQL> COMMENT ON COLUMN library.books.title IS ’’; Comment created. 데이터 정의어 59 CREATE DATABASE 구문 create_database ::= CREATEDATABASEdatabase_nameintegerINITSIZE= M G ARCHIVELOG NOARCHIVELOG ; CHARACTER NATIONALCHARACTERSET SETcharaset charaset 전제 조건 이 구문은 PROCESS 구동 단계에서만 수행할 수 있으므로, SYS 사용자가 -sysdba 모드로 실행한 iSQL에서만 실행할 수 있다. 설명 데이터베이스를 생성하는 구문이다. 데이터베이스 생성시 딕셔너리 테이블스페이스(Dictionary Tablespace), 언두 테이블스페이스(Undo Tablespace), 임시 테이블스페이스(Temp Tablespace)등 다수의 시스템 테이블스페이스(System Tablespace)가 만들어진다. 생성되는 시스템 테이블스페이스는 시스템에 의해 정의된 이름과 알티베이스 프로퍼티의 기본값을 갖는다. 사용자 정의 테이블스페이스는 이후에 사용자가 추가로 생성할 수 있다. 데이터베이스 생성시 데이터베이스 캐릭터 셋과 내셔널 캐릭터 셋을 반드시 지정해야 한다. database_name 생성할 데이터베이스 이름을 명시한다. 명시하는 데이터베이스 60 SQL Reference 이름은 프로퍼티 파일에 DB_NAME프로퍼티로 지정한 이름과 동일해야 한다. 다른 경우에는 오류가 발생한다. INITSIZE 절 데이터베이스의 초기 크기를 나타내며, 128M 또는 4G 등의 형식으로 사용할 수 있다. 단위 없이 숫자만 명시할 경우, 기본으로 MB(Mega Bytes) 단위로 지정된다. ARCHIVELOG | NOARCHIVELOG 데이터베이스를 archive log 모드 또는 noachive log 모드로 운영할지를 명시한다. 아카이브로그 모드로 운영시 매체 복구에 대비할 수 있는 반면, 노아카이브로그 모드로 운영할 때에는 매체 복구가 불가능하다. 알티베이스 백업과 복구에 대한 자세한 정보는 Administrator’s Manual을 참고하기 바란다. charset 데이터베이스의 캐릭터 셋, 내셔날 캐릭터 셋을 지정한다. 지정 가능한 데이터베이스 캐릭터 셋 US7ASCII KO16KSC5601 MS949 BIG5 GB231280 UTF8 SHIFTJIS EUCJP 지정 가능한 내셔널 캐릭터 셋 UTF8 UTF16 예제 <질의> 이름이 mydb이고, 데이터베이스 캐릭터 셋은 KSC5601, 내셔널 캐릭터 셋은 UTF16인 10MB 크기의 데이터베이스를 생성하라. $ xdbisql -s localhost -u sys -p manager -sysdba .. xdbiSQL> STARTUP PROCESS; Trying Connect to Altibase.. Connected with Altibase. TRANSITION TO PHASE: PROCESS 데이터 정의어 61 Command execute success. xdbiSQL> CREATE DATABASE mydb INITSIZE=10M NOARCHIVELOG CHARACTER SET KSC5601 NATIONAL CHARACTER SET UTF16; . . Create success. 62 SQL Reference CREATE DIRECTORY 구문 CREATE ORREPLACE DIRECTORYdirectory_name AS‘’path_name; 전제 조건 SYS 사용자 또는 CREATE ANY DIRECTORY 시스템 권한을 가진 사용자만이 이 구문으로 디렉토리 객체를 생성할 수 있다. 설명 저장프로시저에서 파일 조작이 가능하다는 것은 운영 체제 파일 시스템상의 텍스트 파일에 대한 읽기 및 쓰기가 가능하다는 것을 의미한다. 이 기능을 이용하여 사용자는 저장프로시저 실행에 대해서 메시지를 파일에 남길 수도 있으며, 파일로 질의 결과를 리포팅 하거나 파일로부터 데이터를 읽어와 테이블에 삽입하는 등 다양한 작업을 수행할 수 있다. CREATE DIRECTORY구문은 이러한 저장프로시저가 사용하는 파일들이 위치하는 디렉토리에 해당하는 데이터베이스 객체를 생성하는데 사용된다. CREATE DIRECTORY문으로 생성된 디렉토리 객체의 소유자는 항상 SYS사용자이다. 실제 디렉토리 객체를 생성한 사용자는 이 객체에 대한 읽기와 쓰기 권한(WITH GRANT OPTION 포함)을 부여받을 뿐이다. CREATE DIRECTORY문의 실행은 SYS_DIRECTORIES_ 메타 테이블에 디렉토리 정보를 기록할 뿐이며, 실제 운영 체제의 파일 시스템에 디렉토리를 생성하지는 않는다. 따라서 사용자는 실제 파일 시스템에 수동으로 디렉토리를 생성해야 한다. 데이터 정의어 63 OR REPLACE 이미 존재하는 디렉토리를 대체하여 같은 이름의 새로운 디렉토리를 생성하기 위한 옵션이다. 파일 시스템상의 실제 디렉토리는 삭제되지 않는다. directory_name 데이터베이스 객체로서의 디렉토리 이름을 명시한다. path_name 운영 체제 파일 시스템 상의 디렉토리의 절대 경로를 문자열로 명시한다. 예제 <질의> /home/altibase/altibase_xdb_home/psm_msg 디렉토리를 가리키는 alti_dir1 디렉토리 객체를 생성하라. xdbiSQL> create directory alti_dir1 as '/home/altibase/altibase_xdb_home/psm_msg'; Create success. <질의> /home/altibase/altibase_xdb_home/psm_result 디렉토리를 가리키는 alti_dir1 디렉토리 객체를 생성하라. 이미 alti_dir1 이름의 디렉토리가 데이터베이스에 존재하는 경우 이를 대체하여 생성하라. xdbiSQL> create or replace directory alti_dir1 as '/home/altibase/altibase_xdb_home/psm_result'; Create success. 64 SQL Reference CREATE INDEX 구문 create_index ::= CREATE memory_index_clause INDEX ON index_name UNIQUEuser_name. table_index_clause; table_index_clause ::= ()column_name ASC DESC , user_name. tbl_name memory_index_clause ::= set_persistent_clausememory_index_attributesdomain_index_clause domain_index_clause ::= INDEXTYPEISBTREE set_persistent_clause ::= PERSISTENTSET= ON OFF 데이터 정의어 65 memory_index_attributes ::= TABLESPACEtablespace_name parallel_clause parallel_clause ::= PARALLEL NOPARALLEL parallel_factor 전제 조건 SYS 사용자, CREATE INDEX 시스템 권한을 가진 사용자 또는 인덱스가 생성될 테이블에 대한 INDEX 객체 권한을 가진 사용자만이 이 구문으로 인덱스를 생성할 수 있다. 설명 테이블의 한 개 이상의 칼럼에 대해 인덱스를 생성하는 구문이다. user_name 생성될 인덱스의 소유자 이름을 명시한다. 생략하면 알티베이스는 현재 세션에 연결된 사용자의 스키마에 인덱스를 생성한다. index_name 생성될 인덱스 이름을 명시한다. UNIQUE 중복 값을 허용하지 않는다. ASC/DESC 인덱스 키의 각 칼럼이 오름차순인지 내림차순인지를 지정한다. BTREE B+-Tree 인덱스를 생성하도록 지시한다. 이는 범위 검색 시 유용하다. INDEXTYPE IS 절 생략 시 기본으로 B+-Tree 인덱스가 생성된다. SET PERSISTENT 서버가 정상으로 종료 시 메모리 테이블에 대한 인덱스를 디스크에 66 SQL Reference 저장할 것인지 여부를 지정하는 옵션이다. 서버 종료 시 메모리 테이블에 대한 인덱스는 디스크에 저장되지 않고, 서버 구동 시 메모리 테이블스페이스의 모든 인덱스들은 재생성된다. 그러나 PERSISTENT 옵션을 ON으로 인덱스를 생성하면, 서버를 정상 종료할 때 메모리 인덱스는 디스크의 특정 파일에 저장된다. 그리고 서버가 구동될 때 저장된 인덱스 파일들을 읽음으로써 인덱스 재생성 시간이 절약될 수 있다. 기본값은 OFF이다. 서버가 종료될 때 인덱스가 디스크에 저장되도록 하려면 PERSTISTENT 옵션을 ON으로 지정한다. TABLESPACE 절 인덱스가 저장될 테이블스페이스 이름을 명시한다. 이 절을 생략하면 알티베이스는 인덱스를 그 인덱스가 속하는 스키마 소유자의 기본 테이블스페이스에 생성한다. 그러나 메모리 테이블에 인덱스를 생성하는 구문에는 테이블스페이스를 지정하더라도 메모리 인덱스는 테이블스페이스에 저장되지 않으므로 이는 무시된다. parallel_clause 이는 인덱스를 생성하는 쓰레드의 개수를 결정하는 데 사용되는 힌트(hint)로 인덱스 생성시 성능 향상을 목적으로 사용한다. 알티베이스는 사용자가 힌트로 지정한 parallel_factor, 인덱스 생성 대상 테이블의 크기 및 인덱스 생성 시 사용가능한 메모리 양을 고려하여 최적화된 인덱스 생성 쓰레드의 개수를 결정한다. parallel_factor의 입력 가능한 값의 범위는 0 ~ 512이고, 기본값은 알티베이스가 동작중인 호스트 장비의 CPU 개수이다. 인덱스 생성 쓰래드 개수는 위에서 설명한 최적화 방법으로 결정되기 때문에 parallel_factor는 생략해도 무방하다. 이 구문을 생략하거나 0으로 설정한 경우, parallel_factor와 동일한 의미를 갖는 altibase_xdb.properties 파일에 설정된 INDEX_BUILD_THREAD_COUNT 프로퍼티 값이 대신 사용된다. INDEX_BUILD_THREAD_COUNT프로퍼티도 명시되어 있지 않은 경우, CPU 개수에 기반하여 최적화된 인덱스 생성 쓰레드 개수가 결정된다. parallel_factor의 값을 실제 CPU 개수보다 큰 값으로 설정하는 경우, 혹은 최대값인 512를 초과해 설정하는 경우, CPU 개수를 힌트로 사용하여 최적화된 인덱스 생성 쓰레드 개수가 결정된다. 데이터 정의어 67 주의 사항 LOB 칼럼은 인덱스 키 칼럼이 될 수 없다. 예제 <질의 1> 사원 테이블의 eno 칼럼 (오름차순)과 dno칼럼 (내림차순)에 인덱스 emp_idx2를 생성하라. xdbiSQL> CREATE INDEX emp_idx2 ON employees (eno ASC, dno DESC); Create success. <질의 2> 사원 테이블의 dno 칼럼에 내림차순의 유니크 인덱스 emp_idx2를 생성하라. (이는 사원 테이블에 레코드가 전혀 없거나 칼럼 dno에 unique한 값들만 존재 할 때 가능하다.) xdbiSQL> CREATE UNIQUE INDEX emp_idx2 ON employees (dno DESC); Create success. <질의 3>테이블 employees의 eno 칼럼에 오름차순으로 B+tree 인덱스 emp_idx3를 생성하라. 이미 사원 테이블의 eno칼럼에 PRIMARY KEY가 존재하기 때문에 인덱스 emp_idx3를 생성하기 전에 기본키 제약을 삭제해야 한다. 그렇지 않으면, 다음 오류가 발생할 것이다: ERR-3104C: Duplicate key columns in an index xdbiSQL> ALTER TABLE employees DROP PRIMARY KEY; Alter success. xdbiSQL> CREATE INDEX emp_idx3 ON employees (eno ASC) INDEXTYPE IS BTREE; Create success. <질의 4> 테이블 employees의 eno칼럼(내림차순)과 dno 칼럼(오름차순)에 PERSISTENT 속성을 가진 B+tree인덱스 emp_idx1을 생성하라. xdbiSQL> CREATE INDEX emp_idx1 ON employees (eno DESC, dno ASC) INDEXTYPE IS BTREE SET PERSISTENT = ON; Create success. <질의 5> user_data 테이블스페이스에 table_user 테이블의 i1칼럼에 인덱스 idx1을 생성하라. xdbiSQL> CREATE INDEX idx1 ON table_user (i1) TABLESPACE user_data; Create success. <질의 6> user_data 테이블스페이스에 table_user 테이블의 i1 68 SQL Reference 칼럼에 인덱스 idx2을 병렬 옵션으로 생성하라. xdbiSQL> CREATE INDEX idx1 ON table_user (i1) TABLESPACE user_data PARALLEL 4; Create success. 데이터 정의어 69 CREATE QUEUE 구문 create_queue ::= size; CREATEQUEUEqueue_name FIXED ) variable_clause ( 설명 큐에 삽입 가능한 최대 메시지의 길이를 지정하여 큐를 생성하는 구문이다. 큐 테이블에 저장 가능한 최대 레코드 수도 지정할 수 있다. queue_name 큐의 이름을 지정한다. 최대로 가능한 큐 이름의 길이는 28 바이트이다. size 큐에 저장될 메시지의 최대 크기(단위: 바이트)를 지정한다. 지정 가능한 값의 범위는 1에서 32000바이트이다. FIXED|variable_clause 메시지의 저장 방식을 지정한다. (자세한 설명은 General Reference를 참고한다.) 주의사항 큐 생성시에 데이터베이스 내부적으로 “큐 이름”+ “_NEXT_MSG_ID”라는 명칭의 테이블 객체가 생성된다. 따라서 생성 하고자 하는 큐의 이름 또는 “큐 이름”+ “_NEXT_MSG_ID”과 동일한 70 SQL Reference 이름의 테이블, 뷰, 시퀀스, 시노님, 또는 저장 프로시저가 이미 존재하는 경우에 에러가 발생한다. 예제 <질의> 메시지의 길이가 최대 40인 Q1이라는 이름의 큐를 생성하라. CREATE QUEUE Q1(40); 데이터 정의어 71 CREATE REPLICATION 구문 create_replication ::= WITH'replication_host_ip',replication_host_port_no , CREATEREPLICATIONreplication_name AS MASTER AS SLAVE LAZY FROM.user_nametbl_nameuser_name.tbl_name;TO 설명 이중화 객체를 생성하는 구문으로, 이는 지역 서버에서 원격 서버로의 이중화 연결을 설정한다. 한 이중화 객체는 최대 32개의 다른 원격 서버와 연결할 수 있다. 이중화는 테이블 간에 1:1 로 일어난다. 즉, 한 테이블은 상대편의 오직 하나의 테이블에만 매칭된다. 데이터 충돌을 해결하기 위해 이중화 생성 구문에 AS MASTER 또는 AS SLAVE를 지정하여 Master-Slave scheme을 사용할 수 있다. 이중화 충돌 해결에 대한 자세한 내용은 Replication Manual을 참고한다. replication_name 이중화 이름을 명시한다. 지역 서버와 원격 서버의 이중화 객체의 이름이 동일해야 한다. replication_host_ip 원격 서버의 IP 주소를 입력한다. replication_host_port_no 72 SQL Reference 원격 서버의 수신 쓰레드가 사용하는 포트번호를 입력한다. 이는 원격 서버 altibase_xdb.properties 파일의 REPLICATION_PORT_NO프로퍼티 값과 일치해야 한다. user_name 이중화 대상 테이블의 소유자 이름을 명시한다. tbl_name 이중화 대상 테이블 이름을 명시한다. 예제 <질의> 다음 조건에 부합하는 이중화 rep1을 생성하라. 지역 서버의 IP 주소가 192.168.1.60 이고 포트 번호가 25524 원격 서버의 IP 주소가 192.168.1.12 이고 포트 번호가 35524 employees 테이블과 departments 테이블을 이중화 지역 서버의 경우 (IP: 192.168.60) xdbiSQL> CREATE REPLICATION rep1 WITH '192.168.1.12',35524 FROM sys.employees TO sys.employees, FROM sys.departments TO sys.departments; Create success. 원격 서버의 경우 (IP: 192.168.1.12) xdbiSQL> CREATE REPLICATION rep1 WITH '192.168.1.60',25524 FROM sys.employees TO sys.employees, FROM sys.departments TO sys.departments; Create success. 데이터 정의어 73 CREATE SEQUENCE 구문 create_sequence ::= CREATESEQUENCEseq_name integer MAXVALUEinteger NOMAXVALUE MINVALUEinteger NOMINVALUE CYCLE CACHE ; INCREMENT WITHSTART integer user_name. BY 전제 조건 SYS 사용자 또는 CREATE SEQUENCE 시스템 권한을 가진 사용자만이 이 구문으로 시퀀스를 생성할 수 있다. 만약 다른 사용자의 스키마에 시퀀스를 생성하려면, CREATE ANY SEQUENCE 권한을 가져야한다. 설명 이 구문은 명시된 시퀀스 이름으로 새로운 시퀀스를 생성한다. 생성된 시퀀스는 시퀀스 번호를 자동으로 생성하는데 사용된다. user_name 생성될 시퀀스의 소유자 이름을 명시한다. 생략하면 알티베이스는 현재 세션에 연결된 사용자의 스키마에 시퀀스를 생성한다. seq_name 74 SQL Reference 생성될 시퀀스 이름을 명시한다. START WITH 시퀀스의 시작값을 명시한다. 이는 MINVALUE와 MAXVALUE 사이의 값으로 지정 가능하다. 이 값이 생략되고 INCREMENT BY의 값이 0보다 크면, 기본값은 시퀀스의 최소값과 동일하다. 이 값이 생략되고 INCREMENT BY의 값이 0보다 작으면, 기본값은 시퀀스의 최대값과 동일하다. INCREMENT BY 시퀀스의 증감분을 명시한다. 기본값은 1이다. 이 값의 절대값은 MAXVALUE와 MINVALUE의 차이보다 작아야 한다. MAXVALUE 시퀀스의 최대값을 명시한다. 이는 -9223372036854775807부터 9223372036854775806까지의 범위내에서 지정 가능하다. 생략할 경우, INCREMENT BY의 값이 0보다 크면 기본값은 9223372036854775806이다. INCREMENT BY의 값이 0보다 작으면, 기본값은 -1이다. MINVALUE 시퀀스의 최소값을 명시한다. 이는 -9223372036854775807부터 9223372036854775806까지의 범위내에서 지정 가능하다. 생략할 경우, INCREMENT BY의 값이 0보다 크면 기본값은 1이다. INCREMENT BY의 값이 0보다 작으면, 기본값은 - 9223372036854775807이다. CYCLE 이는 시퀀스가 최대값 또는 최소값 한계에 도달했을 때 다음 시퀀스 값을 계속 생성할지 여부를 지정하는 옵션이다. 오름차순 시퀀스의 경우는 시퀀스의 다음 값은 최소값에서 다시 순환되고, 내림차순 시퀀스의 경우는 최대값부터 다시 순환된다. CACHE 시퀀스 값을 더 빠르게 액세스 하기 위하여 명시된 개수 만큼의 시퀀스 값들이 메모리에 캐시된다. 캐시는 시퀀스가 처음 참조될 때 채워지며 다음 시퀀스 값을 요청할 때마다 캐시된 시퀀스에서 검색된다. 캐시된 마지막 시퀀스 값을 사용한 이후의 다음 시퀀스 값 요청시에 시퀀스 값들이 메모리에 캐시된다. 이 값을 생략하면 기본값은 20이다. * 새로 생성된 시퀀스에 대한 sequence_name.CURRVAL시도는 실패한다. sequence_name.CURRVAL로 새로 생성된 시퀀스에 데이터 정의어 75 접근하려면 먼저 sequence_name.NEXTVAL을 사용해야만 한다. 예제 다음 SQL문들을 이용하여 새로운 시퀀스를 정의하고 시퀀스 값과 정보를 확인해본다. xdbiSQL> CREATE TABLE seqtbl(i1 INTEGER); Create success. xdbiSQL> CREATE OR REPLACE PROCEDURE proc1 AS BEGIN FOR i IN 1 .. 10 LOOP INSERT INTO seqtbl VALUES(i); END LOOP; END; / Create success. xdbiSQL> EXEC proc1; Execute success. <질의> 13 부터 시작해서 3씩 증가하고 최소값이 0, 최대값이 무한대인 seq1시퀀스를 생성하라. xdbiSQL> CREATE SEQUENCE seq1 START WITH 13 INCREMENT BY 3 MINVALUE 0 NOMAXVALUE; Create success. xdbiSQL> INSERT INTO seqtbl VALUES(seq1.NEXTVAL); 1 row inserted. xdbiSQL> INSERT INTO seqtbl VALUES(seq1.NEXTVAL); 1 row inserted. xdbiSQL> SELECT * FROM seqtbl; SEQTBL.I1 -------------- 1 2 3 4 5 6 7 8 9 10 13 16 12 rows selected. <질의> 시퀀스 seq1을 50씩 증가 시키되 최대값 100에 도달한 경우에는 다시 최소값부터 시작하도록 변경하라. xdbiSQL> ALTER SEQUENCE sys.seq1 INCREMENT BY 50 MAXVALUE 100 CYCLE; Alter success. xdbiSQL> INSERT INTO sys.seqtbl VALUES(seq1.NEXTVAL); 1 row inserted. 76 SQL Reference xdbiSQL> INSERT INTO sys.seqtbl VALUES(seq1.NEXTVAL); 1 row inserted. xdbiSQL> INSERT INTO sys.seqtbl VALUES(seq1.NEXTVAL); 1 row inserted. xdbiSQL> INSERT INTO sys.seqtbl VALUES(seq1.NEXTVAL); 1 row inserted. xdbiSQL> SELECT * FROM sys.seqtbl; SEQTBL.I1 -------------- 1 2 3 4 5 6 7 8 9 10 13 16 66 0 50 100 16 rows selected. <질의> 새 번호 생성 전에 시퀀스 seq1의 현재 값을 확인하라. xdbiSQL> SELECT seq1.CURRVAL FROM dual; SEQ1.CURRVAL ----------------------- 100 1 row selected. <질의> 칼럼 i1의 값을 seq1 시퀀스의 다음 값인 0으로 갱신하라. xdbiSQL> UPDATE SEQTBL SET i1 = seq1.NEXTVAL; 16 rows updated. <질의> 시퀀스 seq1의 현재 값을 확인하라. xdbiSQL> SELECT seq1.CURRVAL FROM dual; SEQ1.CURRVAL ----------------------- 0 1 row selected. <질의> 빠른 액세스를 위해 명시된 값 (25개) 만큼 시퀀스 값들을 메모리에 캐시하도록 시퀀스 seq1을 변경하라. xdbiSQL> ALTER SEQUENCE seq1 INCREMENT BY 2 MAXVALUE 200 CACHE 25; Alter success. xdbiSQL> CREATE OR REPLACE PROCEDURE proc2 AS BEGIN FOR i IN 1 .. 30 LOOP INSERT INTO sqqtbl VALUES(seq1.NEXTVAL); END LOOP; END; / Create success. xdbiSQL> EXEC proc2; Execute success. 데이터 정의어 77 xdbiSQL> SELECT * FROM seqtbl; SEQTBL.I1 -------------- 0 50 100 0 50 100 0 50 100 0 50 100 0 50 100 0 2 4 6 8 10 12 14 . . . 58 60 46 rows selected. SYS 계정으로 데이터베이스에 접속한 경우 아래 쿼리는 모든 시퀀스들의 정보를 출력한다. xdbiSQL> SELECT * FROM SEQ; USER_NAME -------------------------------------------- SEQUENCE_NAME CURRENT_VALUE INCREMENT_BY ------------------------------------------------ MIN_VALUE MAX_VALUE CYCLE CACHE_SIZE ------------------------------------------------ SYS SEQ1 60 2 0 200 YES 25 1 row selected. 다음 SQL문들을 이용하여 여러 계정에서 새로운 시퀀스를 정의하고 시퀀스 값과 정보를 확인해본다. xdbiSQL> CONNECT sys/manager; Connect success. xdbiSQL> CREATE USER user1 IDENTIFIED BY user1; Create success. xdbiSQL> CREATE USER user2 IDENTIFIED BY user2; Create success. xdbiSQL> CONNECT user1/user1; Connect success. xdbiSQL> CREATE SEQUENCE seq1 MAXVALUE 100 CYCLE; Create success. xdbiSQL> CREATE SEQUENCE seq2; Create success. <질의> user1이 생성한 모든 시퀀스의 정보를 출력한다. xdbiSQL> SELECT * FROM SEQ; 78 SQL Reference SEQUENCE_NAME CURRENT_VALUE INCREMENT_BY ------------------------------------------------ MIN_VALUE MAX_VALUE CYCLE CACHE_SIZE ------------------------------------------------ SEQ1 1 1 1 100 YES 20 SEQ2 1 1 1 9223372036854775806 NO 20 2 rows selected. xdbiSQL> CONNECT user2/user2; Connect success. xdbiSQL> CREATE SEQUENCE seq1 INCREMENT BY -30; Create success. xdbiSQL> CREATE SEQUENCE seq2 INCREMENT BY -10 MINVALUE - 100; Create success. xdbiSQL> CONNECT sys/manager; Connect success. xdbiSQL> CREATE SEQUENCE seq2 START WITH 20 INCREMENT BY 30; Create success. xdbiSQL> CREATE SEQUENCE seq3 CACHE 40; Create success. <질의> SYS 계정으로 데이터베이스에 접속한 경우 아래 쿼리는 모든 시퀀스의 정보를 출력한다. xdbiSQL> SELECT * FROM SEQ; USER_NAME -------------------------------------------- SEQUENCE_NAME CURRENT_VALUE INCREMENT_BY ------------------------------------------------ MIN_VALUE MAX_VALUE CYCLE CACHE_SIZE ------------------------------------------------ SYS SEQ1 60 2 0 200 YES 25 SYS SEQ2 20 30 1 9223372036854775806 NO 20 SYS SEQ3 1 1 1 9223372036854775806 NO 40 USER1 SEQ1 1 1 1 100 YES 20 USER1 SEQ2 1 1 1 9223372036854775806 NO 20 USER2 SEQ1 -1 -30 -9223372036854775806 -1 NO 20 USER2 SEQ2 -1 -10 -100 -1 NO 20 7 rows selected. <질의> 다음 SQL문을 이용하여 시퀀스 객체로부터 정보를 확인한다. xdbiSQL> select * from v$seq; ->이 구문은 생성되어 있는 모든 시퀀스 객체에 대한 정보를 읽어 들인다. Select * from seq와 달리 다른 사용자의 시퀀스 정보도 데이터 정의어 79 확인할 수 있다. V$SEQ 성능 뷰에 대한 자세한 내용은 Administrator's Manual의 데이터 딕셔너리 장의 성능 뷰 절을 참고한다. 80 SQL Reference CREATE SYNONYM 구문 create_synonym ::= CREATEsynonym_nameSYNONYM ; PUBLICuser_name. user_name. FORobject_name 전제 조건 SYS 사용자 또는 CREATE SYNONYM 시스템 권한을 가진 사용자만 이 구문으로 시노님을 생성할 수 있다. 또한 다른 사용자의 스키마에 시노님를 생성하려면 SYS 사용자이거나 CREATE ANY SYNONYM 시스템 권한을 가져야 하며, PUBLIC 시노님 생성을 위해서는 SYS 사용자이거나 CREATE PUBLIC SYNONYM 시스템 권한을 가져야 한다. 설명 이 구문은 시노님을 생성하는 SQL문으로, 시노님이란 다음 객체들에 대한 별칭을 의미한다. 테이블 뷰 시퀀스 저장 프로시저 및 저장 함수 다른 시노님 데이터 정의어 81 다음 SQL문에서 시노님을 사용할 수 있다. DML 문 DDL 문 SELECT INSERT UPDATE DELETE MOVE LOCK TABLE GRANT REVOKE PUBLIC 시노님과 PRIVATE 시노님 PUBLIC 시노님은 모든 사용자가 사용할 수 있는 시노님이며, PRIVATE 시노님은 그 시노님의 소유자만 사용할 수 있는 시노님이다. PUBLIC 시노님을 생성하려면 이 구문에 PUBLIC을 명시해야 한다. 이를 명시하지 않으면 기본으로 PRIVATE 시노님이 생성된다. user_name 시노님 앞에 위치하는 사용자명은 시노님 소유자명이다. PUBLIC 시노님을 생성하는 경우에는 소유자명을 명시하지 않는다. PRIVATE 시노님을 생성하는 경우에 소유자명을 명시할 수 있다. 소유자명을 명시하지 않을 경우 시노님은 CREATE SYNONYM문을 수행하는 세션에 연결된 사용자의 스키마에 생성된다. synonym_name 생성할 시노님 이름과 동일한 이름의 테이블, 뷰, 시퀀스, 저장프로시저, 저장함수, 또는 다른 시노님이 존재할 경우에는 오류가 반환된다. 시노님은 이들 객체와 동일한 이름 영역 (namespace)에 저장되므로, 시노님의 이름은 자신이 속할 스키마 내에서 유일해야 한다. FOR clause 별칭을 제공할 대상 객체를 명시하는 절이다. user_name 별칭을 제공할 대상 객체의 소유자명을 명시한다. 지정하지 않을 경우에 알티베이스는 현재 세션에 접속되어 시노님을 생성하고 있는 사용자의 스키마에 속하는 것으로 간주한다. object_name 별칭을 제공할 대상 객체명을 명시한다. 만약 그 객체가 데이터베이스 내에 존재하지 않더라도 시노님 생성 82 SQL Reference 시에는 오류가 리턴되지 않고 시노님 생성은 성공한다. 즉, 시노님 생성시에는 대상 스키마 객체가 현재 존재하지 않아도 되며, 별칭을 제공할 객체에 대한 권한이 없어도 된다. 권한과 시노님 시노님에 대한 DML문을 수행하기 위해서는 사용자가 시노님의 대상 객체에 대한 DML 실행 권한을 가지고 있어야 한다. 시노님에 대하여 DML 실행 권한을 부여 또는 박탈할 때, 실제로는 시노님의 대상이 되는 객체에 그 권한이 부여되거나 박탈된다. 따라서 시노님에 대한 DML문 수행 시 권한 오류가 발생하는 경우, 시노님 대상 객체에 대한 DML 실행 권한이 사용자에게 부여되어 있는지 SYS_GRANT_SYSTEM_ 또는 SYS_GRANT_OBJECT 메타 테이블에서 확인해야 한다. 사용자에게 적절한 권한이 없는 경우 권한을 부여해야 한다. 사용자에게 권한을 부여할 때, 대상 객체에 대한 권한을 부여하여도 되고 시노님에 대한 권한을 부여해도 된다. 사용자에게 대상 객체에 대한 적절한 권한이 이미 있다면 시노님을 생성한 후 시노님에 대한 권한까지 부여할 필요는 없다. 또한 시노님에 대한 권한을 부여함으로써 객체에 대한 권한이 부여된 경우, 해당 시노님이 삭제되더라도 객체에 대한 권한은 그대로 유지된다. 이는 시노님에 대한 권한을 부여하더라도 실제로는 시노님 자체에 대한 권한이 아니라 시노님 대상 객체에 대한 권한이 부여되기 때문이다. 객체 이름 검색 우선 순위 SQL문에서 참조되는 객체가 데이터베이스 내의 어떤 객체인지를 결정하기 위해서, 알티베이스는 테이블, 뷰, 시퀀스, 저장프로시저, 또는 저장함수의 이름을 먼저 찾아본다. 여기에 존재하지 않으면 그 이름의 시노님을 찾는다. 시노님 내에서는 PRIVATE 시노님이 PUBLIC 시노님보다 검색 우선 순위가 높다. 예를 들어 SQL문에서 참조되는 이름을 가지는 객체가 데이터베이스에 존재하는지 알티베이스가 검사하는 순서는 다음과 같다. SELECT * FROM NAME 1. “NAME”이라는 이름의 테이블 또는 뷰를 찾는다. 데이터 정의어 83 2. 이름이 “NAME”인 테이블 또는 뷰가 존재하지 않으면 현재 세션 에 접속한 사용자의 스키마에서 그 이름의 PRIVATE 시노님을 찾는다. 3. 그 이름의 PRIVATE 시노님이 존재하지 않으면 PUBLIC 시노님 을 찾는다. SELECT * FROM USER.NAME 1. “USER” 스키마에서 “NAME”이라는 이름의 테이블 또는 뷰를 찾는다. 2. 이름이 “NAME”인 테이블 또는 뷰가 존재하지 않으면 “USER” 스키마에서 그 이름의 PRIVATE 시노님을 찾는다. 3. 그 이름의 PRIVATE 시노님이 존재하지 않으면, PUBLIC 시노님 을 찾지는 않는다. 대신 오류를 반환한다. 예제 <질의> 사용자 altibase가 소유한 dept 테이블에 별칭으로 my_dept라는 시노님을 현재 사용자 소유로 생성하고 이 시노님을 이용해서 DML문을 수행한다. xdbiSQL> CONNECT altibase/altibase; Connect success. xdbiSQL> CREATE TABLE dept ( id integer, name char(10), location varchar(40), member integer ); Create success. xdbiSQL> GRANT INSERT ON dept TO mylee; Grant success. xdbiSQL> GRANT SELECT ON dept TO mylee; Grant success. xdbiSQL> CONNECT mylee/mylee; Connect success. xdbiSQL> CREATE SYNONYM mylee.my_dept FOR altibase.dept; Create success. xdbiSQL> INSERT INTO my_dept VALUES (1,'rndn1',NULL,4); 1 row inserted. xdbiSQL> SELECT * FROM my_dept; MY_DEPT.ID MY_DEPT.NAME MY_DEPT.LOCATION ------------------------------------------------------- MY_DEPT.MEMBER ----------------- 1 rndn1 4 1 row selected. 84 SQL Reference CREATE TABLE 구문 create_table ::= CREATETABLEtbl_name() column_definition table_constraint , segment_attributes_clause user_name. ; lob_column_propertiessubqueryAS column_definition ::= column_name , variable_clausedefault_clause column_constraint in_row_clause data_type TIMESTAMP variable_clause::= FIXED VARIABLE 데이터 정의어 85 in_row_clause::= INROWinteger default_clause::= DEFAULTexpr column_constraint ::= CONSTRAINTconstraint_name NOT NULL unique_clause references_clause unique_clause ::= sort_order_clauseset_persistent_clauseusing_index_clause unique_specification unique_specification ::= KEYPRIMARY UNIQUE sort_order_clause ::= ASC DESC 86 SQL Reference set_persistent_clause ::= PERSISTENTSET= OFF ON using_index_clause ::= INDEXUSING memory_index_attributes references_clause::= REFERENCEStbl_name user_name.column_name)( ON INSERT UPDATE NOACTIONDELETE DELETECASCADE table_constraint ::= CONSTRAINTconstraint_namereferential_constraint table_unique_clause table_unique_clause ::= sort_order_clause unique_specificationcolumn_name() , set_persistent_clauseusing_index_clause 데이터 정의어 87 referential_constraint ::= column_name(FOREIGNKEY) , REFERENCEStbl_name user_name.column_name() ON INSERT UPDATE NOACTIONDELETE DELETECASCADE , , segment_attributes_clause ::= TABLESPACEtablespace_name table_compressionlogging_clause table_compression ::= COMPRESSED LOGGING UNCOMPRESSED LOGGING logging_clause ::= LOGGING NOLOGGING 88 SQL Reference lob_column_properties ::= LOB_storage_clause lob_storage_clause ::= LOB()LOB_item , STOREAS()lob_attributes lob_attributes ::= TABLESPACEtablespace_name LOGGING NOLOGGING BUFFER NOBUFFER 전제 조건 SYS 사용자와 CREATE TABLE 시스템 권한을 가진 사용자만이 이 구문으로 테이블을 생성할 수 있다. 설명 명시된 이름의 새로운 테이블을 생성한다. user_name 생성될 테이블 소유자 이름을 명시한다. 생략하면 알티베이스는 현재 세션에 연결된 사용자의 스키마에 테이블을 생성한다. tbl_name 생성될 테이블 이름을 명시한다. column_definition 데이터 정의어 89 DEFAULT 칼럼에 DEFAULT 절을 명시하지 않고 테이블을 생성한 경우, 데이터 삽입시 해당 칼럼의 값을 명시하지 않으면 NULL이 입력된다. TIMESTAMP TIMESTAMP 칼럼은 여러 면에서 다른 데이터 타입들처럼 다뤄진다. 예를 들어, CREATE TABLE 문에 칼럼의 데이터 타입으로 TIMESTAMP를 명시한 경우 내부적으로 데이터 크기가 8Byte인 TIMESTAMP 칼럼이 생성된다. 그러나 TIMESTAMP 칼럼의 값은 시스템에 의해 결정되기 때문에 명시적으로 DEFAULT 값을 설정할 수 없다. 또한 TIMESTAMP 칼럼은 한 테이블에 하나만 생성할 수 있다. column constraint 새로운 테이블을 생성할 때 칼럼에 대한 제약조건을 설정한다. 명시적으로 제약조건의 이름을 지정할 수 있다. PRIMARY KEY UNIQUE (NOT) NULL 참조 무결성(referential integrity) PERSISTENT: CREATE INDEX 참고 TIMESTAMP PRIMARY KEY 기본키의 값은 테이블 내에서 유일해야 하며 기본키에 속하는 칼럼은 널(NULL) 값을 가질 수 없다. 한 테이블 내에 정의 가능한 기본키의 개수는 하나이며, 최대 32개 칼럼들의 조합에 대해 기본 키를 생성할 수 있다. UNIQUE UNIQUE 제약조건을 정의하면 유니크 키에 해당하는 칼럼 (또는 칼럼의 조합)은 같은 값을 2개 이상 가질 수 없다. 단, 널 값은 허용된다. 같은 칼럼 또는 같은 칼럼의 조합에 대해 유니크 제약조건과 기본키를 동시에 정의할 수 없다. 또한, 같은 칼럼 또는 같은 칼럼의 조합에 대해 2개 이상의 유니크 제약조건도 존재할 수 없다. 그러나 다른 칼럼 또는 다른 칼럼들의 조합에는 존재할 수 있다. 최대 32개 칼럼의 조합에 대해 유니크 제약조건을 생성할 수 있다. NULL 90 SQL Reference 해당 칼럼이 널 값을 가질 수 있다는 것을 의미한다. NOT NULL 해당 칼럼이 널 값을 가질 수 없다는 것을 의미한다. PERSISTENT SET PERSISTENT 절을 사용하지 않은 경우 기본값은 OFF이다. 자세한 정보는 CREATE INDEX 문의 설명을 참고한다. table_constraint 한 칼럼 또는 칼럼들의 조합에 대한 제약조건을 명시하는 절이다. 다음의 테이블 제약조건이 있다. PRIMARY KEY UNIQUE LOCALUNIQUE 참조 무결성(referential integrity) using_index_clause 제약조건을 위해 자동으로 생성되는 인덱스가 저장될 테이블스페이스를 지정하는 절이다. PRIMARY KEY 또는 UNIQUE 제약을 명시할 경우, 자동으로 생성되는 인덱스가 저장될 테이블스페이스를 지정할 수 있다. referential_constraint 외래키를 정의하는 절이다. 외래키에 의해 참조되는 다른 테이블의 참조키(referenced key)는 그 테이블에서 유니크 제약조건에 해당하거나 그 테이블의 기본키이어야 한다. 만약 이 절에 참조키의 칼럼들을 명시하지 않은 경우, 해당 테이블의 기본키가 자동으로 참조키가 된다. NO ACTION “부모(parent) 테이블” (참조키가 있는 테이블)에 대해 INSERT, DELETE, 또는 UPDATE 구문을 실행하면, 알티베이스는 “자식(child) 테이블” (참조키를 참조하는 외래키를 가진 테이블)에 대한 무결성 검사를 한 후에 이 구문을 수행한다. NO ACTION은 무결성 검사 후에 자식 테이블에 대해서는 어떠한 작업도 하지 않음을 명시하는 옵션이다. 예를 들어 다음과 같이 employees 테이블을 생성하면, departments 테이블에서 어떤 부서를 삭제하려 할 때, employees 테이블의 레코드가 이 부서 번호를 참조하고 있다면, 삭제 시도는 실패하고 데이터 정의어 91 에러가 발생할 것이다. CREATE TABLE employees ( ENO INTEGER PRIMARY KEY, DNO INTEGER, NAME CHAR(10), FOREIGN KEY(DNO) REFERENCES departments(DNO) ON DELETE NO ACTION ); ON DELETE CASCADE 이는 부모 테이블의 행이 삭제되면 외래 키 값을 가진 자식 테이블에서 이 행을 참조하는 모든 행도 삭제될 것을 명시하는 옵션이다. 예를 들어 예를 들어 다음과 같이 employees 테이블을 생성하면, departments 테이블에서 어떤 부서를 삭제하려 할 때, employees 테이블에서 이 부서 번호를 참조하는 모든 행도 삭제된다. CREATE TABLE employees ( ENO INTEGER PRIMARY KEY, DNO INTEGER, NAME CHAR(10), FOREIGN KEY(DNO) REFERENCES departments (DNO) ON DELETE CASCADE ); CREATE TABLE … AS SELECT 테이블 생성시, 다른 테이블에서 새로운 테이블로 칼럼의 속성과 데이터를 그대로 복사하려면 이 구문을 사용한다. 새로운 테이블의 칼럼 수는 SELECT 절로 검색되는 칼럼의 개수와 동일해야 한다. 또한 새로운 칼럼의 데이터 타입은 명시할 수 없고, 데이터가 검색되는 원래 칼럼의 데이터 타입과 동일하게 된다. 생성될 테이블의 칼럼 명을 명시하지 않을 경우에는 검색되는 칼럼의 이름이 그래도 사용된다. 검색 대상이 칼럼이 아니고 표현식인 경우 alias가 반드시 존재해야 한다. 이 alias가 새로운 테이블의 칼럼명이 될 것이다. segment_attributes_clause 테이블스페이스 를 지정하는 절이다. TABLESPACE 절 테이블이 저장될 테이블스페이스를 지정하는 절이다. 테이블스페이스는 CREATE TABLE 문으로만 지정할 수 있다. 즉 테이블 생성 후 ALTER TABLE문으로는 변경할 수 없다. 이 절을 생략할 경우 테이블은 이 테이블을 생성하려 하는 사용자의 기본 테이블스페이스에 저장될 것이다. 사용자 생성 시 DEFAULT TABLESPACE를 생략했었다면 테이블은 시스템 메모리 기본 테이블스페이스(SYSTEM MEMORY DEFAULT TABLESPACE)에 생성된다. 92 SQL Reference CREATE TABLE 문 내에 UNIQUE 또는 PRIMARY KEY 제약조건이 명시된 경우 이들을 위한 인덱스는 테이블이 저장되는 테이블스페이스에 생성될 것이다. LOB_storage_clause LOB 칼럼 데이터는 LOB 칼럼이 속한 테이블과 별도의 테이블스페이스에 저장될 수 없다. 즉, 테이블과 동일한 테이블스페이스에만 저장될 수 있다. 주의 사항 다음은 테이블 생성시 유념해야 할 몇가지 사항이다. 정의한 칼럼 크기가 최대 허용 크기를 넘거나 최소 크기 보다 작으면 오류가 발생한다. 최대와 최소 크기는 각 데이터 타입마다 다르다. 한 테이블의 최대 칼럼 수는 1024개이다. 기본키는 한 테이블에 한 개만 존재할 수 있다. 참조 제약조건의 경우 외래키와 참조키의 칼럼 개수는 동일해야 한다. 또한 외래키와 참조키의 각 칼럼 데이터 타입은 동일해야 한다. 한 테이블에 생성할 수 있는 인덱스, 기본키 및 유니크 키의 총 개수는 1024개를 넘을 수 없다. CREATE TABLE AS SELECT의 경우 칼럼 명을 명시하였다면 그 개수는 검색 대상에 명시한 칼럼 개수와 동일해야 한다. CREATE TABLE AS SELECT문 실행시 CREATE TABLE 문에 칼럼 명을 명시하지 않고 SELECT문의 검색 대상에는 표현식을 사용한 경우, 반드시 새로운 테이블의 칼럼 이름으로 사용될 별명(alias name)을 표현식에 명시해야 한다. 예제 테이블 생성 다음 테이블들을 생성하라. 테이블 이름: employees 칼럼: 사원번호, 사원이름과 성, 직책, 전화번호, 부서번호, 월급, 성별, 생일, 입사일자, 상태 데이터 정의어 93 xdbiSQL> CREATE TABLE employees( eno INTEGER PRIMARY KEY, e_lastname CHAR(20) NOT NULL, e_firstname CHAR(20) NOT NULL, emp_job VARCHAR(15), emp_tel CHAR(15), dno SMALLINT, salary NUMBER(10,2) DEFAULT 0, sex CHAR(1), birth CHAR(6), join_date DATE, status CHAR(1) DEFAULT 'H'); Create success. 테이블 이름: orders 칼럼: 주문번호, 주문일자, 판매사원, 고객번호, 상품번호, 주문수량, 도착 예정일자, 주문상태 xdbiSQL> CREATE TABLE orders( ono BIGINT, order_date DATE, eno INTEGER NOT NULL, cno BIGINT NOT NULL, gno CHAR(10) NOT NULL, qty INTEGER DEFAULT 1, arrival_date DATE, processing CHAR(1) DEFAULT '0', PRIMARY KEY(ono, order_date)); Create success. CREATE TABLE … AS SELECT 사용 다음 질의는 직원 테이블에서 부서 번호가 1002인 조건을 만족하는 데이터를 가진 테이블 dept_1002를 생성한다. xdbiSQL> CREATE TABLE dept_1002 AS SELECT * FROM employees WHERE dno = 1002; Create success. TIMESTAMP 타입 칼럼을 가지는 테이블을 생성한다. xdbiSQL> CREATE TABLE tbl_timestamp( i1 TIMESTAMP CONSTRAINT const2 PRIMARY KEY, i2 INTEGER, i3 DATE, i4 Byte(8)); Create success. * 테이블 tbl_timestamp의 속성은 다음과 같다. [ TABLESPACE : SYS_TBS_MEM_DATA ] [ ATTRIBUTE ] ----------------------------------------------------------- ------------------- NAME TYPE IS NULL ----------------------------------------------------------- ------------------- I1 TIMESTAMP FIXED NOT NULL I2 INTEGER FIXED I3 DATE FIXED I4 BYTE(8) FIXED [ INDEX ] 94 SQL Reference ----------------------------------------------------------- ------------------- NAME TYPE IS UNIQUE COLUMN ----------------------------------------------------------- ------------------- CONST2 BTREE UNIQUE I1 ASC [ PRIMARY KEY ] ----------------------------------------------------------- ------------------- I1 명시적으로 Byte(8) 데이터 타입을 선언한 칼럼 i4와 TIMESTAMP 데이터 타입 칼럼인 i1을 구별하는 방법은 SYS_CONSTRAINTS_와 SYS_CONSTRAINT_COLUMNS_ 메타 테이블을 조회해서 칼럼 타입이 TIMESTAMP 인지를 확인하는 것이다. * 참고: INSERT나 UPDATE 수행 시 사용자가 TIMESTAMP 칼럼 값을 DEFAULT로 명시한 경우, 당시의 시스템 시간값이 그 TIMESTAMP 칼럼에 쓰여진다. xdbiSQL> INSERT INTO tbl_timestamp VALUES(DEFAULT, 2, '02- FEB-01', Byte'A1111002'); 1 row inserted. xdbiSQL> UPDATE tbl_timestamp SET i1 = DEFAULT, i2 = 102, i3 = '02-FEB-02', i4 = Byte'B1111002' WHERE i2 = 2; 1 row updated. xdbiSQL> SELECT * FROM tbl_timestamp; I1 I2 I3 I4 ----------------------------------------------------------- ------- 4E3778C900037AE9 102 02-FEB-2002 B111100200000000 1 row selected. 마찬가지로 INSERT나 UPDATE 수행 시 사용자가 TIMESTAMP 칼럼 값을 명시하지 않은 경우, 당시의 시스템 시간 값이 INSERT 또는 UPDATE 수행에 사용된다. xdbiSQL> INSERT INTO tbl_timestamp(i2, i3, i4) VALUES(4, '02-APR-01', Byte'C1111002'); 1 row inserted. xdbiSQL> UPDATE tbl_timestamp SET i2=104, i3='02-APR-02', i4=BYTE'D1111002' WHERE i2=4; 1 row updated. xdbiSQL> SELECT * FROM tbl_timestamp; I1 I2 I3 I4 ----------------------------------------------------------- ------- 4E3778C900037AE9 102 02-FEB-2002 B111100200000000 4E37794900083702 104 02-APR-2002 D111100200000000 2 rows selected. 질의에서 지정한 테이블스페이스에 테이블을 생성하라. <질의> 테이블 소유자가 uare1인 테이블 tbl1을 생성하라. (사용자 생성 시 기본 테이블스페이스가 지정되지 않았다.) xdbiSQL> CONNECT uare1/rose1; Connect success. xdbiSQL> CREATE TABLE tbl1( i1 INTEGER, 데이터 정의어 95 i2 VARCHAR(3)); Create success. * 참고: 사용자 생성 시 기본 테이블스페이스가 지정되지 않은 경우 시스템 메모리 기본 테이블스페이스에 테이블이 생성 된다. <질의> 사용자 생성 시 지정된 기본 테이블스페이스 user_data에 다음 조건을 만족하는 테이블 books과 inventory를 생성하라. books 칼럼: 책번호, 책이름, 저자, 판, 출판연도, 가격, 출판사코드 inventory 칼럼: 예약구독번호, 책번호, 상점코드, 구입날짜, 구입량, 지불여부 xdbiSQL> CREATE TABLE books( isbn CHAR(10) CONSTRAINT const1 PRIMARY KEY SET PERSISTENT = ON, title VARCHAR(50), author VARCHAR(30), edition INTEGER DEFAULT 1, publishingyear INTEGER, price NUMBER(10,2), pubcode CHAR(4)) TABLESPACE user_data; Create success. xdbiSQL> CREATE TABLE inventory( subscriptionid CHAR(10) PRIMARY KEY, isbn CHAR(10) CONSTRAINT fk_isbn REFERENCES books (isbn), storecode CHAR(4), purchasedate DATE, quantity INTEGER, paid CHAR(1)) TABLESPACE user_data; Create success. 또는 xdbiSQL> CREATE TABLE inventory( subscriptionid CHAR(10), isbn CHAR(10), storecode CHAR(4), purchasedate DATE, quantity INTEGER, paid CHAR(1), PRIMARY KEY(subscriptionid), CONSTRAINT fk_isbn FOREIGN KEY(isbn) REFERENCES books(isbn)) TABLESPACE user_data; Create success. 96 SQL Reference CREATE MEMORY TABLESPACE 구문 create_memory_tablespace ::= CREATE ; TABLESPACEMEMORYtablespace_name DATA initsize_clause autoextend_clausecheckpoint_path_clausesplitsize_clause initsize_clause ::= SIZEinteger K M G autoextend_clause ::= NEXT AUTOEXTEND OFF ON integer K M G maxsize_clause 데이터 정의어 97 maxsize_clause ::= MAXSIZE integer K M G UNLIMITED checkpoint_path_clause ::= CHECKPOINTcheckpoint_pathPATH‘’ , splitsize_clause ::= integer K M G SPLITEACH 전제 조건 테이블스페이스는 SYS 사용자이거나 CREATE TABLESPACE 시스템 권한을 가진 사용자만이 테이블스페이스를 생성할수 있다. 설명 데이터베이스 내에 데이터베이스 객체를 저장할 수 있는 메모리 데이터 테이블스페이스를 생성하는 구문이다. 이 구문으로 생성된 테이블스페이스에는 메모리 테이블이 저장될 수 있다. MEMORY 메모리 테이블스페이스를 생성할 것을 지정한다. DATA 98 SQL Reference 사용자의 데이터를 저장할 테이블스페이스를 생성할 것을 지정한다. DATA 키워드 없이 CREATE TABLESPACE 구문을 수행하여도 기본적으로 데이터 테이블스페이스가 생성된다. tablespace_name 생성될 테이블스페이스의 이름을 명시한다. initsize_clause 생성될 테이블스페이스의 초기 크기를 지정한다. SIZE 테이블스페이스의 초기 크기를 명시한다. 이는 메모리 테이블스페이스의 기본 확장 크기의 배수여야 한다. (즉, EXPAND_CHUNK_PAGE_COUNT 프로퍼티에 지정된 페이지 개수 * 메모리 테이블스페이스의 한 페이지 크기 (32kB)) 예를 들어 EXPAND_CHUNK_PAGE_COUNT프로퍼티를 128로 지정했다면, 메모리 테이블스페이스의 기본 확장 크기는 128 * 4MB가 될 것이다. 그러므로 초기 크기는 4MB의 배수여야 한다. 이 값은 Kilobytes(K), Megabytes(M), 또는 Gigabytes(G) 단위로 명시할 수 있다. 단위를 명시하지 않을 경우 기본 단위는 Kilobytes이다. autoextend_clause 테이블스페이스가 자동으로 확장될 지 여부를 명시한다. 이 절을 생략하면, AUTOEXTEND는 기본으로 꺼진다. ON AUTOEXTEND 옵션이 켜진다. OFF AUTOEXTEND 옵션이 꺼진다. NEXT 테이블스페이스가 자동으로 크기가 증가될 때 증가할 양을 명시한다. 단, 이 크기는 메모리 테이블스페이스의 기본 확장 크기의 배수여야 한다. (EXPAND_CHUNK_PAGE_COUNT 프로퍼티에 지정된 페이지 개수 * 메모리 테이블스페이스의 한 페이지 크기 (32kB)) AUTOEXTEND를 ON으로 지정하고 이 값을 명시하지 않을 경우, 기본값은 EXPAND_CHUNK_PAGE_COUNT프로퍼티에 지정한 값이다. 데이터 정의어 99 AUTOEXTEND가 OFF일 때 이 값은 의미없다. 이 값은 Kilobytes(K), Megabytes(M), 또는 Gigabytes(G) 단위로 명시할 수 있다. 단위를 명시하지 않을 경우 기본 단위는 Kilobytes이다. maxsize_clause 테이블스페이스 자동 확장 시 확장할 수 있는 최대 크기를 명시한다. AUTOEXTEND는 ON 으로 지정하고 이 값을 명시하지 않을 경우 기본값은 UNLIMITED이다. AUTOEXTEND가 OFF이면 이 값은 의미없다. 이 값은 Kilobytes(K), Megabytes(M), 또는 Gigabytes(G) 단위로 명시할 수 있다. 단위를 명시하지 않을 경우 기본 단위는 Kilobytes이다. UNLIMITED 테이블스페이스가 자동 확장되는 크기에 제한이 없음을 명시한다. 이 옵션이 사용되면, 테이블스페이스는 그 크기가 데이터베이스내의 모든 메모리 테이블스페이스와 모든 휘발성 테이블스페이스의 총 크기가 MEM_MAX_DB_SIZE 프로퍼티에 지정된 크기에 도달할 때까지 자동으로 증가될 것이다. checkpoint_path_clause 메모리 테이블스페이스에 저장된 데이터의 영속성을 보장하기 위해 데이터는 파일에 저장되어야 한다. 이러한 메모리 테이블스페이스의 데이터 저장 파일을 “체크포인트 이미지”라고 한다. checkpoint_path절은 체크포인트 이미지 파일이 저장될 체크포인트 경로(Path)들을 지정한다. 체크포인트 경로를 지정하지 않은 경우 MEM_DB_DIR 프로퍼티에 지정한 경로가 기본 경로로 사용된다. checkpoint_path 메모리 테이블스페이스의 체크포인트시 체크포인트 이미지가 저장되는 경로이다. 체크포인트 및 테이블스페이스 로딩시 디스크 입출력 비용을 분산할 수 있도록 다수의 경로가 지정될 수 있다. split_each_clause 이 절은 체크포인트 파일을 좀 더 작은 파일로 분리시키기 위해 사용된다. 이는 메모리 테이블스페이스의 크기가 운영체제에서 지원하는 최대 파일 크기를 초과할 때, 또는 입출력 비용을 분산하기 100 SQL Reference 위해서 유용하다. 분할된 파일의 크기는 사용자가 지정할 수 있다. 크기를 지정하지 않을 경우 DEFAULT_MEM_DB_FILE_SIZE 프로퍼티에 지정된 값이 기본으로 사용된다. 이 값은 Kilobytes(K), Megabytes(M), 또는 Gigabytes(G) 단위로 명시할 수 있다. 단위를 명시하지 않을 경우 기본 단위는 Kilobytes이다. 예제 <질의 1> 초기 크기가 512MB이고, 자동 확장되지 않는 사용자 정의 메모리 데이터 테이블스페이스를 생성한다. (체크포인트 이미지는 MEM_DB_DIR 프로퍼티에 지정된 경로에 저장된다. 분할될 체크포인트 이미지 파일의 크기는 DEFAULT_MEM_DB_FILE_SIZE 프로퍼티의 값을 따른다.) xdbiSQL> CREATE MEMORY DATA TABLESPACE user_data SIZE 512M; Create success. <질의 2> 초기 크기가 512MB이고, 128MB 단위로 자동 확장되는1 사용자 정의 메모리 데이터 테이블스페이스를 생성한다. (체크포인트 이미지는 MEM_DB_DIR 프로퍼티에 지정된 경로에 저장된다. 분할될 체크포인트 이미지 파일의 크기는 DEFAULT_MEM_DB_FILE_SIZE 프로퍼티의 값을 따른다.) xdbiSQL> CREATE MEMORY DATA TABLESPACE user_data SIZE 512M AUTOEXTEND ON NEXT 128M; Create success. <질의 3> 초기 크기가 512MB 이고, 최대 1GB까지 128MB 단위로 자동 확장되는 사용자 정의 메모리 데이터 테이블스페이스를 생성한다. (체크포인트 이미지는 다중화를 위해 3개의 디렉토리에 나누어 저장하고, 분할될 체크포인트 이미지 파일의 크기를 256M로 한다.) xdbiSQL> CREATE MEMORY DATA TABLESPACE user_data SIZE 512M AUTOEXTEND ON NEXT 128M MAXSIZE 1G CHECKPOINT PATH ‘/dbs/path1’, ‘/dbs/path2’, ‘/dbs/path3’ SPLIT EACH 256M; Create success. 1 테이블스페이스의 최대 크기를 MAXSIZE절을 이용하여 지정하지 않았으므로, 기본적으로 UNLIMITTED를 지정한 것과 같다. 이 경우 시스템에 존재하는 모든 메모리 테이블스페이스와 휘발성 테이블스페이스의 크기의 총합이 MEM_MAX_DB_SIZE 프로퍼티에 지정된 값을 벗어나지 않는 한도 내에서 테이블스페이스의 확장이 이루어진다. 데이터 정의어 101 CREATE TRIGGER 구문 create_trigger ::= ; CREATETRIGGERtrigger_name AFTER trigger_eventONtbl_name OLD NEW REFERENCINGalias_name , trigger_action .user_name BEFORE.user_name ROWAS trigger_event ::= INSERT DELETE UPDATE OFcolumn_name , 102 SQL Reference trigger_action::= FOREACHROW STATEMENT WHENsearch_condition psm_body () psm_body::= AS ISdeclare_section BEGIN statement EXCEPTIONexception_handler END 전제 조건 SYS 사용자와 CREATE TRIGGER 시스템 권한을 가진 사용자만이 트리거를 생성할 수 있다. 또한, 다른 사용자 소유의 테이블에 트리거를 생성하기 위해서는 SYS 사용자이거나 CREATE ANY TRIGGER 시스템 권한이 있어야 한다. 설명 명시된 이름으로 트리거를 생성한다. user_name 생성될 트리거의 소유자 이름을 명시한다. 생략하면 알티베이스는 현재 사용자가 소유한 테이블에 트리거를 생성한다. trigger_name 데이터 정의어 103 생성될 트리거의 이름을 명시한다. AFTER 트리거가 동작될 시점을 지정한다. AFTER 옵션은 trigger_event가 수행된 후에 트리거가 동작될 것을 지정한다. BEFORE BEFORE 옵션은 trigger_event가 수행되기 전에 트리거가 동작될 것을 지정한다. trigger_event 이는 테이블의 데이터를 변경시키는 이벤트로 트리거의 동작을 유발시킨다. 단 데이터베이스의 무결성을 지키기 위해 이중화 수신자에 의해 적용되는 테이블 데이터의 변경은 트리거 이벤트로 처리되지 않는다 (즉, 트리거 동작을 유발시키지 않는다). trigger_event로 다음의 세 가지 유형의 DML문을 지정할 수 있다. DELETE 해당 테이블의 데이터를 삭제하는 DELETE 구문 수행 시 트리거 동작이 유발된다. INSERT 해당 테이블에 데이터를 삽입하는 INSERT 구문 수행 시 트리거 동작이 유발된다. UPDATE 해당 테이블의 데이터를 변경하는 UPDATE 구문 수행 시 트리거 동작이 유발된다. UPDATE 트리거 이벤트에 OF 절을 사용할 경우 OF 절에 명시된 컬럼이 변경될 경우에만 트리거를 동작시킨다. 현재 BEFORE UPDATE … FOR EACH ROW 구문의 트리거는 지원되지 않는다. ON table_name 트리거가 동작할지를 결정하기 위해 참조하는 테이블을 지정한다. 트리거는 table_name에 정의된 테이블의 변경에 따라 동작이 유발될 것이다. 트리거는 일반 테이블만 참조할 수 있다. 뷰, 시퀀스, 저장 프로시저와 같은 객체를 기반으로 트리거를 생성할 수 없다. 이중화에 포함되어 있는 테이블에는 트리거를 생성할 수 없다. 그러나, 트리거가 이미 존재하는 테이블에 대한 이중화 생성은 가능하다. 104 SQL Reference User_name이 생략되면, 알티베이스는 현재 사용자 소유의 테이블을 기반으로 트리거를 생성할 것이다. REFERENCING 절 트리거의 특성상 old row와 new row의 개념을 갖는다. 즉, 트리거가 참조하는 테이블의 데이터 변경시, 변경된 각 row는 이전 값과 이후 값을 갖게 된다. REFERENCING 절을 사용해서 old row 및 new row를 참조할 수 있다. REFERENCING 절은 다음과 같은 제약을 갖는다. REFERENCING 절은 FOR EACH ROW 옵션과 함께인 경우에만 사용할 수 있다. REFERENCING 절은 trigger_action 절에서 참조할 수 있도록 다음과 같은 구조를 가져야 한다. {OLD|OLD ROW|OLD ROW AS|OLD AS} alias_name 변경되기 이전의 로우(row)를 의미한다. 이는 WHEN 절 또는 trigger_action의 psm_body 내에서 참조될 수 있다. 트리거 이벤트가 INSERT문일 때는 이전의 값이 없기 때문에 이전 값 참조는 불가능하다. {NEW|NEW ROW|NEW ROW AS|NEW AS} alias_name 변경된 후의 로우(row)를 의미한다. 단, BEFORE TRIGGER의 경우 트리거 바디 내에서 이들 데이터를 변경하는 것이 가능하다. 트리거 이벤트가 DELETE문일 경우 이후 값이 없기 때문에 이후 값 참조는 불가능하다. trigger_action 트리거 작동 절은 다음과 같은 세 가지 부분으로 구성된다. Action granularity: 트리거가 수행되는 단위 지정 (ROW 또는 STATEMENT) Action WHEN condition: 트리거 동작 여부를 결정하는 추가 조건을 선택적으로 명시 Action body: 트리거가 실제로 무엇을 수행하는지 명시 FOR EACH {ROW|STATEMENT} 트리거 수행 단위를 명시한다. 테이블의 데이터 변경시 여기에 명시된 단위에 따라서 트리거가 발생한다. 기본값은 FOR EACH STATEMENT이다. FOR EACH ROW: trigger_event에 의해 영향을 받고 WHEN 절의 조건을 만족하는 각 row에 대해서 트리거의 action body 가 수행된다. 데이터 정의어 105 REFERENCING 절 또는 WHEN 절을 사용하기 위해서는 반드시 FOR EACH ROW 절을 사용하여야 한다. FOR EACH STATEMENT: 트리거 동작을 유발하는 DML 구문의 수행 후 또는 전에 한 번만 트리거가 동작하게 된다. WHEN search_condition 트리거가 동작 여부를 결정하는 조건을 명시한다. WHEN 절의 search_condition이 TRUE 인 경우에만 트리거의 action body가 수행되며, FALSE인 경우에는 트리거의 action body가 수행되지 않는다. WHEN 절이 명시되지 않으면, 트리거 이벤트 발생 시 항상 트리거의 action body가 수행된다. WHEN 절에 조건을 사용하기 위해서는 다음과 같은 제약을 만족해야 한다. WHEN 절은 반드시 FOR EACH ROW 절과 함께인 경우에만 사용할 수 있다. WHEN 절에는 REFERENCING절에 정의된 alias_name만을 사용할 수 있다. WHEN 절에는 부질의를 사용할 수 없다. WHEN 절에는 저장 프로시저를 사용할 수 없다. psm_body 트리거의 “action body”를 의미하며, 트리거가 수행할 구문이 여기에 기술된다. 저장 프로시저의 블록 구문과 동일한 방법으로 기술할 수 있다. Psm_body는 다음과 같은 제약을 만족하여야 한다. 트리거의 특성 및 개념 상 action body를 위한 SQL statement 구문은 다음과 같은 것을 사용할 수 없다. COMMIT 또는 ROLLBACK 등과 같은 트랜잭션 관련구문을 사용할 수 없다. CONNECT 등과 같은 세션 관련구문을 사용할 수 없다. CREATE TABLE 등과 같은 스키마 관련구문을 사용할 수 없다. 저장 프로시저를 호출할 수 없다. 회기하는 트리거, 즉 trigger_event에 명시된 연산을 수행하는 트리거는 생성할 수 없다. 저장 프로시저의 블록 구에 대한 자세한 설명은 Stored Procedures Manual을 참조하기 바란다. 106 SQL Reference 주의 사항 트리거의 수행 순서 하나의 테이블에 대하여 하나 이상의 트리거를 정의할 수 있다. 여러 개의 트리거가 정의되어 있을 때 트리거가 동작되는 순서는 일정하지 않다. 트리거 동작 순서가 중요할 경우에는 여러 개의 트리거를 하나로 통합하여 재작성 하여야 한다. 트리거의 수행 실패 트리거를 수행하던 도중 오류가 발생하면, 해당 트리거를 발생시킨 DML 구문도 실패하게 된다. 트리거 내에서 참조되는 테이블에 발생하는 DDL 테이블이 삭제되면 그 테이블에 대해 생성되어 있는 모든 트리거도 삭제된다. 그러나 트리거의 action body내에서 참조하는 테이블이 변경되거나 삭제될 경우에는 트리거는 제거되지 않는다. 참조 테이블이 삭제되어 해당 트리거의 action body가 수행될 수 없는 경우, 그 트리거를 발생시킨 DML 구문은 실패할 것이다. 참조 테이블이 변경된 경우에는 트리거 발생시에 트리거가 내부적으로 재 컴파일되어 정상적으로 수행될 것이다. 트리거와 이중화 이중화로 인해 반영되는 테이블 데이터의 변경은 트리거 동작을 발생시키지 않는다. 트리거와 LOB 트리거를 발생시키는 테이블은 LOB 타입 칼럼을 포함할 수 없다. LOB 칼럼을 포함하는 테이블에 대해서 트리거를 생성하려고 하면 에러가 발생할 것이다. Psm_body 내에서 LOB 칼럼의 값을 사용할 수 없다. 그러나, psm_body 내에서 LOB 칼럼을 포함하는 테이블을 참조하는 것은 가능하다. 예제 <질의> 다음 예제는 행의 삭제를 추적하기 위해 트리거를 어떻게 사용하는지를 보여준다. 이 예제에서 배달이 완료(processing=’D’)된 주문에 관련된 데이터가 orders 테이블에서 삭제될 때, 트리거는 FOR EACH ROW 기준으로 동작되고 orders 테이블의 ono, cno, qty 및 arrival_date 칼럼의 원래 값을 참조한다. 이 트리거는 orders 테이블에서 삭제된 행의 값을 log_tbl에 입력한다. xdbiSQL> CREATE TABLE log_tbl( ono BIGINT, cno BIGINT, qty INTEGER, 데이터 정의어 107 arrival_date DATE, sysdate DATE); Create success. xdbiSQL> CREATE TRIGGER del_trigger AFTER DELETE ON orders REFERENCING OLD ROW old_row FOR EACH ROW AS BEGIN INSERT INTO log_tbl VALUES(old_row.ono, old_row.cno, old_row.qty, old_row.arrival_date, sysdate); END; / Create success. xdbiSQL> DELETE FROM orders WHERE processing = 'D'; 2 rows deleted. xdbiSQL> SELECT * FROM log_tbl; ONO CNO QTY ARRIVAL_DATE ----------------------------------------------------------- ------------- SYSDATE --------------- 11290011 17 1000 05-DEC-2011 25-APR-2012 11290100 11 500 07-DEC-2011 25-APR-2012 2 rows selected. <질의> 다음의 예제에서, 트리거는 scores 테이블에 레코드가 입력될 때, score 칼럼의 값이 지정되어 있지 않으면(NULL이면) 이 값을 0으로 변경한다. 이를 위해서 FOR EACH ROW 기준으로 발생되는 BEFORE INSERT 트리거를 생성하면 된다. xdbiSQL> CREATE TABLE scores( id INTEGER, score INTEGER ); Create success. xdbiSQL> CREATE TRIGGER scores_trigger BEFORE INSERT ON scores REFERENCING NEW ROW NEW_ROW FOR EACH ROW AS BEGIN IF NEW_ROW.SCORE IS NULL THEN NEW_ROW.SCORE := 0; END IF; END; / Create success. xdbiSQL> INSERT INTO scores VALUES( 1, 20 ); 1 row inserted. xdbiSQL> INSERT INTO scores VALUES( 5, NULL ); 1 row inserted. xdbiSQL> INSERT INTO scores VALUES( 17, 75 ); 1 row inserted. xdbiSQL> SELECT * FROM SCORES; ID SCORE --------------------------- 1 20 5 0 17 75 3 rows selected. 108 SQL Reference CREATE USER 구문 create_user ::= CREATEIDENTIFIEDUSERuser_namepassword ACCESStblspace_name ; DEFAULTTABLESPACEtblspace_name ON OFF BY 전제 조건 SYS 사용자와 CREATE USER 시스템 권한을 가진 사용자만이 사용자를 생성할 수 있다. 설명 명시된 사용자 명, 암호, 및 테이블스페이스 접근 권한으로 데이터베이스 사용자를 생성하는 구문이다. user_name 생성될 사용자 이름을 명시한다. 사용자의 이름은 데이터베이스 내에서 유일해야 한다. IDENTIFIED BY password 알티베이스는 암호를 사용해서 사용자를 인증한다. 즉, 사용자는 데이터베이스 로그온시 암호를 입력해야만 한다. 사용자 암호의 최대 길이는 운영체제에 따라 16바이트 또는 22바이트이다. Solaris x86 2.8과 Windows에서 비밀번호의 최대 길이는 22바이트이다. 그 외 다른 운영체제에서 비밀번호의 최대 데이터 정의어 109 길이는 16바이트이다. 만일 이보다 더 긴 문자열의 암호를 명시하여 사용자를 생성하려 하면, 오류가 반환될 것이다. DEFAULT TABLESPACE 절 사용자가 생성한 객체를 저장할 기본 테이블스페이스를 명시한다. 이 절을 생략하면 시스템 메모리 기본 테이블스페이스가 사용자의 기본 테이블스페이스가 된다. 기본 테이블스페이스는 한 사용자에 하나만 지정할 수 있다. ACCESS 절 명시한 (tablespace_name) 테이블스페이스에 접근 가능 여부를 지정하는 절이다. ACCESS tablespace_name ON으로 지정한 테이블스페이스에 대해서는 사용자는 접근 권한을 부여 받는다. OFF로 명시한 테이블스페이스에 대해서는 사용자가 접근이 불가능하다. 물론, ALTER TABLESPACE 시스템 권한이 부여된 사용자는 테이블스페이스 접근이 가능하다. 제한 사항 한 사용자는 여러 데이터 테이블스페이스를 사용할 수 있다. 그러나 한 사용자는 임시 테이블스페이스는 하나만 사용할 수 있다. 사용자가 명시적으로 시스템 언두 테이블스페이스에 접근하거나, 언두 테이블스페이스 내에 테이블이나 인덱스 등을 생성하는 것은 불가능하다. 또한, 시스템 언두 테이블스페이스는 데이터베이스 내에 오직 하나만 존재하며, 사용자가 이를 생성하거나 삭제할 수 없다. 예제 <질의> 사용자 명이 uare1이고 암호가 rose1인 사용자를 생성하라. xdbiSQL> CREATE USER uare1 IDENTIFIED BY rose1; Create success. <질의> 사용자 이름이 uare4이고 암호가 rose4인 사용자를 생성하라. 또한 user_data를 사용자의 기본 테이블스페이스로, temp_data 테이블스페이스를 임시 테이블스페이스로 사용하며, 메모리 테이블스페이스인 SYS_TBS_MEMORY에 대해 접근 권한을 가지고 있다. xdbiSQL> CREATE USER uare4 IDENTIFIED BY rose4 110 SQL Reference DEFAULT TABLESPACE user_data TEMPORARY TABLESPACE temp_data ACCESS SYS_TBS_MEMORY ON; Create success. 데이터 정의어 111 CREATE VIEW 구문 create_view ::= CREATE ORREPLACE NO FORCE VIEW user_name, view_name () ; alias_name , ASsubquery query_restriction_clause query_restriction_clause ::= WITHREADONLY 전제 조건 SYS 사용자와 CREATE VIEW 시스템 권한을 가진 사용자만이 뷰를 생성할 수 있다. 또한, 다른 사용자의 스키마에 뷰를 생성하려면 CREATE ANY VIEW 권한을 가져야 한다. 뷰가 저장된 스키마의 소유자는 뷰의 기반이 되는 테이블 또는 뷰로부터 SELECT 문을 수행하는데 필요한 권한을 가지고 있어야 한다. 112 SQL Reference 설명 명시된 이름으로 새로운 뷰를 생성한다. 뷰(view)란 하나 이상의 테이블 또는 뷰를 기반으로 하는 논리적인 테이블(logical table)이다. 뷰는 실제 데이터를 가지고 있지 않다. 뷰의 기반이 된 테이블을 베이스 테이블(base table)이라 한다. OR REPLACE 이 절은 뷰가 이미 존재한다면 같은 이름의 뷰로 교체할 때 사용된다. 즉, 이 절은 존재하는 뷰를 제거한 후 재 생성하는 대신에 기존 뷰의 정의를 변경하는 기능을 제공한다. FORCE 뷰의 베이스 테이블 존재 여부와 뷰를 내포하고 있는 스키마 소유자의 권한 유무에 상관없이 뷰가 생성되도록 하는 옵션이다. 이는 의미상으로 오류를 내포한 무효한 상태의 뷰가 생성될 수 있음을 의미한다. 이런 경우, 뷰에 대해 SELECT 문 수행 시 오류가 발생할 것이기 때문에, FORCE 옵션을 사용해 뷰를 생성한 후에는 뷰를 SELECT 해보거나 SYS_VIEWS_ 메타 테이블을 조회해 뷰의 상태를 확인해야 한다. NO FORCE 이 옵션을 사용하면 뷰의 베이스 테이블이 존재하고 뷰를 내포하고 있는 스키마 소유자가 권한을 가지고 있을 때만 뷰가 생성된다. 이 옵션이 기본값이다. user_name 생성될 뷰의 소유자 이름을 명시한다. 생략하면 알티베이스는 현재 세션에 연결된 사용자의 스키마에 뷰를 생성한다. view_name 생성될 뷰의 이름을 명시한다. alias_name 베이스 테이블로부터 검색하는 대상이 표현식인 경우 표현식을 위한 별칭을 명시해야 한다. 이 별칭이 뷰의 칼럼 명이 된다. 별칭의 개수는 subquery의 검색 대상(표현식과 칼럼)의 총 개수와 동일해야 한다. subquery 베이스 테이블로부터 조회하는 열과 행을 식별하는 부질의를 명시한다. 데이터 정의어 113 WITH READ ONLY 뷰가 읽기 전용임을 지정한다. 뷰에 대해서는 INSERT, UPDATE, 및 DELETE 같은 변경 연산을 수행할 수 없으므로 이 옵션을 명시하지 않아도 기본적으로 읽기 전용 뷰가 생성된다. 뷰의 부질의에 대한 제한 사항 베이스 테이블에 대한 SELECT문의 검색 대상에 명시할 수 있는 표현식의 개수는 최대 1024개이다. CURRVAL과 NEXTVAL 의사열을 베이스 테이블에 대한 SELECT문의 검색 대상에 사용할 수 없다. 예제 뷰 생성하기 <질의> 다음 예제는 employees 테이블을 기반으로 한 이름이 avg_sal인 뷰를 생성한다. 뷰는 각 부서의 평균 월급을 부서별로 보여준다. xdbiSQL> CREATE VIEW avg_sal AS SELECT dno, AVG(salary) emp_avg_sal FROM employees GROUP BY dno; Create success. xdbiSQL> SELECT * FROM avg_sal; AVG_SAL.DNO AVG_SAL.EMP_AVG_SAL ------------------------------------ A001 2066.66667 C001 1576.66667 C002 1660 D001 2075.75 F001 1845 6 rows selected. 부질의 내에서 표현식 AVG(salary)에 대한 별칭으로 emp_avg_sal이 제공되어 있기 때문에, 뷰의 칼럼을 위한 별칭은 명시할 필요가 없다. 조인 뷰1 생성하기 <질의> 다음 뷰는 주문된 상품을 담당하고 있는 사원 이름과 상품을 1 조인 뷰는 뷰의 부질의에 조인을 내포하는 것을 의미한다. 114 SQL Reference 주문한 고객의 이름을 보여준다. xdbiSQL> CREATE VIEW emp_cus AS SELECT DISTINCT e.e_firstname, e.e_lastname, c.c_firstname, c.c_lastname FROM employees e, customers c, orders o WHERE e.eno = o.eno AND o.cno = c.cno; Create success. xdbiSQL> SELECT * FROM emp_cus; E_FIRSTNAME E_LASTNAME C_FIRSTNAME C_LASTNAME ----------------------------------------------------------- ---------------------------------- Alvar Marquez Estevan Sanchez Sandra Hammond Pierre Martin . . . William Blake Saeed Pahlavi Sandra Hammond Saeed Pahlavi 22 rows selected. 데이터 정의어 115 DROP DATABASE 구문 drop_database ::= DROPDATABASEdatabase_name; 전제 조건 이 구문은 SYS 사용자가 -sysdba 관리자 모드에서만 수행할 수 있으며, PROCESS 구동 단계에서만 수행할 수 있다. 설명 시스템에서 데이터베이스를 삭제하는 구문이다. database_name 삭제할 데이터베이스 이름을 명시한다. 이 구문이 실행되면 해당 데이터베이스가 사용하고 있던 데이터 파일과 로그 파일, 로그 앵커 파일 등이 모두 삭제된다. 예제 <질의> mydb라는 이름의 데이터베이스를 삭제하라. iSQL(sysdba)> DROP DATABASE mydb; Checking Log Anchor files [Ok] /home /altibase_xdb_home/logs/loganchor0 Exist. [Ok] /home /altibase_xdb_home/logs/loganchor1 Exist. [Ok] /home /altibase_xdb_home/logs/loganchor2 Exist. Removing DB files Removing Log files Removing Log Anchor files Drop success. 116 SQL Reference DROP DIRECTORY 구문 drop_directory ::= DROPDIRECTORYdirectory_name; 전제 조건 SYS 사용자와 DROP ANY DIRECTORY 시스템 권한을 가진 사용자만이 디렉토리 객체를 삭제할 수 있다. 설명 디렉토리를 제거하는 구문이다. 단, 실제 파일 시스템상의 디렉토리가 삭제되지는 않고 데이터베이스내의 디렉토리 객체만 삭제된다. directory_name 제거할 디렉토리 이름을 명시한다. 예제 <질의> 이름이 alti_dir1인 디렉토리 객체를 삭제하라. xdbiSQL> DROP DIRECTORY alti_dir1; Drop success. 데이터 정의어 117 DROP INDEX 구문 drop_index ::= DROPINDEXindex_name; user_name. 전제 조건 SYS 사용자, 인덱스 소유자, 및 DROP ANY INDEX 시스템 권한을 가진 사용자만이 인덱스를 삭제할 수 있다. 설명 데이터베이스에서 인덱스를 제거하는 구문이다. user_name 제거될 인덱스 소유자 이름를 명시한다. 생략하면 알티베이스는 현재 세션에 연결된 사용자의 스키마에 속한 것으로 간주한다. index_name 제거할 인덱스 이름을 명시한다. 예제 <질의> 인덱스 emp_idx1을 삭제하라. xdbiSQL> DROP INDEX emp_idx1; Drop success. 118 SQL Reference DROP QUEUE 구문 drop_queue ::= DROPQUEUEqueue_name; 설명 지정한 이름의 큐을 삭제하는 구문이다. 큐를 삭제하면 큐와 함께 생성되었던 큐 테이블, 큐 테이블의 인덱스, 및 큐 테이블의 MSGID값을 생성하는데 사용되었던 시퀀스도 삭제된다. 예제 <질의> Q1이라는 이름을 가지는 메시지 큐와 부속 객체들을 모두 삭제하라. DROP QUEUE Q1; 데이터 정의어 119 DROP REPLICATION 구문 drop_replication ::= DROPREPLICATIONreplication_name; 전제 조건 SYS 사용자만이 이중화 객체를 삭제할 수 있다. 설명 이중화 객체를 제거하는 SQL 문이다. replication_name 제거할 이중화 객체의 이름을 명시한다. 주의 사항 실행중인 이중화 객체는 제거할 수 없다. 즉 이중화 개시(ALTER REPLICATION START)가 되어있을 경우 삭제할 수 없고, 이중화 종료(ALTER REPLICATION STOP) 후에 삭제할 수 있다. 예제 <질의> 이중화 rep1을 삭제하라. DROP REPLICATION rep1; 120 SQL Reference DROP SEQUENCE 구문 drop_sequence ::= DROPSEQUENCE user_name. seq_name; 전제 조건 SYS 사용자, 시퀀스의 소유자, 및 DROP ANY SEQUENCE 시스템 권한을 가진 사용자만이 시퀀스를 삭제할 수 있다. 설명 명시된 시퀀스를 삭제하는 구문이다. user_name 제거될 시퀀스의 소유자 이름을 명시한다. 생략하면 알티베이스는 현재 세션에 연결된 사용자의 스키마에 속한 것으로 간주한다. seq_name 제거할 시퀀스 이름을 명시한다. 예제 <질의> 시퀀스 seq1을 삭제하라. xdbiSQL> DROP SEQUENCE seq1; Drop success. 데이터 정의어 121 DROP SYNONYM 구문 drop_synonym ::= DROPSYNONYM user_name. synonym_name; PUBLIC 전제 조건 SYS 사용자, 시노님의 소유자, 및 DROP ANY SYNONYM 시스템 권한을 가진 사용자만이 시노님을 삭제할 수 있다. 또한, SYS 사용자와 DROP PUBLIC SYNONYM 시스템 권한을 가진 사용자만이 PUBLIC 시노님을 삭제할 수 있다. 설명 명시된 시노님을 데이터베이스에서 삭제하는 구문이다. PUBLIC PUBLIC 시노님을 삭제하기 위해서는 PUBLIC을 명시해야 한다. PUBLIC을 명시하지 않으면 명시한 이름의 PRIVATE 시노님이 삭제될 것이다. PUBLIC을 명시한 경우 user_name은 명시할 수 없다. user_name 삭제할 시노님의 소유자 이름을 명시한다. 생략하면 알티베이스는 현재 세션에 연결된 사용자의 스키마에 속한 것으로 간주한다. synonym_name 삭제할 시노님의 이름을 명시한다. 예제 122 SQL Reference <질의> my_dept 시노님을 삭제하라. xdbiSQL> DROP SYNONYM my_dept; Drop success. <질의> PUBLIC 시노님인 dept를 삭제하라. xdbiSQL> DROP PUBLIC SYNONYM dept; Drop success. 데이터 정의어 123 DROP TABLE 구문 drop_table ::= DROPTABLE user_name. table_name; CASCADE CONSTRAINTS 전제 조건 SYS 사용자, 테이블의 소유자, 및 DROP ANY TABLE 시스템 권한을 가진 사용자만이 테이블을 삭제할 수 있다. 설명 명시된 테이블과 테이블의 데이터를 데이터베이스에서 제거하는 구문이다. user_name 제거될 테이블의 소유자 이름을 명시한다. 생략하면 알티베이스는 현재 세션에 연결된 사용자의 스키마에 속한 것으로 간주한다. table_name 제거될 테이블의 이름을 명시한다. {CASCADE | CASCADE CONSTRAINTS} 삭제될 테이블의 기본 키, 유니크 키를 참조하는 다른 테이블들의 참조 무결성 제약조건(referential integrity constraint)도 함께 삭제된다. 예제 124 SQL Reference <질의> employees 테이블을 삭제하라. xdbiSQL> DROP TABLE employees; Drop success. 데이터 정의어 125 DROP TABLESPACE 구문 drop_tablespace ::= DROPTABLESPACEtblspace_name INCLUDINGCONTENTS ANDDATAFILESCASCADECONSTRAINTS ; 전제 조건 SYS 사용자와 DROP TABLESPACE 시스템 권한을 가진 사용자만이 테이블스페이스를 삭제할 수 있다. 설명 데이터베이스에서 테이블스페이스를 제거하는 구문이다. tblspace_name 제거할 테이블스페이스를 명시한다. INCLUDING CONTENTS 테이블스페이스 내의 모든 내용도 삭제된다. 만약 테이블스페이스 내에 하나 이상의 객체가 존재할 경우 테이블스페이스를 삭제하려면 반드시 이 절을 명시해야 한다. 그렇지 않은 경우 알티베이스는 오류를 발생시키고 DROP TABLESPACE문의 수행은 실패한다. AND DATAFILES INCLUDING CONTENTS 절과 함께 AND DATAFILES 절을 명시하면 파일 시스템에서 삭제될 테이블스페이스와 관련된 모든 파일이 삭제된다. 테이블스페이스를 삭제할 경우 테이블스페이스의 모든 체크포인트 이미지 파일들이 파일 시스템으로부터 삭제된다. 그러나, 체크포인트 126 SQL Reference 경로는 삭제되지 않는다. CASCADE CONSTRAINTS 삭제될 테이블스페이스 내에 존재하는 테이블들의 기본 키, 유니크 키를 참조하는 다른 테이블스페이스에 존재하는 테이블들의 참조 무결성 제약조건(referential integrity constraint)들도 함께 제거하려면 이 절을 명시해야 한다. 즉, 이런 참조 무결성 제약조건이 존재하는 상태에서 이 절을 명시하지 않고 수행하면 알티베이스는 오류를 발생시키고 DROP TABLESPACE문의 수행은 실패할 것이다. 제한 사항 다음 테이블스페이스는 시스템 테이블스페이스로, 사용자가 삭제할 수 없다. SYS_TBS_MEM_DIC SYS_TBS_MEM_DATA 예제 <질의 1> 테이블스페이스 user_data를 제거하라. xdbiSQL> DROP TABLESPACE user_data; Drop success. <질의 2> 메모리 테이블스페이스 user_data의 모든 객체(object)와 데이터 파일들과 함께 테이블스페이스를 삭제하라. xdbiSQL> DROP TABLESPACE user_memory_tbs INCLUDING CONTENTS AND DATAFILES; Drop success. <질의 3> 테이블스페이스 user_data의 모든 객체(object)와 거기에 저장된 모든 테이블의 기본 키 또는 유니크 키를 참조하는 다른 테이블스페이스에 존재하는 테이블들의 모든 참조 무결성 제약조건들을 테이블스페이스와 함께 삭제하라. xdbiSQL> DROP TABLESPACE user_data INCLUDING CONTENTS CASCADE CONSTRAINTS; Drop success. 데이터 정의어 127 DROP TRIGGER 구문 drop_trigger ::= ;DROPTRIGGERtrigger_name user_name. 전제 조건 SYS 사용자, 트리거의 소유자, 및 DROP ANY TRIGGER 시스템 권한을 가진 사용자만이 트리거를 삭제할 수 있다. 설명 데이터베이스에서 명시된 트리거를 제거하는 구문이다. user_name 제거될 트리거의 소유자 이름을 명시한다. 생략하면 알티베이스는 현재 사용자의 스키마 내에 속한 트리거를 제거한다. trigger_name 제거될 트리거의 이름을 명시한다. 예제 <질의> 트리거 del_trigger을 삭제하라. xdbiSQL> DROP TRIGGER del_trigger; Drop success. 128 SQL Reference DROP USER 구문 drop_user ::= DROPUSERuser_name CASCADE ; 전제 조건 SYS 사용자와 DROP USER 시스템 권한을 가진 사용자만이 사용자를 삭제할 수 있다. 설명 데이터베이스에서 명시된 사용자를 제거하는 구문이다. user_name 제거될 사용자 이름을 명시한다. CASCADE 데이터베이스 사용자 뿐만 아니라 그 사용자의 스키마에 속한 모든 객체를 삭제한다. 또한 해당 사용자 소유 테이블에 정의된 기본키 또는 유니크 키를 참조하는 다른 테이블들의 참조 무결성 제약조건(referential integrity constraint)들도 함께 삭제된다. 삭제될 사용자 스키마에 객체가 있는 경우 CASCADE를 생략하면, 에러가 반환되고 사용자 삭제 구문 실행은 실패할 것이다. 예제 <질의> 사용자 uare1을 삭제하라. xdbiSQL> DROP USER uare1; Drop success. 데이터 정의어 129 <질의> 사용자 uare4와 그것에 속한 모든 objects를 삭제하라. xdbiSQL> DROP USER uare4 CASCADE; Drop success. 130 SQL Reference DROP VIEW 구문 drop_view ::= DROPVIEW user_name. view_name; 전제 조건 SYS 사용자, 뷰의 소유자, 및 DROP ANY VIEW 시스템 권한을 가진 사용자만이 뷰를 삭제할 수 있다. 설명 데이터베이스에서 명시된 뷰를 제거하는 구문이다. user_name 제거될 뷰의 소유자 이름을 명시한다. 생략하면 알티베이스는 현재 사용자의 스키마 내에 속하는 뷰를 제거한다. view_name 제거될 뷰의 이름을 명시한다. 예제 <질의> 뷰 avg_sal을 제거하라. xdbiSQL> DROP VIEW avg_sal; Drop success. 데이터 정의어 131 GRANT 구문 grant ::= GRANT; grant_object_privilege grant_system_privilege grant_system_privilege ::= TO ALLPRIVILEGES system_privilege PUBLIC user ,, grant_object_privilege ::= object object_privilege , , WITHGRANTOPTION ALL user PUBLIC TO ON PRIVILEGESdirectory_nameDIRECTORY 전제 조건 SYS 사용자와 GRANT ANY PRIVILEGES 시스템 권한을 가진 사용자만이 시스템 권한을 부여할 수 있다. SYS 사용자와 객체의 소유자만이 객체에 대한 권한을 부여할 수 있다. 또한 GRANT OPTION을 사용해서 객체에 대한 권한을 132 SQL Reference 부여받은 사용자는 그 객체에 대한 권한을 다른 사용자에게 부여할 수 있다. 설명 명시된 사용자에게 데이터베이스와 객체에 접근하기 위한 권한들을 부여하는 구문이다. 권한은 시스템 권한과 객체 권한으로 분류된다. grant_system_privilege 시스템 권한은 일반적으로 SYS 사용자에 의해 관리된다. SYS 사용자는 사용자들에게 특정 데이터베이스 작업을 수행하는 것을 허용하기 위해서 제한한 시스템 권한을 부여할 수 있다. 시스템 권한은 모든 스키마에 있는 객체들을 제어하는 광범위한 권한으로 볼 수 있다. 시스템 권한은 DDL문과 DCL문을 수행하기 위해서 필요하다. grant_object_privilege 사용자가 특정 객체에 대한 권한을 부여 받으면, 그 사용자는 그 객체에 접근/조작이 가능하다. 객체 접근 권한은 일반적으로 객체 소유자에 의해 관리된다. 시스템 권한이 없으면, DML문을 수행을 위해서 객체 권한이 필요하다. 데이터 정의어 133 시스템 권한 (System Privilege) system_privilege 부여될 시스템 접근 권한의 이름을 명시한다. ALL PRIVILEGES 모든 시스템 권한을 사용자에게 부여하기 위해 사용되는 옵션이다. TO user 시스템 권한을 부여할 사용자 이름을 명시한다. TO PUBLIC 모든 사용자에게 시스템 권한을 부여함을 명시하는 옵션이다. 주의 사항 SYS 사용자와 GRANT ANY PRIVILEGES 권한을 가진 사용자는 모든 시스템 권한을 다른 사용자에게 부여할 수 있다. SYS 사용자는 모든 시스템 권한을 가진다. 시스템 권한 중 ANY 키워드는 모든 스키마에 대한 권한을 가진다. 예를 들어 SELECT ANY TABLE 권한은 데이터베이스 내에 있는 모든 테이블을 SELECT 할 수 있다. CREATE 권한은 객체를 생성할 수 있는 권한이며, 해당 객체를 삭제하는 권한도 포함한다. CREATE TABLE 객체 권한은 테이블 뿐만 아니라 인덱스를 생성하는 권한을 포함한다. 이 인덱스 생성 권한은 시스템 권한이 아니라 객체 권한이다. 새로운 사용자가 생성될 때 기본적으로 CREATE SESSION, CREATE TABLE, CREATE SEQUENCE, CREATE SYNONYM, CREATE PROCEDURE, CREATE VIEW, CREATE TRIGGER 권한이 그 사용자에게 부여된다. 다음 쿼리를 사용하면 알티베이스가 지원하는 모든 시스템 권한들의 목록을 볼 수 있다. xdbiSQL> SELECT * FROM SYSTEM_.SYS_PRIVILEGES_ where PRIV_TYPE = 2; 알티베이스는 다음과 같은 총 51개의 시스템 접근 권한을 지원한다. PrivID System privilege Name Purpose 1 ALL 향후 지원 예정 (현재는 이 권한을 사용자에게 부여해도 134 SQL Reference PrivID System privilege Name Purpose ALTER DATABASE, DROP DATABASE, MANAGER TABLESPACE 권한은 부여되지 않는다.) 201 DATABASE ALTER SYSTEM 알티베이스 프로퍼티 설정을 동적으로 변경할 수 있다. 233 ALTER DATABASE SYS 사용자 외의 다른 사용자에게는 부여되지 않는다. 234 DROP DATABASE SYS 사용자 외의 다른 사용자에게는 부여되지 않는다. 250 DIRECTORY CREATE ANY DIRECTORY 저장프로시저내에서 파일 제어를 위해 사용되는 디렉토리 객체를 생성할 수 있다. 251 DROP ANY DIRECTORY 디렉토리 객체를 삭제할 수 있다. 202 INDEXES CREATE ANY INDEX 자신의 스키마 뿐 아니라 다른 사용자의 스키마 내에서도 인덱스 생성이 가능하다. 203 ALTER ANY INDEX 데이터베이스에 존재하는 모든 인덱스의 정의를 변경할 수 있다. 204 DROP ANY INDEX 데이터베이스에 존재하는 모든 인덱스를 삭제할 수 있다. 205 PROCEDURES CREATE PROCEDURE 자신의 스키마 내에 저장 프로시저나 함수를 생성할 수 있다. 206 CREATE ANY PROCEDURE 자신의 스키마 뿐 아니라 다른 사용자의 스키마 내에 저장 프로시저나 함수를 생성할 수 있다. 207 ALTER ANY PROCEDURE 데이터베이스에 존재하는 모든 저장 프로시저나 함수를 재컴파일 할 수 있다. 208 DROP ANY 데이터베이스에 존재하는 데이터 정의어 135 PrivID System privilege Name Purpose PROCEDURE 모든 저장 프로시저나 함수를 삭제할 수 있다. 209 EXECUTE ANY PROCEDURE 데이터베이스에 존재하는 모든 저장 프로시저나 함수를 실행할 수 있다. 210 SEQUENCES CREATE SEQUENCE 자신의 스키마 내에 시퀀스를 생성할 수 있다. 211 CREATE ANY SEQUENCE 자신의 스키마 뿐 아니라 다른 사용자의 스키마 내에서도 시퀀스 생성이 가능하다. 212 ALTER ANY SEQUENCE 데이터베이스에 존재하는 모든 시퀀스의 정의를 변경할 수 있다. 213 DROP ANY SEQUENCE 데이터베이스에 존재하는 모든 시퀀스를 삭제할 수 있다. 214 SELECT ANY SEQUENCE 데이터베이스에 존재하는 모든 시퀀스를 조회할 수 있다. 215 SESSIONS CREATE SESSION 서버에 연결할 수 있다. 216 ALTER SESSION 자동으로 모든 사용자에게 부여된다. 향후 지원 예정. 245 SYNONYM CREATE SYNONYM 자기 소유의 시노님 (private synonym)을 생성할 수 있다. 246 CREATE PUBLIC SYNONYM PUBLIC 시노님을 생성할 수 있다. 247 CREATE ANY SYNONYM 자신의 스키마 뿐 아니라 다른 사용자의 스키마 내에서도 PRIVATE 시노님을 생성할 수 있다. 248 DROP ANY SYNONYM PRIVATE 시노님을 삭제할 수 있다. 249 DROP PUBLIC SYNONYM PUBLIC 시노님을 삭제할 수 있다. 217 TABLES CREATE TABLE 자신의 스키마 내에 테이블을 생성할 수 있다. 218 CREATE ANY TABLE 자신의 스키마 뿐 아니라 다른 사용자의 스키마 136 SQL Reference PrivID System privilege Name Purpose 내에서도 테이블 생성이 가능하다. 219 ALTER ANY TABLE 데이터베이스에 존재하는 모든 테이블에 대해서 truncate(모든 레코드 삭제)하거나 모든 테이블의 정의를 변경할 수 있다. 220 DELETE ANY TABLE 데이터베이스에 존재하는 모든 테이블의 레코드를 삭제 할 수 있다. 221 DROP ANY TABLE 데이터베이스에 존재하는 모든 테이블을 삭제할 수 있다. 222 INSERT ANY TABLE 데이터베이스에 존재하는 모든 테이블에 새로운 레코드를 삽입할 수 있다. 223 LOCK ANY TABLE 데이터베이스에 존재하는 모든 테이블에 테이블 잠금을 할 수 있다. 224 SELECT ANY TABLE 데이터베이스에 존재하는 모든 테이블의 데이터를 조회할 수 있다. 225 UPDATE ANY TABLE 데이터베이스에 존재하는 모든 테이블의 데이터를 변경할 수 있다. 226 USERS CREATE USER 새로운 사용자를 생성할 수 있다. 227 ALTER USER 모든 사용자의 암호를 변경할 수 있다. 228 DROP USER 사용자를 제거할 수 있다. 229 VIEWS CREATE VIEW 자신의 스키마 내에 뷰를 생성할 수 있다. 230 CREATE ANY VIEW 자신의 스키마 뿐 아니라 다른 사용자의 스키마 내에서도 뷰 생성이 가능하다. 231 DROP ANY VIEW 데이터베이스에 존재하는 모든 뷰를 삭제 할 수 있다. 232 MISCELLANEOUS GRANT ANY 모든 시스템 권한을 다른 데이터 정의어 137 PrivID System privilege Name Purpose PRIVILEGES 사용자에게 부여할 수 있다. 235 TABLESPACES CREATE TABLESPACE 테이블스페이스를 생성할 수 있다. 236 ALTER TABLESPACE 테이블스페이스 정의를 변경할 수 있다. 237 DROP TABLESPACE 테이블스페이스를 삭제할 수 있다. 238 MANAGE TABLESPACE SYS 사용자 외의 다른 사용자에게는 부여되지 않는다. 240 SYSDBA SYS 사용자 외의 다른 사용자에게는 부여되지 않는다. 241 TRIGGER CREATE TRIGGER 자신의 스키마 내에 새로운 트리거를 생성할 수 있다. 242 CREATE ANY TRIGGER 자신의 스키마 뿐 아니라 다른 사용자의 스키마 내에서도 트리거 생성이 가능하다. 243 ALTER ANY TRIGGER 데이터베이스에 존재하는 모든 트리거의 정의를 변경할 수 있다. 244 DROP ANY TRIGGER 데이터베이스에 존재하는 모든 트리거를 제거할 수 있다. 객체 권한 (Object privilege) object_privilege 어떤 객체에 대한 특정 권한만을 부여하고자 할 때 사용되는 절이다. (이 절의 아래에 어떤 객체에 대해서 어떤 권한이 지원되는지를 보여주는 표가 있다.) ALL [PRIVILEGES] 객체에 대한 모든 가능한 권한을 부여하는 옵션이다. ON object 어느 객체에 대해서 권한을 부여할 것인지를 명시하는 절이다. 객체에는 테이블, 시퀀스, 저장 프로시저가 있다. 138 SQL Reference ON DIRECTORY directory_name 권한을 부여할 대상인 저장 프로시저 내에서 사용하는 디렉토리 객체의 이름을 명시한다. TO user 객체에 대한 객체 권한을 부여 받는 사용자를 명시한다. TO PUBLIC 모든 사용자에게 객체 한을 부여한다. WITH GRANT OPTION 권한 수여자가 다른 사용자들에게 자신이 받은 객체 권한을 부여할 수 있는 옵션이다. 요약 정리 객체의 소유자란 객체를 생성한 사용자를 말한다. 객체의 소유자이거나, WITH GRANT OPTION으로 객체 권한을 부여 받은 사용자만이 그 객체에 대한 권한을 다른 사용자에게 부여할 수 있다. 객체의 소유자는 자동적으로 해당 객체에 대한 모든 객체 권한을 가진다. 다음 쿼리로 알티베이스에서 지원하는 모든 객체 권한들에 대한 정보를 볼 수 있다. SELECT * FROM SYSTEM_.SYS_PRIVILEGES_ where PRIV_TYPE = 1; 알티베이스는 다음과 같은 객체 접근 권한을 지원한다. PrivID Object privileges Table Sequence PSM View directory 101 ALTER O O 102 DELETE O 103 EXECUTE O 104 INDEX O 105 INSERT O 106 REFERENCES O 107 SELECT O O O 108 UPDATE O 109 READ O 110 WRITE O 모든 사용자는 자동으로 메타 테이블에 대한 SELECT 권한을 가진다. 데이터 정의어 139 예제 시스템 접근 권한 <질의1> 다음은 사용자 uare5에게 EXECUTE ANY PROCEDURE, SELECT ANY TABLE, ALTER ANY SEQUENCE, INSERT ANY TABLE, SELECT ANY SEQUENCE 등의 시스템 권한을 부여하는 예제이다. xdbiSQL> CREATE TABLE seqtbl(i1 INTEGER); Create success. xdbiSQL> CREATE OR REPLACE PROCEDURE proc1 AS BEGIN FOR i IN 1 .. 10 LOOP INSERT INTO seqtbl VALUES(i); END LOOP; END; / Create success. xdbiSQL> CREATE USER uare5 IDENTIFIED BY rose5; Create success. xdbiSQL> GRANT EXECUTE ANY PROCEDURE, SELECT ANY TABLE TO uare5; Grant success. xdbiSQL> CONNECT uare5/rose5; Connect success. xdbiSQL> EXEC sys.proc1; Execute success. xdbiSQL> SELECT * FROM sys.seqtbl; SEQTBL.I1 -------------- 1 2 3 4 5 6 7 8 9 10 10 rows selected. xdbiSQL> CONNECT sys/manager; Connect success. xdbiSQL> CREATE SEQUENCE seq1 START WITH 13 INCREMENT BY 3 MINVALUE 0 NOMAXVALUE; Create success. xdbiSQL> INSERT INTO seqtbl VALUES(seq1.NEXTVAL); 1 row inserted. xdbiSQL> INSERT INTO seqtbl VALUES(seq1.NEXTVAL); 1 row inserted. xdbiSQL> SELECT * FROM seqtbl; SEQTBL.I1 -------------- 1 2 3 4 5 6 7 140 SQL Reference 8 9 10 13 16 12 rows selected. xdbiSQL> GRANT ALTER ANY SEQUENCE, INSERT ANY TABLE, SELECT ANY SEQUENCE TO uare5; Grant success. xdbiSQL> CONNECT uare5/rose5; Connect success. xdbiSQL> ALTER SEQUENCE sys.seq1 INCREMENT BY 50 MAXVALUE 100 CYCLE; Alter success. xdbiSQL> INSERT INTO sys.seqtbl VALUES(sys.seq1.NEXTVAL); 1 row inserted. xdbiSQL> INSERT INTO sys.seqtbl VALUES(sys.seq1.NEXTVAL); 1 row inserted. xdbiSQL> INSERT INTO sys.seqtbl VALUES(sys.seq1.NEXTVAL); 1 row inserted. xdbiSQL> INSERT INTO sys.seqtbl VALUES(sys.seq1.NEXTVAL); 1 row inserted. xdbiSQL> SELECT * FROM sys.seqtbl; SEQTBL.I1 -------------- 1 2 3 4 5 6 7 8 9 10 13 16 66 0 50 100 16 rows selected. 객체 권한 <질의1> 사용자 uare6가 WITH GRANT OPTION으로 employees 테이블에 대한 SELECT와 DELETE 객체 권한을 부여 받은 후, 같은 권한을 다른 사용자 uare7과 uare8에게 부여한다. xdbiSQL> CREATE USER uare6 IDENTIFIED BY rose6; Create success. xdbiSQL> GRANT CREATE USER TO uare6; Grant success. xdbiSQL> @schema.sql xdbiSQL> GRANT SELECT, DELETE ON employees TO uare6 WITH GRANT OPTION; Grant success. xdbiSQL> CONNECT uare6/rose6; Connect success. xdbiSQL> CREATE USER uare7 IDENTIFIED BY rose7; Create success. xdbiSQL> GRANT SELECT, DELETE ON sys.employees TO uare7; Grant success. 데이터 정의어 141 xdbiSQL> CONNECT uare7/rose7; Connect success. xdbiSQL> DELETE FROM SYS.employees WHERE eno = 12; 1 row deleted. xdbiSQL> SELECT eno, ename FROM sys.employees WHERE eno = 12; ENO ENAME ------------------------------------- No rows selected. xdbiSQL> CONNECT sys/manager; Connect success. xdbiSQL> CREATE USER uare8 IDENTIFIED BY rose8; Create success. xdbiSQL> CONNECT uare6/rose6; Connect success. xdbiSQL> GRANT SELECT, DELETE ON sys.employees TO uare8; Grant success. WITH GRANT OPTION 으로 객체권한을 부여받은 사용자 uare6는 자신이 생성한 사용자 uare7 뿐만 아니라 원래의 권한 부여자(SYS)가 생성한 사용자 uare8에게도 객체 권한을 부여할 수 있다. xdbiSQL> CONNECT uare8/rose8; Connect success. xdbiSQL> DELETE FROM sys.employees WHERE eno = 13; 1 row deleted. xdbiSQL> SELECT eno, e_firstname, e_lastname FROM sys.employees WHERE eno = 13; ENO ENAME ------------------------------------- No rows selected. <질의> 다음은 사용자에게 시스템 권한, 객체 권한을 부여한 후 각각의 권한을 해제하는 예제이다. 1. SYS 사용자가 uare9에게 모든 시스템 권한을 부여한다. xdbiSQL> CONNECT sys/manager; Connect success. xdbiSQL> CREATE TABLE book( isbn CHAR(10) PRIMARY KEY, title VARCHAR(50), author VARCHAR(30), edition INTEGER DEFAULT 1, publishingyear INTEGER, price NUMBER(10,2), pubcode CHAR(4)); Create success. xdbiSQL> CREATE TABLE inventory( subscriptionid CHAR(10) PRIMARY KEY, storecode CHAR(4), purchasedate DATE, quantity INTEGER, paid CHAR(1)); Create success. xdbiSQL> CREATE USER uare9 IDENTIFIED BY rose9; Create success. xdbiSQL> GRANT ALL PRIVILEGES TO uare9; Grant success. 2. SYS는 사용자uare9에게 객체 book에 대한 REFERENCES 권한을 WITH GRANT OPTION 으로 부여한다. 142 SQL Reference xdbiSQL> GRANT REFERENCES ON book TO uare9 WITH GRANT OPTION; Grant success. 사용자uare9은 SYS로부터 객체 book에 대한 REFERENCES 권한을 WITH GRANT OPTION 으로 부여 받았기 때문에, uare9은 다른 사용자(uare10)에게 객체 book에 대해 REFERENCES 객체 권한을 부여할 수 있다. 3. uare9이 SYS의 객체인 book 테이블에 데이터를 입력한다. xdbiSQL> CONNECT uare9/rose9; Connect success. xdbiSQL> INSERT INTO sys.book VALUES ('0070521824', 'Software Engineering', 'Roger S. Pressman', 4, 1982, 100000, 'CHAU'); 1 row inserted. xdbiSQL> INSERT INTO sys.book VALUES ('0137378424', 'Database Processing', 'David M. Kroenke', 6, 1972, 80000, 'PREN'); 1 row inserted. uare9이 SYS의 객체인 inventory 테이블에 데이터를 입력한다. xdbiSQL> INSERT INTO sys.inventory VALUES('BORD000002', 'BORD', '12-Jun-2003', 6, 'N'); xdbiSQL> INSERT INTO sys.inventory VALUES('MICR000001', 'MICR', '07-Jun-2003', 7, 'N'); 1 row inserted. 4. uare9이 SYS의 객체인 book 테이블을 조회한다. xdbiSQL> SELECT * FROM sys.book; BOOK.ISBN BOOK.TITLE ------------------------------------------------ BOOK.AUTHOR BOOK.EDITION BOOK.PUBLISHINGYEAR BOOK.PRICE ------------------------------------------------ BOOK.PUBCODE ---------------- 0070521824 Software Engineering Roger S. Pressman 4 1982 100000 CHAU 0137378424 Database Processing David M. Kroenke 6 1972 80000 PREN 2 rows selected. uare9이 SYS의 객체인 inventory 테이블을 조회한다. xdbiSQL> SELECT * FROM sys.inventory; INVENTORY.SUBSCRIPTIONID INVENTORY.STORECODE INVENTORY.PURCHASEDATE ------------------------------------------------ INVENTORY.QUANTITY INVENTORY.PAID -------------------------------------- BORD000002 BORD 2003/06/12 00:00:00 6 N MICR000001 MICR 2003/06/07 00:00:00 7 N 2 rows selected. xdbiSQL> CREATE TABLE book( isbn CHAR(10) PRIMARY KEY, title VARCHAR(50), 데이터 정의어 143 author VARCHAR(30), edition INTEGER DEFAULT 1, publishingyear INTEGER, price NUMBER(10,2), pubcode CHAR(4)); Create success. xdbiSQL> CREATE TABLE inventory( subscriptionid CHAR(10) PRIMARY KEY, isbn CHAR(10) CONSTRAINT fk_isbn REFERENCES book(isbn), storecode CHAR(4), purchasedate DATE, quantity INTEGER, paid CHAR(1)); Create success. 5. uare9은 SYS로부터 ALL PRIVILEGES를 부여 받았으므로 다른 사용자를 생성할 수 있다. xdbiSQL> CREATE USER uare10 IDENTIFIED BY rose10; Create success. 6. SYS는 uare9에게 REFERENCES 권한을 WITH GRANT OPTION으로 부여했기 때문에, uare9는 다른 사용자(uare10)에게 이 권한을 부여할 수 있다. xdbiSQL> GRANT REFERENCES ON sys.book TO uare10; Grant success. 7. GRANT ANY PRIVILEGES를 부여 받은 uare9이 다른 사용자(uare10)에게 시스템 권한을 부여한다. xdbiSQL> GRANT ALTER ANY TABLE, INSERT ANY TABLE, SELECT ANY TABLE, DELETE ANY TABLE TO uare10; Grant success. 8. 사용자 uare10은 ALTER ANY TABLE과 REFERENCE 권한이 있기 때문에, 다른 사용자 소유의 테이블에 제약조건을 추가할 수 있다. xdbiSQL> CONNECT uare10/rose10; Connect success. xdbiSQL> ALTER TABLE sys.inventory ADD COLUMN (isbn CHAR(10) CONSTRAINT fk_isbn REFERENCES sys.book(isbn)); Alter success. 9. 사용자 uare10은 INSERT ANY TABLE 권한이 있기 때문에, 사용자 uare9가 소유한 테이블에 데이터를 입력할 수 있다. xdbiSQL> INSERT INTO uare9.book VALUES('0471316156', 'JAVA and CORBA', 'Robert Orfali', 2, 1998, 50000, 'PREN'); 1 row inserted. xdbiSQL> INSERT INTO uare9.inventory VALUES('TOWE000001', '0471316156', 'TOWE', '01-Jun-2003', 5, 'N'); 1 row inserted. 사용자 uare10은 INSERT ANY TABLE 권한이 있기 때문에, SYS소유의 테이블에 데이터를 입력할 수 있다. xdbiSQL> INSERT INTO sys.book VALUES('053494566X', 'Working Classes', 'Robert Orfali', 1, 1999, 80000, 'WILE'); 1 row inserted. 144 SQL Reference xdbiSQL> INSERT INTO sys.inventory VALUES('MICR000005', 'WILE', '28-JUN-1999', 8, 'N', '053494566X'); 1 row inserted. 10. 사용자 uare10은 SELECT ANY TABLE 권한이 있기 때문에, uare9소유의 테이블을 조회할 수 있다. xdbiSQL> SELECT * FROM uare9.book; BOOK.ISBN BOOK.TITLE ------------------------------------------------ BOOK.AUTHOR BOOK.EDITION BOOK.PUBLISHINGYEAR BOOK.PRICE ------------------------------------------------ BOOK.PUBCODE ---------------- 0471316156 JAVA and CORBA Robert Orfali 2 1998 50000 PREN 1 row selected. xdbiSQL> SELECT * FROM uare9.inventory; INVENTORY.SUBSCRIPTIONID INVENTORY.ISBN INVENTORY.STORECODE ------------------------------------------------ INVENTORY.PURCHASEDATE INVENTORY.QUANTITY INVENTORY.PAID ------------------------------------------------ TOWE000001 0471316156 TOWE 2003/06/01 00:00:00 5 N 1 row selected. 사용자 uare10은 SELECT ANY TABLE 권한이 있기 때문에, SYS소유의 테이블을 조회할 수 있다. xdbiSQL> SELECT * FROM sys.book; BOOK.ISBN BOOK.TITLE ------------------------------------------------ BOOK.AUTHOR BOOK.EDITION BOOK.PUBLISHINGYEAR BOOK.PRICE ------------------------------------------------ BOOK.PUBCODE ---------------- 0070521824 Software Engineering Roger S. Pressman 4 1982 100000 CHAU 0137378424 Database Processing David M. Kroenke 6 1972 80000 PREN 053494566X Working Classes Robert Orfali 1 1999 80000 WILE 3 rows selected. xdbiSQL> SELECT * FROM sys.inventory; INVENTORY.SUBSCRIPTIONID INVENTORY.STORECODE INVENTORY.PURCHASEDATE ------------------------------------------------ INVENTORY.QUANTITY INVENTORY.PAID INVENTORY.ISBN ------------------------------------------------ BORD000002 BORD 2003/06/12 00:00:00 6 N MICR000001 MICR 2003/06/07 00:00:00 7 N MICR000005 WILE 1999/06/28 00:00:00 8 N 053494566X 3 rows selected. 11. 사용자 uare10은 DELETE ANY TABLE 권한이 있기 때문에, 데이터 정의어 145 SYS와 uare9소유의 테이블의 데이터를 삭제할 수 있다. xdbiSQL> DELETE FROM uare9.inventory WHERE subscriptionid = 'TOWE000001'; 1 row deleted. xdbiSQL> SELECT * FROM uare9.inventory; INVENTORY.SUBSCRIPTIONID INVENTORY.ISBN INVENTORY.STORECODE ------------------------------------------------ INVENTORY.PURCHASEDATE INVENTORY.QUANTITY INVENTORY.PAID ------------------------------------------------ No rows selected. xdbiSQL> DELETE FROM sys.inventory WHERE subscriptionid = 'MICR000005'; 1 row deleted. xdbiSQL> SELECT * FROM sys.inventory; INVENTORY.SUBSCRIPTIONID INVENTORY.STORECODE INVENTORY.PURCHASEDATE ------------------------------------------------ INVENTORY.QUANTITY INVENTORY.PAID INVENTORY.ISBN ------------------------------------------------ BORD000002 BORD 2003/06/12 00:00:00 6 N MICR000001 MICR 2003/06/07 00:00:00 7 N 2 rows selected. 12. 사용자 uare9이 REVOKE ALL 구문을 사용하지 않고 uare10으로부터 모든 권한을 해제한다. xdbiSQL> CONNECT uare9/rose9; Connect success. xdbiSQL> REVOKE ALTER ANY TABLE, INSERT ANY TABLE, SELECT ANY TABLE, DELETE ANY TABLE FROM uare10; Revoke success. 13. 사용자 uare10의 REFERENCES 권한과 함께 관련된 참조 무결성 제약조건(referential integrity constraints)도 같이 삭제한다. xdbiSQL> REVOKE REFERENCES ON sys.book FROM uare10 CASCADE CONSTRAINTS; Revoke success. 14. 사용자 uare9의 모든 시스템 권한을 해제한다. xdbiSQL> CONNECT sys/manager; Connect success. xdbiSQL> REVOKE ALL PRIVILEGES FROM uare9; Revoke success. 15. 사용자 uare9의 GRANT ANY PRIVILEGES 권한을 해제한다. xdbiSQL> REVOKE GRANT ANY PRIVILEGES FROM uare9; Revoke success. 16. 사용자 uare9의 REFERENCES 권한을 해제한다. xdbiSQL> REVOKE REFERENCES ON book FROM uare9; Revoke success. 146 SQL Reference RENAME TABLE 구문 rename ::= RENAMEtbl_namenew_tbl_name user_name. ;TO 전제 조건 SYS 사용자, 테이블의 소유자, 및 ALTER ANY TABLE 시스템 권한을 가진 사용자만이 테이블 이름을 변경할 수 있다. 설명 명시된 테이블의 이름을 새로운 이름으로 변경한다. 테이블의 이름만 변경되고 그 안에 저장된 데이터는 유지된다. user_name 이름이 변경될 테이블의 소유자 이름을 명시한다. 생략하면 알티베이스는 현재 세션에 연결된 사용자의 스키마에 속한 것으로 간주한다. old_name 테이블의 현재 이름을 명시한다. new_name 테이블에 주어질 새로운 이름을 명시한다. 주의 사항 이중화 대상 테이블일 경우 테이블의 이름을 변경할 수 없다. 데이터 정의어 147 예제 <질의> 테이블 employees의 이름을 emp1으로 변경하라. xdbiSQL> RENAME employees TO emp1; Rename success. 또는 xdbiSQL> ALTER TABLE employees RENAME TO emp1; Alter success. 148 SQL Reference REVOKE 구문 revoke ::= REVOKE revoke_system_privilege revoke_object_privilege , ; revoke_system_privilege ::= ALLPRIVILEGES system_privilege , PUBLIC user , FROM revoke_object_privilege ::= object object_privilege , , CASCADECONSTRAINT ALL user PUBLIC FROM ON PRIVILEGESdirectory_nameDIRECTORY 전제 조건 SYS 사용자와 원래 그 권한을 부여한 사용자만이 해당 권한을 해제할 수 있다. 데이터 정의어 149 설명 명시된 사용자가 가진 시스템 권한 또는 특정 객체에 대한 객체 권한을 해제하는 구문이다. 시스템 및 객체 접근 권한를 해제하려면 GRANT 명령으로 직접 부여 되었던 권한들에 대해서만 해제할 수 있다. 시스템 접근 권한 (System privilege) system_privilege 해제할 시스템 권한을 명시하는 절이다. 시스템 권한의 목록은 GRANT구문의 설명을 참고한다. ALL PRIVILEGES 이 REVOKE 문을 실행하는 사용자에 의해서 부여된 모든 시스템 권한을 해제하는 옵션이다. ALL PRIVILEGES 옵션으로 부여된 시스템 권한은 ALL PRIVILEGES 옵션을 사용해서 해제하거나 각각의 권한을 따로따로 해제해도 된다. FROM user 시스템 권한을 해제할 사용자를 명시한다. FROM PUBLIC 모든 사용자로부터 시스템 권한을 해제하는 옵션이다. Note: PUBLIC옵션으로 부여된 시스템 권한은 PUBLIC옵션으로 해제할 수 있다. 객체 권한 (Object privilege) object_privilege 해제할 객체 권한을 명시하는 절이다. 객체 권한의 목록은 GRANT구문의 설명을 참고한다. ALL [PRIVILEGES] 이 REVOKE 문을 실행하는 사용자에 의해서 부여된 모든 객체 권한을 해제하는 옵션이다. ALL PRIVILEGES 옵션으로 권한을 해제하면, 사용자에게 부여된 모든 객체 권한이 해제된다. 즉, ALL [PRIVILEGES] 옵션을 사용하지 않고 부여된 객체 권한도 해제된다. 예을 들어, 다음 구문으로 부여된 객체 권한은: 150 SQL Reference GRANT SELECT ON object TO user; 다음 방법으로 명시적으로 해제될 수 있다: REVOKE SELECT ON object FROM user; 또한, 다음 구문을 사용하면 모든 다른 권한도 함께 해제된다: REVOKE ALL ON object FROM user; ON object 어느 객체(테이블, 시퀀스, 저장 프로시저 등)에 대한 권한을 해제할지를 명시하는 절이다. ON DIRECTORY directory_name 어느 디렉토리 객체에 대한 객체 권한을 해제할지를 명시하는 절이다. FROM user 객체 권한을 해제할 사용자를 명시하는 절이다. FROM PUBLIC 모든 사용자로부터 객체 권한을 해제하는 옵션이다. CASCADE CONSTRAINTS REFERENCES 권한 또는 ALL [PRIVILEGS]를 사용해서 해제할 때 사용할 수 있는 옵션이다. 이 옵션을 사용해서 사용자의 권한을 해제하면 관련된 모든 참조 무결성 제약조건(referential integrity constraints)도 함께 삭제된다. 예제 <질의> 객체 권한을 해제하라 xdbiSQL> CONNECT uare6/rose6; Connect success. xdbiSQL> REVOKE SELECT, DELETE ON sys.employees FROM uare7, uare8; Revoke success. xdbiSQL> CONNECT uare7/rose7; Connect success. xdbiSQL> SELECT eno, e_lastname FROM sys.employees WHERE eno = 15; [ERR-311B1: The user must have the SELECT_ANY_TABLE privilege(s) to execute this statement.] employees 테이블에 대한 SELECT와 DELETE 권한 해제 후, 그 테이블에 SELECT 문을 실행하면 오류 메시지를 볼 수 있다. 데이터 정의어 151 TRUNCATE TABLE 구문 truncate ::= ;TRUNCATETABLE user_name. tbl_name 전제 조건 SYS 사용자, 테이블 소유자, 및 DROP ANY TABLE 시스템 권한을 가진 사용자만이 이 구문을 실행할 수 있다. 설명 명시된 테이블의 모든 레코드를 삭제하는 구문이다. user_name 레코드가 삭제될 테이블의 소유자 이름을 명시한다. 생략하면 알티베이스는 현재 세션에 연결된 사용자의 스키마에 속한 것으로 간주한다. tbl_name 레코드가 삭제될 테이블 이름을 명시한다. table_name 에는 큐 테이블 명을 지정하여 ENQUE된 메시지를 한꺼번에 삭제할 수 있다. TRUNCATE vs. DELETE TRUNCATE 문을 수행한 경우는 해당 테이블에 할당된 모든 페이지가 데이터베이스에 free page로 반납된다. 따라서 이 페이지들은 다른 테이블에 의해 사용될 수 있다. 그러나 DELETE 문을 수행하여 해당 테이블의 모든 레코드를 삭제한 경우는 free 152 SQL Reference page가 생기더라도 데이터베이스에 다시 반납되지 않고 해당 테이블 내에 유지되기 때문에 메모리 사용량이 줄지 않는다. TRUNCATE 구문은 DDL구문이므로 이 구문을 성공적으로 수행한 후에는 rollback이 불가능하다. 주의 사항 레코드의 삭제가 성공적으로 수행되었다면 삭제된 레코드는 복구될 수 없다. 그러나 수행 완료 전에 오류가 발생한 경우나 서버가 죽은 경우엔 롤백이 가능하다. 예제 <질의> 테이블 employees의 모든 데이터를 삭제하라. xdbiSQL> TRUNCATE TABLE employee; Truncate success. 데이터 조작어 153 3. 데이터 조작어 이 장에서는 데이터 조작에 사용되는 DML 구문에 대해서 상세히 설명한다. 154 SQL Reference DELETE 구문 delete ::= DELETE hints where_clause ; from_clause limit_clause from_clause ::= FROM tbl_name user_name. where_clause ::= WHEREcondition limit_clause ::= row_offset, LIMITrow_count 데이터 조작어 155 hints ::= +/**/ fullscan_hint index_hint noindex_hint indexasc_hint indexdesc_hint plancache_hint fullscan_hint ::= FULLSCAN()tbl_name index_hint ::= INDEXtbl_name( index_name ), noindex_hint ::= INDEXtbl_nameNO)( index_name , indexasc_hint ::= index_name INDEX ASC (tbl_name), 156 SQL Reference indexdesc_hint ::= index_name INDEX DESC (tbl_name), plancache_hint ::= NO_PLAN_CACHEKEEP_PLAN 전제 조건 SYS 사용자, 테이블 소유자, DELETE ANY TABLE 시스템 권한을 가진 사용자 및 테이블에 대한 DELETE 객체 권한을 가진 사용자만이 이 구문으로 해당 테이블의 레코드를 삭제할 수 있다. 설명 조건을 만족하는 레코드를 해당 테이블에서 삭제하는 구문이다. WHERE 절은 SELECT구문의 WHERE 절과 동일하다. WHERE 절을 생략하면 테이블의 모든 데이터가 삭제된다. user_name 레코드를 삭제할 테이블의 소유자 이름을 명시한다. 생략하면 알티베이스는 테이블이 현재 세션에 연결된 사용자의 스키마에 속한 것으로 간주한다. tbl_name 삭제될 레코드를 포함한 테이블 이름을 명시한다. HINTS 옵션 알티베이스는 SQL문 내에 주석의 형태로 힌트를 포함시켜 쿼리 옵티마이저로 전달하는 것을 지원한다. 쿼리 옵티마이저는 실행 계획을 선택할 때 가능하면 이러한 힌트를 따른다. 데이터 조작어 157 플러스 기호(+)는 그 주석이 힌트임을 알티베이스에 알려주는 역할을 한다. 다음처럼 플러스 기호(+)는 주석 구분자 바로 뒤에 공백 없이 위치해야 한다: /*+ FULL SCAN */ 힌트에 문법 오류가 있어도 쿼리 자체는 실행되지만, 힌트는 무시된다. FULL SCAN 테이블에 이용 가능한 인덱스가 존재하더라도 인덱스를 사용하지 않고 테이블 전체를 검색하도록 하는 힌트이다. INDEX 명시된 인덱스를 사용하여 해당 테이블에 대해서 인덱스 스캔을 수행하도록 하는 힌트이다. INDEX ASC’ 명시된 인덱스를 사용하여 해당 테이블에 대해서 인덱스 스캔을 수행하되, 오름 차순으로 탐색한다. INDEX DESC 명시된 인덱스를 사용하여 해당 테이블에 대해서 인덱스 스캔을 수행하되, 내림 차순으로 탐색한다. NO INDEX 명시된 인덱스를 사용해서 해당 테이블에 대한 인덱스 스캔을 수행하지 않도록 하는 힌트이다 plancache_hint plan cache 관련된 힌트는 NO_PLAN_CACHE와 KEEP_PLAN이 있다. NO_PLAN_CACHE는 생성된 플랜을 플랜 캐시에 저장하지 않도록 하는 힌트이다. KEEP_PLAN는 한 번 생성된 플랜이 참조하는 테이블의 통계 정보가 변경되더라도 플랜이 재생성되는 것을 방지하고 그대로 사용하도록 하는 힌트이다. KEEP_PLAN 힌트는 쿼리의 direct/execute 수행뿐 아니라 prepare/execute 수행시에도 사용 가능하다. 각 힌트의 문법과 자세한 설명은 Administrator’s Manual 의 “SQL 튜닝”장을 참고하기 바란다. 예제 단순 데이터 삭제 158 SQL Reference <질의> 테이블의 모든 데이터를 삭제하라. DELETE FROM orders; <질의> 직원 ’William’이 받은 주문들을 삭제한다. DELETE FROM orders WHERE eno = (SELECT eno FROM employees WHERE e_firstname = 'William'); 데이터 조작어 159 INSERT 구문 insert ::= INSERTINTOtbl_name DEFAULTVALUES ;)column_name , values_clause subquery user_name.insert_hints ( values_clause ::= VALUES expr DEFAULT , () insert_hints ::= /**/+plancache_hint 전제 조건 SYS 사용자, 테이블 소유자, INSERT ANY TABLE 시스템 권한을 가진 사용자 및 테이블에 대한 INSERT 객체 권한을 가진 사용자만이 이 구문으로 해당 테이블에 레코드를 삽입할 수 있다. 설명 160 SQL Reference 명시한 테이블에 새로운 레코드를 삽입하는 구문이다. 만약 해당 테이블에 인덱스가 존재할 경우엔 인덱스 데이터도 변경될 것이다. user_name 레코드가 삽입될 테이블의 소유자 이름을 명시한다. 생략하면 알티베이스는 그 테이블이 현재 세션에 연결된 사용자의 스키마에 속한 것으로 간주한다. tbl_name 레코드가 삽입될 테이블의 이름을 명시한다. NULL 일부 칼럼의 값은 명시하고 일부 칼럼의 값은 명시하지 않고 데이터를 삽입할 경우, 값을 주지 않은 칼럼에 기본값이 설정되어 있지 않으면 널이 삽입된다. ( TIMESTAMP 칼럼의 기본값은 INSERT 연산이 수행된 시점의 시스템 시각 값이다. 따라서 TIMESTAMP 칼럼의 입력 값을 명시하지 않을 경우 널이 아닌 시스템 시각 값이 삽입된다. ) VALUES 절에 명시적으로 널을 지정하면 널이 삽입된다. DEFAULT VALUES 절에 DEFAULT를 명시하면 해당 칼럼에 정의된 기본값이 삽입된다. 전체 칼럼들에 대해 기본값을 삽입하려면 DEFAULT VALUES 절을 사용한다. TIMESTAMP 칼럼에 DEFAULT를 명시하면 시스템 시각 값이 삽입될 것이다. INSERT ~ SELECT SELECT 질의 결과를 테이블에 삽입하는 구문이다. 삽입할 테이블과 조회하는 테이블이 같아도 된다. 삽입할 칼럼의 개수와 조회하는 칼럼의 개수는 동일해야 하며, 대응하는 칼럼은 서로 호환 가능한 데이터 타입이어야 한다. HIINTS 옵션 알티베이스는 SQL문 내에 주석의 형태로 힌트를 포함시켜 쿼리 옵티마이저로 전달하는 것을 지원한다. 쿼리 옵티마이저는 실행 계획을 선택할 때 가능하면 이러한 힌트를 따른다. 플러스 기호(+)는 그 주석이 힌트임을 알티베이스에 알려주는 역할을 데이터 조작어 161 한다. 플러스 기호(+)는 주석 구분자 바로 뒤에 공백 없이 위치해야 한다: 주의 사항 INSERT 문으로 데이터 입력시, 다음의 사항들을 유념해야 한다. 명시한 칼럼의 개수와 삽입할 값들의 개수는 동일해야 하며 호환 가능한 데이터형 이어야 한다. 기본값이 정의되어 있지 않고 NOT NULL 제약이 없는 칼럼에 입력값을 명시하지 않고 INSERT를 수행할 경우, NULL이 삽입된다. 예제 단순 데이터 입력 <질의> 이름이 Louise Leroux인 고객 정보 입력 INSERT INTO customers VALUES ( '25', 'Leroux', 'Louise', 'student', '025282222', 'F', '0101', 150763, '#3 825 - 17th Ave SW Calgary Canada'); <질의> Rosalia Jung인 고객의 정보 중 사번, 이름, 성별만 입력 INSERT INTO employees(eno, e_firstname, e_lastname, sex) VALUES( 21, 'Rosalia', 'Jung', 'F'); 복합 데이터 입력 <질의> 지연중인 주문에 대한 고객 번호와 주문일을 orders 테이블에서 delayed_processing 테이블로 복사하라. xdbiSQL> CREATE TABLE delayed_processing( cno CHAR(14), order_date DATE); Create success. xdbiSQL> INSERT INTO delayed_processing SELECT cno, order_date FROM orders WHERE PROCESSING = 'D'; 1 row inserted. 162 SQL Reference LOCK TABLE 구문 lock_table ::= LOCKTABLE MODEIN WAIT NOWAIT ; integer tbl_name lock_mode user_name. 전제 조건 SYS 사용자, 테이블의 소유자와 LOCK ANY TABLE 시스템 권한을 가진 사용자만이 이 구문으로 테이블 잠금을 할 수 있다. 설명 특정한 모드내에서 테이블 자체에 잠금(lock table)을 거는 기능이다. 테이블에 잠금이 걸리면 관련 트랜잭션이 커밋되거나 롤백될 때까지 계속 그 잠금이 유지된다. user_name 잠금이 걸릴 테이블의 소유자 이름을 명시한다. 생략하면 알티베이스는 그 테이블이 현재 세션에 연결된 사용자의 스키마에 속한 것으로 간주한다. tbl_name 잠금이 걸릴 테이블의 이름을 명시한다. lock_mode 테이블에 잠금을 걸 때, 다음의 잠금 모드 중의 하나를 명시해야 한다. 데이터 조작어 163 ROW SHARE 이 잠금이 걸린 테이블에 다른 트랜잭션에 의한 동시 접근을 허용한다. 그러나 다른 사용자들이 독점적인 접근을 위해 이 테이블에 EXCLUSIVE 모드로 잠금을 거는 것은 금한다. SHARE UPDATE ROW SHARE와 같은 잠금 모드이다. ROW EXCLUSIVE 다른 트랜잭션이 SHARE 모드로 잠금을 요청하는 것을 금하는 것을 제외하면 ROW SHARE 모드와 동일하다. 데이터를 갱신, 삽입하거나 또는 삭제할 때 자동으로 이 잠금이 획득된다. SHARE ROW EXCLUSIVE 전체 테이블을 보는 것을 허용한다. 그러나 다른 트랜잭션들이 SHARE 모드로 잠금을 요청하거나 행들을 갱신하는 것을 금한다. SHARE 다른 트랜잭션이 이 잠금이 걸린 테이블을 읽는 것은 허용하지만 갱신하는 것은 금한다. EXCLUSIVE 현재 트랜잭션이 이 잠금이 걸린 테이블을 읽거나 갱신하는 것은 허용하지만 다른 트랜잭션이 그 테이블에 접근하는 것은 금한다. WAIT | NOWAIT 잠금이 획득될 때까지 대기할 지 여부를 지정하는 옵션이다. 생략하면, 행 단위 잠금이 획득될 때까지 무한정 기다린다. WAIT n 트랜잭션이 행 단위 잠금(row lock)이 걸리기까지 n 초 만큼 기다리고도 획득에 실패하면 에러가 반환될 것이다. NOWAIT 트랜잭션이 잠금 획득이 즉시 안 될 경우 행 단위 잠금이 걸리기까지 기다리지 않는다. 이 경우 이미 다른 사용자에 의해서 해당 테이블에 이미 잠금이 걸려 있다는 것을 나타내는 에러를 반환한다. SQL Statement Mod e of Table Lock Lock Modes Permitted? IS IX S SIX X SELECT … FROM tbl_name … IS Y(IS) Y(IX) Y(S) Y(SIX) N(X) INSERT INTO tbl_name … IX Y(IX) Y(IX) N(SIX) N(SIX) N(X) 164 SQL Reference UPDATE tbl_name … IX Y*(IX) Y*(IX) N(SIX) N(SIX) N(X) DELETE FROM tbl_name … IX Y*(IX) Y*(IX) N(SIX) N(SIX) N(X) SELECT … FROM tbl_name FOR UPDATE … IS Y*(IX) Y*(IX) Y*(S) Y*(SIX ) N(X) LOCK TABLE tbl_name IN ROW SHARE MODE IS Y(IS) Y(IX) Y(S) Y(SIX) N(X) LOCK TABLE tbl_name IN ROW EXCLUSIVE MODE IX Y(IX) Y(IX) N(SIX) N(SIX) N(X) LOCK TABLE tbl_name IN SHARE MODE S Y(S) N(SIX) Y(S) N(SIX) N(X) LOCK TABLE tbl_name IN SHARE ROW EXCLUSIVE MODE SIX Y(SIX) N(SIX) N(SIX) N(SIX) N(X) LOCK TABLE tbl_name IN EXCLUSIVE MODE X N(X) N(X) N(X) N(X) N(X) IS: row share (Intent share lock) IX: row exclusive (Intent exclusive lock) S: share SIX: share row exclusive (Share with Intent exclusive lock) X: exclusive * Y: 다른 트랜잭션에 의해 행 잠금 충돌이 일어나지 않은 경우, 그 트랜잭션은 잠금 획득이 가능하다. 그렇지 않으면 기다림이 발생한다. 괄호 내에 표시된 잠금 타입은: 1. 다른 트랜잭션에 의해 현재의 잠금 모드 전환이 허용되는 경우(Y), 현재 걸려있는 잠금 타입이 괄호 안의 타입으로 전환된다. 2. 다른 트랜잭션에 의해 현재의 잠금 모드 전환이 허용되지 않는 경우(N), 잠금 타입은 현재 잠금을 획득하고 있는 트랜잭션이 새로운 잠금을 획득할 때만 괄호 안의 타입으로 전환이 가능하다. [표 3-1] Summary of Table Locks 예제 다음은 LOCK TABLE과 SELECT 문이 사용 될 때 알티베이스가 데이터 동시성, 무결성, 그리고 일관성을 어떻해 관리하는가를 보여주는 예제이다. Transaction A Time Point Transaction B xdbiSQL> AUTOCOMMIT OFF; xdbiSQL> AUTOCOMMIT OFF; 데이터 조작어 165 Set autocommit off success. Set autocommit off success. 1 (request X lock on employees) xdbiSQL> LOCK TABLE employees IN EXCLUSIVE MODE; Command execute success. (acquire X lock on employees) xdbiSQL> DROP TABLE employees; [ERR-11170: The transaction has exceeded the lock timeout specified by the user.] 2 3 xdbiSQL> UPDATE employees SET salary = 2500000 WHERE eno = 15; 1 row updated. (request S lock on employees) xdbiSQL> LOCK TABLE employees IN SHARE MODE; (the request conflicts with the X lock already held by transaction B) wait wait wait 4 5 xdbiSQL> COMMIT; Commit success. (release X lock on employees) (resume) Lock success. (acquire S lock on employees) xdbiSQL> SELECT salary FROM employees WHERE eno = 15; SALARY -------------- 2500 1 row selected. (커밋된 데이터가 보인다.) 6 xdbiSQL> ROLLBACK; Rollback success. (release S lock on employees) 7 xdbiSQL> LOCK TABLE employees IN EXCLUSIVE MODE; Lock success. (acquire X lock on employees) 8 xdbiSQL> SELECT SALARY 166 SQL Reference FROM employees WHERE eno = 15; wait wait wait xdbiSQL> UPDATE employees SET eno = 30 WHERE eno = 15; 1 row updated. 10 xdbiSQL> COMMIT; Commit success. (release X loc on employees) 11 12 (resume) SALARY -------------- 2500 1 row selected. 데이터 조작어 167 SELECT 구문 select ::= ; for_update_clause subquery subquery ::= select_clause order_by_clauselimit_clause select_clause ::= select_listSELECT hintsALL DISTINCT FROM where_clausehierarchical_query_clausegroup_by_clause HAVINGconditionUNION ALL INTERSECT MINUS select_clause , tbl_reference joined_table 168 SQL Reference select_list ::= alias_name AS tbl_name. , * * user_name. expr tbl_reference ::= AS alias_nametbl_name user_name. ()subquery pivot_clause pivot_clause ::= AS alias (aggregate_function(expr) , )pivot_for_clausepivot_in_clause PIVOT pivot_for_clause ::= FOR column_name column_name() , 데이터 조작어 169 pivot_in_clause ::= IN expr expr() , ( AS alias ) , joined_table ::= tbl_reference join_type tbl_referenceconditionJOINON join_type ::= LEFT INNER RIGHT FULL OUTER where_clause ::= WHEREcondition AND OR hierarchical_query_clause ::= CONNECTcondition STARTWITHconditionIGNORELOOP BY 170 SQL Reference group_by_clause ::= GROUP , expr HAVINGcondition BY order_by_clause ::= ORDERlocation ASC DESC , BY expr c_alias limit_clause ::= LIMIT row_offset row_count , for_update_clause ::= FORUPDATE WAIT NOWAIT integer 데이터 조작어 171 hints ::= fullscan_hint index_hint noindex_hint indexasc_hint indexdesc_hint ordered_hint rule_hint cost_hint dnf_hint cnf_hint use_nl_hint use_hash_hint use_sort_hint use_merge_hint hash_bucket_count_hint group_bucket_count_hint set_bucket_count_hint /*+*/ temp_table_type_hint group_method_hint distinct_method_hint view_opt_hint push_pred_hint 172 SQL Reference fullscan_hint ::= FULLSCAN()tbl_name index_hint ::= INDEXtbl_name( index_name ), noindex_hint ::= INDEXtbl_nameNO)( index_name , indexasc_hint ::= index_name INDEX ASC (tbl_name), indexdesc_hint ::= index_name INDEX DESC (tbl_name), ordered_hint ::= ORDERED rule_hint ::= RULE cost_hint ::= COST 데이터 조작어 173 cnf_hint ::= CNF dnf_hint ::= DNF use_nl_hint ::= USE_NL(tbl_name,)tbl_name use_hash_hint ::= USE_HASH(tbl_name,)tbl_name use_sort_hint ::= USE_SORT(tbl_name,)tbl_name use_merge_hint ::= USE_MERGE(tbl_name,)tbl_name hash_bucket_count_hint ::= integerBUCKETCOUNTHASH group_bucket_count_hint ::= integerBUCKETCOUNTGROUP 174 SQL Reference set_bucket_count_hint ::= integerBUCKETCOUNTSET temp_table_type_hint ::= TEMP_TBS_MEMORY TEMP_TBS_DISK group_method_hint ::= GROUP_HASH GROUP_SORT distinct_method_hint ::= DISTINCT_HASH DISTINCT_SORT view_opt_hint ::= NO_PUSH_SELECT_VIEW PUSH_SELECT_VIEW push_pred_hint ::= PUSH_PRED()view_name 데이터 조작어 175 전제 조건 SYS 사용자, 테이블 소유자, SELECT ANY TABLE 시스템 권한을 가진 사용자 및 테이블에 대한 SELECT 객체 권한을 가진 사용자만이 이 구문으로 해당 테이블에서 데이터를 조회할 수 있다. 설명 한 개 이상의 테이블 또는 뷰에서 데이터를 검색하는 구문이다. select_list 절 DISTINCT를 명시할 경우 결과 집합에서 중복된 레코드는 제거된다. 만약 GROUP BY 절이 존재한다면 상수, 집계 함수(aggregate functions), GROUP BY 절에 명시된 표현식과 이들을 조합한 표현식만 SELECT 리스트에 명시 가능하다. SELECT 리스트에 집계 함수가 하나 이상 존재할 경우 SELECT 리스트의 다른 표현식도 GROUP BY 절에 존재하는 표현식들 중 하나이거나 집계 함수이어야 한다. SELECT 키워드 검색 바로 다음에 힌트를 명시할 수 있다. 힌트는 다음과 같이 구분된다: /*+ your_hint */ 힌트에 대한 자세한 설명은 Administrator’s Manual 의 “SQL 튜닝”장을 참고하기 바란다. FROM 절 같은 별명(alias_name)을 FROM 절에 두 번 이상 사용할 수 없다. 같은 테이블 명을 FROM절에 여러 번 사용할 때, 다른 별명을 주어야 한다. 즉, 별명을 명시하지 않고 같은 테이블 명을 두 번 이상 사용할 수 없다. FROM절에 사용되는 테이블 또는 뷰의 최대 개수는 32개이다. OUTER JOIN 조인 조건을 만족하지 않는 데이터를 처리하기 위한 JOIN의 확장 형태이다. (INNER) JOIN이 두 테이블에서 키 값이 일치하는 데이터만 가져오는 것에 비해 OUTER JOIN은 어느 한 쪽의 데이터를 모두 가져온다. 즉, 한 테이블의 행에 대응하는 행이 다른 테이블에 존재하지 않을 때, 빈 칼럼들에 대해서 결과 집합에는 NULL로 채워져서 반환된다. 176 SQL Reference 인라인 뷰(Inline View) FROM 절에 오는 부질의(subquery)를 인라인 뷰라고 한다. pivot_clause pivot_clause는 데이터 집계 연산 및 별개의 행으로 존재하는 데이터를 칼럼으로 재배열하여 보여주기 위해 사용할 수 있다. 이것은 GROUP BY 절에 두 개의 칼럼을 사용할 때보다 데이터를 더 읽기 쉽게 보여준다. 편의상, 많은 수의 칼럼 출력 또는 변형 연산의 결과로 생기는 특정 칼럼들의 이름을 명시하는 어려움을 방지하기 위해서 pivot_clause는 일반적으로 인라인 뷰와 함께 사용된다. Pivot_clause는 다음의 단계를 수행한다. 1. 먼저 pivot_clause 는 마치 GROUP BY 절처럼 그룹 연산을 수 행한다. 그 결과는 pivot_clause내의 참조되지 않은 모든 칼럼 과 pivot_in_clause에 명시된 값에 대해 그룹화된다. 2. 다음으로 pivot_clause는 결과로 나온 그룹화된 칼럼들과 집계 된 값들을 회전된 표 형식으로 배열한다. pivot_for_clause pivot_for_clause는 그 값 (pivot_in_clause에 명시된 값)이 칼럼 형태로 바꾸어지는 한 개 이상의 원천 칼럼을 명시한다. pivot_in_clause pivot_for_clause에 명시된 칼럼들에 존재하는 값을 이 절에 명시할 수 있다. 이 값들은 pivot 연산에서 칼럼 이름으로 사용될 것이다. where 조건절 WHERE 절의 조건에 대한 설명은 8장 조건 연산자를 참고한다. Hierarchical Query 절 계층적 질의(Hierarchical query)란 데이터 조회시 계층적 구조로 출력되도록 하는 쿼리문이다. 테이블에 부모, 자식 관계를 가지는 데이터가 존재하는 경우 이 쿼리문을 이용해서 부모, 자식 관계를 계층적으로 출력할 수 있다. 즉, 주어진 검색 조건을 갖는 루트 행에 대하여, 그 행과 그의 종속 행에 대한 계층적 조건을 만족하는 행들을 검색한다. 계층적 데이터를 조회할 때, ORDER BY 또는 GROUP BY 절을 사용하면 안 된다. 왜냐하면 이는 CONNECT BY절로 수립된 계층적 순서를 깨기 때문이다. START WITH 절 계층적 질의의 루트 행으로 사용될 행을 식별하는 조건을 명시하는 데이터 조작어 177 절이다. 이 조건을 만족하는 모든 행들이 루트 행으로 사용된다. 이 절을 생략하면 알티베이스는 테이블에 있는 모든 행들을 루트 행으로 사용한다. CONNECT BY 절 없이 이 절을 사용할 수 없다. CONNECT BY 절이 있을 경우 이 절은 생략 가능하다. ROWNUM 의사칼럼은 이 절에 사용될 수 없다. CONNECT BY 절 계층 구조의 부모 행들과 자식 행들간의 관계를 식별하는 조건을 명시하는 절이다. 이전에 검색된 행과 현재 행을 구분하기 위해서 PRIOR 연산자를 사용한다. 즉, 부모행을 언급하기 위해 반드시 PRIOR 연산자를 사용해야만 한다. PRIOR 연산자는 CONNECT BY 절을 포함하는 질의문의 SELECT 리스트, WHERE 절, 또는 CONNECT BY 절에서만 사용 가능하다. CONNECT BY 절은 부질의를 포함할 수 없고 조인과 함께 사용될 수도 없다. CONNECT BY 절은 WHERE 절 이후 ORDER BY, GROUP BY, HAVING 절 이전에 사용하여야 한다. 집합 연산자 (UNION, INTERSECT, 등)가 쿼리에 사용되었을 ?, PRIOR 연산자는 ORDER BY 절에 올 수 없다. LEVEL 의사칼럼 계층적 질의를 포함하는 SQL문은 select_list에 LEVEL 의사칼럼을 포함할 수 있다. LEVEL 의사칼럼은 루트 행과 종속 행간의 계층적 거리를 나타낸다. 즉, 루트 행의 LEVEL은 1이고, 자식 행의 LEVEL은 2, 손자 행의 LEVEL은 3, 등이 된다. LEVEL의사칼럼은 WHERE 절, ORDER BY 절, GROUP BY 절, HAVING 절에서도 사용 가능하다. 또한, LEVEL 의사칼럼은 다음 예처럼 쿼리문에 CONNECT BY 절이 없더라도 select_list 에 올 수 있다: select level from t1; IGNORE LOOP 행들간 계층 관계가 순환 형태를 이룰 경우 알티베이스는 오류를 반환한다. (여기서 순환이란 한 행이 다른 행의 부모 행도 되고 자식 행도 되는 경우를 말한다.) 단, IGNORE LOOP이 명시되었을 경우, 178 SQL Reference 질의 수행시의 순환 형성이 오류를 발생시키지 않고, 순환 형태의 행들이 질의 결과 집합에서 제거된다. GROUP BY 절 GROUP BY 절은 주어진 하나 이상의 표현식에 대해서 같은 값을 가지는 레코드들끼리 그룹짓고, 각 그룹별로 집계한 정보를 한 행으로 반환받기 위해 사용되는 절이다. WHERE 조건을 사용하여 반환되는 그룹을 제한할 수 없다. 대신에, HAVING 절을 사용하여 반환되는 그룹을 제한할 수 있다. HAVING 및 GROUP BY 절은 WHERE 절과 hierarchical_clause 뒤에 위치시킨다. 만약 ORDER BY 절이 있다면 이는 쿼리문의 맨 마지막에 와야 한다. HAVING 조건절 HAVING 절에는 상수, 집계 함수(aggregate functions), GROUP BY 절에 명시된 표현식과 이들을 조합한 표현식만 올 수 있다. 이 절은 명시된 조건이 참인 그룹에 해당하는 레코드만 반환한다. HAVING 절의 조건문에 대한 자세한 설명은 "8장 조건 연산자"를 참고하기 바란다. UNION (ALL), INTERSECT, MINUS 집합 연산자는 두 SELECT 문의 결과 집합을 하나로 결합한다. 각 질의가 반환하는 칼럼들의 개수와 데이터 타입이 동일해야 하지만, 칼럼 길이는 달라도 된다. 집합 연산자의 앞 부분에 위치하는 select_list 의 표현식 이름이 전체 결과 집합의 칼럼 이름이 될 것이다. 집합 연산자에 대한 자세한 설명은 5장 집한 연산자를 참고한다. ORDER BY 절 검색된 레코드들을 정렬하는 절이다. 결과 집합은 오름차순 또는 내림차순으로 정렬 가능하다. 기본으로 오름차순 정렬된다. ORDER BY 절 없이 같은 질의를 반복해서 수행할 때, 결과 집합이 일관되게 정렬된다는 보장이 없다. ORDER BY 절은 SELECT 문에서 한번만 올 수 있다. 이는 부질의 (subquery)에서는 사용할 수 없다. ORDER BY 절에 표현식을 명시한 경우에는 표현식 연산의 결과 값에 대해 정렬된다. 표현식은 select_list 또는 FROM 절의 테이블 또는 뷰의 컬럼을 기반으로 작성될 것이다. ORDER BY 절에 상수를 명시한 경우에는 select_list 내에서의 그 위치에 해당하는 검색 대상 데이터 조작어 179 값에 대해 정렬 한다. 집합 연산자(UNION, INTERSECT 등)를 사용한 경우, 위치(position) 또는 검색 대상의 별명만 ORDER BY 절에 사용 가능하다. GROUP BY가 존재할 경우 그룹 표현식만 사용 가능하다. ORDER BY 절에 다수의 표현식도 올 수 있다. 결과 집합은 먼저 첫 번째 표현식의 값을 기준으로 정렬되고, 첫번째 표현식의 값이 같은 레코드들은 두번째 표현식의 값을 기준으로 정렬되며, 같은 방식으로 이 후 표현식에 대해서도 정렬된다. 오름차순의 인덱스가 정렬 기준 칼럼에 존재한다면, 오름차순으로 정렬할 때는 다른 모든 것들의 뒤에, 그리고 내림차순으로 정렬할 때는 다른 다른 것들의 앞에, NULL 이 정렬된다. 내림차순의 인덱스가 정렬 기준 칼럼에 존재한다면, 오름차순으로 정렬할 때는 다른 모든 것들의 앞에, 그리고 내림차순으로 정렬할 때는 다른 다른 것들의 뒤에, NULL 이 정렬된다. 인덱스가 정렬 기준 칼럼에 존재하지 않는다면, 정렬 순서에 상관없이 NULL은 다른 모든 것들의 뒤에 나타난다. 검색 대상에 DISTINCT를 사용하면, ORDER BY 절에는 SELECT 리스트내의 표현식 또는 이들 표현식의 조합만 올 수 있다. GROUP BY 절이 있다면, 다음의 표현식이 ORDER BY 절에 올 수 있다. 상수 집계 함수 (aggregate functions) GROUP BY 절의 표현식 위의 조합으로 이루어진 표현식 LIMIT 절 LIMIT 절은 반환되는 행의 개수를 제한하기 위해 사용된다. row_offset: 반환할 첫번째 레코드를 지정한다. 생략하면 전체 결과 집합의 첫번째 레코드부터 반환될 것이다. row_count: 반환할 레코드의 개수를 지정한다. 부질의에서도 LIMIT절을 사용할 수 있다. FOR UPDATE 절 현재 트랜잭션이 끝날 때 까지 다른 사용자들이 행(row)을 잠그거나 수정할 수 없도록 선택된 행을 잠근다. WAIT 옵션은 테이블의 잠금을 획득하기 위해 얼마나 대기할지를 지정한다. 반면, NOWAIT 옵션은 잠금을 획득할 테이블이 이미 다른 180 SQL Reference 트랜잭션에 의해 잠금이 걸린 상태라면 기다리지 말 것을 지시한다. FOR UPDATE 절은 최 상위 SELECT 문에서만 사용 가능하다. 즉, 부질의에는 사용할 수 없다. 그러므로 다음과 같은 질의는 사용할 수 없다: select eno from employees where (select eno from departments for update); FOR UPDATE 절은 DISTINCT, GROUP BY절, 집계 함수, 집합 연산자(UNION, INTERSECT 등)와 함께 사용 할 수 없다. HINTS 절 각각의 힌트에 대한 문법과 자세한 설명은 Administrator’s Manual 의 11장 SQL튜닝을 참고하기 바란다. 제약사항 알티베이스는 SQL질의 및 저장프로시저 수행에 있어 다음과 같은 제약을 가진다. 최대 65536개까지의 내부 튜플2만 질의 처리에 사용될 수 있다. FROM절에에 최대 32개 까지의 테이블 또는 뷰를 사용할 수 있다. WHERE, GROUP BY, ORDER BY 같은 연산식이 사용 가능한 절에 최대 32개까지의 테이블 또는 뷰를 사용할 수 있다. 위와 같은 제약을 위배하게 되면 다음과 같은 에러가 발생하게 된다. qpERR_ABORT_QTC_TUPLE_SHORTAGE : There are too many DML statements in the stored procedure, or the SQL query is too long. qpERR_ABORT_QTC_TOO_MANY_TABLES : Too many tables are referenced in a phrase. 예제 단순 조회 <질의>모든 사원의 이름, 고용일, 월급을 검색하라. 2 내부 튜플(internal tuple)은 알티베이스가 질의 처리를 위해 할당하는 메모리의 단위이다 데이터 조작어 181 xdbiSQL> SELECT e_firstname, e_lastname, join_date, salary FROM employees; E_FIRSTNAME E_LASTNAME JOIN_DATE SALARY ----------------------------------------------------------- ------------ Chan-seung Moon Susan Davenport 18-NOV-2009 1500 Ken Kobain 11-JAN-2010 2000 . . . 20 rows selected. 검색 조건 사용 <질의> 월급이 100만원 이하인 직원의 이름, 업무, 입사일, 월급을 월급 순서로 정렬하라. xdbiSQL> SELECT e_firstname, e_lastname, emp_job, salary FROM employees WHERE salary < 1500 ORDER BY 4 DESC; E_FIRSTNAME E_LASTNAME EMP_JOB SALARY ----------------------------------------------------------- ------------- Takahiro Fubuki PM 1400 Curtis Diaz planner 1200 Jason Davenport webmaster 1000 Mitch Jones PM 980 Gottlieb Fleischer manager 500 5 rows selected. Hierachical query 사용 검색 <질의> id 열의 값이 0인 행을 루트로 하는 행들을 얻기 위한 계층적 질의문은 다음과 같다. xdbiSQL> CREATE TABLE hier_order(id INTEGER, parent INTEGER); Create success. xdbiSQL> INSERT INTO hier_order VALUES(0, NULL); 1 row inserted. xdbiSQL> INSERT INTO hier_order VALUES(1, 0); 1 row inserted. xdbiSQL> INSERT INTO hier_order VALUES(2, 1); 1 row inserted. xdbiSQL> INSERT INTO hier_order VALUES(3, 1); 1 row inserted. xdbiSQL> INSERT INTO hier_order VALUES(4, 1); 1 row inserted. xdbiSQL> INSERT INTO hier_order VALUES(5, 0); 1 row inserted. xdbiSQL> INSERT INTO hier_order VALUES(6, 0); 1 row inserted. xdbiSQL> INSERT INTO hier_order VALUES(7, 6); 1 row inserted. xdbiSQL> INSERT INTO hier_order VALUES(8, 7); 1 row inserted. xdbiSQL> INSERT INTO hier_order VALUES(9, 7); 1 row inserted. xdbiSQL> INSERT INTO hier_order VALUES(10, 6); 1 row inserted. 182 SQL Reference xdbiSQL> SELECT ID, parent, LEVEL FROM hier_order START WITH id = 0 CONNECT BY PRIOR id = parent ORDER BY level; ID PARENT LEVEL ------------------------------------------------ 0 1 6 0 2 5 0 2 1 0 2 10 6 3 4 1 3 7 6 3 3 1 3 2 1 3 8 7 4 9 7 4 11 rows selected. [그림 3-1] 계층적 구조 데이터 <질의> START WITH 절을 생략하여 테이블 내의 모든 행을 루트 행으로 사용하고 PRIOR id = parent 조건을 만족하는 질의이다. xdbiSQL> SELECT id, parent, level FROM hier_order CONNECT BY PRIOR id = parent ORDER BY id; ID PARENT LEVEL ------------------------------------------------ 0 1 1 0 1 1 0 2 2 1 1 2 1 3 2 1 2 3 1 2 3 1 1 3 1 3 4 1 1 4 1 2 4 1 3 5 0 1 5 0 2 Level 3 4 2 1 0, NULL 1, 0 5, 0 6, 0 2, 1 3, 1 4, 1 7, 6 10, 6 8, 7 9, 7 루트/부모 부모/자식 자식/리프 부모/자식 자식/리프 자식/리프 자식/리프 자식/리프 자식/리프 자식/리프 부모/자식 데이터 조작어 183 6 0 2 6 0 1 7 6 1 7 6 2 7 6 3 8 7 3 8 7 1 8 7 2 8 7 4 9 7 2 9 7 3 9 7 4 9 7 1 10 6 1 10 6 2 10 6 3 30 rows selected. <질의> 다음 계층적 질의문은 순환을 형성하는 행을 제외한 결과 집합을 얻기 위하여 IGNORE LOOP 절을 사용한 예이다. xdbiSQL> CREATE TABLE triple( num INTEGER, tri INTEGER, PRIMARY KEY(num, tri)); Create success. xdbiSQL> CREATE OR REPLACE PROCEDURE proc_tri AS v1 INTEGER; BEGIN FOR v1 IN 1 .. 1000 LOOP INSERT INTO triple VALUES(v1, v1 * 3); END LOOP; INSERT INTO triple VALUES(1, 1); END; / Create success. xdbiSQL> EXEC proc_tri; Execute success. xdbiSQL> SELECT num, tri, level FROM triple WHERE num < 3001 START WITH num = 1 CONNECT BY PRIOR tri = num IGNORE LOOP; NUM TRI LEVEL ------------------------------------------------ 1 1 1 1 3 2 3 9 3 9 27 4 27 81 5 81 243 6 243 729 7 729 2187 8 1 3 1 3 9 2 9 27 3 27 81 4 81 243 5 243 729 6 729 2187 7 15 rows selected. GROUP BY를 이용한 조회 184 SQL Reference <질의> 부서별 급여 평균을 계산하라. xdbiSQL> SELECT dno, AVG(salary) AS avg_sal FROM employees GROUP BY dno; DNO AVG_SAL --------------------------- 1001 2150 1002 1340 1003 2438.25 2001 1400 3001 1800 3002 2500 4001 1550 4002 1396.66667 1500 9 rows selected. SELECT 목록의 열 중 집계 함수가 사용되지 않은 모든 열은 GROUP BY 절에 있어야 한다. 칼럼에 별명을 주거나, 칼럼 이름과 다른 별명을 사용하고 싶으면 위의 AS avg_sal 처럼 칼럼의 이름 뒤에 사용하고 싶은 별명을 적어주면 된다. 칼럼 별명을 만들 때 AS 키워드는 생략 가능하다. 하이픈 두개 (“--“)가 오면 그 줄의 이후 부분은 모두 주석(comment) 으로 처리된다. <질의> 여러 열에 GROUP BY 절을 사용해서 각 부서내에서 각 직위별로 지급되는 급여 총액을 출력하라. xdbiSQL> SELECT dno, emp_job, COUNT(emp_job) num_emp, SUM(salary) sum_sal FROM employees GROUP BY dno, emp_job; DNO EMP_JOB NUM_EMP SUM_SAL ----------------------------------------------------------- -------- 3002 CEO 1 designer 1 1500 1001 engineer 1 2000 3001 PL 1 1800 3002 PL 1 2500 1002 programmer 1 1700 4002 manager 1 500 4001 manager 1 4001 planner 2 3100 1003 programmer 1 4000 1003 webmaster 2 3750 4002 sales rep 3 3690 1002 PM 1 980 1003 PM 1 2003 1001 manager 1 2300 2001 PM 1 1400 16 rows selected. <질의> 평균 급여가 $1500 USD를 넘는 부서의 평균 급여를 출력하라. xdbiSQL> SELECT dno, AVG(salary) FROM employees WHERE AVG(salary) > 1500 GROUP BY dno; 데이터 조작어 185 [ERR-31061 : An aggregate function is not allowed here. 0003 : WHERE AVG(SALARY) > 1500000 ^ ^ ] HAVING 절을 사용하여 위의 오류를 수정할 수 있다. xdbiSQL> SELECT dno, AVG(salary) FROM employees GROUP BY dno HAVING AVG(salary) > 1500; DNO AVG(SALARY) --------------------------- 1001 2150 1003 2438.25 3001 1800 3002 2500 4001 1550 5 rows selected. <질의> 3개 이상 주문된 상품번호와 그 상품들의 총 수를 출력하라. xdbiSQL> SELECT gno, COUNT(*) FROM orders GROUP BY gno HAVING COUNT(*) > 2; GNO COUNT ------------------------------------ A111100002 3 C111100001 4 D111100008 3 E111100012 3 4 rows selected. <질의> 12월 한 달 동안 2개 이상 주문된 상품번호와 그 상품들의 평균 주문양을 평균 주문양 순서대로 출력하라. xdbiSQL> SELECT gno, AVG(qty) month_avg FROM orders WHERE order_date BETWEEN '01-Dec-2000' AND '31-Dec-2000' GROUP BY gno HAVING COUNT(*) > 1 ORDER BY AVG(qty); GNO MONTH_AVG --------------------------- A111100002 35 D111100003 300 D111100004 750 C111100001 1637.5 D111100010 1750 D111100002 1750 E111100012 4233.33333 D111100008 5500 8 rows selected. ORDER BY를 이용한 조회 <질의> 모든 사원의 이름, 부서 번호 및 급여를 부서 번호를 기준으로 정렬한 후 급여를 기준으로 해서 내림차순으로 출력하라. xdbiSQL> SELECT e_firstname, e_lastname, dno, salary FROM employees ORDER BY dno, salary DESC; E_FIRSTNAME E_LASTNAME DNO SALARY ----------------------------------------------------------- -------------- 186 SQL Reference Wei-Wei Chen 1001 2300 Ken Kobain 1001 2000 Ryu Momoi 1002 1700 Mitch Jones 1002 980 Elizabeth Bae 1003 4000 . . . 20 rows selected. <질의> 다음은 모든 사원의 이름 및 급여를 부서 번호를 기준으로 정렬한 후 급여를 기준으로 해서 내림차순으로 출력하는 질의이다. (SELECT 목록에 없는 열을 기준으로 정렬할 수도 있다.) xdbiSQL> SELECT e_firstname, e_lastname, salary FROM employees ORDER BY dno, salary DESC; E_FIRSTNAME E_LASTNAME SALARY ----------------------------------------------------------- - Wei-Wei Chen 2300 Ken Kobain 2000 Ryu Momoi 1700 Mitch Jones 980 Elizabeth Bae 4000 . . . 20 rows selected. 연산자 사용 조회 <질의> 재고 상품의 이름, 각 제품의 재고 값을 출력하라. xdbiSQL> SELECT gname, (stock*price) inventory_value FROM goods; GNAME INVENTORY_VALUE ------------------------------------- IM-300 78000000 IM-310 9800000 NT-H5000 27924000 . . . 30 rows selected. 별명(alias_name)을 사용한 조회 <질의> 부서 위치에 별명(지역명)을 지정하여 검색하라. xdbiSQL> SELECT dname, 'District Name', dep_location location FROM departments; DNAME 'District Name' LOCATION ------------------------------------------------ Applied Technology Team District Name Mapo Engine Development Team District Name Yeoido Marketing Team District Name Gangnam Planning t Team District Name Gangnam Sales Team District Name Shinchon 5 rows selected. LIMIT절을 사용한 조회 데이터 조작어 187 <질의> employees테이블에서 사원 이름을 3번째 레코드 부터 5명만 출력하라. xdbiSQL> SELECT e_firstname first_name, e_lastname last_name FROM employees LIMIT 3, 5; FIRST_NAME LAST_NAME ----------------------------------------------- Ken Kobain Aaron Foster Farhad Ghorbani Ryu Momoi Gottlieb Fleischer 5 rows selected. <질의> 관리자 테이블에서 첫 번째 레코드에 해당하는 사원의 이름과 급여를 출력하라. xdbiSQL> CREATE TABLE managers( mgr_no INTEGER PRIMARY KEY, m_lastname VARCHAR(20), m_firstname VARCHAR(20), address VARCHAR(60)); Create success. xdbiSQL> INSERT INTO managers VALUES(7, 'Fleischer', 'Gottlieb', '44-25 YouIDo-dong Youngdungpo-gu Seoul Korea'); 1 row inserted. xdbiSQL> INSERT INTO managers VALUES(8, 'Wang', 'Xiong', '3101 N Wabash Ave Brooklyn NY'); 1 row inserted. xdbiSQL> INSERT INTO managers VALUES(12, 'Hammond', 'Sandra', '130 Gongpyeongno Jung-gu Daegu Korea'); 1 row inserted. xdbiSQL> SELECT e_firstname, e_lastname, salary FROM employees WHERE eno = (SELECT mgr_no FROM managers LIMIT 1); E_FIRSTNAME E_LASTNAME SALARY ----------------------------------------------------------- - Gottlieb Fleischer 500 1 row selected. FOR UPDATE를 사용한 조회 Transaction A Time Point Transaction B xdbiSQL> AUTOCOMMIT OFF; Set autocommit off success. xdbiSQL> AUTOCOMMIT OFF; Set autocommit off success. (request X lock on employees) xdbiSQL> LOCK TABLE employees IN EXCLUSIVE MODE; Lock success. (acquire X lock on employees) xdbiSQL> SELECT e_lastname FROM employees WHERE eno = 15; E_LASTNAME 1 188 SQL Reference ------------------------ Davenport 1 row selected. 2 xdbiSQL> SELECT e_lastname FROM employees WHERE eno = 15 FOR UPDATE; (request conflicts with the X lock already held by transaction A) wait wait wait xdbiSQL> UPDATE employees SET ENO = 30 WHERE eno = 15; 1 row updated. xdbiSQL> SELECT e_lastname FROM employees WHERE eno = 30; E_LASTNAME ------------------------ Davenport 1 row selected. 3 xdbiSQL> COMMIT; Commit success. 4 5 (resume) E_LASTNAME ------------------------ No rows selected. HINTS를 사용한 조회 Table Access Method Hints - full scan, index scan, index ascending order scan, index descending order scan, no index scan 다음은 사원들 중 모든 여사원의 번호, 이름, 직업을 검색하는 질의이다. SELECT eno, e_firstname, e_lastname, emp_job FROM employees WHERE sex = 'F'; 예를 들어, 많은 수의 사원들이 있는 사원 테이블의 성별(SEX) 칼럼에 인덱스가 정의되어 있고, 이 칼럼의 값은 ‘M’ 또는 ‘F’이다. 데이터 조작어 189 만약, 남자 직원과 여자 직원의 비율이 같다면 full scan으로 전체 테이블을 검색하는 것이 index scan으로 검색하는 것보다 더 빠를 것이다. 그러나, 만약 여자 직원의 비율이 남자 직원보다 상대적으로 적다면, index scan이 전체 테이블의 full scan 보다 빠를 것이다. 즉, 칼럼이 서로 다른 두 개의 값만을 가지고 있을 때, 쿼리 옵티마이저는 각 값의 행들이 50%씩 존재한다고 가정해서 비용 기반 접근 방식으로서 index scan 보다 전체 테이블의 full scan을 선택한다. 아래의 질의들에서 access 회수를 비교해 보면 각각 20과 4인 것을 알수 있다. <질의> 성별이 여자인 직원의 사원 번호, 이름, 직업을 출력하라. (full scan 이용) xdbiSQL> SELECT /*+ FULL SCAN(employees) */ eno, e_firstname, e_lastname, emp_job FROM employees WHERE sex = 'F'; ENO E_FIRSTNAME E_LASTNAME EMP_JOB ------------------------------------------------ . . . ------------------------------------------------ PROJECT ( COLUMN_COUNT: 4, TUPLE_SIZE: 65 ) SCAN ( TABLE: EMPLOYEES, FULL SCAN, ACCESS: 20, SELF_ID: 2 ) ------------------------------------------------ <질의> 성별이 여자인 직원의 사원 번호, 이름, 직업을 출력하라. (index 이용) xdbiSQL> CREATE INDEX gender_index ON employees(sex); Create success. xdbiSQL> SELECT /*+ INDEX(employees, gender_INDEX) use gender_index because there are few female employees */ eno, e_firstname, e_lastname, emp_job FROM employees WHERE sex = 'F'; ENO E_FIRSTNAME E_LASTNAME EMP_JOB ------------------------------------------------ . . . ------------------------------------------------ PROJECT ( COLUMN_COUNT: 4, TUPLE_SIZE: 65 ) SCAN ( TABLE: EMPLOYEES, INDEX: GENDER_INDEX, ACCESS: 4, SELF_ID: 2 ) ------------------------------------------------ <질의> 1사분기(1월에서 3월까지) 동안의 모든 주문에 대한 주문번호, 상품번호, 주문량을 출력하라 (index 이용). 각 월에 해당하는 주문 테이블의 이름이 orders_## 라고 가정한다. create view orders as select ono, order_date, eno, cno, gno, qty from orders_01 union all select ono, order_date, eno, cno, gno, qty from orders_02 190 SQL Reference union all select ono, order_date, eno, cno, gno, qty from orders_03; create index order1_gno on orders_01(gno); create index order2_gno on orders_02(gno); create index order3_gno on orders_03(gno); xdbiSQL> select /*+ index( orders, orders1_gno, orders2_gno,orders3_gno ) */ ONO, GNO, QTY from orders; ONO GNO QTY ------------------------------------------------- . . . ------------------------------------------------ PROJECT ( COLUMN_COUNT: 3, TUPLE_SIZE: 24 ) VIEW ( ORDERS, ACCESS: 14, SELF_ID: 6 ) PROJECT ( COLUMN_COUNT: 6, TUPLE_SIZE: 48 ) VIEW ( ACCESS: 14, SELF_ID: 5 ) BAG-UNION PROJECT ( COLUMN_COUNT: 6, TUPLE_SIZE: 48 ) SCAN ( TABLE: ORDERS_01, INDEX: ORDERS1_GNO, ACCESS: , SELF_ID: 0 ) PROJECT ( COLUMN_COUNT: 6, TUPLE_SIZE: 48 ) SCAN ( TABLE: ORDERS_02, INDEX: ORDERS2_GNO, ACCESS: 4, SELF_ID: 1 ) PROJECT ( COLUMN_COUNT: 6, TUPLE_SIZE: 48 ) SCAN ( TABLE: ORDERS_03, INDEX: ORDERS3_GNO, ACCESS: 7, SELF_ID: 4 ) ------------------------------------------------ Join Order Hints (ordered, optimized) <질의> 주문된 상품을 담당하고 있는 직원의 사원번호, 이름과 해당 고객의 이름을 출력하라. (employees 테이블과 customers 테이블을 조인하고, 그 결과를 orders 테이블과 조인하기 위해 ORDERED 힌트를 사용하라.) xdbiSQL> SELECT /*+ ORDERED */ DISTINCT o.eno, e.e_lastname, c.c_lastname FROM employees e, customers c, orders o WHERE e.eno = o.eno AND o.cno = c.cno; ENO E_LASTNAME C_LASTNAME ------------------------------------------------ . . . ------------------------------------------------ PROJECT ( COLUMN_COUNT: 3, TUPLE_SIZE: 48 ) DISTINCT ( ITEM_SIZE: 40, ITEM_COUNT: 21, BUCKET_COUNT: 1024, ACCESS: 21, SELF_ID: 4, REF_ID: 3 ) JOIN JOIN SCAN ( TABLE: EMPLOYEES E, FULL SCAN, ACCESS: 20, SELF_ID: 1 ) SCAN ( TABLE: CUSTOMERS C, FULL SCAN, ACCESS: 400, SELF_ID: 2 ) SCAN ( TABLE: ORDERS O, FULL SCAN, ACCESS: 12000, SELF_ID: 3 ) ------------------------------------------------ <질의> 주문된 상품을 담당하고 있는 직원의 사원번호, 이름과 해당 고객의 이름을 출력하라. (FROM 절의 테이블들의 순서에 상관없이 데이터 조작어 191 옵티마이저에 의해서 테이블 조인 순서가 결정되도록 하라.) xdbiSQL> SELECT DISTINCT o.eno, e.e_lastname, c.c_lastname FROM employees e, customers c, orders o WHERE e.eno = o.eno AND o.cno = c.cno; ENO E_LASTNAME C_LASTNAME ------------------------------------------------ . . . ------------------------------------------------ PROJECT ( COLUMN_COUNT: 3, TUPLE_SIZE: 48 ) DISTINCT ( ITEM_SIZE: 40, ITEM_COUNT: 21, BUCKET_COUNT: 1024, ACCESS: 21, SELF_ID: 4, REF_ID: 1 ) JOIN JOIN SCAN ( TABLE: CUSTOMERS C, FULL SCAN, ACCESS: 20, SELF_ID: 2 ) SCAN ( TABLE: ORDERS O, INDEX: ODR_IDX2, ACCESS: 30, SELF_ID: 3 ) SCAN ( TABLE: EMPLOYEES E, INDEX: __SYS_IDX_ID_366, ACCESS: 30, SELF_ID: 1 ) ------------------------------------------------ Optimizer Mode Hints (rule, cost) xdbiSQL> SELECT /*+ RULE */ * FROM t1, t2 WHERE t1.i1 = t2.i1; xdbiSQL> SELECT /*+ COST */ * FROM t1, t2 WHERE t1.i1 = t2.i1; Normal Form Hints (CNF, DNF) xdbiSQL> SELECT /*+ CNF */ * FROM t1 WHERE i1 = 1 OR i1 = 2; xdbiSQL> SELECT /*+ DNF */ * FROM t1 WHERE i1 = 1 OR i1 = 2; Join Method Hints (nested loop, hash, sort, sort merge) xdbiSQL> SELECT /*+ USE_NL (t1,t2) */ * FROM t1, t2 WHERE t1.i1 = t2.i1; xdbiSQL> SELECT /*+ USE_HASH (t1,t2) */ * FROM t1, t2 WHERE t1.i1 = t2.i1; xdbiSQL> SELECT /*+ USE_SORT (t1,t2) */ * FROM t1, t2 WHERE t1.i1 = t2.i1; xdbiSQL> SELECT /*+ USE_MERGE (t1,t2) */ * FROM t1, t2 WHERE t1.i1 = t2.i1; Hash Bucket Size Hints (hash bucket count, group bucket count, set bucket count) xdbiSQL> SELECT /*+ HASH BUCKET COUNT (20) */ DISTINCT * FROM t1; xdbiSQL> SELECT * FROM t1 GROUP BY i1, i2; xdbiSQL> SELECT /*+ GROUP BUCKET COUNT (20) */ * FROM t1 GROUP BY i1, i2; xdbiSQL> SELECT * FROM t1 INTERSECT SELECT * FROM t2; xdbiSQL> SELECT /*+ SET BUCKET COUNT (20) */ * FROM t1 INTERSECT SELECT * FROM t2; Push Predicate Hints <질의> 1사분기(1월에서 3월까지) 동안 발생한 주문 중에서 한번의 주문수량이 10000개이상인 고객의 명단과 상품번호을 구하라.(고객 192 SQL Reference 테이블과 주문 테이블을 조인하기 위해 Push Predicate 힌트를 사용하라.) create view orders as select ono, order_date, eno, cno, gno, qty from orders_01 union all select ono, order_date, eno, cno, gno, qty from orders_02 union all select ono, order_date, eno, cno, gno, qty from orders_03; xdbiSQL> select /*+ PUSH_PRED(orders) */ c_lastname, gno 2 from customers, orders 3 where customers.cno = orders.cno 4 and orders.qty >= 10000; C_LASTNAME GNO ------------------------------------- . . . ------------------------------------------------ PROJECT ( COLUMN_COUNT: 2, TUPLE_SIZE: 34 ) JOIN SCAN ( TABLE: CUSTOMERS, FULL SCAN, ACCESS: 20, SELF_ID: 2 ) FILTER [ FILTER ] AND OR ORDERS.QTY >= 10000 VIEW ( ORDERS, ACCESS: 1, SELF_ID: 8 ) PROJECT ( COLUMN_COUNT: 6, TUPLE_SIZE: 48 ) VIEW ( ACCESS: 1, SELF_ID: 7 ) BAG-UNION PROJECT ( COLUMN_COUNT: 6, TUPLE_SIZE: 48 ) SCAN ( TABLE: ORDERS_01, INDEX: ODR1_IDX2, ACCESS: 3, SELF_ID: 3 ) [ VARIABLE KEY ] OR AND [ FILTER ] AND OR PROJECT ( COLUMN_COUNT: 6, TUPLE_SIZE: 48 ) SCAN ( TABLE: ORDERS_02, INDEX: ODR2_IDX2, ACCESS: 4, SELF_ID: 4 ) [ VARIABLE KEY ] OR AND [ FILTER ] AND OR PROJECT ( COLUMN_COUNT: 6, TUPLE_SIZE: 48 ) SCAN ( TABLE: ORDERS_03, INDEX: ODR3_IDX2, ACCESS: 7, SELF_ID: 6 ) [ VARIABLE KEY ] OR AND [ FILTER ] AND OR ------------------------------------------------ OUTER JOIN을 이용한 조회 <질의> 모든 부서에 대한 부서 번호와 사원 이름을 출력하라. (단, 데이터 조작어 193 사원이 전혀 없는 부서 번호 5001도 출력되게 하라.) xdbiSQL> INSERT INTO departments VALUES('5001', 'Quality Assurance', 'Jonglo', 22); 1 row inserted. xdbiSQL> SELECT d.dno, e.e_lastname FROM departments d LEFT OUTER JOIN employees e ON d.dno = e.dno ORDER BY d.dno; DNO E_LASTNAME ------------------------------- . 5001 . <질의> 모든 부서에 대한 부서 번호와 사원 이름을 출력하라. (단, 부서에 소속이 되어 있지 않은 CEO도 출력되게 하라.) xdbiSQL> SELECT d.dno, e.e_lastname FROM departments d RIGHT OUTER JOIN employees e ON d.dno = e.dno ORDER BY d.dno; DNO E_LASTNAME ------------------------------- . Davenport . <질의> 부서의 위치와 상품을 모아 놓은 장소가 같은 곳에 해당하는 부서의 부서번호, 부서 이름, 상품 번호를 출력하라. xdbiSQL> INSERT INTO departments VALUES('6002', 'headquarters', 'CE0002', 100); 1 row inserted. xdbiSQL> SELECT d.dno, d.dname, g.gno FROM departments d FULL OUTER JOIN goods g ON d.dep_location = g.goods_location; DNO DNAME GNO ----------------------------------------------------------- - . 6002 headquarters E111100005 . In-line View를 이용한 조회 <질의> 자신이 속한 부서의 평균 급여보다 급여를 많이 받는 모든 사원의 이름, 급여, 부서 번호 및 그 부서의 평균 급여를 출력하라. xdbiSQL> SELECT e.e_last name, e.salary, e.dno, v1.salavg FROM employees e, (SELECT dno, AVG(salary) salavg FROM employees GROUP BY dno) v1 WHERE e.dno = v1.dno AND e.salary > v1.salavg; ENAME SALARY DNO SALAVG ------------------------------------------------ . . . PIVOT 절을 이용한 조회 194 SQL Reference <질의> 각 부서별 남자와 여자 직원의 수를 구하라. xdbiSQL> SELECT * FROM (SELECT d.dname, e.sex FROM departments d, employees e WHERE d.dno = e.dno) PIVOT (COUNT(*) FOR sex in ('M', 'F')) ORDER BY dname; DNAME 'M' 'F' ----------------------------------------------------------- ----------- BUSINESS DEPT 3 1 CUSTOMERS SUPPORT DEPT 1 0 MARKETING DEPT 3 0 PRESALES DEPT 2 0 QUALITY ASSURANCE DEPT 1 0 RESEARCH DEVELOPMENT DEPT 1 1 1 RESEARCH DEVELOPMENT DEPT 2 2 0 SOLUTION DEVELOPMENT DEPT 3 1 8 rows selected. <질의> 다음 예제는 비교를 위해서 GROUP BY와 ORDER BY 절을 이용한 질의를 보여준다. 같은 정보를 출력하지만, 읽기가 더 힘든 것을 알 수 있다. xdbiSQL> SELECT d.dname, e.sex, count(*) FROM departments d, employees e WHERE d.dno = e.dno GROUP BY d.dname, e.sex ORDER BY d.dname, e.sex DESC; DNAME SEX COUNT ----------------------------------------------------------- --- BUSINESS DEPT M 3 BUSINESS DEPT F 1 CUSTOMERS SUPPORT DEPT M 1 MARKETING DEPT M 3 PRESALES DEPT M 2 QUALITY ASSURANCE DEPT M 1 RESEARCH DEVELOPMENT DEPT 1 M 1 RESEARCH DEVELOPMENT DEPT 1 F 1 RESEARCH DEVELOPMENT DEPT 2 M 2 SOLUTION DEVELOPMENT DEPT M 3 SOLUTION DEVELOPMENT DEPT F 1 11 rows selected. 데이터 조작어 195 UPDATE 구문 update ::= UPDATEtbl_name hints t_alias where_clause update_set_clause; user_name. limit_clause AS update_set_clause ::= SET column_name (column_name)= = subquery expr expr subquery () )( , , , where_clause ::= WHEREcondition limit_clause ::= row_offset, LIMITrow_count 196 SQL Reference hints ::= +/**/ fullscan_hint index_hint noindex_hint indexasc_hint indexdesc_hint plancache_hint fullscan_hint ::= FULLSCAN()tbl_name index_hint ::= INDEXtbl_name( index_name ), noindex_hint ::= INDEXtbl_nameNO)( index_name , indexasc_hint ::= index_name INDEX ASC (tbl_name), indexdesc_hint ::= index_name INDEX DESC (tbl_name), 데이터 조작어 197 전제 조건 SYS 사용자, 테이블 소유자, UPDATE ANY TABLE 시스템 권한을 가진 사용자 및 테이블에 대한 UPDATE 객체 권한을 가진 사용자만이 이 구문으로 해당 테이블의 데이터를 갱신할 수 있다. 설명 조건을 만족하는 레코드를 찾아 명시한 칼럼들의 값을 변경하는 구문이다. user_name 변경될 레코드가 속한 테이블의 소유자 이름을 명시한다. 생략하면 알티베이스는 테이블이 현재 세션에 연결된 사용자의 스키마에 속한 것으로 간주한다. tbl_name 변경될 레코드가 속한 테이블의 이름을 명시한다. 부질의 (subquery) SET 절에 부질의 사용이 가능하다. 부질의는 하나의 행을 반환해야 한다. SET 절에 단지 한 칼럼만을 명시하면, 부질의는 오로지 하나의 값만을 반환할 수 있다. SET 절에 여러 칼럼들을 명시하면, 부질의의 검색 대상 개수는 명시된 칼럼들의 개수와 동일해야 한다. SET 절에 사용된 부질의의 결과로서 반환되는 행이 없으면 명시된 칼럼은 널 값으로 갱신된다. TIMESTAMP 칼럼의 데이터 수정 TIMESTAMP 칼럼에 대해 UPDATE문 수행 시 기본적으로 칼럼 값이 시스템 시간 값으로 갱신된다. 따라서 TIMESTAMP 칼럼의 데이터 수정 시 값을 명시하지 않으면 널이 아닌 시스템 시간 값으로 변경된다. TIMESTAMP 칼럼의 값을 시스템 시간으로 변경하는 또다른 방법은 칼럼 값에 DEFAULT키워드를 사용하는 것이다. HINTS 옵션 198 SQL Reference 자세한 설명은 DELETE 구문의 HINTS 옵션 절을 참고한다. 주의 사항 SET 절에 같은 칼럼을 두번 이상 사용할 수 없다. 널 제약조건이 있는 칼럼에 널을 삽입하거나 그 칼럼의 값을 널로 변경할 수 없다. 예제 칼럼 데이터 갱신 <질의> 이름이 Davenport인 직원의 월급을 갱신하라. xdbiSQL> UPDATE employees SET salary = 2500 WHERE e_lastname = 'Davenport'; 1 row updated. <질의> 전 직원의 월급을 7% 인상하라. xdbiSQL> UPDATE employees SET salary = salary * 1.07; 20 rows updated. WHERE 절에 부질의를 사용해서 데이터 갱신 <질의> MYLEE 직원이 받은 주문들의 수량을 50개씩 빼라. xdbiSQL> UPDATE orders SET qty = qty - 50 WHERE eno IN( SELECT eno FROM employees WHERE e_lastname ='Hammond'); 9 rows updated. SET 절에 부질의를 갖는 데이터 갱신 <질의> 다음 예제는 두개의 중첩된 SELECT 부질의를 갖는 UPDATE 문의 구조를 보여준다. xdbiSQL> CREATE TABLE bonuses (eno INTEGER, bonus NUMBER(10, 2) DEFAULT 100, commission NUMBER(10, 2) DEFAULT 50); Create success. xdbiSQL> INSERT INTO bonuses(eno) (SELECT e.eno FROM employees e, orders o WHERE e.eno = o.eno GROUP BY e.eno); 3 rows inserted. xdbiSQL> SELECT * FROM bonuses; 데이터 조작어 199 BONUSES.ENO BONUSES.BONUS BONUSES.COMMISSION ------------------------------------------------ 12 100 50 19 100 50 20 100 50 3 rows selected. xdbiSQL> UPDATE bonuses SET eno = eno + 100, (bonus, commission) = (SELECT 1.1 * AVG(bonus), 1.5 * AVG(commission) FROM bonuses) WHERE eno IN (SELECT eno FROM orders WHERE qty >= 10000); 1 row updated. xdbiSQL> SELECT * FROM bonuses; BONUSES.ENO BONUSES.BONUS BONUSES.COMMISSION ------------------------------------------------ 12 100 50 20 100 50 119 110 75 3 rows selected. Note: WHERE 절의 부질의 결과가 한 건도 없으면 어떠한 레코드도 영향을 받지 않으나, SET 절의 부질의 결과가 한 건도 없으면 해당 칼럼은 널값으로 갱신될 것이다. xdbiSQL> UPDATE orders SET qty = qty - 50 WHERE eno IN( SELECT eno FROM employees WHERE e_lastname ='Frederick'); No rows updated. xdbiSQL> UPDATE employees SET dno = (SELECT dno FROM departments WHERE dep_location = 'Timbuktu'); 20 rows updated. xdbiSQL> SELECT e_lastname, dno FROM employees WHERE eno = 12; E_LASTNAME DNO ------------------------------- Hammond 1 row selected. 200 SQL Reference MOVE 구문 move ::= MOVE hints INTO column_commalist FROMsource_tbl_name limit_clausewhere_clause expression_commalist user_name. user_name. target_tbl_name ; column_commalist ::= ()column_name , expression_commalist ::= ()expr , limit_clause ::= LIMIT row_offset row_count , 데이터 조작어 201 전제 조건 테이블의 레코드를 이동(MOVE)하기 위해서는 테이블에서 레코드를 삭제할 수 있는 권한과 테이블에 레코드를 삽입할 수 있는 권한이 있어야 한다. 데이터 이동은 삽입과 삭제로 수행되기 때문이다. INTO 절에 명시된 테이블에 레코드를 삽입하기 위해서는 SYS 사용자이거나 테이블의 소유자이거나 INSERT ANY TABLE 시스템 권한을 가진 사용자, 또는 그 테이블에 대한 INSERT 객체 권한을 가진 사용자이어야 한다. FROM 절에 명시된 테이블에서 레코드를 삭제하기 위해서는 SYS 사용자이거나 테이블의 소유자이거나 DELETE ANY TABLE 시스템 권한을 가진 사용자, 또는 그 테이블에 대한 DELETE 객체 권한을 가진 사용자이어야 한다. 설명 한 테이블에서 조건을 만족하는 레코드를 찾아 다른 테이블로 이동하는 구문이다. hints FROM절에 대한 힌트를 제공한다. 이는 SELECT구문에서 사용하는 힌트와 동일하다. source_tbl_name, target_tbl_name 데이터 이동에 관련된 테이블(원본 테이블과 대상 테이블)을 명시한다. 여기에는 뷰나 메타 테이블이 올 수 없다. column_commalist 대상 테이블에 속하는 실제 칼럼들의 리스트이다. expression_commalist 쉼표로 구분된 표현식들의 리스트이다. 각 표현식은 FROM 테이블에 속한 칼럼, 상수, 또는 표현식일 수 있다. where_clause SELECT 구문의 WHERE 절과 구조가 동일하다. limit_clause SELECT구문의 LIMIT 절과 구조가 동일하다. 202 SQL Reference 주의 사항 동일한 테이블간의 데이터 이동은 불가능하다. 예제 <질의> t2테이블의 i1, i2 칼럼으로부터 t2.i2=4조건을 만족하는 모든 레코드를 t1 테이블의 i1, i2 칼럼에 삽입하고 t2 테이블에서 삭제한다. xdbiSQL> MOVE INTO T1(I1, I2) FROM T2(I1, I2) WHERE T2.I2 = 4; <질의> t2테이블의 i1, i2, i3 칼럼으로 이루어진 레코드를 t1 테이블에 삽입하고 t2테이블에서 삭제한다. (테이블t1에는 t2의 i1, i2, i3 칼럼에 대응되는 칼럼이 있어야 하며 칼럼 개수가 서로 동일해야 한다.) xdbiSQL> MOVE INTO T1 FROM T2(I1, I2, I3); 데이터 조작어 203 ENQUEUE 구문 enqueue ::= ENQUEUEINTOqueue_name;()column_name , values_clause values_clause ::= VALUES expr DEFAULT () , 설명 큐에 메시지를 삽입하는 구문이다. ENQUEUE 구문은 INSERT 구문과 유사한 구조를 가지는데 INTO 절 이후에 반드시 하나 이상의 큐 칼럼 명을 명시해야 한다. 일반적인 경우 사용자는 자신이 저장할 메시지만 지정하여 메시지를 입력하는데, 메시지를 구분하거나 분류하여 차별화 할 필요가 있을 때에는 Correlation ID를 명시적으로 지정하여 입력할 수 있다. 예제 <질의> “This is a message”라는 메시지를 Q1메시지 큐에 입력하라. ENQUEUE INTO Q1(message) VALUES ('This is a message'); <질의> “This is a message”라는 메시지를 237이라는 Correlation ID로 Q1메시지 큐에 입력하라. ENQUEUE INTO Q1(message,corrid) VALUES ('This is a message', 237); 204 SQL Reference DEQUEUE 구문 dequeue ::= DEQUEUEqueue_column_listFROMqueue_name where_clause WAITinteger ;fifo_option fifo_option ::= FIFO LIFO 설명 DEQUEUE 구문은 where_clause 절의 조건에 맞는 메시지를 얻어 오고 해당 메시지를 큐에서 삭제한다. fifo_option FIFO 옵션이 설정되어 있거나 아무 옵션도 설정하지 않은 경우에는 조건에 맞는 메시지 중 가장 오래된 메시지를 얻어 오고, LIFO 옵션이 설정된 경우에는 가장 최신의 메시지를 얻어 온다. WAIT integer DEQUEUE 문은 큐에 메시지가 하나도 없을 경우에 큐에 메시지가 들어올 때까지 대기하는데, WAIT 절에 명시한 시간만큼 대기한다. 대기 시간이 설정되지 않은 경우, DEQUEUE 문은 무한정 대기할 것이다. 주의사항 데이터 조작어 205 DEQUEUE 구문의 사용시에 다음과 같은 점에 주의해야 한다. queue_column_list에는 큐 테이블 내의 칼럼명만 지정 가능하다. DEQUEUE문은 SELECT 구문의 일부 특징을 가지고 있지만 DEQUEUE문의 FROM 절에는 단 하나의 큐 테이블 이름만 지정이 가능하다. 두개 이상의 큐 테이블 이름이 오면 에러가 발생한다. DEQUEUE구문의 WHERE 절에는 부질의(Subquey)가 올 수 없다. 예제 <질의> 메시지 큐 Q1에서 Correlation ID가 237인 메시지들을 모두 읽어라. DEQUEUE MESSAGE, CORRID FROM Q1 WHERE CORRID=237; 데이터 제어어 207 4. 데이터 제어어 이장에서는 사용자 세션 제어와 트랜잭션을 제어하는 SQL문에 대해서 설명한다. 208 SQL Reference ALTER SESSION 구문 alter_session::= ;ALTERSESSIONalter_session_set_clause replication_mode_set_clause alter_session_set_clause::= SETproperty_name=property_value replication_mode_set_clause::= SET=REPLICATION DEFAULT NONE 설명 현재 세션(Session)의 속성을 변경하는 구문이다. alter_session_set_clause alter_session_set_clause 절의 property_name과 property_ value에 관한 자세한 내용은 알티베이스 매뉴얼 중 General Reference의 알티베이스 프로퍼티 장을 참조한다. replication_mode_set_clause replication_mode_set_clause는 현재 세션에서 수행하는 트랜잭션을 위한 이중화 모드 속성을 설정하는 절이다. DEFAULT를 명시하면 이중화는 이중화 객체 생성시 기본모드로 채택된 모드로 동작할 것이다. 그러나 NONE을 명시하면 세션에서 데이터 제어어 209 수행되는 모든 DDL, DML, DCL 문이 이중화 대상에서 제외된다. 이중화 모드에 대한 보다 자세한 내용은 Replication Manual을 참조한다. 210 SQL Reference ALTER SYSTEM 구문 alter_system ::= ALTER SET ; START STOP LOG RESET LOGFILE SYSTEM CHECKPOINT MEMORY ARCHIVE SWITCH COMPACT SQL_PLAN_CACHE COMPACT alter_system_set_clause alter_system_set_clause ::= property_nameproperty_value= 설명 알티베이스의 시스템 프로퍼티를 변경하는 구문이다. SYS 사용자 또는 ALTER SYSTEM 권한을 가진 사용자만이 ALTER SYSTEM 문의 모든 기능을 수행할 수 있다. CHECKPOINT 체크포인트를 수행하는 옵션이다. COMPACT 메모리 콤팩션을 수행하는 구문이다. 이 구문은 IBM AIX플랫폼에서만 동작한다. ARCHIVE LOG START/STOP START를 실행하면 아카이브로그 쓰레드가 시작되고, STOP하면 종료된다. 알티베이스가 아카이브로그 모드로 운영중일때만 이 데이터 제어어 211 구문을 실행할 수 있다. 알티베이스가 아카이브로그 모드로 운영중인지 여부는 V$LOG 또는 V$ARCHIVE 성능 뷰에서 확인이 가능하다. 아카이브로그 모드에 대한 자세한 내용은 Administrator’s Manual의 10장 백업 및 복구를 참고한다. SWITCH LOGFILE 로그파일을 강제로 아카이브하는 구문이다. 현재 로그파일이 꽉 차지 않았더라도, 이 구문을 실행하면 알티베이스 XDB는 사용중이던 로그파일을 닫고 다음 로그파일에 로깅을 계속한다. SET alter_system_set_clause 알티베이스 프로퍼티 값을 변경하는 구문이다. 현재 버전의 알티베이스 XDB에서는 이 구문으로 프로퍼티 값을 변경하는 것이 불가능하다. 이 기능은 다음 버전에서 지원될 예정이다. 프로퍼티에 대한 자세한 내용은 General Reference의 알티베이스 프로퍼티를 참조한다. 예제 <질의> 아카이브로그 모드일 경우 아카이브 로그 쓰레드를 시작시킨다. xdbiSQL> ALTER SYSTEM ARCHIVE LOG START; 212 SQL Reference COMMIT 구문 commit::= COMMIT; FORCEglobal_tx_id 설명 현재의 트랜잭션을 데이터베이스에 명시적으로 커밋하는 구문이다. AUTOCOMMIT 모드가 FALSE일때 사용할 수 있다. FORCE global_tx_id XA환경에서 트랜잭션이 in-doubt 상태가 될 경우에 이를 강제로 커밋하는 구문이다. global_tx_id는 글로벌 트랜잭션의 포맷(format) 아이디, 글로벌 트랜잭션(global transaction) 아이디, 브랜치 수식자(branch qualifier)를 문자열로 나타낸 것이다. 주의 사항 AUTOCOMMIT 모드 시에 이 문장을 수행할 수 없다. 예제 다음 구문은 트랜잭션이 이전에 수행한 모든 명령들을 데이터베이스에 반영한다.. xdbiSQL> COMMIT; Commit success. 데이터 제어어 213 SAVEPOINT 구문 savepoint::= SAVEPOINTsavepoint_name; 설명 저장점을 생성하는 구문이다. 저장점의 생성은 지금까지 실행된 트랜잭션 처리의 결과를 임시로 저장하는 것을 의미한다. 즉, 저장점은 트랜잭션 내에서 롤백할 지점을 명시적으로 지정한 것이다. 저장점은 AUTOCOMMIT 모드가 FALSE 일 때 유효하다. 주의 사항 자동반영(AUTOCOMMIT) 모드 일때 사용할 수 없다. 예제 xdbiSQL> AUTOCOMMIT OFF; Set autocommit off success. xdbiSQL> CREATE TABLE savept(num INTEGER); Create success. xdbiSQL> INSERT INTO savept VALUES(1); 1 row inserted. xdbiSQL> SAVEPOINT sp1; Savepoint success. xdbiSQL> INSERT INTO savept VALUES(2); 1 row inserted. xdbiSQL> SELECT * FROM savept; SAVEPT.NUM -------------- 1 2 2 rows selected. 저장점 sp1 지점까지 트랜잭션을 롤백한다. xdbiSQL> ROLLBACK TO SAVEPOINT sp1; Rollback success. xdbiSQL> SELECT * FROM savept; SAVEPT.NUM -------------- 214 SQL Reference 1 1 row selected. xdbiSQL> COMMIT; Commit success. 데이터 제어어 215 ROLLBACK 구문 rollback ::= ROLLBACK TOSAVEPOINTsavepoint_name ; FORCEglobal_tx_id 설명 ROLLBACK (TO SAVEPOINT) 현재의 트랜잭션을 모두 롤백하거나 (이전에 정의한) 저장점까지 부분 롤백하는 구문이다. FORCE global_tx_id XA환경에서 “in-doubt”상태의 트랜잭션을 강제로 롤백하는 구문이다. global_tx_id는 글로벌 트랜잭션의 포맷(format) 아이디, 글로벌 트랜잭션(global transaction) 아이디, 브랜치 수식자(branch qualifier)를 문자열로 나타낸 것이다. 주의 사항 이 구문은 AUTOCOMMIT 모드일 때는 사용할 수 없다. 예제 xdbiSQL> AUTOCOMMIT OFF; Set autocommit off success. xdbiSQL> UPDATE employees SET salary = 2300 WHERE eno = 3; 1 row updated. xdbiSQL> SAVEPOINT emp3_sal; Savepoint success. xdbiSQL> DELETE FROM employees WHERE eno = 19; 1 row deleted. xdbiSQL> SAVEPOINT emp19_ret; Savepoint success. 216 SQL Reference xdbiSQL> INSERT INTO employees(eno, e_lastname, e_firstname, salary, sex) VALUES(21, 'Templeton', 'Kimmie', 3000, 'F'); 1 row inserted. xdbiSQL> SAVEPOINT emp21_join; Savepoint success. xdbiSQL> UPDATE employees SET salary = 2200 WHERE eno=18; 1 row updated. xdbiSQL> SELECT eno, e_lastname, e_firstname, salary FROM employees WHERE eno in (3, 18, 19, 21); ENO E_LASTNAME E_FIRSTNAME SALARY ----------------------------------------------------------- -------------- 3 Kobain Ken 2300 18 Huxley John 2200 21 Templeton Kimmie 3000 3 rows selected. 저장점 emp21_join 지점까지 트랜잭션을 롤백한다. xdbiSQL> ROLLBACK TO SAVEPOINT emp21_join; Rollback success. xdbiSQL> SELECT eno, e_lastname, e_firstname, salary FROM employees WHERE eno in (3, 18, 19, 21); ENO E_LASTNAME E_FIRSTNAME SALARY ----------------------------------------------------------- -------------- 3 Kobain Ken 2300 18 Huxley John 1900 21 Templeton Kimmie 3000 3 rows selected. 저장점 emp19_ret 지점까지 트랜잭션을 롤백한다. xdbiSQL> ROLLBACK TO SAVEPOINT emp19_ret; Rollback success. xdbiSQL> SELECT eno, e_lastname, e_firstname, salary FROM employees WHERE eno in (3, 18, 19, 21); ENO E_LASTNAME E_FIRSTNAME SALARY ----------------------------------------------------------- -------------- 3 Kobain Ken 2300 18 Huxley John 1900 2 rows selected. 첫 번째 UPDATE 문, 첫번째 DELETE문과 마지막 DML문 (두 번째 INSERT문)에 의해 수행된 모든 변경을 커밋한다. 모든 다른 DML 문들의 변경사항은 COMMIT 되기 전에 롤백되어 사라졌다. 또한 저장점 emp21_join은 더 이상 유효하지 않다. xdbiSQL> ROLLBACK TO SAVEPOINT emp21_join; [ERR-11016 : Savepoint not found] xdbiSQL> INSERT INTO employees(eno, e_lastname, e_firstname, sex, join_date) VALUES(22, 'Chow', 'May', 'F', TO_DATE('2011-11-19 00:00:00', 'YYYY-MM-DD HH:MI:SS')); 1 row inserted. xdbiSQL> COMMIT; Commit success. xdbiSQL> SELECT eno, e_lastname, e_firstname, salary FROM employees; ENO E_LASTNAME E_FIRSTNAME SALARY ----------------------------------------------------------- -------------- 1 Moon Chan-seung 2 Davenport Susan 1500 4 Foster Aaron 1800 5 Ghorbani Farhad 2500 데이터 제어어 217 6 Momoi Ryu 1700 7 Fleischer Gottlieb 500 8 Wang Xiong 9 Diaz Curtis 1200 10 Bae Elizabeth 4000 11 Liu Zhen 2750 12 Hammond Sandra 1890 13 Jones Mitch 980 14 Miura Yuu 2003 15 Davenport Jason 1000 16 Chen Wei-Wei 2300 17 Fubuki Takahiro 1400 18 Huxley John 1900 20 Blake William 3 Kobain Ken 2300 22 Chow May 0 20 rows selected. xdbiSQL> COMMIT; Commit success. 218 SQL Reference SET TRANSACTION 구문 set_transaction ::= ; READONLY READWRITE ISOLATIONLEVEL READCOMMITTED REPEATABLEREAD SERIALIZABLE TRANSACTIONSET 설명 현재 트랜잭션을 read only, read/write 또는 고립화 수준(isolation level)을 설정하기 위해 SET TRANSACTION 구문을 사용할 수 있다. 고립화 수준을 READ COMMITTED 또는 SERIALIZABLE 로 설정하면 행 수준 잠금과 다중버전 제어기법의 조합을 통하여 높은 수준의 데이터 일관성, 동시성 그리고 성능을 제공한다. SET TRANSACTION 구문에 의해 수행된 동작들은 다른 사용자들이나 다른 트랜잭션이 아닌 오로지 현재 트랜잭션에만 영향을 미친다. 다음과 같은 3개의 고립화 수준 중 하나를 설정할 수 있다. READ COMMITTED 테이블 내의 커밋된 데이터에 대해 읽기를 허용하며, 커밋되지 않은 데이터에 대해서는 이전 버전의 값을 읽도록 동작한다. 알티베이스의 기본 고립화 수준은 READ COMMITTED이다. REPEATABLE READ 트랜잭션이 읽어간 데이터에 대해 그 트랜잭션이 완료될 때까지 데이터 제어어 219 잠금을 걸어서, 해당 데이터에 대한 다른 트랜잭션의 변경을 금지한다. 이러한 동작은 반복적으로 그 값을 다시 읽었을 때도 항상 같은 값이 반환될 것을 보장한다. 그러나 잠금이 걸려 있는 상태에서도 읽어간 검색 범위안에 포함되는 새로운 레코드를 다른 트랜잭션이 삽입하는 것은 가능하다. 이러한 레코드는 잠금을 걸고 있는 읽기 트랜잭션에 의한 최초 조회시에는 보이지 않았지만 삽입 이후에는 보일 것이다. 이를 “Phantom Reads”라고 한다. SERIALIZABLE 이는 가장 높은 고립화 수준이다. 이는 한번 SELECT하여 가져간 모든 데이터에 공유잠금을 걸뿐만 아니라, 그 검색 범위안에 있는 모든 키 값에 대해서도 잠금을 걸게 된다. 이는 “phantom reads”를 방지하는 효과를 내어 트랜잭션의 독립성(isolation)을 보장한다. 주의 사항 현재 세션이 AUTOCOMMIT 모드일 경우에는 이 구문을 사용할 수 없다. 활성화된 트랜잭션이 있을 경우에는 이 구문을 사용할 수 없다. 예제 xdbiSQL> AUTOCOMMIT OFF; Set autocommit off success. xdbiSQL> SET TRANSACTION ISOLATION LEVEL READ COMMITTED; Command execute success. xdbiSQL> SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; Command execute success. Transaction A Time Point Transaction B xdbiSQL> AUTOCOMMIT OFF; Set autocommit off success. xdbiSQL> AUTOCOMMIT OFF; Set autocommit off success. xdbiSQL> SET TRANSACTION READ ONLY; Command execute success. 1 220 SQL Reference xdbiSQL> SELECT e_last name FROM employees WHERE eno = 20; E_LASTNAME ------------------------ Blake 1 row selected. 2 3 xdbiSQL> UPDATE employees SET e_lastname = 'Jung' WHERE eno = 20; 1 row updated. xdbiSQL> SELECT e_lastname FROM employees WHERE eno = 20; E_LASTNAME ------------------------ Blake 1 row selected. 4 5 xdbiSQL> commit; Commit success. xdbiSQL> SELECT e_lastname FROM employees WHERE eno = 20; E_LASTNAME ------------------------ Jung 1 row selected. 6 집합 연산자 221 5. 집합 연산자 이 장에서는 SQL 질의 실행 결과 집합을 대상으로 연산하는 집합 연산자들에 대해서 설명한다. 222 SQL Reference UNION 구문 SELECT statement1 UNION SELECT statement2 설명 두 질의문의 결과를 모두 반환하는 연산자이다. 단, 양쪽 질의의 결과에 동일한 값이 있을 경우 한건만 반환된다. 예제 <질의> 생일이 1980년 이후인 사원과 100개 미만의 주문량을 받은 사원의 사원번호를 출력하라. 중복된 사원번호는 한번만 출력되게 하라. xdbiSQL> SELECT eno FROM employees WHERE birth > '800101' UNION SELECT eno FROM orders WHERE qty < 100; ENO -------------- 4 7 8 12 13 15 20 7 rows selected. 집합 연산자 223 UNION ALL 구문 SELECT statement1 UNION ALL SELECT statement2 설명 두 질의문의 결과를 모두 반환하는 연산자이다. 양쪽 질의의 결과에 동일한 값이 있을 경우에 중복된 값이 모두 반환된다. 예제 <질의> 생일이 1980년 이후인 사원과 100개 미만의 주문량을 받은 사원의 사원번호를 출력하라. 중복된 사원번호도 모두 출력되게 하라. xdbiSQL> SELECT eno FROM employees WHERE birth > '800101' UNION ALL SELECT eno FROM orders WHERE qty < 100; ENO -------------- 4 7 8 12 13 15 12 20 20 9 rows selected. 224 SQL Reference INTERSECT 구문 SELECT statement1 INTERSECT SELECT statement2 설명 두 질의문의 결과 중 공통된 행을 반환하는 연산자이다. 예제 <질의> 한번이라도 주문된 적이 있는 상품을 모두 출력하라. xdbiSQL> SELECT gno FROM goods INTERSECT SELECT gno FROM orders; GNO -------------- . . . 집합 연산자 225 MINUS 구문 SELECT statement1 MINUS SELECT statement2 설명 첫번째 검색 결과에서 두 번째 검색 결과를 제외한 결과를 반환하는 연산자이다. 예제 <질의> 한번도 주문된 적이 없는 상품들의 제품번호를 출력하라. xdbiSQL> SELECT gno FROM goods MINUS SELECT gno FROM orders; GNO -------------- . . . 226 SQL Reference 연산 순서 연산의 순서 즉, 연산자 우선 순위는 데이터베이스 서버가 수식 내의 연산자들을 처리하는 순서이다. 다수의 연산자를 포함하는 수식이 처리될 때, 높은 우선순위의 연산자가 낮은 우선순위의 연산자보다 먼저 처리된다. 같은 우선순위를 갖는 연산자는 수식 내에서 나열된 순서 즉, 왼쪽에서 오른쪽으로 처리된다. 설명 SQL 연산자의 연산 우선순위를 내림차순으로 다음 표에 보여주고 있다. 수식 내에 괄호를 사용하여 우선순위 규칙보다 우선 적용되게 할수 있다. 우선순위 레벨 연산자 1 모든 비교 연산자 2 NOT 3 AND 4 OR 예제 <질의> 월급이 1850 달러를 넘는 엔지니어의 이름, 직위, 급여와 급여에 상관없이 모든 영업 사원의 이름, 직위, 급여를 출력하라. xdbiSQL> SELECT e_firstname, e_lastname, emp_job, salary FROM employees WHERE emp_job = 'sales rep' OR emp_job = 'engineer' AND salary >= 1850; E_FIRSTNAME E_LASTNAME EMP_JOB SALARY ----------------------------------------------------------- ------------------- Ken Kobain engineer 2000 Sandra Hammond sales rep 1890 Alvar Marquez sales rep 1800 William Blake sales rep 4 rows selected. <질의> 월급이 1850 달러를 넘는 엔지니어의 이름, 직위, 급여와 월급이 1850 달러를 넘는 영업 사원의 이름, 직위, 급여를 출력하라. xdbiSQL> SELECT e_firstname, e_lastname, emp_job, salary FROM employees WHERE (emp_job = 'sales rep' OR emp_job = 'engineer') AND salary >= 1850; 집합 연산자 227 E_FIRSTNAME E_LASTNAME EMP_JOB SALARY ----------------------------------------------------------- ------------------- Ken Kobain engineer 2000 Sandra Hammond sales rep 1890 2 rows selected. SQL 함수 229 6. SQL 함수 230 SQL Reference SQL 함수 소개 알티베이스에 내장되어 제공되는 SQL 함수들은 다양한 SQL 구문 내에서 사용할 수 있다. 내장된 SQL 함수 외에 사용자가 저장 함수를 정의하는 것도 가능하다. 이에 대해서는 Stored Procedures Manual을 참고하기 바란다. SQL 함수 호출 시 정의된 데이터 타입이 아닌 다른 데이터 타입의 인자를 입력할 경우, 알티베이스는 SQL 함수 수행 전에 인자로 넘어온 데이터를 SQL함수에 정의된 데이터 타입으로 변환한다. SQL 함수 호출 시 NULL 인자를 넘기면, SQL 함수는 NULL을 반환한다. 이 절은 알티베이스 HDB가 제공하는 SQL 함수의 목록을 보여주고, 그들이 어떻게 분류되는지를 설명한다. SQL 함수 분류 SQL 함수는 크게 다음의 표처럼 분류된다. 함수 구분 설명 집계 함수 (aggregate functions) 질의의 결과를 그룹별로 하나의 결과를 반환하는 함수이다. 이 함수는 select_list, ORDER BY, HAVING 절에 올 수 있다. 집계 함수에는 AVG, COUNT, MAX, MIN, STDDEV, SUM, VARIANGE가 있다. 분석 함수 (analytic functions) 알티베이스 HDB는 두 종류의 분석 함수, 즉 분석 집계 함수와 분석 랭킹 함수를 제공한다. 위에 나열한 모든 집계 함수는 분석 함수 용도로 사용이 가능하다. 이들은 분석 집계 함수 또는 분석 랭킹 함수의 형태로 올 수 있다. 또한 알티베이스 HDB는 RANK, DENSE_RANK, ROW_NUMBER 분석 함수도 제공한다. 이들은 분석 랭킹 함수의 형태로만 올 수 있다. 숫자 함수 숫자 입력 값에 대한 작업을 수행하고 숫자 값을 반환한다.. ABS, ACOS, ASIN, ATAN, ATAN2, CEIL, COS, COSH, EXP, FLOOR, LN, LOG, MOD, POWER, RANDOM, ROUND, SIGN, SIN, SINH, SQRT, TAN, TANH, TRUNC, BITAND, BITOR, BITXOR, BITNOT 문자 함수 문자열 입력 값에 대한 작업을 수행하고 문자열이나 숫자 값을 반환한다. SQL 함수 231 문자열 반환 함수 CHR, CONCAT, DIGITS, INITCAP, LOWER, LPAD, LTRIM, NCHR, REPLICATE, REPLACE2, REVERSE_STR, RPAD, RTRIM, STUFF, SUBSTRB(SUBSTRING), TRANSLATE, TRIM, UPPER 숫자 값 반환 함수 ASCII, CHAR_LENGTH(CHARACTER_LENGTH,LENGTH), DIGEST,INSTR(POSITION, INSTRB), OCTET_LENGTH(LENGTHB), SIZEOF 날짜 함수 날짜 및 시간 입력 값에 대한 작업을 수행하며 문자열, 숫자 또는 날짜/시간 값을 반환한다. ADD_MONTHS, DATEADD, DATEDIFF, DATENAME, EXTRACT(DATEPART), LAST_DAY, MONTHS_BETWEEN, NEXT_DAY, SYSDATE, SYSTIMESTAMP 변환 함수 입력 값(문자, 숫자 또는 날짜/시간)에 대해 문자, 날짜/시간, 또는 숫자 값으로 변환한다. ASCIISTR, BIN_TO_NUM, CONVERT, HEX_TO_NUM, OCT_TO_NUM, TO_BIN, TO_CHAR(datetime), TO_CHAR(number), TO_DATE, TO_HEX, TO_NCHAR(character), TO_NCHAR(datetime), TO_NCHAR(number), TO_NUMBER, TO_OCT, UNISTR 암호화 함수 문자열에 대해 DES 암호화와 복호화를 수행한다. DESENCRYPT, DESDECRYPT 기타 함수 BINARY_LENGTH, CASE2, DECODE, DUMP, GREATEST, LEAST, NVL, NVL2 등 232 SQL Reference 집계 함수 여러 행에 대해 처리하여 단일 값을 반환하는 함수이다. 집계 함수는 SELECT 목록이나 ORDER BY 또는 HAVING 절 안에 나타날 수 있다. SELECT 문에 GROUP BY 절이 포함되었다면 상수, 집계 함수(aggregate functions), GROUP BY 절에 명시된 표현식과 이들을 조합한 표현식만 SELECT 목록에 올 수 있다. AVG 구문 AVG ( [ALL | DISTINCT] expression) 설명 입력된 expression의 평균값을 구하는 함수이다. NULL은 계산에서 제외된다. 이 함수는 FLOAT 타입의 값을 반환한다. 예제 <질의> 상품 테이블에서 평균 가격을 계산하여 출력하라. xdbiSQL> SELECT AVG(price) FROM goods; AVG(PRICE) -------------- 30406.173 1 row selected. COUNT 구문 COUNT ( [ * | [ALL | DISTINCT] expression ] ) 설명 질의에 의해 검색되는 행의 수를 반환하는 함수이다. 칼럼의 값이 널인 행은 계산 되지 않는다. 예제 SQL 함수 233 <질의> 사원 테이블의 전체 레코드의 개수를 출력하라. xdbiSQL> SELECT COUNT(*) Rec_count FROM employees; REC_COUNT ----------------------- 20 1 row selected. <질의> 사원 테이블 생일 자료의 개수를 출력하라. xdbiSQL> SELECT COUNT(birth) Rec_count FROM employees; REC_COUNT ----------------------- 13 1 row selected. MAX 구문 MAX ([ALL | DISTINCT] expression) 설명 입력된 expression중에서 최대값을 구하는 함수이다. 예제 <질의> 상품 테이블에서 가장 비싼 가격을 출력하라. xdbiSQL> SELECT MAX(price) FROM goods; MAX(PRICE) -------------- 100000 1 row selected. MIN 구문 MIN ([ALL | DISTINCT] expression) 설명 입력된 expression중에서 최소값을 구하는 함수이다. 예제 <질의> 상품 테이블의 가장 싼 가격을 출력하라. xdbiSQL> SELECT MIN(price) FROM goods; 234 SQL Reference MIN(PRICE) -------------- 966.99 1 row selected. STDDEV 구문 STDDEV ([ALL | DISTINCT] expression) 설명 STDDEV는 입력된 expression 들의 표준편차를 반환한다. 시스템 호출에 의한 반복적인 실수 연산의 오차 누적에 따라 반환 값의 오차가 발생할 수 있다. 예제 <질의> 직원 테이블에서 급여의 표준편차를 구하라. xdbiSQL> SELECT STDDEV(salary) standard_deviation FROM employees; STANDARD_DEVIATION ------------------------- 797.706786762566 1 row selected. SUM 구문 SUM ([ALL | DISTINCT] expression) 설명 입력된 expression의 합을 구하는 함수이다. 예제 <질의> 상품 테이블에서 모든 보관 수량의 합을 구하라. xdbiSQL> SELECT SUM(stock) FROM goods; SUM(STOCK) ----------------------- 379420 1 row selected. SQL 함수 235 VARIANCE 구문 VARIANCE ([ALL | DISTINCT] expression) 설명 VARIANCE는 입력된 expression들의 변동량을 반환한다. 시스템 호출에 의한 반복적인 실수 연산의 오차 누적에 따라 반환 값의 오차가 발생할 수 있다. 예제 <질의> 직원 테이블에서 급여의 변동량을 구하라. xdbiSQL> SELECT VARIANCE(salary) variance FROM employees; VARIANCE ------------------------- 636336.117647059 236 SQL Reference 분석 함수 분석 함수는 OVER 절을 가진다는 점에서 집계 함수 (aggregate functions)와 다르다. OVER절은 PARTITION BY 식을 포함할 수도, 하지 않을 수도 있다. 분석 함수는 OVER 절이 ORDER BY 식 (주질의에 포함된 ORDER BY절과 구분하기 위해 식이라 칭함)을 포함하는지 여부에 따라 분석 집계 함수와 랭킹 함수로 분류된다. 현재, 알티베이스 XDB는 분석 집계 함수 형태의 분석 함수만 제공한다. 모든 집계 함수 (AVG, COUNT, MAX, MIN, STDDEV, SUM 및VARIANCE)는 분석 함수로 사용될 수 있다. 분석 함수는 SELECT 목록 또는 ORDER BY 절에만 올 수 있다. 분석 함수가 포함된 질의가 처리되는 단계는 다음과 같다. 1단계: 분석 함수와 ORDER BY 절 (만약 존재하면)을 제외한 질의 처리 2단계: 분석 함수에 PARTITION BY 식이 포함된 경우, 1단계의 질의 결과를 분석 함수가 적용될 파티션으로 분리 3단계: 분석 함수 계산 수행 4단계: ORDER BY 절이 있는 경우 처리 분석 집계 함수 형태 분석 함수의 OVER절이 ORDER BY식을 포함하지 않을 때, 집계 함수는 분석 집계 함수로 여겨진다. 집계 함수 (AVG, MAX, MIN 등)가 분석 집계 함수 형태로 사용될 때, 결과 값은 모든 행에 대해 각각 반환된다. 이것이 집계 함수의 일반적인 사용 형태와 다른 점으로, 집계 함수의 경우에는 결과 값이 한 번만 반환된다. 구문 analytic_aggregate_function ::= SQL 함수 237 analytic_aggregate_function() arg_expr OVER(); partition_by_expr partition_by_expr::= PARTITIONBYexpr , 설명 analytic_aggregate_funciton 분석 집계 함수로 사용할 집계 함수의 이름을 명시한다. 위에서 설명한 바와 같이, 알티베이스는 모든 집계 함수에 대해서 분석 집계 함수로 사용되는 것을 지원한다. arg_expr 분석 함수를 위한 인자로 사용될 수식을 명시한다. OVER 이 함수가 분석 집계 함수임을 질의 처리기가 인식하도록 하는 키워드이다. partition_by_expr PARTITION BY 식은 그룹을 묶을 칼럼 명을 명시하는 절이다. 즉, 분석 함수의 계산 대상 그룹을 지정한다. 예제 <질의> 자신이 속한 부서의 최고 급여에 대한 자신의 급여 비율을 모든 사원에 대해 구하라. iSQL(sysdba)> SELECT e_lastname, dno, salary, ROUND(salary/MAX(salary) OVER (PARTITION BY dno)*100) rel_sal FROM employees; E_LASTNAME DNO SALARY REL_SAL ----------------------------------------------------------- ---- Kobain 1001 2000 87 Chen 1001 2300 100 . 238 SQL Reference . . Diaz 4001 1200 63 Fleischer 4002 500 26 Marquez 4002 1800 95 Blake 4002 Hammond 4002 1890 100 Davenport 1500 100 20 rows selected. SQL 함수 239 숫자 함수 이 함수는 매개 변수로 숫자 값을 입력 받아 계산 작업을 수행하고 숫자 값을 반환한다. ABS 구문 ABS (number) 설명 입력된 숫자의 절대값을 반환하는 함수이다. 예제 <질의> 세 숫자의 절대 값을 출력하라. xdbiSQL> SELECT ABS(-1), ABS(0.0), ABS(1) FROM dual; ABS(-1) ABS(0.0) ABS(1) ---------------------------------------- 1 0 1 1 row selected. <질의> 상품 테이블에서 가장 비싼 품목의 가격과 가장 싼 품목의 가격 차이를 구하라. xdbiSQL> SELECT ABS(MIN(price) - MAX(price)) absolute_value FROM goods; ABSOLUTE_VALUE ----------------- 99033.01 1 row selected. ACOS 구문 ACOS (number) 설명 아크코사인, 즉 역코사인을 반환하는 함수이다. 아크코사인은 코사인 값이 number인 각도이다. number는 -1에서 1 까지의 값이어야 한다. 입력 값이 이 범위에 속하지 않으면 0.000000을 반환한다. 이 240 SQL Reference 함수는 0에서 π(pi)사이의 DOUBLE타입 숫자 값을 라디안 단위로 반환한다. 1 라디안(radian) = 180º/pi 예제 <질의> xdbiSQL> SELECT ACOS(.3) Arc_Cosine FROM dual; ARC_COSINE -------------- 1.2661036727795 1 row selected. ASIN 구문 ASIN (number) 설명 아크사인, 즉 역사인을 반환하는 함수이다. 아크사인은 사인 값이 number인 각도이다. number는 -1에서 1 까지의 값이어야 한다. 입력 값이 이 범위에 속하지 않으면 0.000000을 반환한다. 이 함수는 -π/2에서 π/2사이의 DOUBLE타입 숫자 값을 라디안 단위로 반환한다. 예제 <질의> xdbiSQL> SELECT ASIN(.3) Arc_Sine FROM dual; ARC_SINE -------------- 0.304692654015398 1 row selected. ATAN 구문 ATAN (number) 설명 SQL 함수 241 아크탄젠트, 즉 역탄젠트를 반환하는 함수이다. 아크탄젠트는 탄젠트 값이 number인 각도이다. 이 함수는 -π/2에서 π/2사이의 DOUBLE타입 숫자 값을 라디안 단위로 반환한다. 예제 <질의> xdbiSQL> SELECT ATAN(.3) Arc_Tangent FROM dual; ARC_TANGENT -------------- 0.291456794477867 1 row selected. ATAN2 구문 ATAN2 (n, m) 설명 이 함수는 실수 타입의 두 입력 인자를 가지며, n / m의 아크탄젠트 값을 반환한다. 이 함수는 -π(exclusive)에서 π(inclusive)사이의 DOUBLE타입 숫자 값을 라디안 단위로 반환한다. 예제 <질의> xdbiSQL> SELECT ATAN2(.3, .2) Arc_Tangent2 FROM dual; ARC_TANGENT2 --------------- 0.982793723247329 1 row selected. CEIL 구문 CEIL (number) 설명 입력된 값 이상의 가장 작은 정수를 반환하는 함수이다. 예제 242 SQL Reference <질의> 각 입력 값에 대해 입력 값 이상의 가장 작은 정수를 구하라. xdbiSQL> SELECT CEIL(99.9), CEIL(-99.9) FROM dual; CEIL(99.9) CEIL(-99.9) --------------------------- 100 -99 1 row selected. <질의> 상품 테이블에서 가장 비싼 품목의 가격과 가장 싼 품목의 가격 차이를 구해 그 값 이상의 가장 작은 정수를 구하라. xdbiSQL> SELECT CEIL(ABS (MIN(price) - MAX(price))) Smallest_int FROM goods; SMALLEST_INT --------------- 99034 1 row selected. COS 구문 COS (number) 설명 라디안 단위의 부동 소수점 숫자 입력 값의 코사인 값을 라디안 단위로 반환하는 함수이다. 반환 데이터 타입은 DOUBLE이다. 예제 <질의> xdbiSQL> SELECT COS(180 * 3.14159265359/180) Cos_of_180_degrees FROM dual; COS_OF_180_DEGREES --------------------- -1 1 row selected. COSH 구문 COSH (number) 설명 입력 값의 쌍곡선 코사인(hyperbolic 코사인) 값을 반환하는 함수이다. 반환 데이터 타입은 DOUBLE이다. SQL 함수 243 COSH(n) = ( e n + e -n )/2 예제 <질의> xdbiSQL> SELECT COSH(0) FROM dual; COSH(0) -------------- 1 1 row selected. EXP 구문 EXP (n) 설명 이 함수는 e의 n제곱을 반환한다. (e = 2.71828183…) 반환 데이터 타입은 DOUBLE이다. 예제 <질의> xdbiSQL> SELECT EXP(2.4) FROM dual; EXP(2.4) -------------- 11.0231763806416 1 row selected. FLOOR 구문 FLOOR (number) 설명 입력된 값 이하의 가장 큰 정수를 반환하는 함수이다. 예제 <질의> 각 입력 값에 대해 입력 값 이하의 가장 큰 정수를 구하라. xdbiSQL> SELECT FLOOR(99.9), FLOOR(-99.9) FROM dual; FLOOR(99.9) FLOOR(-99.9) 244 SQL Reference ---------------------------- 99 -100 1 row selected. <질의> 상품 테이블에서 가장 비싼 품목의 가격과 가장 싼 품목의 가격 차이를 구해 그 값 이하의 가장 큰 정수를 구하라. xdbiSQL> SELECT FLOOR(ABS(MIN(price) - MAX(price))) Largest_int FROM goods; LARGEST_INT -------------- 99033 1 row selected. LN 구문 LN (n) 설명 LN 함수는 n의 자연로그를 반환한다. 입력 값은 0 보다 커야 된다. 예제 <질의> xdbiSQL> SELECT LN(2.4) FROM dual; LN(2.4) -------------- 0.8754687373539 1 row selected. LOG 구문 LOG (m, n) 설명 LOG 함수는 밑이 m인 n의 로그를 반환한다. 밑 m은 0과 1이 아닌 양수이어야 하고, n은 양수이어야 한다. 예제 <질의> xdbiSQL> SELECT LOG(10, 100) FROM dual; LOG(10, 100) SQL 함수 245 --------------- 2 1 row selected. MOD 구문 MOD (m, n) 설명 m을 n 으로 나눈 나머지를 반환하는 함수이다. 예제 <질의> 10을 3으로 나눈 나머지를 구하라. xdbiSQL> SELECT MOD(10, 3) FROM dual; MOD(10, 3) -------------- 1 1 row selected. <질의> 모든 사람의 급여의 합을 가장 적은 사람의 급여로 나눈 나머지를 구하라. xdbiSQL> SELECT MOD(SUM(salary), MIN(salary)) Remainder FROM employees; REMAINDER -------------- 223000 1 row selected. POWER 구문 POWER (m, n) 설명 POWER 함수는 m의 n 제곱을 반환한다. m과 n은 임의의 숫자일 수 있고, m이 음수이면 n은 정수이어야 한다. 예제 <질의> xdbiSQL> SELECT POWER(3, 2) FROM dual; POWER(3, 2) -------------- 246 SQL Reference 9 1 row selected. RANDOM 구문 RANDOM (number) 설명 이 함수는 의사 랜덤 정수형 값(pseudo random integer value)을 반환한다. 반환 값의 범위는 0 부터 INTEGER 형의 최대값, 즉 2,147,483,647이다. number가 0이 아니면 이 값을 random seed 값으로 사용해서 구한 의사 랜덤 정수를 반환한다. 0이 아닌 같은 seed 값을 사용해서 반복적으로 RANDOM 함수를 호출하면, 같은 값이 반환될 것이다. 예제 <질의> xdbiSQL> SELECT RANDOM(0) FROM dual; RANDOM(0) -------------- 16838 1 row selected. <질의> xdbiSQL> SELECT RANDOM(100) FROM dual; RANDOM(100) -------------- 12662 1 row selected. ROUND 구문 ROUND ( n1 [ , n2 ] ) 설명 반올림 함수이다. n1를 소수점 아래 n2 + 1 번째 자리에서 반올림하여 n2번째 자리까지 반환한다. n2를 생략하면 소수점 아래 SQL 함수 247 첫번째 자리에서 반올림하여 정수값을 반환한다. n2가 음수일 경우 소수점 앞 n2번째 자리에서 반올림한 값을 반환한다. 예제 <질의> 다음 ROUND 함수로 표현한 두 개의 식의 결과를 출력하라: ROUND(123.9994, 3), ROUND(123.9995, 3) xdbiSQL> SELECT ROUND(123.9994, 3), ROUND(123.9995, 3) FROM dual; ROUND(123.9994, 3) ROUND(123.9995, 3) ----------------------------------------- 123.999 124 1 row selected. <질의> 가장 싼 상품의 값을 정수값으로 반올림해서 출력하라. xdbiSQL> SELECT ROUND( MIN(price) ) FROM goods; ROUND( MIN(PRICE) ) ---------------------- 967 1 row selected. 예제 결과 ROUND(748.58, -1) 750 ROUND(748.58, -2) 700 ROUND(748.58, -3) 1000 ROUND는 항상 값을 반환한다. n2가 음수이고 이 값이 소수점 앞의 자릿수보다 클 경우 이 함수는 0을 반환한다. 예제 결과 ROUND(748.58, -4) 0 SIGN 구문 SIGN (number) 설명 number의 부호를 반환하는 함수이다. 입력 값이 양수이면 1, 입력 값이 음수이면 -1, 입력 값이 0이면 0을 돌려준다. 예제 248 SQL Reference <질의> xdbiSQL> SELECT SIGN(15), SIGN(0), SIGN(-15) FROM dual; SIGN(15) SIGN(0) SIGN(-15) ---------------------------------------- 1 0 -1 1 row selected. <질의> 급여가 1000달러보다 많으면 1, 적으면 -1, 1000달러이면 0을 출력하라. xdbiSQL> SELECT e_firstname, e_lastname, SIGN(salary-1000) As Wage_class 2 FROM employees; E_FIRSTNAME E_LASTNAME WAGE_CLASS ----------------------------------------------------------- - Chan-seung Moon Susan Davenport 1 Ken Kobain 1 . . . 20 rows selected. SIN 구문 SIN (n) 설명 입력한 n (라디안 단위)의 사인 값을 구하는 삼각 함수이다. 반환 데이터 타입은 DOUBLE이다. 예제 <질의> xdbiSQL> SELECT SIN (30 * 3.14159265359/180) Sine_of_30_degrees FROM dual; SINE_OF_30_DEGREES --------------------- 0.5 1 row selected. SINH 구문 SINH (n) SQL 함수 249 설명 입력한 n의 hyperbolic 사인을 반환하는 함수이다. SINH(n) = ( e n - e -n )/2 예제 <질의> xdbiSQL> SELECT SINH(1) Hyperbolic_sine_of_1 FROM dual; HYPERBOLIC_SINE_OF_1 ----------------------- 1.175201 1 row selected. SQRT 구문 SQRT (n) 설명 SQRT 함수는 n의 제곱근을 반환한다. n은 음수가 아니어야 한다. 예제 <질의> 10의 제곱근을 구하라. xdbiSQL> SELECT SQRT(10) FROM dual; SQRT(10) -------------- 3.162278 1 row selected. TAN 구문 TAN (n) 설명 입력한 n의 탄젠트를 반환하는 삼각 함수이다. 입력 인수는 라디안 단위이며 반환 값은 DOUBLE 타입이다. 250 SQL Reference 예제 <질의> 135도 각도의 탄젠트를 구하라. xdbiSQL> SELECT TAN (135 * 3.14159265359/180) Tangent_of_135_degrees FROM dual; TANGENT_OF_135_DEGREES ------------------------- -1 1 row selected. TANH 구문 TANH (n) 설명 입력한 n의 hyperbolic 탄젠트를 반환하는 함수이다. 예제 <질의> xdbiSQL> SELECT TANH(.5) Hyperbolic_tangent_of_ FROM dual; HYPERBOLIC_TANGENT_OF_ ------------------------- 0.462117 1 row selected. TRUNC(number) 구문 TRUNC ( n1 [ , n2 ] ) 설명 n1을 소수점아래 n2 번째 자리에서 버림한여 FLOAT 타입 값을 반환한다. n2이 생략될 경우 0으로 취급하여 소수점 아래 자리를 모두 버린 정수를 반환한다. n2가 음수일 경우 소수점 앞 n2번째 자리를 버린다. 예제 SQL 함수 251 <질의> 다음의 각 수식에 대해 TRUNC 함수의 결과를 구하라. xdbiSQL> SELECT TRUNC(15.79, 1), TRUNC(15.79, -1) FROM dual; TRUNC(15.79, 1) TRUNC(15.79, -1) ------------------------------------ 15.7 10 1 row selected. <질의> 가장 싼 상품의 정수값을 출력하라. xdbiSQL> SELECT TRUNC(MIN(price)) FROM goods; TRUNC(MIN(PRICE)) -------------------- 966 1 row selected. BITAND 구문 BITAND (bit_a, bit_b) 설명 bit_a와 bit_a의 비트에 대한 AND 연산 결과를 반환하는 함수이다. 예제 xdbiSQL> SELECT TO_CHAR( BITAND( BIT'01010101', BIT'10101010' ) ) FROM DUAL; TO_CHAR( BITAND( BIT'01010101', BIT'1010 -------------------------------------------- 00000000 1 row selected. BITOR 구문 BITOR (bit_a, bit_b) 설명 bit_a와 bit_b의 비트에 대한 OR 연산 결과를 반환하는 함수이다. 예제 xdbiSQL> SELECT TO_CHAR( BITOR( BIT'01010101', BIT'10101010' ) ) FROM DUAL; TO_CHAR( BITOR( BIT'01010101', BIT'10101 -------------------------------------------- 11111111 252 SQL Reference BITXOR 구문 BITXOR (bit_a, bit_b) 설명 bit_a와 bit_b의 비트에 대한 XOR(exlusive OR) 연산 결과를 반환하는 함수이다. 예제 xdbiSQL> SELECT TO_CHAR( BITXOR( BIT'01010101', BIT'10101010' ) ) FROM DUAL; TO_CHAR( BITXOR( BIT'01010101', BIT'1010 -------------------------------------------- 11111111 1 row selected. BITNOT 구문 BITNOT (bit_a) 설명 bit_a의 비트에 대한 NOT 연산 결과를 반환하는 함수이다. 예제 xdbiSQL> SELECT TO_CHAR( BITNOT( BIT'01010101' ) ) FROM DUAL; TO_CHAR( BITNOT( BIT'01010101' ) ) -------------------------------------- 10101010 1 row selected. SQL 함수 253 문자 함수 문자 함수는 문자 또는 문자열을 입력 받아서 문자나 숫자 값을 반환한다. 이들은 반환하는 데이터 타입에 따라서 크게 두 가지 종류로 분류될 수 있다. 문자 값을 반환하는 문자 함수 CHR, CONCAT, DIGITS, INITCAP, LOWER, LPAD, LTRIM, NCHR, REPLICATE, REPLACE2, REVERSE_STR, RPAD, RTRIM, STUFF, SUBSTRB(SUBSTRING), TRANSLATE, TRIM, UPPER 숫자 값을 반환하는 문자 함수 ASCII, INSTR(POSITION), CHAR_LENGTH(CHARACTER_LENGTH, LENGTH), INSTRB, OCTET_LENGTH(LENGTHB), SIZEOF ASCII 구문 ASCII (expr) 설명 문자 식 expr에서 가장 첫 (즉, 왼쪽) 문자의 ASCII 코드 값을 반환한다. 예제 <질의> 문자 'A'의 ASCII 코드를 출력하라. xdbiSQL> SELECT ASCII('A') FROM dual; ASCII('A') -------------- 65 1 row selected. CHAR_LENGTH, CHARACTER_LENGTH, LENGTH 구문 CHAR_LENGTH (expr) CHARACTER_LENGTH (expr) 254 SQL Reference LENGTH (expr) 설명 입력 문자열의 길이를 돌려준다. 예제 <질의> 관리자 테이블에서 주소의 길이를 출력하라. 단, 데이터베이스 캐릭터 셋이 KO16KSC5601 이다. CREATE TABLE managers( mgr_no INTEGER PRIMARY KEY, m_lastname VARCHAR(20), m_firstname VARCHAR(20), address VARCHAR(60)); INSERT INTO managers VALUES(1, 'Jones', 'Davey', '3101 N. Wabash Ave. Brooklyn, NY'); INSERT INTO managers VALUES(15, 'Min', 'Sujin', ' 서울 마포구 아현 1'); xdbiSQL> SELECT CHAR_LENGTH(address) FROM managers; CHAR_LENGTH (ADDRESS) ------------------------ 32 11 2 rows selected. CHR 구문 CHR (n) 설명 입력 ASCII 코드값을 해당하는 문자로 변환하는 함수이다. 예제 <질의> ‘ALTIBASE’를 ASCII 코드값을 이용해서 출력하기 xdbiSQL> SELECT CHR(65) || CHR(76) || CHR(84) || CHR(73) || CHR(66) || CHR(65) || CHR(83) || CHR(69) mmdbms FROM dual; MMDBMS ------------------------------------ ALTIBASE 1 row selected. <질의> SELECT 질의 결과를 적절한 포맷으로 출력하기 위해 ASCII 코드 값 10을 갖는 줄 바꿈 문자를 이용해라. SQL 함수 255 xdbiSQL> SELECT RTRIM(c_firstname) || ' ' || c_lastname || CHR(10) || sex || ' ' || cus_job || CHR(10) || address cus_info FROM customers WHERE cno = 10; CUS_INFO ------------------------------------------------ Anh Dung Nguyen M 8A Ton Duc Thang Street District 1 HCMC Vietnam 1 row selected. * 참고: 제어 문자 ASCII 코드 값 탭 9 줄 바꿈 10 캐리지 리턴 13 CONCAT 구문 CONCAT (expr1, expr2) 설명 expr1과 expr2를 연결한 문자열을 반환한다. 이 함수는 연결 연산자 (||)와 동일하다. 예제 xdbiSQL> SELECT CONCAT(CONCAT(CONCAT(CONCAT(CONCAT(RTRIM(e_firstname), ' '), RTRIM(e_lastname)), ' is a ' ), emp_job ), '.') Job FROM employees WHERE eno = 10; JOB ----------------------------------------------------------- -------- Elizabeth Bae is a programmer. 1 row selected. DIGITS 구문 DIGITS (n) 설명 256 SQL Reference 입력 정수를 문자열로 반환한다. n의 데이터 형에 따라서 다른 길이의 문자열이 반환된다. SMALLINT 일 경우 5자리, INTEGER일 경우 10자리, BIGINT일 경우 19 자리의 문자열이 반환된다. 입력 수의 자리 수가 문자열의 자리수보다 작을 경우 앞 부분이 0으로 채워진다. 예제 <질의> 다른 숫자 데이터 형의 세 입력 숫자를 문자열로 출력하라. CREATE TABLE T1 (I1 SMALLINT, I2 INTEGER, I3 BIGINT); NSERT INTO T1 VALUES (357, 12, 5000); xdbiSQL> SELECT DIGITS(I1), DIGITS(I2), DIGITS(I3) FROM T1; DIGITS(I1) DIGITS(I2) DIGITS(I3) ------------------------------------------------ 00357 0000000012 0000000000000005000 1 row selected. INITCAP 구문 INITCAP (expr) 설명 이 함수는 입력 문자열의 각 단어의 첫 번째 문자를 대문자로 변환해서 그 결과를 반환한다. 단어는 공백, 또는 문자나 숫자가 아닌 문자로 구분된다. 예제 <질의> 'the soap' 문자열의 각 단어의 첫 문자를 대문자로 출력하라. xdbiSQL> SELECT INITCAP ('the soap') Capital FROM dual; CAPITAL ------------ The soap 1 row selected. INSTR, INSTRB, POSITION 구문 INSTR (expr, substring [, start [, occurrence]]) INSTRB (expr, substring [,start [, occurrence]]) POSITION (expr, substring [,start [, occurrence]]) SQL 함수 257 설명 INSTR 함수는 입력 expr 문자열에서 substring을 찾아서 substring의 첫 번째 문자의 위치를 반환한다. substring이 없으면 0이 반환된다. INSTRB 함수는 지정한 문자열의 위치를 문자 단위가 아닌 바이트 단위로 반환한다. start는 expr 내에서 탐색을 시작하는 위치를 가리킨다. 기본 start 값은 1, 즉 첫 번째 문자이다. 음수이면 expr 의 맨 끝에서부터 찾기 시작한다. 0으로 지정하면 0이 반환된다. start 값이 expr 의 길이보다 크면 에러가 발생한다. occurrence는 expr내에서 몇 번째 나타나는 substring의 위치를 반환할 지를 가리킨다. 기본값은 1이다. occurrence가 1이면 처음 탐색된 substring의 위치를 반환한다. occurrence가 2이면 두 번째로 나타나는 substring의 위치를 반환한다. 이 값이 0이거나, expr내에서 찾을 수 있는 substring 의 개수보다 더 크면 이 함수는 0을 반환한다. 음수로 설정하면 에러가 발생한다. POSITION 함수는 INSTR과 같은 함수이다. 예제 <질의> 문자열 ‘CORPORATE FLOOR’에서 ‘OR’의 위치를, 앞에서 3번째 문자부터 탐색을 시작하여 2번째로 탐색된 문자열의 위치를 출력하라. xdbiSQL> SELECT INSTR ('CORPORATE FLOOR','OR', 3, 2) Instring FROM dual; INSTRING -------------- 14 1 row selected. <질의> 문자열 ‘알티베이스5 데이터베이스’에서 ‘베이’의 위치를 뒤에서 3번째 문자부터 탐색을 시작하여 2번째로 탐색된 문자열의 위치를 출력하라. (단, 데이터베이스 문자 집합이 KO16KSC5601로 설정되어 있다.) xdbiSQL> SELECT INSTR ('알티베이스5 데이터베이스','베이', 3, 2) Instring FROM dual; INSTRING -------------- 11 1 row selected. LOWER 258 SQL Reference 구문 LOWER (expr) 설명 이 함수는 입력된 문자열의 모든 문자를 소문자로 변환한 문자열을 반환한다. 예제 <질의> 입력 문자열을 소문자로 변환하여 출력하라. xdbiSQL> SELECT LOWER('ONE PAGE PROPOSAL') Lowercase FROM dual; LOWERCASE --------------------- one page proposal 1 row selected. LPAD 구문 LPAD (expr1, n [,expr2]) 설명 이 함수는 expr1의 왼쪽에 expr2를 전체 길이가 n이 될 때까지 반복적으로 삽입하여 그 결과를 반환한다. expr2를 명시하지 않으면, 공백 문자가 삽입된다. 만약, expr1의 길이가 n 보다 길면 expr1의 왼쪽부터 길이 n만큼의 문자열을 반환한다. 단 n 은 바이트의 개수가 아니라 문자 개수를 의미하므로 사용하는 언어(설정된 문자 집합)에 따라 문자열의 바이트 크기는 다를 수 있다. 예제 <질의> 다음은 “abc”라는 문자열의 왼쪽에 “xyz”라는 문자열을 삽입하여 총 10 글자를 반환하는 예이다. xdbiSQL> SELECT LPAD('abc', 10, 'xyz') Lpad_ex FROM dual; LPAD_EX ------------------------------------------------ xyzxyzxabc 1 row selected. SQL 함수 259 LTRIM 구문 LTRIM (expr1 [,expr2]) 설명 expr1의 가장 왼쪽 문자부터 시작해서 expr1의 각 문자들과 expr2의 각 문자들을 비교한다. expr1의 현재 문자가 expr2에 있는 한 문자와 같으면 expr1의 문자를 삭제한다. 이 과정을 expr1의 현재 문자와 일치하는 문자가 expr2에 없을 때까지 삭제하여 그 결과를 출력한다. expr2의 기본값은 한 개의 공백이다. 그러므로, expr2가 생략된 경우 expr1의 앞(왼쪽)에 있는 공백이 모두 제거된다. 예제 <질의> 문자열 'abaAabLEFT TRIM' 중 가장 왼쪽에 나타나 있는 a와 b를 제외한 문자열을 출력하라. xdbiSQL> SELECT LTRIM ('abaAabLEFT TRIM', 'ab') Ltrim_ex FROM dual; LTRIM_EX ------------------- AabLEFT TRIM 1 row selected. <질의> 각 사원의 입사일 정보에서 날짜를 제거하여 입사 년월만 출력하라. xdbiSQL> SELECT e_lastname, LTRIM(LTRIM(join_date, '1234567890'), '-') Join_Month FROM employees; E_LASTNAME JOIN_MONTH ----------------------------------------------------------- . . . Ghorbani DEC-2009 Momoi SEP-2010 Fleischer JAN-2004 Wang NOV-2009 . . . 20 rows selected. NCHR 구문 260 SQL Reference NCHR (n) 설명 이 함수는 국가 문자 집합(national character set)에서 n 값에 해당하는 문자를 반환한다. 반환 값의 타입은 NVARCHAR이다. 예제 내셔날 캐릭터 셋의 187(U+00BB)을 문자로 나타낸다. xdbiSQL> SELECT NCHR(187) FROM DUAL; NC -- >> 1 row selected. OCTET_LENGTH, LENGTHB 구문 OCTET_LENGTH (expr) 설명 이 함수는 입력된 문자열의 길이를 바이트 단위로 돌려준다. 문자열의 바이트 길이는 데이터베이스 캐릭터 셋 또는 내셔날 캐릭터 셋에 따라 다르다. LENGTHB 는 OCTET_LENGT와 같은 함수이다. 예제 <질의> 문자열 '우리나라'의 길이를 바이트 단위로 출력하라. (단, 데이터베이스 캐릭터 셋이 K016KSC5601로 설정되어 있다.) xdbiSQL> SELECT OCTET_LENGTH('우리나라') FROM dual; OCTET_LENGTH('우리나라') --------------------------- 8 1 row selected. <질의> 관리자 테이블에서 주소의 길이를 바이트 단위로 출력하라. xdbiSQL> SELECT OCTET_LENGTH(address) FROM managers; OCTET_LENGTH(ADDRESS) ------------------------ 32 18 2 rows selected. SQL 함수 261 REPLACE2 구문 REPLACE2 (expr1 , expr2, [expr3]) 설명 이 함수는 expr1내에서 모든 expr2를 expr3으로 치환하여 그 결과를 반환한다. expr3이 생략되거나 NULL인 경우 expr2은 제거된다. 만약 expr2이 NULL이면 expr1 이 그대로 반환된다. TRANSLATE 함수가 각 문자에 대해 하나씩 치환되는 것에 반해 REPLACE2 함수는 문자열을 제거시킬 뿐만 아니라 한 문자열을 다른 문자열로 대치한다. 예제 <질의> departments 테이블의 dname칼럼의 값에서 “team”을 “division”으로 모두 치환하라. xdbiSQL> SELECT REPLACE2(dname, 'team', 'division') FROM departments; REPLACE2(DNAME, 'team', 'division') ------------------------------------------------ Engine Development Division Marketing Division Planning and Management Division Sales Division 5 rows selected. <질의> 다음 예제는 “abcdefghi” 문자열에서 “cde”를 “xx”로 바꾼다. xdbiSQL> SELECT REPLACE2('abcdefghicde', 'cde', 'xx') FROM dual; REPLACE2('abcdefghicde', 'cde', 'xx') ----------------------------------------- abxxfghixx 1 row selected. REPLICATE 구문 REPLICATE (expr, n) 설명 이 함수는 expr 를 n만큼 반복한 문자열을 반환한다. expr 는 문자열이고 n은 양수이어야 한다. 만약 n이 0 또는 음수이면 262 SQL Reference REPLICATE 함수는 NULL을 반환한다. 예제 <질의> 문자열 “KSKIM”을 3회 반복한 문자열을 출력하라. xdbiSQL> SELECT REPLICATE ('KSKIM', 3) FROM dual; REPLICATE ('KSKIM', 3) ----------------------------------- KSKIMKSKIMKSKIM 1 row selected. RPAD 구문 RPAD (expr1, n [,expr2]) 설명 이 함수는 expr1의 오른쪽 끝에 expr2를 전체 길이가 n이 될 때까지 반복적으로 붙여서 그 결과를 반환한다. expr2를 명시하지 않으면, 공백 문자가 붙는다. 만약, expr1의 길이가 n 보다 길면 expr1의 왼쪽부터 길이 n만큼의 문자열을 반환한다. 단 n 은 바이트의 개수가 아니라 문자 개수를 의미하므로 사용하는 언어(설정된 문자 집합)에 따라 문자열의 바이트 크기는 다를 수 있다. 예제 <질의> 다음은 “123”이라는 문자 식의 오른쪽에 “0” 문자열을 삽입하여 총 10 자리 숫자를 반환하는 예이다. xdbiSQL> SELECT TO_NUMBER(RPAD('123', 10, '0')) rpad_ex FROM dual; RPAD_EX -------------- 1230000000 1 row selected. RTRIM 구문 RTRIM (expr1 [, expr2]) 설명 SQL 함수 263 expr1의 가장 오른쪽 문자부터 시작해서 expr1의 각 문자들과 expr2의 각 문자들을 비교한다. expr1의 현재 문자가 expr2에 있는 한 문자와 같으면 expr1의 문자를 삭제한다. 이 과정을 expr1의 현재 문자와 일치하는 문자가 expr2에 없을 때까지 삭제하여 그 결과를 출력한다. expr2의 기본값은 한 개의 공백이다. 그러므로, expr2가 생략된 경우 expr1의 뒤(오른쪽)에서부터 공백이 모두 제거된다. 예제 <질의> 문자열 “RIGHTTRIMbaAbab” 가장 오른쪽에 나타나는 ‘a’와 ‘b’문자를 제거한 문자열을 출력하라. xdbiSQL> SELECT RTRIM ('RIGHTTRIMbaAbab', 'ab') rtrim_ex FROM dual; RTRIM_EX ------------------- RIGHTTRIMbaA 1 row selected. <질의> 각 사원의 입사일 정보에서 년도를 제거하여 입사 일월만 출력하라. xdbiSQL> SELECT e_lastname, RTRIM(RTRIM(join_date, '1234567890'), '-') Join_Date FROM employees; E_LASTNAME JOIN_DATE ----------------------------------------------------------- ---------------- . . . Ghorbani 20-DEC Momoi 09-SEP Fleischer 24-JAN Wang 29-NOV . . . 20 rows selected. SIZEOF 구문 SIZEOF (expr) 설명 이 함수는 문자열의 크기 또는 거기에 할당된 크기를 반환한다. 입력 값은 CHAR, VARCHAR, 또는 숫자형 데이터 타입일 수 있다. 입력 값이 숫자형 데이터 타입이면, VARCHAR로 변환하여 거기에 할당된 264 SQL Reference 크기를 되돌려 준다. OCTET_LENGTH 함수가 입력 문자열의 실제 크기를 반환하는 것에 반해 SIZEOF 함수는 입력 문자열에 할당된 공간의 크기 또는 테이블 생성시 정의된 칼럼의 크기를 반환한다. Note: SIZEOF 함수는 INTEGER, BIGINT, SMALLINT데이터 타입에 대해서는 20을 반환하며, DECIMAL, FLOAT, NUMBER, NUMERIC 타입에 대해서는 47, 그리고DOUBLE, REAL 타입에 대해서는 22를 반환한다. 예제 <질의> 테이블 dual의 칼럼 dummy에 할당된 크기를 출력하라. xdbiSQL> SELECT SIZEOF(dummy) FROM dual; SIZEOF(DUMMY) -------------- 1 1 row selected. SUBSTR, SUBSTRB, SUBSTRING 구문 SUBSTR (expr, start [, length]) 설명 SUBSTR 함수는 expr에서 start번째 문자부터 length 길이만큼의 문자열을 반환한다. start가 양수이면, 이 함수는 입력 문자열의 앞에서 start번째 문자부터 시작해서 length 길이만큼의 문자열을 반환한다. start가 음수이면, 이 함수는 입력 문자열의 끝에서 start번째 문자부터 시작해서 length 길이만큼의 문자열을 반환한다. start가 0이면, 1을 지정한 것처럼 처리된다. length 을 생략하면 문자열의 끝까지 모든 문자가 반환된다. 입력 문자열은 CHAR 또는 VARCHAR 또는 숫자 데이터 타입일 수 있다. 입력 값이 숫자 데이터 타입일 경우, 이는 VARCHAR로 변환된다. 리턴 값의 타입은 VARCHAR이다. SUBSTR 함수가 위치와 길이를 입력 문자열의 문자 단위로 결정하는데 반해, SUBSTRB 함수는 위치와 길이를 문자가 아닌 바이트 단위로 결정한다. SQL 함수 265 SUBSTRING은 SUBSTR와 같은 함수이다. 예제 <질의> 문자열 “SALESMAN”의 첫번째 문자부터 시작해서 길이 5만큼의 substring을 반환하라. xdbiSQL> SELECT SUBSTR('SALESMAN', 1 ,5) Substring FROM dual; SUBSTRING ------------- SALES 1 row selected. <질의> 입력 문자열 “ABCDEFG”의 substring을 반환하라. xdbiSQL> SELECT SUBSTR('ABCDEFG', -5 ,4) Substring FROM dual; SUBSTRING ------------- CDEF 1 row selected. <질의> 문자열 “ABCDEFG”에서 5번째 바이트 부터 2 바이트 길이 만큼의 문자를 출력하라. xdbiSQL> SELECT SUBSTRB('ABCDEFG', 5, 2) Substring_with_bytes FROM dual; SUBSTRING_WITH_BYTES ------------------------ EF 1 row selected. TRANSLATE 구문 TRANSLATE (expr1 , expr2, expr3) 설명 TRANSLATE는 expr1의 각 문자를 체크하여 expr2 중에 있는지 확인한다. 만약 expr2에서 찾을 수 없으면, expr1의 문자는 그대로 남는다. 그러나 만약에 expr2에 같은 문자가 있다면, expr1의 문자는 expr3에서 일치하는 위치의 문자로 교체된다. 이 함수는 이런 방식으로 교체되어 expr1이 수정된 결과를 반환한다. 문자열 expr2의 문자들 개수가 expr3에 있는 문자들 개수보다 많아도 된다. 이 경우, expr2의 끝 부분의 문자들은 expr3에서 대응하는 문자가 없을 것이다. 만약 이런 문자들이 expr1에서 발견된다면, 이 문자는 제거된다. expr1에서 expr2의 모든 문자를 제거하고자 한다면, expr3에 빈 문자열을 입력하라. 266 SQL Reference expr3이 expr2보다 길면, expr3의 나머지 문자들은 무시된다. 같은 문자가 expr2에 여러 개 있으면, 처음 나타나는 문자가 문자가 사용된다. 예제 <질의> 재고량이 50000개가 넘는 상품의 이름에서 “M”을 “L”로 바꾸어라. xdbiSQL> SELECT TRANSLATE(gname, 'M', 'L') FROM goods WHERE stock > 50000; TRANSLATE(GNAME, 'M', 'L') -------------------------------------------- TL-U200 L-190G 2 rows selected. <질의> 문자열의 대문자는 소문자로 변환하라. xdbiSQL> SELECT TRANSLATE('0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijlkmnopqrstuvwxyz') FROM dual; TRANSLATE('0123456789ABCDEFGHIJKLMNOPQRS ------------------------------------------------ 0123456789abcdefghijlkmnopqrstuvwxyz0123456789 1 row selected. <질의> 라이센스 번호에서 알파벳 문자는 제거하고 숫자만 남겨서 반환하라. xdbiSQL> SELECT TRANSLATE('3PQR334', '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ', '0123456789') License FROM dual; LICENSE ------------------ 3334 1 row selected. TRIM 구문 TRIM (expr1 [, expr2]) 설명 TRIM은 expr2에 존재하지 않는 첫번째 문자로 시작하고 expr2에 존재하지 않는 마지막 문자로 끝나는 expr1의 substring을 반환한다. 이들 두 문자 사이의 expr1 일부분이 변환없이 반환된다. 즉, TRIM은 expr2에서 찾을 수 있는 모든 문자를 expr1의 처음과 SQL 함수 267 끝에서 제거하여 그 결과를 반환한다. 그러므로, 이 함수는 LTRIM과 RTRIM을 같은 값의 expr2를 사용해서 함께 실행한 것과 결과가 같다. expr2의 기본 값은 한 개의 공백 문자이다. 이는 expr2가 명시되지 않을 경우, expr1의 양쪽 끝의 모든 공백이 제거됨을 의미한다. 예제 <질의> 문자열 “abbAaBbAbba”에서 양쪽 끝에서부터 a와 b를 제거한 문자열을 출력하라. xdbiSQL> SELECT TRIM ('abbAaBbAbba', 'ab') trim_ex FROM dual; TRIM_EX --------------- AaBbA 1 row selected. UPPER 구문 UPPER (char) 설명 이 함수는 입력 문자열의 모든 문자를 대문자로 바꿔서 반환한다. 예제 <질의> 문자열 “Capital”을 대문자로 출력하라. xdbiSQL> SELECT UPPER('Capital') Uppercase FROM dual; UPPERCASE ------------- CAPITAL 1 row selected. REVERSE_STR 구문 REVERSE_STR (expr) 설명 268 SQL Reference 이 함수는 expr의 문자 순서를 거꾸로 바꾼 결과를 반환한다. 예제 <질의> 문자열 “KSKIM”을 거꾸로 출력하라. xdbiSQL> SELECT REVERSE_STR ('KSKIM') FROM dual; REVERSE_STR ('KSKIM') ------------------------- MIKSK 1 row selected. <질의> 문자열 ‘알티베이스5’를 거꾸로 출력하라. (단, 데이터베이스 문자 집합이 KO16KSC5601로 설정되어 있다.) xdbiSQL> SELECT REVERSE_STR ('알티베이스4') FROM dual; REVERSE_STR ('알티베이스5') ------------------------- 5스이베티알 1 row selected. STUFF 구문 STUFF (expr1, start, length, expr2) 설명 이 함수는 start로 명시한 위치부터 length 길이만큼 제거하고 expr2를 그 자리에 삽입한 문자열을 반환한다. length에 0이 입력되면, expr1에서 아무것도 삭제하지 않고 expr2를 삽입한다. 이 경우 expr2의 삽입 위치는 start가 가리키는 위치의 왼쪽이다. length가 expr1의 start 위치 오른쪽 문자들의 길이보다 크면, start 의 오른쪽에 있는 문자열을 모두 지운 후 expr2를 삽입한다. expr2를 expr1의 맨 뒤에 붙이려면, start를 (expr1의 길이+1)로 지정하고, length 는 0또는 양수로 지정하라. start또는 length 의 값이 음수이거나 start가 (expr1의 길이+1) 보다 클 경우에는 에러가 발생한다. 예제 <질의> STUFF 함수를 이용하여 “KDHONG”을 “KILDONG HONG”으로 변환하라. SQL 함수 269 xdbiSQL> SELECT STUFF (‘KDHONG’, 2, 1, ‘ILDONG ’) FROM dual; STUFF (‘KDHONG’, 2, 1, ‘ILDONG ’) -------------------------------------------------- KILDONG HONG 1 row selected. <질의> expr2을 expr1 앞에 삽입하라. xdbiSQL> SELECT STUFF (‘KDHONG’, 1, 0, ‘ILDONG ’) FROM dual; STUFF (‘KDHONG’, 1, 0, ‘ILDONG ’) -------------------------------------------------- ILDONG KDHONG 1 row selected. <질의> expr2을 expr1 뒤에 삽입하라. xdbiSQL> SELECT STUFF (‘KDHONG’, 7, 0, ‘ILDONG ’) FROM dual; STUFF (‘KDHONG’, 7, 0, ‘ILDONG ’) -------------------------------------------------- KDHONGILDONG 1 row selected. <질의> start의 왼쪽에 expr2가 삽입되도록 length를 0으로 입력하라. xdbiSQL> SELECT STUFF (‘KDHONG’, 2, 0, ‘ILDONG ’) FROM dual; STUFF (‘KDHONG’, 2, 0, ‘ILDONG ’) -------------------------------------------------- KILDONG DHONG 1 row selected. <질의> 데이터베이스 문자 집합이 KO16KSC5601로 설정된 경우 STUFF 함수를 이용해서 입력 문자열의 내용을 변경하라. xdbiSQL> SELECT STUFF ('알티베이스0', 5, 1, '데이터베이스') FROM dual; STUFF ('알티베이스0', 5, 1, '데이터베이스’) ------------------------------------------------ 알티베이데이터베이스0 1 row selected. 270 SQL Reference 날짜시간 함수 이들 함수는 날짜 및 시간 입력 값에 대한 작업을 수행하여 문자, 숫자 또는 날짜/시간 타입의 값을 반환한다. 입력 인자의 값이 문자 데이터 타입이면, 그 값은 ALTIBASE_XDB_DATE_FORMAT 환경변수 또는 DEFAULT_DATE_FORMAT 프로퍼티 (앞의 것이 우선순위가 높음)에 설정된 형식을 따라야 한다. 또한, 이 형식은 iSQL 에서 이들 함수 수행시 반환되는 날짜/시간 값을 출력하는데 사용된다. DATE 데이터 타입과 이 타입의 데이터 반환시 사용되는 날짜형 데이터 형식에 대한 자세한 설명은 General Reference를 참고하기 바란다. ADD_MONTHS 구문 ADD_MONTHS (date, number) 설명 이 함수는 date에 number개월을 더하여 그 결과를 반환한다. 인자 number는 정수이거나 정수로 변환이 가능한 값이면 된다. 예제 <질의> 사원번호가 10인 사원의 입사일과 입사 6개월 후의 날짜를 출력하라. xdbiSQL> SELECT join_date, ADD_MONTHS(join_date, 6) FROM employees WHERE eno = 10; JOIN_DATE ADD_MONTHS(JOIN_DATE, 6) ----------------------------------------- 05-JAN-2010 05-JUL-2010 1 row selected. DATEADD 구문 DATEADD (date, number, date_field_name) SQL 함수 271 설명 이 함수는 date의 date_field_name부분을 number 만큼 증가시켜 그 결과를 반환한다. number가 정수가 아닐 경우 소수점 이하 부분은 버린 후에 적용한다. date_field_name이 ‘SECOND’일 경우에는 number는 68년 이내의 값이어야 하고, ‘MICROSECOND’일 경우에는 number는 30일 이내의 값이어야 한다. DATEADD 함수에 사용할 수 있는 date_field_name은 다음과 같다. Date Field Name 내용 CENTURY date의 년도에 100*number 만큼을 더한다. YEAR date의 년도에 number 만큼을 더한다. QUARTER date의 월에 3*number 만큼을 더한다. MONTH date의 월에 number 만큼을 더한다. WEEK date의 일에 7*number 만큼을 더한다. DAY date의 일에 number 만큼을 더한다. HOUR date의 시에 number 만큼을 더한다. MINUTE date의 분에 number 만큼을 더한다. SECOND date의 초에 number 만큼을 더한다. MICROSECOND date의 마이크로 초에 number 만큼을 더한다. 예제 <질의> 입사한지 40일이 안 된 사원의 수를 구하라. xdbiSQL> SELECT COUNT(*) FROM employees WHERE join_date > DATEADD (SYSDATE, -40, ‘DAY’); COUNT ---------- 5 1 row selected. DATEDIFF 구문 DATEDIFF (startdate, enddate, date_field_name) 설명 이 함수는 enddate에서 startdate를 뺀 값(즉, enddate- 272 SQL Reference startdate)을 date_field_name에 명시한 단위로 반환한다. enddate보다 startdate의 값이 더 크면 음수가 반환된다. 이 함수는 enddate와 startdate의 값을 date_field_name에 명시한 단위의 값으로 각각 구해서 빼는 것으로, DATEDIFF 함수의 결과값은 항상 정수이다. DATEDIFF 함수에 사용 가능한 date_field_name은 다음과 같다. CENTURY YEAR QUARTER MONTH WEEK DAY HOUR MINUTE SECOND MICROSECOND DATEDIFF 함수가 반환하는 값의 범위는 date_field_name의 값에 따라서 한정되어 있다. date_field_name이 ‘MICROSECOND’일 때는 enddate 에서 startdate을 뺀 값이 30일 이내여야 한다. 그리고 초를 나타내는 ‘SECOND’일 경우에 enddate 와 startdate의 차는 68년이다. 이 범위를 초과하면 에러가 발생한다. 이 함수의 반환 데이터 타입은 BIGINT이다. 예제 <질의> 2005년 8월 31일과 2005년 11월 30일 간의 개월 수의 차를 구하라. xdbiSQL> SELECT DATEDIFF ('31-AUG-2005', '30-NOV-2005', 'MONTH') FROM dual; DATEDIFF ('31-AUG-2005', '30-NOV-2005', ------------------------------------------- 3 1 row selected. DATENAME 구문 DATENAME (date, date_field_name) 설명 SQL 함수 273 이 함수는 입력 date_field_name에 따라서 지정한 date의 월 또는 요일의 이름을 반환한다. 다음표는 DATENAME 함수에 사용 가능한 date_field_name을 보여준다. Date Field Name 설명 MONTH, Month, month 월의 이름 (전체 이름) MON, Mon, mon 월의 이름 (약자) DAY, Day, day 요일의 이름 (전체 이름) DY, Dy, dy 요일의 이름 (약자) date_field_name별 가능한 출력 결과는 다음과 같다. date_field_name은 대문자, 소문자, 또는 첫문자만 대문자로 입력할 수 있고, 이 값에 일치하는 결과가 출력될 것이다. MONTH JANUARY, FEBRUARY, MARCH, APRIL, MAY, JUNE, JULY, AUGUST, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER MON JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC DAY SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY DY SUN, MON, TUE, WED, THU, FRI, SAT 예제 <질의> 1980년 12월 28일의 월의 이름을 구하라. xdbiSQL> SELECT DATENAME ('28-DEC-1980', 'Month') FROM dual; DATENAME ('28-DEC-1980', 'Month') ------------------------------------- December 1 row selected. EXTRACT, DATEPART 구문 EXTRACT (date, date_field_name) DATEPART (date, date_field_name) 274 SQL Reference 설명 이들 함수는 동일하며, 입력 date에서 date_field_name 에 해당하는 값만 반환한다. Date Field Name 내용 CENTURY 세기 (예를 들어, 2011의 경우 21을 1999의 경우는 20을 반환) YEAR 년 QUARTER 분기 MONTH 월 WEEK 일년 중 몇 번째 주인지 반환함. (그 해의 첫 번째 토요일과 그 앞의 날은 그 해의 첫 번째 주가 된다.) WEEKOFMONTH 그 달의 몇 번째 주인지 반환함. (그 달의 첫 번째 토요일과 그 앞의 날은 그 달의 첫 번째 주가 된다.) DAY 일 DAYOFYEAR 일년 중 몇 번째 날인지 반환함. DAYOFWEEK 주의 몇 번째 날인지 반환함. (일요일 = 1) HOUR 시 MINUTE 분 SECOND 초 MICROSECOND 마이크로 초 예제 <질의> 사원번호가 10인 사원이 입사한 분기를 구하라. xdbiSQL> SELECT DATEPART (join_date, 'QUARTER') FROM employees WHERE eno = 10; DATEPART (JOIN_DATE, 'QUARTER') ---------------------------------- 1 1 row selected. MONTHS_BETWEEN 구문 MONTHS_BETWEEN (date1, date2) SQL 함수 275 설명 이 함수는 date1에서 date2를 뺀 값을 개월 수로 반환한다. date1이 date2보다 작다면 음수가 반환될 것이다. date1과 date2가 같은 달의 같은 날이거나, 다른 달의 같은 날 또는 서로 다른 달의 마지막 날이라면 정수가 반환될 것이다. 이 경우에는 date1과 date2의 시간, 분, 초, 마이크로 초 부분은 무시된다. 다른 경우에는, 반환되는 값은 정수가 아닌 값이며, 이는 한 달을 31일로 간주하여 입력 날짜의 시간, 분, 초, 마이크로 초 부분을 변환해서 소수 부분이 계산된 것이다. 반환형은 DOUBLE이다. 예제 <질의> 1995년 2월 2일에서 1995년 1월 1일을 뺀 값을 개월 수로 구하라. xdbiSQL> SELECT MONTHS_BETWEEN (TO_DATE('02-02-1995','MM- DD-YYYY'), TO_DATE('01-01-1995','MM-DD-YYYY') ) Months FROM DUAL; MONTHS ------------------------- 1.03225806451613 1 row selected. ROUND 구문 ROUND (date [, date_field_name]) 설명 이 함수는 지정한 date_field_name의 단위에 맞춰서 date를 반올림한 날짜를 반환한다. date_field_name의 기본값은 ‘DAY’이다. 다음 표는 ROUND함수에 사용 가능한 date_field_name을 보여준다. Date Field Name 설명 CENTURY 반올림한 세기의 첫번째 날을 반환함. xx51년 이상은 다음 세기로 올림. (단, 세기는 xxx1년부터 시작함) 276 SQL Reference YEAR 7월 1일부터 다음 해로 올림. QUARTER 반올림한 분기의 첫번째 날을 반환함. 분기의 두 번째 달의 16일부터 다음 분기로 올림. MONTH 16일부터 다음 달로 올림. WEEK 목요일부터 다음 주 일요일로 올림. DAY PM 12:00부터 다음 일로 올림. HOUR 30분부터 다음 시로 올림. MINUTE 30초부터 다음 분으로 올림. 예제 <질의> 1980년 12월 27일을 YEAR로 반올림하여 출력하라. xdbiSQL> SELECT ROUND ( TO_DATE('27-DEC-1980', 'DD-MON- YYYY'), 'YEAR') FROM dual; ROUND ( TO_DATE('27-DEC-1980', 'DD-MON-Y ------------------------------------------- 1981/01/01 00:00:00 1 row selected. LAST_DAY 구문 LAST_DAY (date) 설명 이 함수는 date을 포함하는 달의 마지막 일을 반환한다. 반환 타입은 항상 DATE이다. 예제 <질의> 12월의 마지막 일을 출력하라. xdbiSQL> SELECT LAST_DAY(TO_DATE('15-DEC-2001')) FROM dual; LAST_DAY(TO_DATE('15-DEC-2001')) ----------------------------------- 2001/12/31 00:00:00 1 row selected. <질의> 사원들이 입사한 달의 마지막 일을 출력하라. xdbiSQL> SELECT LAST_DAY(join_date ) FROM employee; LAST_DAY(JOIN_DATE ) ----------------------- 1999/11/30 00:00:00 2000/01/31 00:00:00 . . SQL 함수 277 . 20 rows selected. NEXT_DAY 구문 NEXT_DAY (date, weekday) 설명 이 함수는 입력된 날짜(date) 이후에 첫번째로 오는 weekday 로 명시한 요일의 날짜를 반환한다. date의 요일이 weekday와 같다면, 다음 주 같은 요일의 날짜가 반환된다. weekday인자는 요일 중 하나이어야 한다. 대소문자는 구별하지 않고 요일의 전체 이름 또는 약어로 지정 가능하다. 예제 <질의> 각 사원들의 입사일과 입사일 후 첫번째 일요일을 출력하라. xdbiSQL> SELECT join_date, NEXT_DAY(join_date, 'SUNDAY') First_sunday FROM employees; JOIN_DATE FIRST_SUNDAY --------------------------------------------- . . . 24-JAN-2004 25-JAN-2004 29-NOV-2009 06-DEC-2009 14-JUN-2010 20-JUN-2010 05-JAN-2010 10-JAN-2010 . . . 20 rows selected. SYSDATE 구문 SYSDATE 설명 이 함수는 알티베이스가 운영중인 시스템의 현재 날짜와 시간을 출력한다. 278 SQL Reference 예제 <질의> 시스템 날짜(현재 날짜)를 출력하라. xdbiSQL> SELECT SYSDATE System_Date FROM dual; SYSTEM_DATE ----------------------- 2005/01/20 09:49:33 1 row selected. SYSTIMESTAMP 구문 SYSTIMESTAMP 설명 이 함수는 알티베이스가 운영중인 시스템의 현재 날짜와 시간을 출력한다. 이 함수는 SYSDATE 함수의 alias이며 시간대(time zone)은 지원하지 않는다. 예제 <질의> 시스템 날짜(현재 날짜)를 출력하라. xdbiSQL> SELECT SYSTIMESTAMP FROM dual; SYSTIMESTAMP ----------------------- 2005/01/20 09:49:33 1 row selected. TRUNC (date) 구문 TRUNC (date [, ‘fmt’]) 설명 버림 함수이다. 이 함수는 fmt에 명시된 단위까지만 반환한다. 즉, fmt로 명시된 단위보다 낮은 단위에 해당하는 모든 부분은0으로 교체된다. fmt를 생략하면 시간 단위 이하 부분은 제거되고 날짜까지만 반환된다. SQL 함수 279 TRUNC 함수에 사용 가능한 fmt는 다음과 같다. YEAR MONTH DAY HOUR MINUTE SECOND MICROSECOND 예제 <질의> 다음 예는 시스템 시간의 시간을 버림한 결과를 돌려준다. xdbiSQL> SELECT TRUNC(SYSDATE) FROM DUAL; <결과> TRUNC(SYSDATE) ----------------------- 2005/07/19 00:00:00 1 row selected. <질의> 다음 예는 날짜를 버림한 결과를 돌려준다. xdbiSQL> SELECT TRUNC(TO_DATE('2005-JUL-19','YYYY-MON-DD'), 'YEAR') New_Year FROM DUAL; <결과> NEW_YEAR ----------------------- 2005/01/01 00:00:00 1 row selected. 280 SQL Reference 변환 함수 변환 함수는 어떤 데이터 타입의 입력 값을 다른 데이터 타입으로 변환한다. ASCIISTR 구문 ASCIISTR(expr) 설명 이 함수는 임의의 캐릭터 셋을 갖는 문자열을 ASCII 문자열로 변환해서 반환한다. ASCII가 아닌 문자가 expr에 올 경우, \xxxx와 같이 UTF-16 코드로 표현된다. 반환 타입은 VARCHAR이다. 문자열을 국가 문자 집합(national character set)으로 변환하려면, UNISTR 함수를 사용하라. 예제 <질의> 입력 문자열을 ASCII 문자열로 변환하라. xdbiSQL> SELECT ASCIISTR('ABACDE') FROM DUAL; ASCIISTR(' ---------- AB\00C4CDE 1 row selected. SQL> select asciistr('abcano') from dual; ASCIISTR('ABCANO') ------------------ abc\00E5\00F1\00F6 1 row selected. BIN_TO_NUM 구문 BIN_TO_NUM (expr) 설명 이 함수는 expr을 10진수로 변환한다. expr은 이진수 또는 1과 0으로만 이루어진 최대 길이 32의 문자열이어야 한다. 반환형은 SQL 함수 281 INTEGER이다. Note: expr에 산술 연산이 있다면, 숫자들은 10진수로 다뤄진다. 그러나 서버 내부에서는 그 산술 연산의 결과로 생기는 수를 10진수가 아닌 2진수로 받아들이기 때문에 결과 숫자는 0과 1로만 이루어져야 한다. 예제 <질의> 주어진 2진수를 10진수로 변환하라. xdbiSQL> SELECT BIN_TO_NUM ('1010') FROM dual; BIN_TO_NUM ('1010') ---------------------- 10 1 row selected. CONVERT 구문 CONVERT(expr, dest_char_set [, source_char_set] ) 설명 이 함수는 expr을 source_char_set에서 dest_char_set으로 변환한다. dest_char_set과 source_char_set에는 알티베이스가 지원하는 캐릭터 셋이 입력될 수 있다. expr에 source_char_set 에 해당하지 않는 문자가 포함된 경우, 물음표(“?”)가 반환될 것이다. source_char_set을 생략할 경우 현재 데이터베이스에 설정된 데이터베이스 캐릭터 셋이 source_char_set이 된다. 예제 <질의> “ABC”라는 글자를 UTF8에서 US7ASCII캐릭터셋으로 변환한다. SQL> select convert( 'ABC', 'US7ASCII', 'UTF8') from dual; CONVER ------ ABC HEX_TO_NUM 구문 HEX_TO_NUM (expr) 282 SQL Reference 설명 이 함수는 expr을 10진수로 변환한다. expr은 0에서 9까지의 숫자와 A에서 F까지의 알파벳으로 이루어진 최대 길이 8인 문자열이어야 한다. 반환형은 INTEGER이다. 예제 <질의> 주어진 16진수를 10진수로 변환하라. xdbiSQL> SELECT HEX_TO_NUM ('1A') FROM dual; HEX_TO_NUM ('1A') -------------------- 26 1 row selected. OCT_TO_NUM 구문 OCT_TO_NUM (expr) 설명 이 함수는 expr을 8진수로 변환한다. expr은 0에서 7까지의 숫자로 이루어진 최대 길이 11인 문자열이어야 한다. 반환형은 INTEGER이다. Note: expr에 산술 연산이 있다면, 숫자들은 10진수로 다뤄진다. 그러나 서버 내부에서는 그 산술 연산의 결과로 생기는 수를 10진수가 아닌 8진수로 받아들이기 때문에 결과 숫자는 0에서 7까지의 숫자로만 이루어져야 한다. 예제 <질의> 주어진 8진수를 10진수로 변환하라. xdbiSQL> SELECT OCT_TO_NUM ('71') FROM dual; OCT_TO_NUM ('71') -------------------- 57 1 row selected. TO_BIN SQL 함수 283 구문 TO_BIN (n) 설명 이 함수는 n을 이진수로 변환한다. n은 10진수 또는 0에서 9까지의 숫자로 이루어진 문자열이어야 한다. 가능한 입력 값의 범위는 -2147483647에서 2147483647, 즉 - (231-1) 에서 (231-1)이다. 음수가 입력되면, 그 음수의 절대값을 이진후로 변환하여 모든 비트를 반대로 바꾸고 1을 더한 값이 반환된다. 반환 값은 부호가 있다. 앞 부분의 0은 출력되지 않기 때문에, 양수의 경우 부호 값은 보이지 않는다. 반환형은 VARCHAR이다. 예제 <질의> 주어진 값을 이진수로 변환하라. xdbiSQL> SELECT TO_BIN(1000) FROM dual; TO_BIN(1000) ------------------------------------ 1111101000 1 row selected. TO_CHAR(날짜형) 구문 TO_CHAR (date [, ‘fmt’]) 설명 이 함수는 날짜형의 date를 fmt에 명시된 날짜시간 포맷의 VARCHAR 타입 문자열로 변환하여 반환한다. fmt가 생략되었을 경우 altibase_xdb.properties에 있는 DEFAULT_DATE_FORMAT 프로퍼티에 지정된 형식으로 반환될 것이다. DEFAULT_DATE_FORMAT 프로퍼티의 기본값은 DD-MON-RRRR 이다. 날짜형 데이터의 변환에 이용되는 날짜 데이터 형식에 대한 상세한 설명은 General Reference를 참고하기 바란다. 예제 284 SQL Reference <질의> 모든 사원의 입사일을 YYYY-MM-DD HH:MI:SS 형식으로 출력하라. xdbiSQL> SELECT e_firstname, e_lastname, TO_CHAR(join_date, 'YYYY-MM-DD HH:MI:SS') Join_date FROM employees; E_FIRSTNAME E_LASTNAME JOIN_DATE ----------------------------------------------------------- ---------------- . . . Farhad Ghorbani 2009-12-20 00:00:00 Ryu Momoi 2010-09-09 00:00:00 Gottlieb Fleischer 2004-01-24 00:00:00 Xiong Wang 2009-11-29 00:00:00 . . . 20 rows selected. TO_CHAR (number) 구문 TO_CHAR (n [,’format’]) 설명 이 함수는 입력된 숫자형 값을 VARCHAR 타입으로 변환하여 반환한다. 반환되는 결과의 형식을 지정하는 것이 가능하다. 문자열이 입력되면, 이는 내부적으로 10진수로 받아들여지며 산술식이 포함된 경우 문자형 데이터로 변환되기 전에 산술 연산이 수행될 수도 있다. 예제 <질의> 다음 SQL문은 문자열과 숫자를 함축적 변환을 사용하여 숫자로 해석한 후 TO_CHAR 함수를 이용하여 문자형으로 변환하여 출력한다. xdbiSQL> SELECT TO_CHAR('01110' + 1) FROM dual; TO_CHAR('01110' + 1) ------------------------------------------------ 1111 1 row selected. <질의> 다음은 숫자를 다양한 형식의 문자열로 출력하는 예를 보여준다. xdbiSQL> SELECT TO_CHAR (123, '99999') FROM dual; TO_CHAR (123, '99999') -------------------------- 123 1 row selected. SQL 함수 285 xdbiSQL> SELECT TO_CHAR (123.4567, '999999') FROM dual; TO_CHAR (123.4567, '999999') -------------------------------- 123 1 row selected. xdbiSQL> SELECT TO_CHAR (1234.578, '9999.99') FROM dual; TO_CHAR (1234.578, '9999.99') --------------------------------- 1234.58 1 row selected. xdbiSQL> SELECT TO_CHAR (1234.578, '999.99999') FROM dual; TO_CHAR (1234.578, '999.99999') ----------------------------------- ########## 1 row selected. TO_DATE 구문 TO_DATE (expr [, ‘fmt’ ]) 설명 TO_DATE는 CHAR, VARCHAR 타입 데이터를 DATE 타입으로 변환한다. fmt는 expr의 날짜 형식을 지정한다. fmt가 생략되었을 경우 expr은 ALTIBASE_XDB_DATE_FORMAT환경 변수 또는 DEFAULT_DATE_FORMAT 프로퍼티에 설정된 형식을 따라야 한다. 만약 입력 날짜에 년 또는 월을 명시하지 않은 경우 TO_DATE 함수가 실행된 시점의 년 또는 월의 값이 반환될 것이다. 예를 들어, TO_DATE(TO_CHAR(sysdate,'YYYY'),'YYYY')를 실행한 시각이 2005/08/24 17:32:34일 경우, 실행 결과는 ‘2005/08/01 00:00:00’이 될 것이다. 입력 날짜에 월을 명시하지 않았으므로 실행 시의 월인 8월과, 일, 시, 분, 초는 초기값인 1일 00시 00분 00초가 결과값이 된다. 예제 <질의> 2001년 11월 19일에 입사한 사원의 번호, 이름, 성별과 입사일을 입력하라. xdbiSQL> INSERT INTO employees(eno, e_lastname, e_firstname, sex, join_date) VALUES('Jones', 'Mary', 'F', TO_DATE('2011- 11-19 00:00:00', 'YYYY-MM-DD HH:MI:SS')); 1 row inserted. <질의> 입력 날짜에 월과 일을 명시하지 않은 경우 TO_DATE 결과 286 SQL Reference xdbiSQL> select to_char(to_date(to_char(sysdate, 'YYYY'), 'YYYY'), 'YYYYMMDD HH24:MI:SS') from dual; TO_CHAR(TO_DATE(TO_CHAR(SYSDATE,'YYYY'), -------------------------------------------- 20080501 00:00:00 1 row selected. (단, SYSDATE = 20080502 13:17:20) TO_HEX 구문 TO_HEX (n) 설명 이 함수는 n을 16진수로 변환한다. n은 10진수 또는 0에서 9까지의 숫자로 이루어진 문자열이어야 한다. 반환형은 VARCHAR이다. 예제 <질의> 주어진 값을 16진수로 변환하라. xdbiSQL> SELECT TO_HEX(1000) FROM dual; TO_HEX(1000) ---------------- 3E8 1 row selected. TO_NCHAR(character) 구문 TO_NCHAR (expr) 설명 이 함수는 문자형 데이터를 데이터베이스 캐릭터셋에서 내셔널 캐릭터셋으로 변환한다. 반환형은 NVARCHAR이다. 이 함수는 CONVERT 함수와 동일하다. 예제 <질의> 문자 ‘안’을 내셔널 캐릭터셋 UTF-16으로 변환하여 그 정보(dump)를 출력하라. (단, ‘안’의 code point는 U+C548이다.) SQL 함수 287 xdbiSQL> select dump( to_nchar('안'), 16 ) from dual; DUMP( TO_NCHAR('안'), 16 ) ----------------------------------------------------------- ------------------- Type=NVARCHAR(UTF16) Length=4: 2,0,c5,48 TO_NCHAR(datetime) 구문 TO_NCHAR (datetime [,’fmt’]) 설명 이 함수는 날짜형 데이터를 데이터베이스 캐릭터셋에서 내셔널 캐릭터셋으로 변환한다. 반환형은 NVARCHAR이다. 예제 <질의> 각 사원의 입사일을 내셔널 캐릭터셋으로 변환해서 출력하라. xdbiSQL> SELECT e_lastname, e_firstname, TO_NCHAR(join_date, 'YYYY-MM-DD HH:MI:SS') Join_date FROM employees; E_LASTNAME E_FIRSTNAME JOIN_DATE ----------------------------------------------------------- ---------------- . . . Momoi Ryu 2010-09-09 00:00:00 Fleischer Gottlieb 2004-01-24 00:00:00 Wang Xiong 2009-11-29 00:00:00 Diaz Curtis 2010-06-14 00:00:00 . . . 20 rows selected. TO_NCHAR(number) 구문 TO_NCHAR (n [,’fmt’]) 설명 이 함수는 숫자형 데이터를 데이터베이스 캐릭터셋에서 내셔널 캐릭터셋으로 변환한다. 반환형은 NVARCHAR이다. 288 SQL Reference 예제 xdbiSQL> SELECT TO_NCHAR('01110' + 1) FROM dual; TO_NCHAR('01110' + 1) ------------------------------------------------ 1111 1 row selected. TO_NUMBER 구문 TO_NUMBER (char [, number_fmt] ) 설명 TO_NUMBER 함수는 문자열 char를 숫자 데이터 타입으로 변환한다. 사용자는 원하는 숫자 출력 형식을 지정할 수 있다. 숫자 출력 형식에 대한 자세한 설명은 General Reference를 참고하기 바란다. 반환형은 FLOAT이다. 예제 <질의> 문자열 200.00을 FLOAT로 변환하여 그 값을 이용해서 갱신하라. xdbiSQL> UPDATE employees SET salary = salary + TO_NUMBER( '200.00') WHERE eno = 10; 1 row updated. <질의> 문자열을 다양한 숫자 출력 형식으로 변환하라. xdbiSQL> SELECT TO_NUMBER ( '0123.4500', '0990.9909' ) FROM dual; TO_NUMBER ( '0123.4500', '0990.9909' ) ----------------------------------------- 123.45 1 row selected. xdbiSQL> SELECT TO_NUMBER ( '$12,3.45-', '09,$0.00S' ) FROM dual; TO_NUMBER ( '$12,3.45-', '09,$0.00S' ) ----------------------------------------- -123.45 1 row selected. xdbiSQL> SELECT TO_NUMBER ( '<$183.5>', '$9,000.0PR' ) FROM dual; TO_NUMBER ( '<$183.5>', '$9,000.0PR' ) ----------------------------------------- -183.5 1 row selected SQL 함수 289 TO_OCT 구문 TO_OCT (n) 설명 이 함수는 주어진 n을 8진수로 변환한다. n은 10진수 또는 0에서 9까지의 수로 이루어진 문자열이어야 한다. 반환형은 VARCHAR이다. 예제 <질의> 주어진 값을 8진수로 변환하라. xdbiSQL> SELECT TO_OCT(1000) FROM dual; TO_OCT(1000) ---------------- 1750 1 row selected. UNISTR 구문 UNISTR(expr) 설명 이 함수는 입력 문자열을 내셔널 캐릭터셋으로 변환한다. expr은 유니코드로 인코딩된 값일 수 있다. 유니코드로 인코딩된 값은 \xxxx와 같은 UTF16 코드 유닛으로 입력된다. 반환 타입은 NVARCHAR이다. ASCIISTR 함수와는 반대되는 기능을 하는 함수이다. 예제 <질의> ASCII 문자와 유니코드로 인코딩된 문자가 같이 들어있는 문자열을 내셔널 캐릭터셋으로 변환하라. xdbiSQL> SELECT UNISTR('abc\00e5\00f1\00f6') FROM DUAL; UNISTR ------ abcano 1 row selected. 290 SQL Reference 기타 함수 BINARY_LENGTH 구문 BINARY_LENGTH (expr) 설명 이 함수는 BLOB, BYTE, NIBBLE과 같은 이진 데이터 형의 데이터 길이를 반환한다. 예제 <질의> 세 가지 이진 데이터 형 값의 길이를 출력하라. xdbiSQL> CREATE TABLE T1 (I1 BLOB, I2 Byte(10), I3 NIBBLE(10) ); Create success. xdbiSQL> INSERT INTO T1 VALUES ( BLOB'3FD', Byte'123FD', NIBBLE'90BCD'); 1 row inserted. xdbiSQL> SELECT BINARY_LENGTH (I1), BINARY_LENGTH (I2), BINARY_LENGTH (I3) FROM T1; BINARY_LENGTH (I1) BINARY_LENGTH (I2) BINARY_LENGTH (I3) ------------------------------------------------------ 2 10 5 1 row selected. CASE2 구문 CASE2 (expr1, ret_expr1, [,expr2, ret_expr2,..,] [, default]) 설명 이 함수는 expr1이 참이면 ret_expr1 을 반환한다. 만약 expr1이 거짓이면 expr2를 계산해서 참이면 ret_expr2를 반환한다. 참인 수식이 나올 때까지 이 과정을 계속한다. 참인 수식이 나오지 않으면, default 가 반환된다. 참인 수식이 없고 default도 지정되어 있지 SQL 함수 291 않으면 NULL이 반환된다. 예제 <질의> 직원들의 급여를 출력하라. 월급여가 2000 보다 크면 ‘HIGH’를, 1500 보다 작으면 ‘LOW’을 출력하고, 급여 정보가 없으면 NULL을 출력하라. xdbiSQL> SELECT e_lastname, e_firstname, emp_job, CASE2(salary > 2000, 'HIGH', salary < 1500, 'LOW', salary IS NULL, 'NULL', TO_CHAR(salary)) Salary FROM employees; E_LASTNAME E_FIRSTNAME EMP_JOB SALARY ----------------------------------------------------------- ---------------- Moon Chan-seung CEO NULL Davenport Susan designer 1500 Kobain Ken engineer 2000 Foster Aaron PL 1800 Ghorbani Farhad PL HIGH Momoi Ryu programmer 1700 Fleischer Gottlieb manager LOW Wang Xiong manager NULL . . . 20 rows selected. CASE WHEN 구문 CASEEND simple_case_expr searched_case_exprelse_clause simple_case_expr THENexprcomparison_exprWHENreturn_expr searched_case_expr THENconditionWHENreturn_expr 292 SQL Reference else_clause else_exprELSE 설명 CASE WHEN에 searched_case_expr이 사용되면, 이는 CASE2 함수와 동일하다. 즉, 첫 번째 condition이 참이면 첫번째 return_expr을 반환한다. 명시된 condition 모두 거짓이면, else_clause가 있을 경우 else_expr이 반환되고 그렇지 않을 경우 NULL이 반환된다. 이런 방식으로 이 함수를 사용하면 여러 종류의 비교 연산자가 사용될 수 있다. CASE WHEN에 simple_case_expr 이 사용되면, expr은 동등 연산자(=)를 사용해서 각 comparison_expr과 비교될 것이다. 예제 <질의> c1 컬럼의 세 번째 문자가 a이면 ‘aaaaa’를, b이면 ‘bbbbb’를, c이면 ‘ccccc’를 출력하라. create table test (c1 char(10)); insert into test values('abcdefghi'); xdbiSQL> select CASE substring(c1,3,1) WHEN 'a' THEN 'aaaaa' WHEN 'b' THEN 'bbbbb' WHEN 'c' THEN 'ccccc' END from test; CASE SUBSTRING(C1,3,1) ------------------------- ccccc 1 row selected. DECODE 구문 DECODE (expr, comparison_expr1, ret_expr1, [, comparison_expr2, ret_expr2,..,] [, default]) 설명 DECODE 함수는 simple_case_expr이 사용된 CASE WHEN 과 동일하다. 즉, expr이 각각의 comparison_expr과 동등 연산자(=)를 사용해서 순차적으로 비교된 후, 처음으로 그 결과가 참이 되는 SQL 함수 293 comparison_expr에 해당하는 ret_expr이 반환된다. 어떤 comparison_expr과의 비교도 참이 아니면, default가 반환된다. 참이 되는 comparison_expr이 없고, default도 명시되지 않았으면, NULL이 반환된다. 예제 <질의> i가 NULL 이면 ‘NULL’, 1 이면 ‘ONE’, 2 이면 ‘TWO’를 반환하라. CREATE TABLE t2(i NUMBER); INSERT INTO t2 VALUES(NULL); INSERT INTO t2 VALUES(1); INSERT INTO t2 VALUES(2); INSERT INTO t2 VALUES(3); xdbiSQL> SELECT DECODE(i, NULL, 'NULL', 1, 'ONE', 2, 'TWO') Revised_i FROM t2; REVISED_I ------------- NULL ONE TWO 4 rows selected. <질의> 모든 사원의 현재 급여를 출력하라. emp_job이 ‘engineer’이면 급여를 10% 인상, ‘sales rep’이면 12% 인상, ‘manager’이면 20% 인상하며, 그 외의 사원은 실제 급여를 출력하라. xdbiSQL> SELECT emp_job, salary, DECODE(RTRIM(emp_job, ' '), 'engineer', salary*1.1, 'sales rep', salary*1.12, 'manager', salary*1.20, salary) Revised_salary FROM employees; EMP_JOB SALARY REVISED_SALARY ------------------------------------------------ CEO designer 1500 1500 engineer 2000 2200 engineer 1800 1980 engineer 2500 2750 programmer 1700 1700 manager 500 600 . . . 20 rows selected. DIGEST 구문 DIGEST(expr, algorithm_name) 294 SQL Reference 설명 이 함수는 표준 암호화 해쉬 알고리즘을 사용해서 expr의 해쉬 다이제스트를 VARCHAR타입으로 반환한다. 현재 알티베이스에서 지원하는 알고리즘은 SHA-1뿐이다. 예제 <질의> 입력 문자열에 대한 다이제스트를 SHA-1 알고리즘을 사용해서 구하라. xdbiSQL> SELECT DIGEST('I am a boy.', 'SHA-1') FROM DUAL; DIGEST('I am a boy. ', 'SHA-1') -------------------------------------------- A817613E0B781BBF01816F36A8B0DC7C98B2C0CC 1 row selected. DUMP 구문 DUMP (expr) 설명 이 함수는 입력된 자료를 분석하여 ‘자료형, 길이, 내용’의 형식으로 반환한다. 예제 <질의> 사원의 번호와 이름에 입력된 자료형에 관한 정보를 3개만 출력하라. xdbiSQL> SELECT DUMP(eno) Emp_Number, DUMP(e_lastname) Last_Name, DUMP(e_firstname) First_Name FROM employees LIMIT 3; EMP_NUMBER ----------------------------------------------------------- ----------- LAST_NAME ----------------------------------------------------------- ----------------------------------------------------------- ------------------------ FIRST_NAME ----------------------------------------------------------- ----------------------------------------------------------- ------------------------ Type=INTEGER(ASCII) Length=4: 1,0,0,0 Type=CHAR(ASCII) Length=22: 20,0,77,111,111,110,32,32,32,32,32,32,32,32,32,32,32,32,32, 32,32,32 Type=CHAR(ASCII) Length=22: 20,0,67,104,97,110,45,115,101,117,110,103,32,32,32,32,32,32 ,32,32,32,32 SQL 함수 295 Type=INTEGER(ASCII) Length=4: 2,0,0,0 Type=CHAR(ASCII) Length=22: 20,0,68,97,118,101,110,112,111,114,116,32,32,32,32,32,32,32 ,32,32,32,32 Type=CHAR(ASCII) Length=22: 20,0,83,117,115,97,110,32,32,32,32,32,32,32,32,32,32,32,32, 32,32,32 Type=INTEGER(ASCII) Length=4: 3,0,0,0 Type=CHAR(ASCII) Length=22: 20,0,75,111,98,97,105,110,32,32,32,32,32,32,32,32,32,32,32, 32,32,32 Type=CHAR(ASCII) Length=22: 20,0,75,101,110,32,32,32,32,32,32,32,32,32,32,32,32,32,32,3 2,32,32 3 rows selected. GREATEST 구문 GREATEST (expr1 [, expr2, expr3…]) 설명 이 함수는 입력 표현식들 중에서 가장 큰 값, 즉 알파벳 순으로 정렬했을 때 가장 마지막에 오는 값을 반환한다. 반환형은 VARCHAR 이다. 예제 <질의> 입력 식들을 알파벳 순으로 정렬했을 때 가장 마지막에 오는 수식을 반환하라. xdbiSQL> SELECT GREATEST('HARRY', 'HARRIOT', 'HAROLD') Greatest FROM dual; GREATEST ------------ HARRY 1 row selected. LEAST 구문 LEAST(expr1 [, expr2, expr3…]) 설명 이 함수는 입력 표현식들 중에서 가장 작은 값, 즉 알파벳 순으로 정렬했을 때 가장 처음에 오는 값을 반환한다. 반환형은 VARCHAR 296 SQL Reference 이다. 예제 <질의> 입력 식들을 알파벳 순으로 정렬했을 때 가장 처음에 오는 수식을 반환하라. xdbiSQL> SELECT LEAST('HARRY','HARRIOT','HAROLD') Least FROM dual; LEAST ----------- HAROLD 1 row selected. ROWNUM 구문 ROWNUM 설명 ROWNUM은 의사 레코드 번호(pseudo rownum)를 BIGINT타입으로 반환한다. 반환 범위는 1부터 BIGINT형의 최대값이다. 레코드 번호는 테이블이나 뷰에 나타나는 레코드 순서에 따라 부여된다. 그러나, ORDER BY, GROUP BY, HAVING 절이 사용되면 순서가 바뀔 수 있다. ROWNUM은 SELECT 문에는 사용할 수 있으나, UPDATE 또는 DELETE 등의 DML문에는 사용할 수 없다.3 예제 <질의> 사원 이름순으로 검색하여 앞에서 3명까지만 사원의 사번, 이름, 전화번호, 상태를 출력하라. xdbiSQL> SELECT eno, e_lastname, e_firstname, emp_tel FROM employees WHERE ROWNUM < 4 ORDER BY e_lastname; ENO E_LASTNAME E_FIRSTNAME EMP_TEL ----------------------------------------------------------- ---------------- 2 Davenport Susan 0113654540 3 UPDATE나 DELETE 문의 경우 LIMIT 절을 사용해서 ROWNUM과 같은 효과를 낼 수 있다. 예) DELETE FROM employees LIMIT 1, 10 ; SQL 함수 297 3 Kobain Ken 0162581369 1 Moon Chan-seung 01195662365 3 rows selected. NVL 구문 NVL (expr1, expr2) 설명 이 함수는 expr1이 NULL이면 expr2를, NULL이 아니면 expr1을 그대로 반환한다. expr1의 데이터 타입은 DATE, CHAR 및 NUMBER일 수 있다. expr2와 expr1의 데이터 타입이 일치해야 한다. 예제 <질의> 모든 사원의 이름과 급여를 출력한다. 급여 데이터가 없는 사원에 대해서는 ‘NOT‘을 출력하라. xdbiSQL> SELECT e_firstname, e_lastname, NVL(TO_CHAR(salary), 'Unknown') FROM employees; E_FIRSTNAME E_LASTNAME NVL(TO_CHAR(SALARY), 'Unknown') ----------------------------------------------------------- ----------------- Chan-seung Moon Unknown Susan Davenport 1500 Ken Kobain 2000 . . . 20 rows selected. NVL2 구문 NVL2 (expr1, expr2, expr3) 설명 expr1이 NULL이 아니면 NVL2는 expr2를 반환하고, NULL이면 expr3를 반환한다. 298 SQL Reference 예제 <질의> 사원의 이름과 급여를 출력하되, 급여 데이터가 있을 경우는 10% 인상된 급여를, 없을 경우는 ‘NOT‘을 출력하라. xdbiSQL> SELECT e_firstname, e_lastname, salary, NVL2(TO_CHAR(salary), TO_CHAR(salary * 1.1), 'Unknown') Nvl2_salary FROM employees; E_FIRSTNAME E_LASTNAME SALARY NVL2_SALARY ----------------------------------------------------------- --------------- Chan-seung Moon Unknown Susan Davenport 1500 1650 Ken Kobain 2000 2200 Aaron Foster 1800 1980 . . . 20 rows selected. SENDMSG 구문 SENDMSG ( VARCHAR ipaddr, INTEGER port, VARCHAR msg, INTEGER ttl ) 설명 SENDMSG는 사용자 메시지를 지정된 IP 주소와 포트 번호에 Socket datagram으로 전송한다. 일반 IP 주소를 입력하면 UDP datagram을 전송하며, Multicast IP 주소를 입력하면 Multicast datagram을 전송한다. Multicast IP 주소는 예약된 Multicast group을 제외한 225.0.0.0~238.0.0.255로 제한된다. 사용가능한 포트 번호는 1025에서 65535까지이다. msg는 최대 2048바이트를 넘을 수 없다. ttl은 TimeToLive의 준말로, 이 인자는 Multicast IP 주소로 메시지 전송시 유용하다. 이는 아래와 같이 멀티캐스트 전송시 전송 범위를 제한한다. 가능한 ttl 값의 범위는 0에서 255 까지이다. TTL 범위 SQL 함수 299 0 호스트 내부로 제한되어, 네트워크 인터페이스를 지나서 출력되지 않음. 1 동일 서브넷으로 제한되어, 라우터를 넘어서 포워딩하지 않음. < 32 동일 사이트(SITE)로 제한, 조직이나 부서로 제한됨. < 64 동일 지역(Region)으로 제한. < 128 동일 대륙으로 제한. < 255 무제한, 전세계. 반환값은 전송된 메시지의 길이를 나타내는 INTEGER형이다. 예제 <질의> 일반 IP 주소로 사용자 메시지를 전송하라 (이 경우, ttl 값은 무시된다). xdbiSQL> SELECT SENDMSG( '192.168.1.60', 12345, 'THIS IS A MESSAGE', 1 ) FROM T1; SENDMSG( '192.168.1.60', 12345, 'THIS IS ------------------------------------------- 17 1 row selected. <질의> Multicast IP 주소로 사용자 메시지를 전송하라 (이 경우, ttl 값이 적용된다). xdbiSQL> SELECT SENDMSG( '226.0.0.37', 12345, 'THIS IS A MESSAGE', 0 ) FROM T1; SENDMSG( '192.168.1.60', 12345, 'THIS IS ------------------------------------------- 17 1 row selected. USER_ID 구문 USER_ID() 설명 이 함수는 현재 접속한 사용자의 ID를 반환한다. 반환 타입은 INTEGER이다. 예제 <질의> 현재 접속한 사용자의 모든 테이블 정보를 조회하라. SELECT table_name FROM system_.sys_tables_ WHERE user_id = USER_ID(); 300 SQL Reference USER_NAME 구문 USER_NAME() 설명 이 함수는 현재 접속한 사용자의 이름을 반환한다. 반환 타입은 VARCHAR이다. 예제 <질의> 현재 접속한 사용자의 이름을 조회하라. SELECT user_name(), user_id() FROM dual; SESSION_ID 구문 SESSION_ID() 설명 이 함수는 현재 접속한 사용자의 세션 식별자를 반환한다. 반환 타입은 INTEGER이다. 예제 <질의> 현재 접속한 사용자가 사용중인 캐릭터셋을 조회하라. xdbiSQL> SELECT client_nls FROM v$session WHERE id = SESSION_ID(); CLIENT_NLS -------------------------------------------- US7ASCII 1 row selected. 중첩 함수 설명 단일 행 함수는 여러 번 중첩될 수 있다. 중첩 함수는 가장 안쪽부터 시작해서 바깥쪽으로 계산 된다. SQL 함수 301 예제 <질의> 각 사원이 입사한 날로부터 여섯 달이 경과한 뒤 첫 번째 월요일의 날짜를 입사일 순으로 출력하라. xdbiSQL> SELECT TO_CHAR(NEXT_DAY(ADD_MONTHS(join_date, 6), 'MONDAY'), 'DD-Mon-YYYY') Monday_six_months FROM employees ORDER BY join_date; MONDAY_SIX_MONTHS -------------------------------------- 26-Jul-2004 21-May-2007 05-May-2008 24-May-2010 . . . 20 rows selected. 302 SQL Reference 암호화 함수 알티베이스는 문자열을 암호화 하거나 암호화 된 문자열을 복호화하는 함수를 제공한다. 알티베이스에 사용된 암복호화 알고리즘은 DES(Data Encryption Standard)이다. 알티베이스는 8바이트 블록 암호화 알고리즘으로 CBC(Cipher Block Chaining)을 사용한다. DESENCRYPT 구문 DESENCRYPT (VARCHAR expr, VARCHAR key_string) 설명 expr: 암호화할 문자열이다. 이 문자열의 길이는 8의 배수이어야 한다. key_string: 암호화 키로 사용할 문자열이다. 이 문자열의 최소 길이는 8이다. 9번째와 이후의 문자는 무시된다. 예제 아래 DESDECRYPT 예제를 참조한다. DESDECRYPT 구문 DESDECRYPT (VARCHAR encrypted_string, VARCHAR key_string) 설명 encrypted_string: 복호화할 문자열이다. 이 문자열의 길이는 8의 배수이어야 한다. key_string: 암호화 키로 사용되었던 문자열이다. 이 문자열의 최소 길이는 8이다. 9번째와 이후의 문자는 무시된다. SQL 함수 303 * 주의: 암호화된 문자열을 화면에 출력하면 터미널 에뮬레이터 오류가 발생할 수 있다. 예제1 암호화한 텍스트를 테이블에 저장 및 복호화하여 출력하라. create table t1( encrypted_string varchar(40) ); 1) 암호화한 텍스트를 테이블에 삽입하기 xdbiSQL> insert into t1 values( desencrypt( 'A4 ALTIBASE Corporation.', 'altibase' ) ); 1 row inserted. 2) 암호화된 텍스트를 조회하면 알아볼 수 없을 것이다. xdbiSQL> select * from t1; T1.ENCRYPTED_STRING -------------------------------------------- Z\uf900\u5b87\ub94c]\uffff\uffffu\uffffxE\uffffIXek \uffff 1 row selected. 3) 암호화 할 때 사용한 것과 동일한 키를 이용하여 암호화된 텍스트를 복호화해서 출력하라. xdbiSQL> select desdecrypt(encrypted_string, 'altibase') from t1; DESDECRYPT(ENCRYPTED_STRING, 'altibase') -------------------------------------------- A4 ALTIBASE Corporation. 1 row selected. 예제2 암호화할 문자열의 길이가 8의 배수이고 키 문자열의 최소 길이가 8이어야 하는 제한 없이 암복호화를 시도하라. create table t1( encrypted_string varchar(40) ); 1) 원문의 길이가 8의 배수가 아니기 때문에 에러가 발생할 것이다. xdbiSQL> insert into t1 values( desencrypt( 'Altibase Client Query utility.', 'altibase' ) ); [ERR-2100D : Invalid data type length] 2) 원문의 길이는 8의 배수이나, key의 길이가 8보다 짧아서 에러가 발생할 것이다. xdbiSQL> insert into t1 values( desencrypt( 'Altibase Client Query utility...', 'alti4' ) ); [ERR-2100D : Invalid data type length] 3) RPAD를 사용해서 원문의 길이를 8의 배수로 맞추고, key의 길이를 8로 맞추는 저장 함수를 생성하라. xdbiSQL> create or replace function my_encrypt( input_string in varchar(100), key_string in varchar(40) ) 2 return varchar(100) 3 as 304 SQL Reference 4 encrypted_string varchar(100); 5 pieces_of_eight INTEGER; 6 begin 7 pieces_of_eight := ((FLOOR(LENGTH(input_string)/8 + .9)) * 8); 8 9 encrypted_string := desencrypt( RPAD( input_string, pieces_of_eight), 10 RPAD( key_string, 8, '#' ) ); 11 return encrypted_string; 12 end; 13 / Create success. 4) RPAD를 사용해서 key의 길이를 8로 맞춘 다음 복호화하고, 복호화된 텍스트를 trim하는 저장 함수를 생성하라. xdbiSQL> create or replace function my_decrypt( input_string in varchar(100), key_string in varchar(40) ) 2 return varchar(100) 3 as 4 decrypted_string varchar(100); 5 begin 6 decrypted_string := desdecrypt( input_string, 7 RPAD( key_string, 8, '#' ) ); 8 9 return trim(decrypted_string); 10 end; 11 / Create success. 5) 이제 사용자 정의 저장 함수 my_encrypt()를 사용해서 길이가 8의 배수가 아닌 문자열을 암호화하여 저장하라. xdbiSQL> insert into t1 values( my_encrypt( 'Altibase Client Query utility.', 'altibase' ) ); 1 row inserted. 6) 사용자 정의 저장 함수 my_decrypt()를 사용해서 암호화된 텍스트를 복호화하라. xdbiSQL> select my_decrypt( encrypted_string, 'altibase' ) from t1; MY_DECRYPT( ENCRYPTED_STRING, 'altibase' ----------------------------------------------------------- --------------------------------------------- Altibase Client Query utility. 1 row selected. xdbiSQL> delete from t1; 1 row deleted. 7) 길이가 8보다 짧은 key를 사용해서 문자열을 암호화하고 저장하는데 저장 함수 my_encrypt를 사용할 수 있다. xdbiSQL> insert into t1 values( my_encrypt( 'Altibase Client Query utility...', 'alti4' ) ); 1 row inserted. 8) 문자열을 조회하고 복호화하는데 저장 함수 my_decrypt를 사용하라. 암호화시 사용되었던 키가 복호화할 때도 사용된다. 키의 SQL 함수 305 길이가 8보다 짧아도 상관없다. xdbiSQL> select my_decrypt( encrypted_string, 'alti4' ) from t1; MY_DECRYPT( ENCRYPTED_STRING, 'alti4' ) ------------------------------------------------ Altibase Client Query utility... 1 row selected. 산술 연산자 307 7. 산술 연산자 이 장에서는 SQL문에 사용되는 산술연산자들에 대해서 자세히 설명한다. 308 SQL Reference 산술 연산자 산술 연산자는 숫자 값에 대해 부호를 붙이거나, 더하기, 빼기, 곱하기, 및 나누기를 하는데 사용되는 연산자이다. 이런 연자자들 중 일부는 날짜 데이터에 대한 계산을 수행하는데 사용될수도 있다. 산술 연산자는 숫자 데이터 타입 또는 내부적으로 숫자형으로 변환이 가능한 데이터 타입에 대해서 수행될 수 있다. 산술 연산자의 종류 다음은 알티베이스에서 지원하는 산술 연산자의 종류와 이에 대한 간단한 설명이다. 산술 연산자 설명 단항 연산자(+) 명시적으로 양수를 나타낸다 단항 연산자(-) 입력 수의 부호를 반전시킨다 이항 연산자(사칙) 두 입력 수에 대해 계산한다 연결 연산자 두 문자열을 합친다 산술 연산자 309 단항 연산자 양수 부호 구문 + number 설명 이 연산자는 입력된 number를 명시적으로 양수로 표시한다. 음수 부호 구문 - number 설명 이 연산자는 입력한 number의 부호를 반전시킨다. 310 SQL Reference 이항 연산자 더하기 구문 number1 + number2 설명 이 연산자는 number1 와 number2 를 더한 결과를 돌려준다. 빼기 구문 number1 - number2 설명 이 연산자는 number1에서 number2를 뺀 결과를 돌려준다. 곱하기 구문 number1 x number2 설명 이 연산자는 number1과 number1를 곱한 결과를 돌려준다. 나누기 구문 number1 / number2 설명 산술 연산자 311 이 연산자는 number1를 number2로 나눈 결과를 돌려준다. 날짜 타입의 데이터에 산술 연산 수행 구문 DATE 타입의 값에 수를 더하거나 뺄 때, 그 수는 일 단위로 해석된다. 그러므로, DATE 타입 값에 시, 분, 또는 초를 더하거나 빼려면 더하거나 빼고자 하는 시, 분, 초의 숫자를 아래와 같이 일로 변환해서 입력해야 한다. date [ + | - ] n date - date date [ + | - ] days (더하기/빼기 n일: n) date [ + | - ] hours (더하기/빼기 n시간: n/24) ) date [ + | - ] minutes (더하기/빼기 n분: n/(24*60) ) date [ + | - ] seconds (더하기/빼기 n초: n/(24*60*60)) DATE 타입 값에 대한 곱하기 또는 나누기 연산은 불가능하다. 예제 <질의> 부서 4001에 속한 모든 사원의 이름 및 근무한 주 수를 출력하라. xdbiSQL> SELECT e_firstname, e_lastname, (SYSDATE- join_date)/7 Weeks_worked FROM employees WHERE dno = 4001; E_FIRSTNAME E_LASTNAME WEEKS_WORKED ----------------------------------------------------------- ------------ Xiong Wang 115.778199044248 Curtis Diaz 87.6353419013905 John Huxley 224.492484758533 3 rows selected <질의> 현재 시간에서 10분 후의 시간을 출력하라. xdbiSQL> SELECT SYSDATE + (10/(24*60)) '10 MINUTES LATER' FROM dual; 10 MINUTES LATER ----------------------- 2005/01/20 09:59:34 1 row selected. 312 SQL Reference 연결 연산자 구문 char1 || char2 설명 이 연산자는 두개의 문자열 char1과 char2를 합친다. 예제 <질의> 사원 이름과 직책사이에 ‘ is a ’를 삽입하여 하나의 칼럼으로 출력하라. xdbiSQL> SELECT RTRIM(e_firstname) || ' ' || RTRIM(e_lastname) || ' is a ' || emp_job || '.' Job_Description FROM employees; JOB_DESCRIPTION ----------------------------------------------------------- -------- . . . Aaron Foster is a PL. Farhad Ghorbani is a PL. Ryu Momoi is a programmer. Gottlieb Fleischer is a manager. . . . 20 rows selected. 산술 연산자 313 CAST 연산자 구문 CAST (expr AS data_type) 설명 이 연산자는 expr을 명시적으로 주어진 data_type의 값으로 변환한다. (BLOB과 CLOB 타입을 제외한 모든 타입이 지원된다.) 예제 <질의> 문자열을 DOUBLE타입의 값으로 변환하라. xdbiSQL> SELECT CAST(‘3.14159265359’ AS DOUBLE) PI FROM dual; PI ------------------------- 3.14159265359 1 row selected. 조건 연산자 315 8. 조건 연산자 이장에서는 SQL문에 사용되는 조건 연산자들에 대해서 자세히 설명한다. 316 SQL Reference SQL 조건의 개요 SQL 조건은 한 개 이상의 논리 연산자와 수식으로 구성된다. 조건의 반환 값은 TRUE, FALSE, 또는 UNKOWN 셋 중의 하나이다. 조건은 SELECT 구문의 다음 절에 사용될 수 있다: WHERE START WITH CONNECT BY HAVING 또한, 조건은 DELETE 또는 UPDATE 구문의 WHERE 절에도 사용될 수 있다. 이 절은 다양한 종류의 조건에 대해서 상세히 설명한다. 논리 조건 다음의 논리 조건들이 알티베이스에서 지원된다. 다음 표는 각각에 대한 간략한 설명을 보여준다. 논리 연산자 설명 논리곱 (AND) 입력 조건들의 논리곱 결과를 돌려준다. 두 조건이 모두 TRUE이면 TRUE를 반환한다. 둘 중 하나라도 FALSE이면 FALSE를 반환한다. 부정 (NOT) 입력된 값의 반대 결과를 돌려준다. 논리합 (OR) 입력 조건들의 논리합 결과를 돌려준다. 두 조건이 모두 FALSE이면 FALSE를 반환한다. 둘 중 하나라도 TRUE이면 TRUE를 반환한다. 비교 조건 비교 조건은 단순 비교와 그룹 비교로 분류될 수 있다. 단순 비교 조건은 한 수식이 한 수식과 비교되는 것이다. 그룹 비교 조건은 한 수식이 여러 수식들과 비교되거나 부질의에 의해 반환되는 다수의 행과 비교되는 것이다. 조건 연산자 317 그 외의 조건 알티베이스에서 지원되는 다른 조건들이 다음 표에 간략히 설명되어 있다. 조건 타입 설명 BETWEEN 조건 BETWEEN 조건은 비교 조건의 일종으로 어떤 값이 일정 범위 내에 속하는지 검사한다. EXISTS 조건 EXISTS 조건은 부질의가 적어도 하나 이상의 행을 반환하는지 검사한다. IN 조건 IN 조건은 어떤 값이 리스트 또는 부질의가 반환한 결과 중의 하나 이상의 값과 같은지 검사한다. NOT IN 조건은 어떤 값이 리스트 또는 부질의가 반환한 결과 중의 모든 값과 같지 않은지를 검사한다. IS NULL 조건 IS NULL 조건은 어떤 값이 널인지 검사한다. LIKE 조건 LIKE 조건은 패턴 일치 검사 조건으로 문자열이 주어진 패턴을 포함하는지 검사한다. UNIQUE 조건 UNIQUE 조건은 부질의가 오직 하나의 행을 반환하는지 검사한다. 318 SQL Reference 논리 연산자 AND 구문 condition1 AND condition2 설명 AND는 condition1과 condition2를 논리곱 연산한 결과를 돌려준다. 논리곱 연산의 결과는 다음과 같다. Condition1 Condition2 TRUE FALSE UNKNOWN TRUE TRUE FALSE UNKNOWN FALSE FALSE FALSE FALSE UNKNOWN UNKNOWN FALSE UNKNOWN 예제 <질의> 엔지니어이면서 급여가 2000 이상인 직원의 이름, 급여, 입사일을 출력하라. xdbiSQL> SELECT e_firstname, e_lastname, salary, join_date FROM employees WHERE emp_job = 'engineer' AND salary >= 2000; E_FIRSTNAME E_LASTNAME SALARY JOIN_DATE ----------------------------------------------------------- --------------- Ken Kobain 2000 11-JAN-2010 1 row selected. NOT 구문 NOT condition 설명 조건 연산자 319 NOT은 입력 condition의 반대 결과를 돌려준다. Condition TRUE FALSE UNKNOWN NOT 결과 FALSE TRUE UNKNOWN 예제 <질의> 1980년 이전에 태어난 사원을 제외한 사원들의 이름, 부서, 생일을 출력하라. xdbiSQL> SELECT e_lastname, e_firstname, dno, birth FROM employees WHERE NOT birth 재고 수량이 20000 이상이거나 단가가 100000원 이상인 상품의 데이터를 출력하라. xdbiSQL> SELECT * FROM goods WHERE stock > 20000 OR price >= 100000; 320 SQL Reference GOODS.GNO GOODS.GNAME GOODS.GOODS_LOCATION GOODS.STOCK ------------------------------------------------ GOODS.PRICE -------------- C111100001 IT-U950 FA0001 35000 7820.55 D111100008 TM-U200 AC0006 61000 10000 E111100004 M-190G CE0001 88000 5638.76 E111100012 M-U420 CE0003 43200 3566.78 F111100001 AU-100 AC0010 10000 100000 5 rows selected. 조건 연산자 321 비교조건 비교조건은 한 수식이 한개 또는 여러 개의 수식과 비교되는지에 따라서 크게 단순 비교조건과 그룹 비교조건으로 분류될 수 있다. 단순 비교 조건 구문 simple_comparison_condition ::= = != > = <= expr ()subquery = != expr ()subquery (subquery) (expr) , (subquery) (expr) , 설명 단순 비교 조건은 명시된 연산자를 기준으로 양쪽의 수식을 비교하여 TRUE, FALSE 또는 UNKNOWN을 반환한다. 단순 비교 조건은 두 식의 크기를 비교하는 것과 두 식이 동일한지를 판단하는 것으로 분류될 수 있다. 두 개 이상의 수식이 연산자의 양쪽에 존재할 때 (위의 다이어그램에서 아래쪽에 해당), 오직 동등 비교만 수행될 수 있다. 즉, 크기 비교는 불가능하다. 322 SQL Reference 또한, 연산자 왼쪽의 수식 개수는 오른쪽 수식의 개수와 동일해야 한다. 이 규칙은 수식이 부질의(subquery) 형태로 올 경우 SELECT 목록의 개수에도 적용된다. 게다가, 부질의가 단순 비교에 사용될 때 이는 오직 한 레코드만 반환해야 한다. 예제 <질의> 재고금액이 1억원 이상인 상품의 품명, 보관수량, 원가, 재고금액을 출력하라. (재고금액은 보관수량 * 원가이다.) xdbiSQL> SELECT gname, stock, price, stock*price value_of_inv FROM goods WHERE stock*price > 100000000; GNAME STOCK PRICE VALUE_OF_INV ------------------------------------------------ IT-U950 35000 7820.55 273719250 TM-T88 10000 72000 720000000 TM-U950 8000 96200 769600000 . . . 11 rows selected. 조건 연산자 323 그룹 비교 조건 구문 group_comparison_condition ::= = != > = <= expr ()subquery ( = != expr) , ()expr , subquery() () , ANY SOME ALL expr , () ANY SOME ALL 설명 그룹 비교 조건에서는 왼쪽의 수식이 오른쪽의 각 수식 또는 부질의 결과와 비교된다. 다수의 행을 반환하는 부질의도 허용된다. 연산자 왼쪽에 두 개 이상의 수식이 올 경우, 오직 동등 비교만 수행될 수 있고, 크기 비교는 불가능하다. 또한, 오른쪽 수식에는 그룹으로 묶기 위해서 괄호를 사용해야 한다. 각 그룹내의 요소들의 개수 또는 부질의에 의해 반환되는 칼럼의 개수는 왼쪽 수식의 개수와 동일해야 한다. ANY / SOME ANY와 SOME 키워드는 같은 의미를 가지고 있다. 이 키워드를 포함하는 그룹 비교 조건은 왼쪽 수식과 오른쪽 수식들 또는 부질의 결과 중 적어도 하나의 수식과 비교한 결과가 TRUE이면, TRUE를 반환한다. 324 SQL Reference ALL ALL 키워드를 포함하는 그룹 비교 조건은 왼쪽의 수식과 오른쪽의 수식들 또는 부질의 결과 모두를 비교해서 모든 경우에 대해서 TRUE일때, TRUE를 반환한다. 예제 <질의> 성이 “B”로 시작되는 사원이 받은 모든 주문에 대한 정보를 출력하라. xdbiSQL> SELECT ono, order_date, processing FROM orders WHERE eno = ANY (SELECT eno FROM employees WHERE e_lastname LIKE 'B%'); ONO ORDER_DATE PROCESSING -------------------------------------------------- 12300003 29-DEC-2011 P 12300004 30-DEC-2011 P 12300006 30-DEC-2011 P 12300008 30-DEC-2011 P 12300009 30-DEC-2011 P 12300011 30-DEC-2011 P 12300013 30-DEC-2011 P 12310001 31-DEC-2011 O 12310003 31-DEC-2011 O 12310005 31-DEC-2011 O 12310006 31-DEC-2011 O 12310010 31-DEC-2011 O 12 rows selected. 조건 연산자 325 그 외의 조건 BETWEEN 구문 between_condition ::= expr NOT BETWEENexprANDexpr 설명 BEETWEEN 비교는 어떤 값이 주어진 범위에 속하는지를 체크하기 위해 사용된다. ‘column1 between x1 and x2’는 ‘column1 >= x1 and column1 <= x2’와 논리적으로 동일하다. 예제 <질의> 재고금액이 100만원 이상 1000만원 이하인 상품의 품명, 보관수량, 원가, 재고금액을 출력하라. (재고금액은 보관수량 * 원가이다.) xdbiSQL> SELECT gname, stock, price, stock*price value_of_inv FROM goods WHERE stock*price BETWEEN 1000000 AND 10000000; GNAME STOCK PRICE VALUE_OF_INV ------------------------------------------------ IM-310 100 98000 9800000 . . . M-T500 5000 1000.54 5002700 7 rows selected. EXISTS 구문 326 SQL Reference exists_condition ::= EXISTSsubquery() 설명 EXIST는 부질의의 결과가 적어도 하나 이상 존재하는지 검사한다. 적어도 하나의 행이 존재하면 EXIST는 TRUE를 반환한다. 예제 <질의> 적어도 두 종류 이상의 상품을 주문한 고객의 고객번호를 출력하라. (먼저 부질의에서는 주문 테이블에서 같은 고객번호이지만 다른 상품을 주문한 행의 쌍을 모두 찾는다. 즉, 한 고객이 한 개 이상의 다른 상품을 주문한 것을 의미한다. 만약, 그러한 행의 쌍이 존재하면, EXISTS는 TRUE를 반환하고, 그 고객번호는 출력된다.) xdbiSQL> SELECT DISTINCT cno FROM orders a WHERE EXISTS (SELECT * FROM orders b WHERE a.cno = b.cno AND NOT(a.gno = b.gno)); CNO ------------------ 19 15 14 11 6 5 3 2 1 9 rows selected. <질의> 모든 상품을 주문한 고객의 이름을 출력하라. 맨 아래쪽에 위치하는 가장 안쪽 질의는 주문 테이블에서 고객이 주문한 상품들을 찾는다. 가운데 질의는 그 고객에 의해 주문되지 않은 상품을 찾는다. 만약, 그 고객에 의해 주문되지 않은 상품이 없으면 그 고객의 이름이 출력될 것이다.) xdbiSQL> SELECT customer.cname FROM customers WHERE NOT EXISTS (SELECT * FROM goods WHERE NOT EXISTS (SELECT * FROM orders WHERE orders.cno = customers.cno AND orders.gno = goods.gno)); CNAME ------------------------ 조건 연산자 327 No rows selected. 328 SQL Reference IN 구문 in_condition ::= expr NOT IN ( ()expr , subquery()NOT IN())expr , , ()expr , subquery() 설명 IN 조건은 ‘= ANY’ 조건을 사용한 그룹 비교와 동일하다. 이런 종류의 조건은 왼쪽의 수식이 오른쪽 수식들 중 어느 하나와 일치하면 TRUE를 반환한다. NOT IN 조건은 ‘!= ALL’ 조건을 사용한 그룹 비교와 동일하다. 이런 종류의 조건은 오른쪽 수식들 중 어느 하나도 왼쪽 수식과 일치하지 않을 때 TRUE를 반환한다. 예제 <질의> 응용프로그램 개발 팀 또는 마케팅 팀에서 일하고 있는 사원의 이름, 업무, 전화번호, 입사일을 출력하라. xdbiSQL> SELECT e_firstname, e_lastname, emp_job, emp_tel FROM employees WHERE dno IN (1003, 4001); E_FIRSTNAME E_LASTNAME EMP_JOB EMP_TEL ----------------------------------------------------------- ---------------- Elizabeth Bae programmer 0167452000 . 조건 연산자 329 . . 7 rows selected. 위 SQL문의 WHERE 절은 다음과 같은 의미를 지닌다: WHERE DNO = 1003 or DNO = 4001 <질의> 상품 C111100001을 주문한 고객의 이름을 출력하라. xdbiSQL> SELECT DISTINCT customers.c_lastname, customers.c_firstname FROM customers WHERE customers.cno IN (SELECT orders.cno FROM orders WHERE orders.gno = 'C111100001'); C_LASTNAME C_FIRSTNAME ----------------------------------------------- Martin Pierre Fedorov Fyodor Dureault Phil Sanchez Estevan 4 rows selected. INLIST 구문 isnull_condition ::= NOT (exprcomma_separated_values),INLIST‘‘ 설명 INLIST는 comma_separated_values내 각각의 값들 중 어느 하나가 expr과 일치하면 TRUE를 반환한다. NOT INLIST는 comma_separated_values내 각각의 값들 중 어느 것도 expr과 일치하지 않으면 TRUE를 반환한다. comma_separated_values내의 각 값은 ASCII 문자로만 이루어진 문자열이어야 한다. 예제 xdbiSQL> SELECT dno, e_firstname, e_lastname FROM employees WHERE INLIST (dno, '1003,4001' ); DNO E_FIRSTNAME E_LASTNAME ----------------------------------------------------------- - 1003 Elizabeth Bae 1003 Zhen Liu 1003 Yuu Miura 330 SQL Reference 1003 Jason Davenport 4001 Xiong Wang 4001 Curtis Diaz 4001 John Huxley 7 rows selected. IS NULL 구문 isnull_condition ::= expr NOT ISNULL 설명 IS NULL 조건은 표현식(expression)이 널(NULL) 인지 아닌지 검사하기 위해 사용된다. 예제 <질의> 생일이 입력 되지 않은 직원의 사원번호, 이름, 업무를 출력하라. xdbiSQL> SELECT eno, e_firstname, e_lastname, emp_job FROM employees WHERE salary IS NULL; ENO E_FIRSTNAME E_LASTNAME EMP_JOB ----------------------------------------------------------- ---------------- 1 Chan-seung Moon CEO 8 Xiong Wang manager 20 William Blake sales rep 3 rows selected. LIKE 구문 like_condition ::= 조건 연산자 331 expr NOT LIKEexpr ESCAPE'indexdesc_hint' 설명 LIKE는 패턴 일치 검사 조건으로 어떤 문자열이 주어진 일련의 문자들(패턴)을 포함하는지를 검사한다. 퍼센트(“%”)와 밑줄(“_”) 문자는 LIKE 조건에서 와일드카드 문자로 사용된다. “%”는 문자열을 나타내고, “_”는 한 문자를 나타낸다. 와일드카드로 사용하지 않고 실제 문자 “%” 또는 “_”를 찾고 싶으면, escape 문자를 정의하기 위해 LIKE 조건의 뒤에 ESCAPE 키워드를 사용하고 이 escape 문자를 “%” 또는 “_” 앞에 덧붙여라. 이렇게 하면 와일드카드 문자로 다뤄지지 않는다. 예제 <질의> 성이 “D”로 시작되는 직원들의 사원번호, 이름, 부서번호, 전화번호 출력하라. xdbiSQL> SELECT eno, e_lastname, e_firstname, dno, emp_tel FROM employees WHERE e_lastname LIKE 'D%'; ENO E_LASTNAME E_FIRSTNAME DNO EMP_TEL ----------------------------------------------------------- ----------------- 2 Davenport Susan 0113654540 9 Diaz Curtis 4001 0165293668 15 Davenport Jason 1003 0119556884 3 rows selected. <질의> 부서 이름에 밑줄(_)이 포함된 모든 부서에 대한 정보를 출력하라. xdbiSQL> INSERT INTO departments VALUES(5002, 'USA_HQ', 'Palo Alto', 100); 1 row inserted. xdbiSQL> SELECT * FROM departments WHERE dname LIKE '%\_%' ESCAPE '\'; DNO DNAME DEP_LOCATION MGR_NO ----------------------------------------------------------- ---------------- 5002 USA_HQ Palo Alto 100 1 row selected. 위 예제에서 백슬래시 (“\”)가 escape 문자로 정의되었다. 이 escape 문자가 밑줄(“_”) 앞에 있으므로 밑줄이 와일드카드로 다뤄지지 않는다. 332 SQL Reference <질의> 이름에 “h”가 들어간 모든 사원의 이름을 출력하라. xdbiSQL> SELECT e_firstname FROM employees WHERE e_firstname LIKE '%h%'; E_FIRSTNAME ------------------------ Chan-seung Farhad Elizabeth Zhen Mitch Takahiro John 7 rows selected. UNIQUE 구문 unique_condition ::= UNIQUEsubquery() 설명 UNIQUE는 부질의가 오직 하나의 레코드만 반환하는지 검사한다. 예제 <질의> CEO가 오직 한명이면, 다음의 메시지를 출력하라: “This is only one CEO.” xdbiSQL> SELECT 'There is only one CEO.' message FROM dual WHERE UNIQUE (SELECT * FROM employees WHERE emp_job = 'CEO'); MESSAGE -------------------------- There is only one CEO. 1 row selected. <질의> 고객 테이블에 여성이 한명만 있을 경우 다음의 메시지를 출력하라: 'There is only one female customer.' xdbiSQL> SELECT 'There is only one female customer.' message FROM dual WHERE UNIQUE (SELECT * FROM customers 조건 연산자 333 WHERE SEX = 'F'); ENAME ------------------------ No rows selected. 찾아보기 335 찾아보기 A ABS function ..................................... 239 ACOS function .................................. 239 ADD_MONTHS function .................... 270 aggregate functions .......................... 232 ALL PRIVILEGES 절 ............................ 137 ALTER DATABASE statement ............... 18 ALTER INDEX statement ....................... 23 ALTER QUEUE ..................................... 25 ALTER REPLICATION statement ............ 26 ALTER SEQUENCE statement ............... 31 ALTER SESSION statement ................. 208 ALTER SYSTEM statement .................. 210 ALTER TABLE statement ....................... 34 ALTER TABLESPACE statement ............ 47 ALTER TRIGGER statement .................. 51 ALTER USER statement ........................ 53 ALTER VIEW statement ........................ 55 Altibase object .................................... 10 AND .................................................. 318 Arithmetic Operators ......................... 308 AS SELECT ........................................... 91 ASC 절 ................................................ 65 ASCII function ................................... 253 ASCIISTR ........................................... 280 ASIN function .................................... 240 ATAN function .................................. 240 ATAN2 function ................................ 241 AVG function .................................... 232 B BETWEEN .......................................... 325 BIN_TO_NUM function ...................... 280 BINARY_LENGTH function ................. 290 BITAND ............................................. 251 BITNOT .............................................. 252 BITOR ................................................ 251 BITXOR.............................................. 252 BTREE ................................................. 65 C CACHE 절 ..................................... 32, 74 CASCADE ............................................ 91 of DROP TABLE ................................... 123 of DROP USER ..................................... 128 CASCADE CONSTRAINTS ................... 150 CASE WHEN function ........................ 291 CASE2 function ................................. 290 CAST 연산자 ...................................... 313 CBC(Cipher Block Chaining) ............... 302 CEIL function ..................................... 241 CHAR_LENGTH function .................... 253 character functions ............................ 253 CHARACTER_LENGTH function .......... 253 CHR function ..................................... 254 comment............................................... 9 COMMENT statement .......................... 57 COMMIT statement ........................... 212 comparison conditions ....................... 321 CONCAT function .............................. 255 Concatenation Operator .................... 312 CONNECT BY 절 ................................ 177 constraint ............................................ 10 conversion functions .......................... 280 CONVERT .......................................... 281 COS function ..................................... 242 COSH function .................................. 242 COUNT function ................................ 232 CREATE DATABASE statement ............. 59 CREATE DIRECTORY statement ............ 62 CREATE INDEX statement .................... 64 CREATE REPLICATION statement .......... 71 CREATE SEQUENCE statement ............. 73 CREATE SYNONYM statement ............. 80 CREATE TABLE statement .................... 84 CREATE TEMPORARY TABLESPACE statement ........................................ 96 CREATE TRIGGER statement .............. 101 CREATE USER statement .................... 108 CREATE VIEW statement .................... 111 336 SQL User’s Manual CYCLE ........................................... 32, 74 D DATEADD function ............................ 270 DATEDIFF function ............................. 271 DATENAME function ......................... 272 DATEPART function ........................... 273 Datetime Functions ............................ 270 DECODE function .............................. 292 DEFAULT 절 ........................................ 45 DELETE statement.............................. 154 DEQUEUE statement .......................... 204 DES(Data Encryption Standard) .......... 302 DESC 절 .............................................. 65 DESDECRYPT function ....................... 302 DESENCRYPT function ....................... 302 DIGEST function ................................ 293 DIGITS function ................................. 255 directory .............................................. 10 DISABLE .............................................. 41 DROP CONSTRAINT 절 ......................... 41 DROP DATABASE statement .............. 115 DROP DIRECTORY statement ............. 116 DROP INDEX statement...................... 117 DROP PRIMARY KEY ............................ 41 DROP QUEUE statement .................... 118 DROP REPLICATION statement ........... 119 DROP SEQUENCE statement .............. 120 DROP SYNONYM statement............... 121 DROP TABLE statement...................... 123 DROP TABLESPACE statement ........... 125 DROP TRIGGER statement ................. 127 DROP UNIQUE ..................................... 41 DROP USER statement ....................... 128 DROP VIEW statement ....................... 130 DUMP function .................................. 294 E ENABLE ............................................... 41 Encryption Function ........................... 302 ENQUEUE statement .......................... 203 EXCLUSIVE lock mode ........................ 163 execution plan tree ................................ 8 EXISTS ............................................... 325 EXP function...................................... 243 EXTRACT function ............................. 273 F FLOOR function ................................. 243 FOR UPDATE 절 ................................. 179 FORCE of CREATE VIEW .................................. 112 FULL SCAN hint.................................. 157 functions ........................................... 230 G GRANT statement .............................. 131 GREATEST function ........................... 295 GROUP BY 절 .................................... 178 H HAVING 조건 ..................................... 178 HEX_TO_NUM function ..................... 281 Hierarchical query 절 .......................... 176 HINTS ................................ 156, 180, 197 I IGNORE LOOP ................................... 177 IN 328 INCREMENT BY 절 ......................... 32, 74 index ................................................... 10 INDEX ASC hint ................................. 157 INDEX DESC hint ................................ 157 INDEX hint ......................................... 157 INITCAP function ............................... 256 In-line view ........................................ 176 INLIST ................................................ 329 INSERT statement .............................. 159 INSTR function ................................... 256 INSTRB function ................................. 256 INTERSECT set operator ..................... 224 INTERSECT 집합 연산자 ...................... 178 IS NULL .............................................. 330 K keyword .............................................. 12 L LAST_DAY function ........................... 276 찾아보기 337 LEAST function .................................. 295 LENGTH function ............................... 253 LENGTHB function ............................. 260 LEVEL ................................................ 177 LIKE .................................................. 330 LIMIT 절 ............................................ 179 LN function ....................................... 244 LOCK TABLE statement ...................... 162 LOG function..................................... 244 logical conditions ............................... 318 LOWER function ................................ 257 LPAD function ................................... 258 LTRIM function .................................. 259 M MAX function .................................... 233 MAXVALUE 절 .............................. 32, 74 MIN function ..................................... 233 MINUS set operator ........................... 225 MINUS 집합 연산자 ............................ 178 MINVALUE 절................................ 32, 74 MOD function ................................... 245 MONTHS_BETWEEN function ............ 274 N Naming Rule ....................................... 10 NCHR function .................................. 259 NEXT_DAY function .......................... 277 NO ACTION ......................................... 90 NO FORCE of CREATE VIEW.................................. 112 NO INDEX hint ................................... 157 NOT .................................................. 318 NOT NULL ..................................... 41, 90 NOWAIT ............................................ 163 NULL ................................................... 41 NULL ................................................... 89 numeric functions .............................. 239 NVL function ..................................... 297 NVL2 function ................................... 297 O OCT_TO_NUM function ..................... 282 OCTET_LENGTH function ................... 260 OR .................................................... 319 ORDER BY 절 .................................... 178 OUTER JOIN 절 .................................. 175 P parallel_clause ..................................... 66 PERSISTENT ......................................... 90 PERSISTENT 인덱스 변경 ....................... 24 PERSISTENT 절 .............................. 41, 65 POSITION function ............................. 256 POWER function ................................ 245 PRIMARY KEY ..................................... 89 prior 연산자 ....................................... 177 private synonym .................................. 81 public synonym .................................... 81 Q QUICKSTART ....................................... 28 R RANDOM function............................. 246 READ COMMITTED ............................ 218 READ ONLY ....................................... 218 READ WRITE ...................................... 218 RENAME TABLE statement ................. 146 RENAME TO 절 ................................... 41 REPEATABLE READ ............................ 218 REPLACE2 function ............................ 261 REPLICATE function ........................... 261 replication ........................................... 10 reserved word...................................... 12 REVERSE_STR function ...................... 267 REVOKE statement ............................ 148 ROLLBACK statement ........................ 215 ROUND ............................................. 275 ROUND function ................................ 246 ROW EXCLUSIVE lock mode ............... 163 ROW SHARE lock mode ..................... 163 ROWNUM ......................................... 296 RPAD function ................................... 262 RTRIM function .................................. 262 S SAVEPOINT statement ....................... 213 338 SQL User’s Manual SELECT statement .............................. 167 select_list ........................................... 175 SENDMSG function............................ 298 sequence ............................................. 10 SERIALIZABLE .................................... 219 SESSION_ID function .......................... 300 set operators ..................................... 221 SET TRANSACTION statement ............ 218 SHARE lock mode .............................. 163 SHARE ROW EXCLUSIVE lock mode ... 163 SHARE UPDATE lock mode ................ 163 SIGN function .................................... 247 SIN function....................................... 248 SINH function .................................... 248 SIZEOF function ................................. 263 SQL ....................................................... 8 SQL 조건 ........................................... 316 SQL 함수 분류 .................................... 230 SQL 함수 소개 .................................... 230 SQL문 분류 .......................................... 14 SQRT function ................................... 249 START ................................................. 28 START WITH 절 ........................... 74, 176 STDDEV function ............................... 234 STOP ................................................... 28 stored procedure ................................. 10 string functions .................................. 253 STUFF function .................................. 268 subquery ............................................... 8 SUBSTR function ................................ 264 SUBSTRB function .............................. 264 SUBSTRING function .......................... 264 SUM function .................................... 234 SYNC .................................................. 27 synonym .............................................. 10 SYSDATE function ..................... 277, 278 system privilege ................................. 133 T table ................................................... 10 table_constraint ................................... 90 tablespace ........................................... 10 TAN function ..................................... 249 TANH function ................................... 250 TIMESTAMP constraint......................... 43 TO_ NUMBER function ....................... 288 TO_BIN function ................................ 282 TO_CHAR(datetime) function ............. 283 TO_CHAR(number) function .............. 284 TO_DATE function ............................. 285 TO_HEX function ............................... 286 TO_NCHAR(character) ....................... 286 TO_NCHAR(datetime) ........................ 287 TO_NCHAR(number) ......................... 287 TO_OCT function ............................... 289 TRANSLATE function .......................... 265 trigger ................................................. 10 TRIM function .................................... 266 TRUNC(date) function ........................ 278 TRUNC(number) function ................... 250 TRUNCATE TABLE statement .............. 151 U UNION ALL set operator ..................... 223 UNION set operator ........................... 222 UNION(ALL) 집합 연산자 .................... 178 UNIQUE ................................. 65, 89, 332 UNISTR .............................................. 289 UPDATE statement .................... 195, 200 UPPER function.................................. 267 user ..................................................... 10 USER_ID function ............................... 299 USER_NAME function ........................ 300 using_index_clause .............................. 90 V VARIANCE function ........................... 235 view .................................................... 10 W WAIT ................................................. 163 where_clause ..................................... 176 WITH GRANT OPTION ........................ 138 WITH READ ONLY of CREATE VIEW .................................. 113 ㄱ 객체 이름 규칙 ...................................... 10 객체 접근 권한 .................................... 137 찾아보기 339 구간 (BETWEEN) 조건 ........................ 325 그룹 비교조건 ..................................... 323 ㄴ 날짜시간 함수 ..................................... 270 논리 연산자 ........................................ 318 논리 조건 ........................................... 316 논리곱 ................................................ 318 논리합 ................................................ 319 ㄷ 단순 비교조건 ..................................... 321 단항 연산자 ........................................ 309 데이터 정의어(DDL) .............................. 14 데이터 제어어(DCL) .............................. 16 데이터 조작어(DML) ............................. 15 디렉토리 ............................................... 10 ㅁ 문자 함수 ........................................... 253 ㅂ 변환 함수 ........................................... 280 부연질의 ................................................. 8 분석 집계 함수 형태 ............................ 236 분석 함수 ........................................... 236 뷰 10 비교 조건 ........................................... 316 비교조건 ............................................. 321 ㅅ 사용자 .................................................. 10 산술 연산자 ........................................ 308 산술 연산자의 종류 ............................. 308 세션 제어문 .......................................... 16 숫자 함수 ........................................... 239 시노님 .................................................. 10 시스템 권한 ........................................ 133 시스템 제어문 ....................................... 16 시퀀스 .................................................. 10 ㅇ 알티베이스 객체 .................................... 10 암호화 함수 ........................................ 302 연결 연산자 ........................................ 312 연산 순서 ........................................... 226 예약어 .................................................. 12 이중화 .................................................. 10 이항 연산자 ........................................ 310 인덱스 .................................................. 10 ㅈ 저장 프로시저 ....................................... 10 제약조건 ............................................... 10 주석 ....................................................... 9 중첩 함수 ........................................... 300 집계 함수 ........................................... 232 집합 연산자 ........................................ 221 ㅌ 테이블 .................................................. 10 테이블스페이스 ..................................... 10 트랜잭션 제어문 .................................... 16 트리거 .................................................. 10
Release Note
-
- Altibase (ver 7.1.0.0.0) Release Notes (English) ㅣ 2017-07-06
- Tablespace of Table The tablespace storage of a table can be relocated along with the index and LOB column as well. However, only the non-partitioned table is able to transfer the records into the specified tablespace, but the records of the part...
-
미리보기
Altibase 7.1.0.0.0 Release Notes (2016.11) Altibase 7.1.0.0.0 Release Notes Altibase Contents Contents .................................................................................................................... 2 1. Operating System Requirements ........................................................... 3 Minimum Hardware Specifications ................................................ 4 Operating System and Platforms .................................................. 4 2. Release Information ..................................................................................... 5 2.1 New Features and Upgraded function of Altibase 7.1 ............ 6 2.2 Changes ................................................................................ 13 2.3 Packages .............................................................................. 16 2.4 Downloads ............................................................................ 17 Altibase 7.1.0.0.0 Release Notes Altibase 1. Operating System Requirements Altibase 7.1.0.0.0 Release Notes Altibase Minimum Hardware Specifications 1GB RAM (Recommended: 2GB) 1 CPU (Recommended: 2 CPUs) 4GB Sufficient space in hard disk (Recommended: 12GB) Operating System and Platforms Altibase 7.1 operation is available under the operating systems and platforms listed in the following table. OS CPU Version Bit (Server) Bit (Client) AIX PowerPC 6.1 tl03 and higher 64-bit 64-bit HP-UX IA64 11.31 and higher 64-bit 64-bit LINUX x86-64, PowerPC (GNU glibc 2.12 and higher) redhat 6.0 and higher 64-bit 64-bit Java version: Altibase 7.1 is compatible with JDK 1.5 or above. Window server and client is not supported since Altibase 7.1. Altibase 7.1.0.0.0 Release Notes Altibase 2. Release Information Altibase 7.1.0.0.0 Release Notes Altibase 2.1 New Features and Upgraded function of Altibase 7.1 2.1.1 Improved Features 2.1.1.1 SQL Extension Conversion of Non-Partitioned table and Partitioned table(Partition Exchange) CONJOIN TABLE: This statement controls converting a non-partitioned table into a partition of a table. The list partition and range partition are supported, but the hash partitioned is not supported. All the data created in the target table is transferred to the created partition. DISJOIN TABLE: You can use this statement to convert a partition in a partitioned table into a non- partitioned table. The hash partition is not supported whereas the existing partition attributes of the non-partitioned table remain the same. Modifying Tablespace of Table The tablespace storage of a table can be relocated along with the index and LOB column as well. However, only the non-partitioned table is able to transfer the records into the specified tablespace, but the records of the partitioned table cannot be moved. User-defined Columns during Creation of a Queue The user can define a column when creating a queue. Syntax extension of COMPACT and AGING COMPACT and AGING statements can be executed with a partition unit in partitioned tables. NOWAIT and WAIT Options NOWAIT and WAIT options are supported in INSERT, FOR UPDATE, and DEQUEUE statements. NOCOPY option The NOCOPY option can be employed along with parameters and local variables which are used in the stored procedures and the stored functions. This option takes a way of assigning parameters by utilizing the reference value, and only supports ASSOCIATIVE ARRAY type. Overloading of Package Subprogram Overloading of subprograms is available. That is to say, the name of subprograms are the same; however, the name of parameter and data type can be diversely defined. Using BULK COLLECTION in FETCH syntax BULK COLLECT INTO function is supported in the FETCH statement. Static SQL available for using Cursor Not only the dynamic SQL is available, but also the static SQL is available for use in the OPEN FOR clause. Note that the static SQL cannot be executed with the USING clause. Altibase 7.1.0.0.0 Release Notes Altibase Autonomous Transation and Exception Initializing Pragmas Altibase supports the following pragmas specifying compile options. Autonomous transaction pragma allows a PSM object to independently operate within a transaction, and there is an exception initializing pragma which can initialize exception variables with Altibase error code. Aggregate functions and Windows functions Various functions such as, percentage rank, ratio analysis functions, cumulative distribution of a group, array functions, sort functions, coefficient of correlation, sample covariance, and population distribution are supported in the aggregate functions and window functions as below. PERCENT_RANK CUME_DIST RATIO_TO_REPORT NTILE CORR COVAR_SAMP COVAR_POP User Lock functions The following functions are supported in an attempt to request or release the user lock. USER_LOCK_REQUEST USER_LOCK_RELEASE Other functions The following function which returns the context of currently accessed environment is supported. SYS_CONTEXT The functions returning the VARBYTE type character strings through encoding or decoding are supported as follows: BASE64_DECODE BASE64_ENCODE Altibase supports functions which can return VARBAYTE type character strings either by decoding or encoding the VARBYTE type character strings which were converted to Quoted printable format. The functions include as follows: QUOTE_PRINTABLE_DECODE QUOTE_PRINTABLE_ENCODE In addition, exclusive functions based upon the Altibase PIPE method have been added. These functions can efficiently manage overall database not belonging to a specific schema as listed below: MSG_CREATE_QUEUE MSG_DROP_QUEUE MSG_SND_QUEUE MSG_RCV_QUEUE Altibase 7.1.0.0.0 Release Notes Altibase 'UNTIL NEXT DDL' in LOCK TABLE If DDL(Data Definition Language) transaction is executed when a session is on NON- AUTOCOMMIT mode, the autocommit is executed before the DDL execution. However, if EXCLUSIVE mode is specified in the lock_mode, the autocommit is not implemented before the DDL execution. ENABLE and DISABLE functions The user can set the status either to enable or disable when creating triggers, and the ALTER TRIGGER statement can modify the status. 2.1.1.2 Application Interface Improvement JDBC Logging JDBC Logging indicates recording of all sorts of logs occurring in the Altibase JDBC driver, and the relevant logs can be stored by using java.util.logging package. 2.1.1.3 Data Types Support for Date format Altibase supports 'WW2' data format that returns which week of the year regardless of the date. 2.1.1.4 Built-in Functions DBMS Stats Functions The built-in function has been added in this release, and this function can duplicate partition stats. COPY_TABLE_STATS Other Built-in Functions The stored procedures, which can store the setting of V$SESSION information have been added as in the followings: SET_CLIENT_INFO SET_MODULE 2.1.1.5 Client Tools Improved altimon.sh The altimon.sh has been enhanced in order to efficiently monitor the Altibase server and the host system in which the altiMon is installed. altiMon primarily monitors OS information and DB information, and the OS which can use the PICL library is required to collect the OS information. Host Variable The default value of declared host variables has been modified. New ISQL command A command configuring the formatted display for the result of a SELECT column in the iSQL prompt has been added. Altibase 7.1.0.0.0 Release Notes Altibase SET NUMF[ORMAT] COLUMN CL[EAR] COL[UMNS] -prefetch_rows otpion of iLoader utility iLoader utility newly support -prefetch_rows option in the out mode of iLoader. This specify the number of records that can be fetched from the database at once. The default value is 0 which is the maximum size where the network packet can be input. Partition Information Output The DESC command allows to view partition information when viewing the table structure. aexport Property The following properties of aexport utility have been added. ILOADER_ARRAY ILOADER_COMMIT ILOADER_ERRORS ILOADER_PARALLEL 2.1.2 Efficiency 2.1.2.1 Enhanced Server Performance Newly Added Packages The system-defined stored packages newly added in Altibase are as follows. DBMS_ALERT DBMS_APPLICATION_INFO DBMS_CONCURRENT_EXEC DBMS_LOCK DBMS_OUPUT DBMS_RANDOM DBMS_SQL DBMS_STATS DBMS_RECYCLEBIN DBMS_UTILITY UTL_FILE UTL_RAW UTL_TCP Result Cache By using the Result Cache, the intermediate result or the final result of initially executed query can be stored so that the results can be reused when executing the same query again. Two-Phase Commit(2PC)Level of DBLink DB Link provides 2PC protocol to ensure interoperable compatibility of the global transaction conducted between other database system and the Altibase. Altibase 7.1.0.0.0 Release Notes Altibase Collecting of Automatic Statistics Columns that are not referenced from the outside are excluded to reduce the size and accelerate the performance of materialized views. Additional Hints In Altibase 7.1, various and advantageous hints, such as normalization code, join methods, and table access methods as well as parallel query execution have been added. INDEX_ASC INDEX_DESC LEADING NO_EXPAND NO_INDEX NO_PARALLEL NO_USE_HASH NO_USE_MERGE NO_USE_NL NO_USE_SORT USE_CONCAT Delay on Execution Plans A function delaying execution of hierarchy, sorting, windowing, grouping, set, and distinction in fetch is provided based upon execution plan graphs. The user can check the added DELAY plan under the top PROJECTION in the execution plan. IPCDA Protocol IPCDA (Inter Process Communication Direct Attach) is a protocol provided by Altibase to exchange data between the server and client by using shared memory as with IPC. IPCDA can produce much advanced performance by reducing idle time between the server and client as well as simplifying data reading and writing compared to IPC. Like as IPC, CLI and OBDB are supported, but JDBC is not supported. Besides, LOB data cannot be used when using IPCDA. IPCDA is only supported on Linux. The following properties should be configured in order to use IPCDA. ACCESS LIST Management Extension The following ACCESS_LIST_FILE property has been added to allow or deny access of the IP packet described in an external file. ACCESS_LIST_FILE 2.1.2.2 Resource Efficiency Reorganization of Memory Index You can reorganize the index space through integration of leaf nodes in the memory index. This function ensures high space efficiency especially when the index range is relatively greater than that of the data, or there is an occurrence of index fragmentation on a particular index. Altibase 7.1.0.0.0 Release Notes Altibase 2.1.3 High Availability Hybrid Partitioned Table Hybrid partitioned tables are supported in Altibase 7.1, and the partitioned table can transfer data from disk tablespace to memory/volatile tablespace, and vice versa; however, global indexes are not supported. Specifying the size of PSM character data Properties that can determine the size of character data type used in the stored procedures and the stored functions have been added as indicated below. PSM_CHAR_DEFAULT_PRECISION PSM_NCHAR_UTF8_DEFAULT_PRECISION PSM_NCHAR_UTF16_DEFAULT_PRECISION PSM_NVARCHAR_UTF8_DEFAULT_PRECISION PSM_NVARCHAR_UTF16_DEFAULT_PRECISION PSM_PARAM_AND_RETURN_WITHOUT_PRECISION_ENABLE PSM_VARCHAR_DEFAULT_PRECISION The properties specifying the basic size of character type data have been removed as follows. CHAR_DEFAULT_PRECISION NCHAR_DEFAULT_PRECISION NVARCHAR_DEFAULT_PRECISION VARCHAR_DEFAULT_PRECISION REMOTE Functions for Batch Process Altibase 7.1 have included Remote function and the related functions that can batch the database links.The added functions can be used only within the stored procedures. JDBC Adapter JDBC Adapter is an utility which applies modified data in Altibase database to other databases which support JDBC. The structure of this utility is to replicate the modified data to the target database through ALA(Alibase Log Analysis API) and JDBC(Java DataBase Connectivity). As of now, JDBC Adapter is only supported in Linux OS and operates in JRE 7 or higher version. 2.1.4 Other 2.1.4.1 Other Changes Deprecation of Supporting Window Platform Window server and client is not supported since Altibase 7.1. Table Function The TABLE FUNCTION transforms the return values of associative array type or the record type variables into a table form, then output them; however, this is not a function Dynamic SQL Method 4 Method 4 has been added in dynamic SQL. This method allows a user to insert values of parameter Altibase 7.1.0.0.0 Release Notes Altibase markers during the program operation. Functions, such as BIND VARIABLES, SELECT LIST, and ARRAY SIZE SET have been added in Altibase 7.1, and OPEN, FETCH, and EXECUTE functions have been highly improved. Support for JRE 1.5 JDK and JRE 1.5 or above is supported. Elimination of DataPort Data transferring function of DataPort, and convdp utility are no longer supported since they have been eliminated. Support Hibernate Hibernate dialect class is supported for Altibase to provide non-standard SQL. Since the official Hibernate library does not include AltibaseDialect.class, AltibaseDialect.java file should be compiled and ported in order to properly use it. Deprecation of Shared Memory mode Shared memory mode is no longer supported since Altibase version 7.1. The management tool supporting shared memory 'shmutil' and the following properties are not available for use anymore. The management tool supporting shared memory 'shmutil' and properties are not available for use anymore. 2.2 Changes The added, modified, and eliminated functions for database administrators and developers to be informed are explicated in the following sections. Database Versions Database components per the latest version. Altibase Version Database Binary Version Communication protocol Version Meta Version Replication Protocol Version 6.5.1 6.3.1 7.1.3 8.1.1 7.4.2 7.1 6.5.1 7.1.3 8.1.1 7.4.2 Compatibility Database Binary Version The database binary version signifies the compatibility between database image file and log files. Since the format of database image file and log file have been changed, the existing database should be migrated when upgrading the database. Altibase Version Database Binary Version 6.5.1 6.3.1. 7.1 6.5.1 Communication Protocol Version The communication Protocol Version remains the same Altibase Version Communication Protocol Version 6.5.1 7.1.3 7.1 7.1.3 Meta Version The Meta Version has not been changed. Altibase Version Meta Version 6.5.1 8.1.1 7.1 8.1.1 Altibase 7.1.0.0.0 Release Notes Altibase Replication Protocol Version The replication between Altibase 6.5.1 and 7.1 can be performed since the protocol version has not been changed. Altibase Version Replication Protocol Version 6.5.1 7.4.2 7.1 7.4.2 Properties The following properties have been included or eliminated. Refer to the General Reference for in-depth information on each property New Properties in Altibase 7.1 ACCESS_LIST_FILE DBLINK_RECOVERY_MAX_LOGFILE IPCDA_CHANNEL_COUNT IPCDA_DATABLOCK_SIZE IPCDA_FILEPATH LOCK_MGR_CACHE_NODE LOCK_MGR_DETECTDEADLOCK_INTERVAL LOCK_MGR_MAX_SLEEP LOCK_MGR_MIN_SLEEP LOCK_MGR_SPIN_COUNT LOCK_MGR_TYPE LOCK_NODE_CACHE_COUNT MEM_INDEX_KEY_REDISTRIBUTION MEM_INDEX_KEY_REDISTRIBUTION_STANDARD_RATE MSG_QUEUE_PERMISSION OPTIMIZER_AUTO_STATS OPTIMIZER_DELAYED_EXECUTION OPTIMIZER_PERFORMANCE_VIEW PSM_CURSOR_OPEN_LIMIT PSM_CHAR_DEFAULT_PRECISION PSM_NCHAR_UTF8_DEFAULT_PRECISION PSM_NCHAR_UTF16_DEFAULT_PRECISION PSM_NVARCHAR_UTF8_DEFAULT_PRECISION PSM_NVARCHAR_UTF16_DEFAULT_PRECISION PSM_PARAM_AND_RETURN_WITHOUT_PRECISION_ENABLE PSM_VARCHAR_DEFAULT_PRECISION RESULT_CACHE_ENABLE RESULT_CACHE_MEMORY_MAXIMUM TABLE_LOCK_MODE TOP_RESULT_CACHE_MODE Altibase 7.1.0.0.0 Release Notes Altibase USER_LOCK_POOL_INIT_SIZE USER_LOCK_REQUEST_CHECK_INTERVAL USER_LOCK_REQUEST_LIMIT USER_LOCK_REQUEST_TIMEOUT The following property has been eliminated. CHAR_DEFAULT_PRECISION DATAPORT_FILE_DIRECTORY DATAPORT_IMPORT_COMMIT_UNIT DATAPORT_IMPORT_STATEMENT_UNIT IPC_PORT_NO NCHAR_DEFAULT_PRECISION NVARCHAR_DEFAULT_PRECISION SHM_DB_KEY SHM_PAGE_COUNT_PER_KEY STARTUP_SHM_CHUNK_SIZE VARCHAR_DEFAULT_PRECISION Meta Tables The following meta table has been eliminated. SYS_DATA_PORTS_ Performance Views The following performance views have been added. V$ACCESS_LIST V$DBLINK_NOTIFIER_TRANSACTION_INFO The following performance views have been altered. V$DBLINK_LINKER_DATA_SESSION_INFO V$DBLINK_GLOBAL_TRANSACTION_INFO V$DBLINK_REMOTE_STATEMENT_INFO V$DBLINK_REMOTE_TRANSACTION_INFO V$SESSION V$REPSENDER V$REPSENDER_PARALLEL 2.3 Packages OS CPU Archive Name AIX PowerPC altibase- server-7.1.0.0.0-AIX-POWERPC-64bit-release.run altibase- client-7.1.0.0.0-AIX-POWERPC-64bit-release.run HP-UX IA64 altibase- server-7.1.0.0.0-HPUX-IA64-64bit-release.run altibase- client -7.1.0.0.0-HPUX-IA64-64bit-release.run LINUX X86 altibase- server-7.1.0.0.0-LINUX-X86-64bit-release.run altibase- client-7.1.0.0.0-LINUX-X86-64bit-release.run PowerPC altibase- server-7.1.0.0.0-LINUX-POWERPC-64bit-release.run altibase- client-7.1.0.0.0-LINUX-POWERPC-64bit-release.run 2.4 Downloads Location Package http://support.altibase.com Manual http://support.altibase.com Installation Refer to the Altibase Installation Guide for in-depth information.
-
- ALTIBASE HDB (ver 5.5.1.0.0) Release Notes (English) ㅣ 2012-09-26
- TABLESPACE USER_BITMAP_TBS DATAFILE user_bitmap_tbs.dbf EXTENTSIZE 512K SEGMENT MANAGEMENT AUTO; Default Segment management method has changed from FMS (Freelist Managed Segment) to TMS (Treelist Managed Segment). The “SEGMENT MANAGEMENT ...
-
미리보기
ALTIBASE HDB 5.5.1 Release Notes ALTIBASE HDB Release Notes 5.5.1.0.0 ALTIBASE HDB® HDB™ Hybrid RDBMS Table of Contents 1. Abstract 3 1.1 System Requirements 3 1.2 Release Platforms 3 2. Release Information 4 2.1 What is New in ALTIBASE HDB 5.5.1 4 2.2 Changes 5 2.3 Packages 14 2.4 Downloads 14 Location 14 Installation 14 ALTIBASE HDB Release Notes 5.5.1.0.0 ALTIBASE HDB® HDB™ Hybrid RDBMS 1. Abstract 1 .1 S y s t em R equi re m ents Minimum Hardware 512MB RAM (Recommended : 1GB) 1 CPU (Recommended : 2 CPUs) 4GB hard disk space (Recommended : 12GB) 1.2 Supported Operating Systems and Platforms OS CPU Version Bit (Server) Bit (Client) AIX PowerPC 5.3 tl1 or above 64bit 64bit, 32bit HP-UX PA-RISC 11.11 or above 64bit 64bit, 32bit IA64 11.23 or above SUN SPARC 2.8 or above 64bit 64bit, 32bit i86PC 2.10 or above Windows x86, x86-64 Windows 2003 64bit, 32bit 64bit, 32bit LINUX x86, x86-64 (GNU glibc 2.3.4 or lower) SSE2 (intel pentium4 above) AS40 64bit, 32bit 64bit, 32bit ES40 64bit, 32bit 64bit, 32bit x86, x86-64 (GNU glibc 2.4.0 or higher) SSE2 (intel pentium4 above) ES50 64bit, 32bit 64bit, 32bit Java Version: Compatible with JDK 1.4 or later versions for JDBC. ALTIBASE HDB Release Notes 5.5.1.0.0 ALTIBASE HDB® HDB™ Hybrid RDBMS 2. Release Information 2.1 What is New in ALTIBASE HDB 5.5.1 Eager Replication Enhancements - Introduced multi-threading for performance improvements for the sender/receiver processes. - Improved conflict detection and resolution for fail-back in 2-way replication mode. Eliminated the restriction on the GCC Client Library - In the previous version, the programming language of the Client Library was C++. It was changed to C for compatibility on the GCC development environment. IPv6 Support - IPv6 Network interface configuration is required to use this feature. - If the server supports dual stack then the ALTIBASE HDB client will support dual stack. If the server supports IPv6 only, then the ALTIBASE HDB client will support IPv6 only. Disk Spatial Index Support - ALTIBASE HDB provides Spatial Index for DRDB and builds using Bottom-Up method. Enhanced TMS (Treelist Managed Segment) - Enhanced TMS (Treelist Managed Segment) - one of Bitmap-based segment space management methods - proper to OLTP service. - Default segment space management method is changed from FSM (Freelist Managed Segment) to TMS (Treelist Managed Segment). Improved the Scalability on Logging - ALTIBASE HDB supports not only posix but also native of log file group mutex functions to improve the scalability of the Logging. As the result, the performance of Logging is two times faster than that of the previous Logging technique. DataPort support function for upgrading ALTIBASE HDB - There is no Network communication cost since DataPort functions directly downloads and uploads data. Furthermore, translating cost on data type does not exist since DataPort functions store data with the same type format that ALTIBASE HDB uses. Therefore, ALTIBASE HDB maximizes the performance of the data migration by using DataPort functions. Enhanced performance of Direct-Path INSERT function - Direct-Path INSERT function uses the APPEND feature and a separate buffer area. It improves the performance of disk data migration and uploading data to the disk table. Support Foreign Key NoValidate function - If stating the NOVALIDATE phrase when creating a foreign key in the child table, ALTIBASE HDB skips the foreign key validation check in the Parent table. As such, ALTIBASE HDB does not guarantee data consistency. The invalid tables can be viewed in the meta table called SYS_CONSTRAINTS_. Provides DBC(Database Connectivity) in C programming language - The CLI Library is complicated due to many parameters; and it makes many function calls. Therefore, ALTIBASE HDB provides an additional Library called C/DBC. It is easy to use and it is in the programming language C. Provides ALTIBASE HDB Administrative API ALTIBASE HDB Release Notes 5.5.1.0.0 ALTIBASE HDB® HDB™ Hybrid RDBMS - Applications can use the iLoader function and Check Server functions directly via ALTIBASE HDB Administrative APIs. Enhanced OLE DB Provider - Added BLOB data type and geometry data type. - Passed OGC OLE DB Provider test - Connection problem with Delphi is resolved. Adapter for Oracle - ALTIBASE Adapter for Oracle enables replication between an ALTIBASE HDB and an Oracle DB via ALA (Altibase Log Analysis). 2.2 Changes Listed below are added/updated/deleted functions explanations for DBA and developers. Database version updates Updated Database versions ALTIBASE HDB Version Binary database Version Communication Protocol Version Meta Version Replication Protocol Version 5.3.3 5.4.1 5.6.2 5.6.1 5.4.1 5.5.1 5.4.1 5.6.2 5.9.1 5.6.1 Compatibility Binary database version The binary database version indicates the compatibility of database image files and log files. When this value changes, the database must be migrated. Communication protocol version Client programs using ALTIBASE HDB 5.3.3 or above are compatible with the new version. They will connect to ALTIBASE HDB without requiring program rebuilds. For the applications using ALTIBASE HDB 5.3.3 or above, they have to re-link to the ALTIBASE HDB 5.5.1 Library to use IPC connections. ALTIBASE HDB Version CM Protocol Version Client Program Rebuild IPC Client Program Rebuild 5.3.3 5.6.2 XO 5.5.1 5.6.2 X X Meta version The Meta version will be upgraded to 5.9.1 automatically after upgrading ALTIBASE HDB to 5.5.1. Downgrade is not supported. ALTIBASE HDB Release Notes 5.5.1.0.0 ALTIBASE HDB® HDB™ Hybrid RDBMS Replication protocol version Replication between different replication protocol versions is not supported. ALTIBASE HDB Version Replication Protocol Version Compatibility 5.3.3 5.4.1 X 5.5.1 5.6.1 X Client compatibility Application development environment Development Environment Modification C language (ODBC, OLE DB) The spatial data structure has been modified. Therefore, Spatial applications must be modified for ALTIBASE HDB 5.5.1. JAVA ABConnectionPoolDataSource has been renamed to ABPoolingDataSource Changes on DBA utilities Utility Modification ( 5.3.3 to 5.5.1 ) Note iLoader FORM file format iLoader may use the quotation marks(“) on the table name and the column in the FORM file. The previous FORM file is compatible on ALTIBASE HDB 5.5.1. Data file format If there are no changes on the FORM file, iLoader can upload data with the existing data file. Command option iLoader ignores PARALLEL hint in the “INSERT INTO … SELECT” statement. iLoader ignores the -ioparallel option. -array and -commit options are available for the Direct-Path INSERT function. The following values are recommended. array size: 5,000 or higher commit unit: five or higher (set the proper value since a transaction can be aborted in the middle of the process.) Dumpdp (dump DataPage) Problem Tracking function enhancement The name of dumpdp(dumpDataPage) has been changed to dumpci(dump CheckpointImage) File specification argument of dumplf, dumpddf and dumpci utilities have been changed to -f. The help scripts of dumpddf, dumplf and dumpci utilities have been modified. The page logical dump function was added to the dumpddf utility ALTIBASE HDB Release Notes 5.5.1.0.0 ALTIBASE HDB® HDB™ Hybrid RDBMS Utility Modification ( 5.3.3 to 5.5.1 ) Note dumplf (Dump LogFile) Option explanation Before modification Usage : dumplf -f file [-t transactionID] [-s] [-l] After modification Usage : dumplf {-f log_file} [-t transaction_id] [-s] [-l] -f : specify log file name -t : specify transaction id -s : silence log value -l : display log types dumpla (Dump LogAnchor) Option explanation Before modification Usage: dumpla After modification Usage: dumpla loganchor_file dumplf, dumpci, dumpddf, dumpla Output format Naming on the information file of dumplf and dumpla utilities are now consistent. dumplf utility prints out the Log Record body of MMDB(Main Memory DB). The utilities print out more detailed information of the page in MMDB and DRDB. The output of utilities is in Hexa format, and it may be shown in logical structure format. Adapter for Oracle compatibility ALTIBASE Adapter for Oracle is supported with ALTIBASE HDB version 5.5.1.1.4 and above. ALTIBASE HDB version 5.5.1.1.4 is compatible only with oraAdapter version 5.5.1.1.4. Replication between different versions of ALTIBASE and oraAdapter is not supported. ALTIBASE Adapter for Oracle version 5.5.1.1.4 is supported for use with AIX versions 5.3 tl1 and above and Oracle versions 10g r2 and above, which are compatible with the Oracle OCI. Property New ALTIBASE HDB Properties Name Description New Properties DATAPORT_FILE_DIRECTORY The Dataport function uses the value of this property as a default directory to store exported/imported data. DATAPORT_IMPORT_COMMIT_UNIT The value of this property determines how many statements are committed at one Commit command when the DataPort function imports data. DATAPORT_IMPORT_STATEMENT_UNIT The value of this property determines how many rows are processed by one statement when DataPort function imports data. REPLICATION_COMMIT_WRITE_WAIT_ MODE If the value is 1, the Receiver Thread waits until a committed data is synchronized to disk. ALTIBASE HDB Release Notes 5.5.1.0.0 ALTIBASE HDB® HDB™ Hybrid RDBMS Name Description REPLICATION_SERVER_FAILBACK_MA X_TIME If ALTIBASE HDB is in Eager Replication mode, it synchronizes data with the peer server at the start up of service. If the synchronization takes more than the value of this property, ALTIBASE HDB stops the synchronization. Default: 2^32 - 1 seconds) This property may be used to perform a Full Sync manually or give up a Fail-Back. REPLICATION_EAGER_PARALLEL_FAC TOR If ALTIBASE HDB is in Eager Replication mode, many Sender Threads may work in parallel. The value of this property determines how many Sender Threads work in parallel. Default: the smaller value from the following - number of CPU cores - 512 LOG_ALLOC_MUTEX_TYPE This value determines the allocation mutex type. Default: 0(POSIX) 1: NATIVE1 2: NATIVE2 3: NATIVE3 Deleted ALTIBASE HDB properties ALTIBASE HDB properties Description Deleted Properties DIRECT_BUFFER_FLUSH_THREAD_SYN C_INTERVAL This property is now a hidden property since ALTIBASE HDB supports a logic that minimizes I/O bottleneck. DIRECT_PATH_INSERT_TEMP_QUEUE_S IZE The Queue was the bottleneck on the previous Direct-Path INSERT function, and has been removed. DIRECT_PATH_INSERT_TEMP_QUEUE_ WAIT_TIME The Queue was the bottleneck on the previous Direct-Path INSERT function, and has been removed. Modified Properties (5.3.3 => 5.5.1) ALTIBASE HDB properties Description Modified Properties DEFAULT_SEGMENT_MANAGEMENT_T YPE Default Value 0 => 1 INDEX_BUILD_THREAD_COUNT Default Value 2 => 4 IPC_PORT_NO Default Value 8802 => 20350 MULTIPLEXING_THREAD_COUNT Default Value 8 => 4 PARALLEL_LOAD_FACTOR Default Value 4 => 8 TRCLOG_DETAIL_PREDICATE Default Value 1 => 0 REPLICATION_MAX_LOGFILE, REPLICATION_RECOVERY_MAX_LOGFI LE These properties do not affect Eager Replication any longer. REPLICATION_SERVICE_WAIT_MAX_LI MIT This property does not affect Eager Replication any longer. ALTIBASE HDB Release Notes 5.5.1.0.0 ALTIBASE HDB® HDB™ Hybrid RDBMS Performance View New Performance View Name Description V$REPGAP_PARALLEL (Expansion to V$REPGAP) It extends V$REPGAP to show the Replication Gap information of parallel Replication Objects. Added Column PARALLEL_ID: Each Sender/Receiver Thread has a separate ID. CURRENT_TYPE: The type of Replication Sender/Receiver Thread Removed Column and START_FLAG: CURRENT_TYPE replaced it. V$REPRECEIVER_PARALLEL (Expansion to V$REPRECEIVER) It extends V$REPRECIEVER to show information of parallel Replication Receiver Threads. Added Column PARALLEL_ID: Each Sender/Receiver Thread has a separate ID. V$REPRECEIVER_TRANSTBL_PARALLE L (Expansion to V$REPRECEIVER_TRANSTBL) It extends V$REPRECIVER_TRANSTBL to show the information of Transaction Tables for the parallel Receiver Threads. Added Column PARALLEL_ID: Each Sender/Receiver Thread has a separate ID. V$REPSENDER_PARALLEL (Expansion to V$REPSENDER) It extends V$REPSENDER to show information of parallel Replication Sender Threads. Added Column PARALLEL_ID: Each Sender/Receiver Thread has a separate ID. CURRENT_TYPE: The type of Replication Sender/Receiver Thread Removed Column ACT_REPL_MODE: The value of this column does not change on ALTIBASE HDB 5.5.1. START_FLAG: CURRENT_TYPE replaced it. V$REPSENDER_TRANSTBL_PARALLEL (Expansion to V$REPSENDER_TRANSTBL) It extends V$REPSENDER_TRANSTBL to show information of Transaction Tables for parallel Sender Threads. Added Column PARALLEL_ID: Each Sender/Receiver Thread has a separate ID. CURRENT_TYPE: The type of Replication Sender/Receiver Thread Removed Column START_FLAG: CURRENT_TYPE replaced it. ALTIBASE HDB Release Notes 5.5.1.0.0 ALTIBASE HDB® HDB™ Hybrid RDBMS Name Description V$DIRECT_PATH_INSERT COMMIT_TX_COUNT : Total number of transactions successfully committed using the Direct-Path INSERT function. ABORT_TX_COUNT : Total number of transactions aborted using the Direct- Path INSERT function. INSERT_ROW_COUNT : Total number of rows inserted using Direct-Path INSERT function. ALLOC_BUFFER_PAGE_TRY_COUNT : Total number of counts that the Page allocation was requested by the Direct-Path INSERT function. ALLOC_BUFFER_PAGE_FAIL_COUNT : The total numbers of counts that the Page allocation failed using the Direct-Path INSERT function. Error messages (5.3.3 to 5.5.1) Removed Error Messages Message Status Description 0x0002E ( 46) Removed Failed to create a thread object. # *Cause: Internal Bug # *Action: Please send a bug report to the vendor. 0x10146 ( 65862) Removed There are no double write files. Check your properties. # *Cause: DOUBLE_WRITE_DIRECTORY property is modified. # *Action: check your properties. # Server Internal Message Modified Error Messages Message Status Description 0x1101F ( 69663) Before The Maximum size of the data file cannot be less than the current size of it. ( Current Size : <0%ld>, Request Max Size : <1%ld> ) # *Cause: The maximum size of the data file is less than the current size of the data file. # *Action: Please reset the INITSIZE or MAXSIZE of the data file correctly. After The MAXSIZE of data file is less than the current size of it. ( Request Max Size : <0%lu> pages, Current Size : <1%lu> pages ) # *Cause: The MAXSIZE of the data file is less than the current size of the data file. # *Action: Please reset the MAXSIZE of the data file correctly. 0x11020 ( 69664) Before The INITSIZE of a data file exceeds the maximum file size. ALTIBASE HDB Release Notes 5.5.1.0.0 ALTIBASE HDB® HDB™ Hybrid RDBMS Message Status Description After The INITSIZE of a data file exceeds the maximum file size. ( Request Init Size : <0%lu> pages, Maximum File Size : <1%lu> pages ) 0x11021 ( 69665) Before The CURRSIZE of a data file exceeds maximum file size. After The CURRSIZE of a data file exceeds maximum file size. ( Request Cur Size : <0%lu> pages, Maximum File Size : <1%lu> pages ) 0x11022 ( 69666) Before The MAXSIZE of data file exceeds maximum file size. ( Request Max Size : <0%ld>, Max Size : <1%ld>) After The MAXSIZE of data file exceeds maximum file size. ( Request Max Size : <0%lu> pages, Maximum File Size : <1%lu> pages ) 0x11030 ( 69680) Before The data file cannot be extended because the requested size is bigger than the maximum size(<0%d> pages). After The requested size of data file exceeds the maximum file size. ( Request Size : <0%lu> pages, Maximum File size : <1%lu> pages ) 0x11105 ( 69893) Before The data file cannot be extended because the requested size is bigger than the OS file limit size(<0%d> pages). After The requested size of data file exceeds the OS file limit size. ( Request Size : <0%lu> pages, OS File Limit Size : <1%lu> pages ) 0x11122 ( 69922) Before you can not shrink this file. # *Cause: you tried to shirink below HWM. # *Action: Don't do it. After The requested size of data file is less than the used size of data file. ( Request Size : <0%lu> pages, Used File Size : <1%lu> pages ) # *Cause: you tried to shrink below HWM. # *Action: Please retry with a greater size. 0x11124 ( 69924) Before you can't even make one extent. # *Action: You know what to do. After The INITSIZE of data file is less than the minimum file size. ( Request Init Size : <0%lu> pages, Minimum File Size : <1%lu> pages ) # *Action: Please retry with a greater size. 0x11128 ( 69928) Before the size is too small to make an extent. After The requested size of data file is less than the minimum file size. ( Request Size : <0%lu> pages, Minimum File Size : <1%lu> pages ) 0x61055 ( 397397) Before Memory allocation failure After Memory allocation failure [Function=<0%s>, Variable=<1%s>] 0x6200F ( 401423) Before [Sender] Stop sender thread <0%s> at [<1%ld>], Restart SN[<2%ld>] After [Sender] Stop sender thread <0%s>:<1%d> at [<2%ld>], Restart SN[<3%ld>] 0xB107C ( 725116) Before Memory allocation failure After Memory allocation failure [Function=<0%s>, Variable=<1%s>] ALTIBASE HDB Release Notes 5.5.1.0.0 ALTIBASE HDB® HDB™ Hybrid RDBMS Modified SQL syntax Name Description Option changed: ALTER SESSION SET REPLICATION= Either DEFAULT or NONE can be used for this SQL statement. Other values (LAZY, ACKED and EAGER) are not supported. Removed SQL: ALTER REPLICATION SET MODE = ALTER REPLICATION replication_name SET MODE {LAZY|ACKED|EAGER}; This SQL statement changes the replication mode, but it is not supported anymore. Replication mode cannot be changed in 5.5.1. CREATE TABLESPACE USER_BITMAP_TBS DATAFILE user_bitmap_tbs.dbf EXTENTSIZE 512K SEGMENT MANAGEMENT AUTO; Default Segment management method has changed from FMS (Freelist Managed Segment) to TMS (Treelist Managed Segment). The “SEGMENT MANAGEMENT AUTO” phrase can be omitted. The default value of EXTENTSIZE has changed from 256K to 512K for both FMS and TMS. CREATE TABLESPACE USER_FREELIST_TBS DATAFILE user_freelist_tbs.dbf EXTENTSIZE 512K SEGMENT MANAGEMENT MANUAL; FMS must be explicitly stated. Restrictions DataPort Function Description Same table schema must exist to import data. If one of following is different, the DataPort function cannot import data; column position, number, precision and scale. It is impossible to import/export on the encrypted tables. Encryption must be removed by ALTER statement in order to import/export data. Importing/Exporting can be performed on the new tables made by the CTAS (Create Table As Select) statement on the encrypted tables. Importing is not possible on tables that have a trigger, foreign key, index and a not null column. Furthermore, importing cannot be performed on the tables in the Replication Object. The DataPort function does not validate all the above restrictions before execution. Therefore, invalid data can be inserted if the restrictions listed above exist on the tables. Data must be imported after resolving the restrictions. Restrictions must be applied after DataPort function finishes the work. Eager Replication Functionality Description DDL on Replication On-line The Receiver Thread stops while ALTIBASE HDB performs DDL. In this case, Data Conflict may occur. Selection Replication It is a data filtering function, and is a proper function for ALA. Off-Line Replicator Data Conflict and replication gap does not occur in Eager Replication mode. Lazy/Acked Replication If the local server is in Eager Replication mode, the peer server must be in Eager Replication mode. Otherwise, Data Conflict may occur. ALTIBASE HDB Release Notes 5.5.1.0.0 ALTIBASE HDB® HDB™ Hybrid RDBMS Functionality Description Replication Give-up The value of REPLICATION_MAX_LOGFILE must not be set in Eager Replication mode since ALTIBASE HDB deletes logfiles if Replication Give-up occurs; Replication Give-up occurs when the existing numbers of logfiles are larger than the value of REPLICATION_MAX_LOGFILE. ALTIBASE HDB deletes all logfiles not required to resolve the Data Conflict. Max Rows The Max Rows restriction may fail a commit command, so it must not be used in Eager Replication mode. Data Conflict cannot be resolved if a commit command fails. Other Modifications on management of storage space ALTIBASE HDB Version Description ALTIBASE HDB 5.3.3 or below ALTIBASE HDB 5.3.3 or below does not support Non-Autocommit mode in the Direct-Path INSERT function. Therefore, the maximum storage space that the Direct-Path INSERT function uses is as follows. Number of Threads * Number of partitions * Number of Pages per Extent ALTIBASE HDB 5.3.5 or above The Direct-Path INSERT function allocates a new Page for every Cursor although an empty space may exist in the allocated Pages due to the characteristic of Buffer management. Furthermore, the Direct-Path INSERT function uses the APPEND method, and the APPEND method allocates a new Extent for each transaction start; although empty Pages exist before the HWM (High Water Mark). As a result, some storage space is wasted. The total space that the Direct-Path INSERT function uses for one transaction can be calculated as the following. (n: number of rows to insert, a: array size, c: commit unit) {(Page Size*[n/a])+(NEXTEXTENTS*(Number of Pages per Extent)*[nla/c])}}*Number of partitions Direct-Path INSERT function on different ALTIBASE HDB versions Column Name Description ALTIBASE HDB 5.3.3 or below The Non-Autocommit mode is not supported, and the value of commit unit is fixed to 1. Furthermore, the performance of Direct-Path INSERT function is slower than that of the ATOMIC INSERT. Therefore, it is not recommended to use this function. ALTIBASE HDB 5.3.5 The Non-Autocommit mode is supported. In the iLoader, the performance of Direct-Path INSERT function is generally faster than that of ATOMIC INSERT. (In some environments and schemas, the performance is slower.) Therefore, it is recommended to use this function. ALTIBASE HDB 5.5.1 The Non-Autocommit mode is supported, and the push method has been improved. The performance of the Direct-Path INSERT function is much faster than that of ATOMIC INSERT. Therefore, it is recommended to use this function. ALTIBASE HDB Release Notes 5.5.1.0.0 ALTIBASE HDB® HDB™ Hybrid RDBMS 2.5 Packages OS Version CPU Archive Name AIX 5.3 powerPC altibase-server-5.5.1.0-AIX-POWERPC-64bit-release.run altibase-client-5.5.1.0-AIX-POWERPC-32bit-release. run altibase-oraAdapter-5.5.1.1.4-AIX-POWERPC-32bit-release. run HP-UX 11.11 PA-RISC altibase-server-5.5.1.0-hpux-PA-RISC-64bit-release. run altibase-client-5.5.1.0-hpux-PA-RISC-32bit-release. run 11.23 IA64 altibase-server-5.5.1.0-hpux-IA64-64bit-release. run altibase-client -5.5.1.0-hpux-IA64-32bit-release. run Solaris 2.8 SPARC altibase-server-5.5.1.0-SOLARIS-SPARC-64bit-release. run altibase-client-5.5.1.0-SOLARIS-SPARC-32bit-release. run 2.10 X86 altibase-server-5.5.1.0-SOLARIS-X86-64bit-release. run altibase-client-5.5.1.0-SOLARIS-X86-32bit-release. run Linux/glibc ES40-x64 X86 altibase-server-5.5.1.0-LINUX-X86-64bit-release. run altibase-server-5.5.1.0-LINUX-X86-32bit-release. run altibase-client-5.5.1.0-LINUX-X86-32bit-release. run Windows 2003 X86 altibase-server-5.5.1.0-WIN_NT-X86-64bit-release.exe altibase-server-5.5.1.0-WIN_NT-X86-32bit-release. exe altibase-client -5.5.1.0-WIN_NT-X86-32bit-release. exe 2.6 Downloads Location Packages http://www.altibase.com/ Manual http://www.altibase.com/ Installation Refer to Installation User's Manual.
Patch Note
-
- ALTIBASE HDB v.6.3.1.11.4 Patch Notes (Korean) ㅣ 2020-05-13
- ALTIBASE HDB 6.3.1.11.4 Patch Notes ALTIBASE HDB Patch Notes 6.3.1.11.4 2 / 30 목차 BUG-47647 오류없이 쿼리수행이 성공한 경우에도, The tablespace does not have enough free space ( TBS Name : ). 에러가 기록됩니다. ......
-
미리보기
ALTIBASE HDB 6.3.1.11.4 Patch Notes ALTIBASE HDB Patch Notes 6.3.1.11.4 2 / 30 목차 BUG-47647 오류없이 쿼리수행이 성공한 경우에도, The tablespace does not have enough free space ( TBS Name : ). 에러가 기록됩니다. ....... 4 BUG-47690 INLIST 조건에 복합 Index를 사용할 경우 비정상 종료할 수 있습니다. ............................................................................................................... 5 BUG-47693 CLOB 컬럼에 empty 데이터가 있는 경우 조회 결과가 틀립니다 .. 9 BUG-47702 연산자가 있을 경우 Selectivity가 1인 INDEX에 대한 잘못된 index 선택 오류 ................................................................................................ 11 BUG-47714 cmERR_ABORT_SELECT_ERROR 에러 발생시 CLI 메모리가 증가합니다. ......................................................................................................... 13 BUG-47715 redo log가 누락되는 현상이 발생하여 recovery 에서 실패합니다. ................................................................................................................................ 14 BUG-47727 v$transaction 에 undo ?행 상태 모니터링 컬럼 추가 .................... 15 BUG-47730 table drop시 drop된 테이블의 페이지가 반납되지않고 사용불가능 할 수 있다. .................................................................................. 17 BUG-47732 empty lob을 PSM 내부에서 select 할 때 에러 발생합니다 .......... 19 BUG-47734 INDEX Scan시 문자 사이에 탭이 있을 경우, 데이터가 조회되지 않는 문제가 있습니다. ................................................................................... 21 BUG-47735 2개 이상의 session으로 Disk LOB insert 중 deadlock 으로 hang 발생. ...................................................................................................................... 22 BUG-47736 uniqueness가 깨? memory index 있는 경우에 서버를 띄우면 안됩니다. ............................................................................................................. 23 BUG-47745 sdcRow::makeTrailingNullUpdateInfo()의 디버깅 정보 출력 위치 변경. ...................................................................................................................... 24 BUG-47752 LEFT OUTER JOIN 오른쪽이 집합 연산을 포함한 인라인 뷰이고 ON 절이 OR 조건으로 구성된 경우 Altibase 서버가 비정상 종료합니다. ......................................................................................................... 25 ALTIBASE HDB Patch Notes 6.3.1.11.4 3 / 30 BUG-47754 중단된 log record로 Recovery를 시도하는 경우, 비정상 종료 할 수 있습니다. ....................................................................................................... 27 BUG-47758 트랜잭션 고립화 수준(isolation level)에 따라 CONNECT BY 절을 포함한 SQL 수행 시 Altibase 서버가 비정상 종료할 수 있습니다. ................................................................................................................................ 28 BUG-47772 ansi style inner join에 index NL을 사용하고 아우터 테이블에 full scan 힌트를 사용하는 경우 결괏값이 달라집니다. .................... 29 ALTIBASE HDB Patch Notes 6.3.1.11.4 3 / 30 ALTIBASE HDB Patch Notes 6.3.1.11.4 4 / 30 BUG-47647 오류없이 쿼리수행이 성공한 경우에도, The tablespace does not have enough free space ( TBS Name : ). 에러가 기록됩니다. Module sm-disk-resource Category Message Error 재현빈도 Always Reproducing Conditions 재현절차 N/A 수행결과 N/A 예상결과 N/A 증상 Undo tablespace는 max size까지 확장된 후에도 Free page를 할당 받을 수 있습니다. 그러나 max size에 도달하기? 해도 altibase_sm.log에 The tablespace does not have enough free space ( TBS Name : ).에러가 기록되는 문제가 있습니다. 해당 에러메시지는 free page를 더이상 할당 받을 수 없을때 출력하도록 수정합니다. 또한 내부적으로 undo page 할당이 실패한 경우와 TSS(Transaction Status Slot) page 할당 실패를 구별하여 에러를 출력하도록 수정합니다. * undo page 할당 실패시 : The tablespace does not have enough free space ( TBS Name : ). Undo Page allocation failed. * TSS page 할당 실패시: The tablespace does not have enough free space ( TBS Name : ). TSS Page allocation failed. 변경사항 Performance View N/A Property N/A Compile Option N/A Error Code N/A Workaround N/A ALTIBASE HDB Patch Notes 6.3.1.11.4 5 / 30 BUG-47690 INLIST 조건에 복합 Index를 사용할 경우 비정상 종료할 수 있습니다. Module qp Category Fatal 재현빈도 Always Reproducing Conditions 재현절차 drop table t1; CREATE TABLE t1 ( FCT_CODE VARCHAR(30) NOT NULL, PLANT_CODE VARCHAR(30) NOT NULL, LRNK_PARTS_CODE VARCHAR(30) NOT NULL ); create index idx01 on t1 ( FCT_CODE, PLANT_CODE, LRNK_PARTS_CODE ); insert into t1 values ( 'C5H0A', 'P516','''2203-007449'''); insert into t1 values ( 'C5H0A', 'P516','''GH63-14327A'''); insert into t1 values ( 'C5H0A', 'P516','''GH82-07284A'''); insert into t1 values ( 'C5H0A', 'P516','''GH82-13952A'''); insert into t1 values ( 'C5H0A', 'P516','''GH82-13952A'''); insert into t1 values ( 'C5H0A', 'P516','''GH82-13970A'''); insert into t1 values ( 'C5H0A', 'P516','''GH82-15493A'''); insert into t1 values ( 'C5H0A', 'P516','''GH94-16242A'''); insert into t1 values ( 'C5H0A', 'P516','''GH96-12150A'''); insert into t1 values ( 'C5H0A', 'P516','''GH96-12150B'''); insert into t1 values ( 'C5H0A', 'P516','''GH96-12150C'''); insert into t1 values ( 'C5H0A', 'P516','''GH96-12150D'''); insert into t1 values ( 'C5H0A', 'P516','''GH96-12151A'''); insert into t1 values ( 'C5H0A', 'P516','''GH96-12151B'''); insert into t1 values ( 'C5H0A', 'P516','''GH96-12151C'''); insert into t1 values ( 'C5H0A', 'P516','''GH96-12151D'''); insert into t1 values ( 'C5H0A', 'P516','''GH96-12152A'''); insert into t1 values ( 'C5H0A', 'P516','''GH96-12152B'''); insert into t1 values ( 'C5H0A', 'P516','''GH96-12152C'''); ALTIBASE HDB Patch Notes 6.3.1.11.4 6 / 30 insert into t1 values ( 'C5H0A', 'P516','''GH96-12194A'''); insert into t1 values ( 'C5H0A', 'P516','''GH96-12664A'''); insert into t1 values ( 'C5H0A', 'P516','''GH96-12665A'''); insert into t1 values ( 'C5H0A', 'P516','''GH96-12666A'''); insert into t1 values ( 'C5H0A', 'P516','''GH96-12667A'''); insert into t1 values ( 'C5H0A', 'P516','''GH96-12671A'''); insert into t1 values ( 'C5H0A', 'P516','''GH96-12671B'''); insert into t1 values ( 'C5H0A', 'P516','''GH96-12671C'''); insert into t1 values ( 'C5H0A', 'P516','''GH96-12671D'''); insert into t1 values ( 'C5H0A', 'P516','''GH96-12671F'''); insert into t1 values ( 'C5H0A', 'P516','''GH96-12672A'''); insert into t1 values ( 'C5H0A', 'P516','''GH96-12672B'''); insert into t1 values ( 'C5H0A', 'P516','''GH96-12672C'''); insert into t1 values ( 'C5H0A', 'P516','''GH96-12672D'''); insert into t1 values ( 'C5H0A', 'P516','''GH96-12841A'''); insert into t1 values ( 'C5H0A', 'P516','''GH96-12841B'''); insert into t1 values ( 'C5H0A', 'P516','''GH96-12841D'''); insert into t1 values ( 'C5H0A', 'P516','''GH96-12841E'''); insert into t1 values ( 'C5H0A', 'P516','''GH96-12861C'''); insert into t1 values ( 'C5H0A', 'P516','''GH96-12946A'''); insert into t1 values ( 'C5H0A', 'P516','''GH96-12946B'''); insert into t1 values ( 'C5H0A', 'P516','''GH96-12946D'''); insert into t1 values ( 'C5H0A', 'P516','''GH96-12946E'''); insert into t1 values ( 'C5H0A', 'P516','''GH96-13048A'''); insert into t1 values ( 'C5H0A', 'P516','''GH96-13048B'''); insert into t1 values ( 'C5H0A', 'P516','''GH96-13048C'''); SELECT /*+NO_SERIAL_FILTER */A.LRNK_PARTS_CODE FROM t1 A WHERE FCT_CODE = 'C5H0A' AND PLANT_CODE = 'P516' AND INLIST (A.LRNK_PARTS_CODE, '''2203-007449'',''GH63- 14327A'',''GH82-07284A'',''GH82-13952A'',''GH82-13952A'',''GH82- 13970A'',''GH82-15493A'',''GH94-16242A'',''GH96-12150A'',''GH96- 12150B'',''GH96-12150C'',''GH96-12150D'',''GH96-12151A'',''GH96- 12151B'',''GH96-12151C'',''GH96-12151D'',''GH96-12152A'',''GH96- ALTIBASE HDB Patch Notes 6.3.1.11.4 7 / 30 12152B'',''GH96-12152C'',''GH96-12194A'',''GH96-12664A'',''GH96- 12665A'',''GH96-12666A'',''GH96-12667A'',''GH96-12671A'',''GH96- 12671B'',''GH96-12671C'',''GH96-12671C'',''GH96-12671D'',''GH96- 12671F'',''GH96-12672B'',''GH96-12672B'',''GH96-12672C'',''GH96- 12672C'',''GH96-12672D'',''GH96-12672D'',''GH96-12841A'',''GH96- 12841A'''); 수행결과 [ERR-91015 : Communication failure.] 예상결과 LRNK_PARTS_CODE ---------------------------------- '2203-007449' 'GH63-14327A' 'GH82-07284A' 'GH82-13952A' 'GH82-13952A' 'GH82-13970A' 'GH82-15493A' 'GH94-16242A' 'GH96-12150A' 'GH96-12150B' 'GH96-12150C' 'GH96-12150D' 'GH96-12151A' 'GH96-12151B' 'GH96-12151C' 'GH96-12151D' 'GH96-12152A' 'GH96-12152B' 'GH96-12152C' 'GH96-12194A' 'GH96-12664A' 'GH96-12665A' 'GH96-12666A' 'GH96-12667A' 'GH96-12671A' 'GH96-12671B' ALTIBASE HDB Patch Notes 6.3.1.11.4 8 / 30 'GH96-12671C' 'GH96-12671D' 'GH96-12671F' 'GH96-12672B' 'GH96-12672C' 'GH96-12672D' 'GH96-12841A' 33 rows selected. 증상 INLIST 조건에 복합 Index를 사용할 경우 비정상 종료 할 수 있어, 수정하였습니다. 변경사항 Performance View N/A Property N/A Compile Option N/A Error Code N/A Workaround not use index or use one index ALTIBASE HDB Patch Notes 6.3.1.11.4 9 / 30 BUG-47693 CLOB 컬럼에 empty 데이터가 있는 경우 조회 결과가 틀립니다 Module qp-select Category Functional Error 재현빈도 Always Reproducing Conditions 재현절차 drop table tt; create table tt(i1 int,i2 clob); INSERT INTO TT VALUES ( 1, 'ABCDEFG1' ); INSERT INTO TT VALUES ( 2, empty_clob() ); INSERT INTO TT VALUES ( 3, null ); INSERT INTO TT VALUES ( 11, 'ABCDEFG2' ); INSERT INTO TT VALUES ( 12, empty_clob() ); INSERT INTO TT VALUES ( 13, null ); INSERT INTO TT VALUES ( 21, 'ABCDEFG3' ); INSERT INTO TT VALUES ( 22, empty_clob() ); INSERT INTO TT VALUES ( 23, null ); select * from tt where i2 = 'ABCDEFG1'; 수행결과 iSQL> select * from tt where i2 = 'ABCDEFG1'; I1 I2 ---------------------------------------------- 1 ABCDEFG1 2 2 rows selected. 예상결과 iSQL> select * from tt where i2 = 'ABCDEFG1'; I1 I2 --------------------------------------------- 1 ABCDEFG1 1 row selected. 증상 CLOB 컬럼에 empty 데이터가 있는 경우 조회 결과가 틀리는 현상 수정 변경사항 Performance View N/A Property N/A Compile Option N/A Error Code N/A ALTIBASE HDB Patch Notes 6.3.1.11.4 10 / 30 Workaround . ALTIBASE HDB Patch Notes 6.3.1.11.4 11 / 30 BUG-47702 연산자가 있을 경우 Selectivity가 1인 INDEX에 대한 잘못된 index 선택 오류 Module qp Category Functional Error 재현빈도 Always Reproducing Conditions 재현절차 drop table t_zone_cell; create table t_zone_cell ( ZONE_CODE VARCHAR(20) NOT NULL, FILE_TYPE VARCHAR(5) , CUID VARCHAR(10) NOT NULL, LOCATION_ID VARCHAR(14) NOT NULL, BTS_NAME VARCHAR(128) VARIABLE , DATE DATE NOT NULL, CREATE_DATE DATE , STATUS CHAR(1) NOT NULL, ZONE_ID VARCHAR(6) ); alter table t_zone_cell add primary key(ZONE_CODE, LOCATION_ID); create index IX_ZONE_CELL on t_zone_cell(STATUS); insert into t_zone_cell select rownum, 'A', 'A', 'A', 'A', sysdate, sysdate, 'M', 'A' from dual connect by level < 201236; exec GATHER_TABLE_STATS( 'SYS', 't_zone_cell' ); alter session set explain plan = on; alter system set trclog_detail_predicate=1; alter system set TRCLOG_EXPLAIN_GRAPH = 1; select * from t_zone_cell WHERE ZONE_CODE = 'a' AND FILE_TYPE = 'a' AND LOCATION_ID = 'a' AND STATUS 'D' ; 수행결과 use index ix_zone_cell 예상결과 use pk index 증상 연산자가 있을 경우 Selectivity가 1인 INDEX에 대한 잘못된 index 선택 오류 수정 ALTIBASE HDB Patch Notes 6.3.1.11.4 12 / 30 변경사항 Performance View N/A Property N/A Compile Option N/A Error Code N/A Workaround NO INDEX ( t_zone_cell, IX_ZONE_CELL ); ALTIBASE HDB Patch Notes 6.3.1.11.4 13 / 30 BUG-47714 cmERR_ABORT_SELECT_ERROR 에러 발생시 CLI 메모리가 증가합니다. Module mm-cli Category Memory Error 재현빈도 Always Reproducing Conditions 재현절차 N/A 수행결과 N/A 예상결과 N/A 증상 sqlcli에서 cmERR_ABORT_SELECT_ERROR 에러 발생시, Client의 메모리가 증가하거나, 서버의 응답을 무한 대기(Hang)할 수 있습니다. 이 문제를 해결하기 위해, SQLCLI Library 를 이용한 송수신(send, receive) 단계에서 각종 OS 이상 에러 발생시, 연결을 disconnect 하여 이후의 오동작을 발생하지 않게 합니다. 패치 적용 후에는 이 경우 Client는 Sever와 Connection이 끊기게 되므로 Connection을 다시 해야 합니다. 변경사항 Performance View N/A Property N/A Compile Option N/A Error Code N/A Workaround cmERR_ABORT_SELECT_ERROR 에러 발생시 SQLDisconnect - SQLDriverConnect 로 재연결 후 쿼리 실행. ALTIBASE HDB Patch Notes 6.3.1.11.4 14 / 30 BUG-47715 redo log가 누락되는 현상이 발생하여 recovery 에서 실패합니다. Module sm-disk-recovery Category Fatal 재현빈도 Rare Reproducing Conditions 재현절차 N/A 수행결과 N/A 예상결과 N/A 증상 mini transaction 을 rollback 하는 경우 redo log가 기록되지 않는 문제가 있어, 수정합니다. 변경사항 Performance View N/A Property N/A Compile Option N/A Error Code N/A Workaround N/A ALTIBASE HDB Patch Notes 6.3.1.11.4 15 / 30 BUG-47727 v$transaction 에 undo 진행 상태 모니터링 컬럼 추가 Module sm_transaction Category Functionality 재현빈도 Always Reproducing Conditions 재현절차 N/A 수행결과 N/A 예상결과 N/A 증상 UNDO ?행상태 모니터링이 용이하도록 V$TRANSACTION에 다음 컬럼을 추가한다. * PROCESSED_UNDO_TIME: 언두 시작 시점부터 현재까지 ?행된 시? (초) * ESTIMATED_TOTAL_UNDO_TIME: 언두 완료될 때 까지 추정되는 총 소요 시? (초) * TOTAL_LOG_COUNT 한 트랜잭션의 모든 로그 갯수 * TOTAL_UNDO_LOG_COUNT: 한 트랜잭션에서 앞으로 ?행되야할 총 언두 로그의 갯수 * PROCESSED_UNDO_LOG_COUNT: 한 트랜잭션에서 언두완료된 로그 갯수 변경사항 Performance View V$TRANSACTION 컬럼 추가) * PROCESSED_UNDO_TIME: 언두 시작 시점부터 현재까지 ?행된 시? (초) * ESTIMATED_TOTAL_UNDO_TIME: 언두 완료될 때 까지 추정되는 총 소요 시? (초) * TOTAL_LOG_COUNT 한 트랜잭션의 모든 로그 갯수 * TOTAL_UNDO_LOG_COUNT: 한 트랜잭션에서 앞으로 ?행되야할 총 언두 로그의 갯수 * PROCESSED_UNDO_LOG_COUNT: 한 트랜잭션에서 언두완료된 로그 갯수 Property N/A Compile Option N/A Error Code N/A ALTIBASE HDB Patch Notes 6.3.1.11.4 16 / 30 Workaround N/A ALTIBASE HDB Patch Notes 6.3.1.11.4 17 / 30 BUG-47730 table drop시 drop된 테이블의 페이지가 반납되지않고 사용불가능 할 수 있다. Module sm-disk-page Category Functional Error 재현빈도 Always Reproducing Conditions 재현절차 create tablespace tbs datafile 'tbs00.dbf' size 12M autoextend off; alter tablespace tbs add datafile 'tbs01.dbf' size 12M autoextend off; alter tablespace tbs add datafile 'tbs02.dbf' size 12M autoextend off; alter tablespace tbs add datafile 'tbs03.dbf' size 12M autoextend on maxsize 20M; alter tablespace tbs add datafile 'tbs04.dbf' size 12M autoextend on maxsize 20M; alter tablespace tbs add datafile 'tbs05.dbf' size 12M autoextend on maxsize 20M; create table t1 ( idx integer, data char(7000) ) tablespace tbs; insert into T1 select rownum, rownum from dual connect by level <= 7000; truncate table T1; insert into T1 select rownum, rownum from dual connect by level <= 20000; drop table T1; create table t1 ( idx integer, data char(7000) ) tablespace tbs; 수행결과 [ERR-11123 : The tablespace does not have enough free space ( TBS Name :TBS ).] 예상결과 Create success. 증상 table drop시 내부적으로 drop된 테이블의 페이지가 반납되지 않는 문제가 있어, 수정합니다. 변경사항 Performance View N/A Property N/A Compile Option N/A Error Code N/A ALTIBASE HDB Patch Notes 6.3.1.11.4 18 / 30 Workaround ALTIBASE HDB Patch Notes 6.3.1.11.4 19 / 30 BUG-47732 empty lob을 PSM 내부에서 select 할 때 에러 발생합니다 Module qp-psm-trigger-execute Category Functional Error 재현빈도 Always Reproducing Conditions 재현절차 drop table t1; create table t1(i1 int,c1 clob); insert into t1 values(1, empty_clob()); insert into t1 values(2, 'abc'); insert into t1 values(3, null); create or replace procedure proc2(v1 in integer) as v2 clob; begin select c1 into v2 from t1 where i1 = v1; system_.println('c1 = ' || v2); end; / exec proc2(1); exec proc2(2); exec proc2(3); 수행결과 iSQL> exec proc2(1); [ERR-2100D : Invalid data type length at "SYS.PROC2", line 5] iSQL> exec proc2(2); c1 = abc Execute success. iSQL> exec proc2(3); c1 = Execute success. 예상결과 iSQL> exec proc2(1); c1 = Execute success. iSQL> exec proc2(2); c1 = abc ALTIBASE HDB Patch Notes 6.3.1.11.4 20 / 30 Execute success. iSQL> exec proc2(3); c1 = Execute success. 증상 empty lob을 PSM 내부에서 select 할 때 에러 없이 수행되도록 수정합니다. 변경사항 Performance View N/A Property N/A Compile Option N/A Error Code N/A Workaround . ALTIBASE HDB Patch Notes 6.3.1.11.4 21 / 30 BUG-47734 INDEX Scan시 문자 사이에 탭이 있을 경우, 데이터가 조회되지 않는 문제가 있습니다. Module mt Category Functional Error 재현빈도 Always Reproducing Conditions 재현절차 alter session set explain plan = on; alter session set trclog_detail_predicate = 1; drop table t2; create table t2 as select upja_cd, cp_nm, CP_COM_NM from t1 where cp_nm like '(주)엠서클%'; create index idx11 on t2 ( cp_nm); select * from t2 where cp_nm = '(주)엠서클' and upja_cd = '55'; 수행결과 No rows 예상결과 1 rows selected 증상 INDEX Scan시 문자 사이에 탭이 있을 경우, 잘못 탐색하는 문제가 있어 수정합니다. 변경사항 Performance View N/A Property N/A Compile Option N/A Error Code N/A Workaround update 컬럼 ALTIBASE HDB Patch Notes 6.3.1.11.4 22 / 30 BUG-47735 2개 이상의 session으로 Disk LOB insert 중 deadlock 으로 hang 발생. Module sm-disk-page Category Hang 재현빈도 Frequence Reproducing Conditions 재현절차 N/A 수행결과 N/A 예상결과 N/A 증상 2개 이상의 session으로 Disk LOB insert 중 내부적으로 deadlock이 발생할 수 있어, 수정하였습니다. 변경사항 Performance View N/A Property N/A Compile Option N/A Error Code N/A Workaround N/A ALTIBASE HDB Patch Notes 6.3.1.11.4 23 / 30 BUG-47736 uniqueness가 깨진 memory index 있는 경우에 서버를 띄우면 안됩니다. Module sm-mem-index Category Efficiency 재현빈도 Always Reproducing Conditions 재현절차 N/A 수행결과 N/A 예상결과 N/A 증상 서버 구동시에 memory unique index 에 인덱스 키 중복이 발생해도 정상적으로 startup되는 문제가 있습니다. 키 중복이 발생하는 경우, memory unique index 정보를 출력하고 startup 실패하도록 수정합니다. 기존에 memory unique index 에 키 중복이 있는 고객의 경우, 이번 패치 적용후 startup 이 실패할 수 있습니다. 이 경우, 패치 후 INDEX_REBUILD_AT_STARTUP = 0 으로 starup 후에 altibase_error.log를 확인하여 정리 후 재구동 해야 합니다. 변경사항 Performance View N/A Property N/A Compile Option N/A Error Code N/A Workaround N/A ALTIBASE HDB Patch Notes 6.3.1.11.4 24 / 30 BUG-47745 sdcRow::makeTrailingNullUpdateInfo()의 디버깅 정보 출력 위치 변경. Module sm-disk-collection Category Message Error 재현빈도 Rare Reproducing Conditions 재현절차 N/A 수행결과 N/A 예상결과 N/A 증상 altibase_error.log 에 의미 없는 로그인 [ Column ], [ Value ] 가 반복적으로 기록되는 문제가 있습니다. altibase_dump.log 에 기록되는 로그의 일부가 altibase_error.log 에 출력되고 있어 수정합니다. 변경사항 Performance View N/A Property N/A Compile Option N/A Error Code N/A Workaround N/A ALTIBASE HDB Patch Notes 6.3.1.11.4 25 / 30 BUG-47752 LEFT OUTER JOIN 오른쪽이 집합 연산을 포함한 인라인 뷰이고 ON 절이 OR 조건으로 구성된 경우 Altibase 서버가 비정상 종료합니다. Module qp-select-execute Category Fatal 재현빈도 Always Reproducing Conditions 재현절차 drop table t1; create table t1 ( i1 integer, i2 varchar(10)); insert into t1 values ( 1, 'AAA'); insert into t1 values ( 2, 'BBB'); drop table t2; create table t2 ( TERM_SQ integer, TAXCRE_RT integer, TO_AMT integer ); insert into t2 values(17, 0, 3980000 ); insert into t2 values(17, 0, 4490000 ); SELECT TG.GUBUN_CD, TG.GUBUN_NM FROM ( SELECT i1 AS GUBUN_CD, i2 AS GUBUN_NM FROM t1 ) TG LEFT OUTER JOIN ( SELECT HDI.TERM_SQ, SUM(HDI.TAXCRE_RT) AS NPN_RT FROM t2 HDI GROUP BY HDI.TERM_SQ ) HDI ON (TG.GUBUN_CD = '1' AND HDI.TERM_SQ = 17) OR (TG.GUBUN_CD = '2' AND HDI.TERM_SQ = 18 ) ; 수행결과 [ERR-91015 : Communication failure.] 예상결과 iSQL> SELECT TG.GUBUN_CD, TG.GUBUN_NM FROM ( SELECT i1 AS GUBUN_CD, i2 AS GUBUN_NM FROM t1 ) TG LEFT OUTER JOIN ( ALTIBASE HDB Patch Notes 6.3.1.11.4 26 / 30 SELECT HDI.TERM_SQ, SUM(HDI.TAXCRE_RT) AS NPN_RT FROM t2 HDI GROUP BY HDI.TERM_SQ ) HDI ON (TG.GUBUN_CD = '1' AND HDI.TERM_SQ = 17) OR (TG.GUBUN_CD = '2' AND HDI.TERM_SQ = 18 ) ; GUBUN_CD GUBUN_NM --------------------------- 1 AAA 2 BBB 2 rows selected. 증상 left outer join의 on절이 OR 조건으로 구성되어있고, 오른쪽 view에 aggregation이 존재할 경우 비정상 종료할수 있는 문제를 수정합니다. 변경사항 Performance View N/A Property N/A Compile Option N/A Error Code N/A Workaround N/A ALTIBASE HDB Patch Notes 6.3.1.11.4 27 / 30 BUG-47754 중단된 log record로 Recovery를 시도하는 경우, 비정상 종료 할 수 있습니다. Module sm_recovery Category Fatal 재현빈도 Rare Reproducing Conditions 재현절차 N/A 수행결과 N/A 예상결과 N/A 증상 서버 비정상 종료시 logfile의 마지막 log record는 일부? 기록되다가 멈추게 됩니다. 이후 Reovery수행 중 log record를 확인하는 과정에서, 기록이 중단된 log record는 무시하고 기록이 완료된 log까지 Recovery 합니다. 그런데 log record 를 확인 하는 로직에서 문제가 있어, 기록이 완료되지 않은 log record를 기록완료된 log로 판단하고 recovery를 시도하게 되어 비정상 종료 합니다. log record를 검증하는 코드의 오류를 분석하여, 정확하게 검증하도록 수정하였습니다. 변경사항 Performance View N/A Property N/A Compile Option N/A Error Code N/A Workaround N/A ALTIBASE HDB Patch Notes 6.3.1.11.4 28 / 30 BUG-47758 트랜잭션 고립화 수준(isolation level)에 따라 CONNECT BY 절을 포함한 SQL 수행 시 Altibase 서버가 비정상 종료할 수 있습니다. Module sm_collection Category Fatal 재현빈도 Always Reproducing Conditions 재현절차 drop table T1; create table T1 ( IDX INTEGER , PARENT_IDX INTEGER ) tablespace sys_tbs_disk_data; INSERT INTO T1 VALUES( 1, 0 ); AUTOCOMMIT OFF; SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; SELECT IDX FROM T1 CONNECT BY PRIOR IDX = PARENT_IDX ; 수행결과 iSQL> SELECT IDX FROM T1 CONNECT BY PRIOR IDX = PARENT_IDX ; [ERR-91015 : Communication failure.] 예상결과 iSQL> SELECT IDX FROM T1 CONNECT BY PRIOR IDX = PARENT_IDX ; IDX -------------- 1 1 row selected. 증상 CONNECT BY 의 open cursor 에서 isolation level을 잘못 설정하는 문제가 있어 수정합니다. 변경사항 Performance View N/A Property N/A Compile Option N/A Error Code N/A Workaround alter system set __OPTIMIZER_HIERARCHY_TRANSFORMATION = 1; ALTIBASE HDB Patch Notes 6.3.1.11.4 29 / 30 BUG-47772 ansi style inner join에 index NL을 사용하고 아우터 테이블에 full scan 힌트를 사용하는 경우 결괏값이 달라집니다. Module qp-dml-pvo Category Functional Error 재현빈도 Always Reproducing Conditions 재현절차 DROP TABLE T10 ; DROP TABLE T12 ; CREATE TABLE T10 ( C1 VARCHAR(11)) ; CREATE TABLE T12 ( C1 VARCHAR(11)) ; CREATE INDEX IX_T12_NI01 ON T12 (C1) ; INSERT INTO T10 (C1) VALUES ('1'); INSERT INTO T12 SELECT * FROM T10 ; SELECT /*+ FULL SCAN(Y) USE_INDEX_NL(Y X) */ X.C1 FROM T12 X INNER JOIN T10 Y ON X.C1 = Y.C1 WHERE '70' IS NULL ; 수행결과 C1 --------------- 1 1 row selected. 예상결과 C1 --------------- No rows selected. 증상 ansi style inner join에 index NL을 사용하고 아우터 테이블에 full scan 힌트를 사용하는 경우 결괏값이 달라집니다. 변경사항 Performance View N/A Property N/A Compile Option N/A Error Code N/A Workaround //ansi 스타일 inner join을 사용하지 않습니다. SELECT ALTIBASE HDB Patch Notes 6.3.1.11.4 30 / 30 /*+ FULL SCAN(Y) USE_INDEX_NL(Y X) */ X.C1 FROM T12 X, T10 Y where X.C1 = Y.C1 AND '70' IS NULL ;
-
- ALTIBASE HDB v.6.5.1.7.8 Patch Notes (Korean) ㅣ 2020-07-24
- ALTIBASE HDB 6.5.1.7.8 Patch Notes ALTIBASE HDB Patch Notes 6.5.1.7.8 2 / 35 목차 BUG-47681 core 수가 129개 이상의 장비에서 Disk 테이블의 DML 동시성 테스트 중, The tablespace does not have enough free space ( TBS Name ...
-
미리보기
ALTIBASE HDB 6.5.1.7.8 Patch Notes ALTIBASE HDB Patch Notes 6.5.1.7.8 2 / 35 목차 BUG-47681 core 수가 129개 이상의 장비에서 Disk 테이블의 DML 동시성 테스트 중, The tablespace does not have enough free space ( TBS Name :SYS_TBS_DISK_UNDO ). 오류가 발생합니다. .......... 4 BUG-47786 Inverse Join으로 인해, subquery unnest 시 결과 오류가 발생할 수 있습니다. ...................................................................... 5 BUG-47787 recursive with 구문이 중첩되고 CASE WHEN의 Subquery로 사용될 경우 비정상 종료 할 수 있습니다. ............................. 11 BUG-47806 sm cursor interface 에서 인자 정합성 검사. .......................... 18 BUG-47813 PCB를 LRU List에 등록한 후 PCB에 접근하면 동시성 문제가 발생할 수 있습니다. .......................................................... 19 BUG-47820 start with 구문에 level pseudo column이 사용될 경우 결과값이 틀립니다. ........................................................................ 20 BUG-47836 LEFT OUTER JOIN 시 복합인덱스가 사용되고 OR절 predicate시 사용될 경우 결과 오류가 발생할 수 있습니다. ....................... 22 BUG-47858 같은 객체 이름을 여러 사용자가 생성하면 ALL_CRT_TBL.sql에 잘못된 storage option가 만들어 질 수 있습니다. .................. 25 BUG-47889 altipasswd에서 암호 대소문자 구분이 필요합니다. ................ 27 BUG-47900 이중화 update XSN 시 에러가 발생했을 때 로그에 잘못된 SN값이 기록되고 있습니다. ............................................... 29 BUG-47901 이중화 sendStop 함수에서 timeout 이 발생하여도 timeout 처리가 되지 않습니다. ....................................................... 30 BUG-47910 통계 수집되지 않은 테이블의 unique constraint가 통계에 일부 포함됩니다. ..................................................................... 31 BUG-47917 외부 프로시저 생성구문에서 parsing 오류가 발생하는 경우가 있습니다. ........................................................................ 33 BUG-47948 DROP TABLESPACE memory tablespace 와 V$DATABASE 조회 중 동시성 문제로 인해 서버가 비정상 종료할 수 있습니다. .......... 34 ALTIBASE HDB Patch Notes 6.5.1.7.8 3 / 35 BUG-47970 Disk Index 에서 inconsistent page 에 대해서 page latch가 풀리지 않는 경우가 있습니다. ............................................ 35 ALTIBASE HDB Patch Notes 6.5.1.7.8 3 / 35 ALTIBASE HDB Patch Notes 6.5.1.7.8 4 / 35 BUG-47681 core 수가 129개 이상의 장비에서 Disk 테이블의 DML 동시성 테스트 중, The tablespace does not have enough free space ( TBS Name :SYS_TBS_DISK_UNDO ). 오류가 발생합니다. Module sm-disk-page Category Efficiency 재현빈도 Always Reproducing Conditions 재현절차 N/A 수행결과 N/A 예상결과 N/A 증상 core 개수가 129 이상의 경우 TRANSACTION_SEGMENT_COUNT 프로퍼티(기본값 265)가 무시되고 512로 설정되어 발생하는 문제입니다. TRANSACTION_SEGMENT_COUNT 의 기본값인 256으로 설정되도록 변경합니다. 이 패치의 영향으로 129 core 개수가 129개 이상인 장비에서는 TRANSACTION_SEGMENT_COUNT 프로퍼티가 256으로 변경되니, 기존과 동일하게 유지하려면 해당 프로퍼티의 값은 512로 변경해주어야 합니다. 변경사항 Performance View N/A Property N/A Compile Option N/A Error Code N/A Workaround SCALABILITY_PER_CPU = 1 ALTIBASE HDB Patch Notes 6.5.1.7.8 5 / 35 BUG-47786 Inverse Join으로 인해, subquery unnest 시 결과 오류가 발생할 수 있습니다. Module qp Category Functional Error 재현빈도 Always Reproducing Conditions 재현절차 drop table TB1; drop table TB2; drop table TB3; drop table TB4; drop table TB5; create table TB1( CUST_CODE VARCHAR(30) NOT NULL, SW_VER VARCHAR(50) NOT NULL ) tablespace sys_tbs_disk_data; alter table TB1 add primary key( CUST_CODE ); insert into TB1 values ( 'A', '111'); insert into TB1 values ( 'B', '111'); insert into TB1 values ( 'C', '111'); insert into TB1 values ( 'D', '111'); insert into TB1 values ( 'E', '111'); insert into TB1 values ( 'F', '111'); insert into TB1 values ( 'G', '111'); insert into TB1 values ( 'H', '111'); create table TB2 ( RB_SKU_CODE VARCHAR(30) NOT NULL, DEL_YN VARCHAR(1) NOT NULL, USE_YN VARCHAR(1) NOT NULL ) tablespace sys_tbs_disk_data;; insert into TB2 values ( 'a', 'Y', 'N'); insert into TB2 values ( 'b', 'Y', 'N'); insert into TB2 values ( 'c', 'Y', 'N'); ALTIBASE HDB Patch Notes 6.5.1.7.8 6 / 35 insert into TB2 values ( 'd', 'Y', 'N'); insert into TB2 values ( 'e', 'Y', 'N'); insert into TB2 values ( 'f', 'Y', 'N'); insert into TB2 values ( 'g', 'Y', 'N'); insert into TB2 values ( 'h', 'Y', 'N'); alter table TB2 add primary key( RB_SKU_CODE ); create table TB3 ( FCT_CODE VARCHAR(30) NOT NULL, PLANT_CODE VARCHAR(30) NOT NULL, STRG_ID VARCHAR(50) NOT NULL, RB_SKU_CODE VARCHAR(30) NOT NULL, MIX_REASON_CODE VARCHAR(30) NOT NULL, SW_VER VARCHAR(50) NOT NULL, DEL_YN VARCHAR(1) NOT NULL, USE_YN VARCHAR(1) NOT NULL ) tablespace sys_tbs_disk_data;; insert into TB3 select 'C310A', 'V341', 'SSS'||level, 'SM6G975UZKATMB', '111', 'Z', 'N', 'Y' from dual connect by level < 30; insert into TB3 select 'C310A', 'V341', 'SSS'||'133', 'SM6G975UZKATMB', '111', 'Z', 'N', 'Y' from dual; insert into TB3 select 'C310A', 'V341', 'SSS'||'134', 'SM6G975UZKATMB', '222', 'Z', 'N', 'Y' from dual; insert into TB3 select 'C310A', 'V340', 'SSS'||'11', 'SM6G975UZKATMB', '111', 'Z', 'N', 'Y' from dual; insert into TB3 select 'C310A', 'V340', 'SSS'||'12', 'SM6G975UZKATMB', '222', 'Z', 'N', 'Y' from dual; insert into TB3 select 'C310A', 'V340', 'SSS'||'13', 'SM6G975UZKATMB', '222', 'Z', 'N', 'Y' from dual; insert into TB3 select 'C310A', 'V340', 'SSS'||'14', 'SM6G975UZKATMB', '222', 'Z', 'N', 'Y' from dual; insert into TB3 select 'C310A', 'V340', 'SSS'||'15', 'SM6G975UZKATMB', '111', 'Z', 'N', 'Y' from dual; insert into TB3 select 'C310A', 'V340', 'SSS'||'16', 'SM6G975UZKATMB', '222', 'Z', 'N', 'Y' from dual; ALTIBASE HDB Patch Notes 6.5.1.7.8 7 / 35 insert into TB3 select 'C310A', 'V340', 'SSS'||'17', 'SM6G975UZKATMB', '222', 'Z', 'N', 'Y' from dual; insert into TB3 select 'C310A', 'V340', 'SSS'||'18', 'SM6G975UZKATMB', '222', 'Z', 'N', 'Y' from dual; create table TB4 ( COMM_CODE varchar(30 ), TYPE_CODE varchar(30 ), DEL_YN VARCHAR(1) NOT NULL, USE_YN VARCHAR(1) NOT NULL ) tablespace sys_tbs_disk_data; insert into TB4 select 'SSS'||level, 'PICK_STRG', 'N', 'Y' from dual connect by level < 30; alter table TB4 add primary key( TYPE_CODE, COMM_CODE ); create table TB5( COMM_CODE varchar(30 ), CUST_CODE varchar(30 ), CUST_TYPE_CODE varchar(30), CUST_COMM_CODE varchar(30), COB_MULTI_MIX_REASON_YN varchar(30), DEL_YN VARCHAR(1) NOT NULL, USE_YN VARCHAR(1) NOT NULL, ATTR_C1_CODE varchar(30) )tablespace sys_tbs_disk_data; insert into TB5 values ( '111', '3433418X', 'COBCUST', '111', 'Y', 'N', 'Y', '973'); insert into TB5 values ( '222', '3433418X', 'MULTI_MIX_REASON', '111', 'Y', 'N', 'Y', '973'); insert into TB5 values ( '111', '3433418X', 'MULTI_MIX_REASON', '222', 'Y', 'N', 'Y', '973'); drop index idx1; create index idx1 on TB5 ( CUST_CODE, CUST_TYPE_CODE); SELECT A.DEL_YN, A.USE_YN FROM TB3 A ALTIBASE HDB Patch Notes 6.5.1.7.8 8 / 35 , (SELECT DECODE(COUNT(T2.CUST_COMM_CODE),0,'N','Y') COB_MULTI_MIX_REASON_YN FROM TB5 T1 , TB5 T2 WHERE T1.CUST_CODE = '3433418X' AND T1.CUST_TYPE_CODE = 'COBCUST' AND T2.CUST_CODE = '3433418X' AND T1.DEL_YN = 'N' AND T1.USE_YN = 'Y' AND T2.CUST_TYPE_CODE = 'MULTI_MIX_REASON' AND T2.ATTR_C1_CODE LIKE '%' || '973' || '%' AND T2.DEL_YN = 'N' AND T2.USE_YN = 'Y') G WHERE 1 = 1 AND A.FCT_CODE = 'C310A' AND A.STRG_ID IN (SELECT COMM_CODE FROM TB4 WHERE TYPE_CODE = 'PICK_STRG' AND DEL_YN = 'N' AND USE_YN = 'Y') AND A.RB_SKU_CODE = 'SM6G975UZKATMB' AND ((G.COB_MULTI_MIX_REASON_YN = 'N' AND A.MIX_REASON_CODE = '000') OR (G.COB_MULTI_MIX_REASON_YN = 'Y' AND A.MIX_REASON_CODE IN (SELECT T2.CUST_COMM_CODE FROM TB5 T1 , TB5 T2 WHERE T1.CUST_CODE = '3433418X' AND T1.CUST_TYPE_CODE = 'COBCUST' AND T2.CUST_CODE = '3433418X' AND T1.DEL_YN = 'N' AND T1.USE_YN = 'Y' AND T2.CUST_TYPE_CODE = 'MULTI_MIX_REASON' AND T2.ATTR_C1_CODE LIKE '%' || '973' || '%' AND T2.DEL_YN = 'N' AND T2.USE_YN = 'Y'))) AND ( A.RB_SKU_CODE, A.SW_VER ) NOT IN (SELECT /*+*/ B.RB_SKU_CODE , A.SW_VER FROM TB1 A, TB2 B ALTIBASE HDB Patch Notes 6.5.1.7.8 9 / 35 WHERE B.RB_SKU_CODE = 'x' AND A.CUST_CODE = 'x' AND B.DEL_YN = 'N' AND B.USE_YN = 'Y') AND A.DEL_YN = 'N' AND A.USE_YN = 'Y' ; 수행결과 DEL_YN USE_YN ------------------- N Y N Y N Y N Y N Y N Y 6 rows selected. 예상결과 DEL_YN USE_YN ------------------- N Y N Y N Y N Y N Y N Y N Y N Y N Y N Y N Y N Y N Y N Y N Y N Y N Y N Y N Y ALTIBASE HDB Patch Notes 6.5.1.7.8 10 / 35 N Y N Y N Y N Y N Y N Y N Y N Y N Y N Y N Y N Y N Y N Y N Y N Y N Y N Y 37 rows selected. 증상 2개 이상의 Disk 테이블 JOIN 에서 Where조건에 Subquery가 여러 개 존재하고, OR predicate 으로 Subquery가 사용된 경우, SEMI INVERSE JOIN 이나 ANTI INVERSE JOIN으로 수행되면, 결과값 오류가 발생할 수 있습니다. 해당 경우에 SEMI JOIN 또는 ANTI JOIN에 대해서 INVERSE JOIN이 수행되지 않도록 수정하였습니다. 변경사항 Performance View N/A Property N/A Compile Option N/A Error Code N/A Workaround N/A ALTIBASE HDB Patch Notes 6.5.1.7.8 11 / 35 BUG-47787 recursive with 구문이 중첩되고 CASE WHEN의 Subquery로 사용될 경우 비정상 종료 할 수 있습니다. Module qp Category Fatal 재현빈도 Always Reproducing Conditions 재현절차 drop table CA_ACGRP_LDTL; create table "CA_ACGRP_LDTL" ( "GAAP_CD" VARCHAR(20) fixed not null, "FORM_CD" VARCHAR(80) variable not null, "ACGRP_CD" VARCHAR(80) variable not null, "LANG_CD" VARCHAR(20) fixed not null, "ACGRP_NM" VARCHAR(400) variable not null ); drop table CA_COA_MST; create table "CA_COA_MST" ( "GAAP_CD" VARCHAR(20) fixed not null, "ACCT_CD" VARCHAR(80) variable not null, "ACCT_NM" VARCHAR(400) variable not null, "FULL_ACCT_NM" VARCHAR(800) variable, "DRCR_CD" VARCHAR(20) fixed not null, "ACCT_LV" NUMERIC(3), "ROOT_ACCT_CD" VARCHAR(80) variable, "UP_ACCT_CD" VARCHAR(80) variable, "FILL_YN" VARCHAR(4) fixed default 'N' not null, "ICTR_TP" VARCHAR(20) fixed, "ACCT_FG" VARCHAR(12) fixed default '11' not null, "PRINT_NO" VARCHAR(160) variable default '1' not null ); drop table CA_ACGRP_DTL; create table "CA_ACGRP_DTL" ( "GAAP_CD" VARCHAR(20) fixed not null, "FORM_CD" VARCHAR(80) variable not null, "ACGRP_CD" VARCHAR(80) variable not null, "ACCT_CD" VARCHAR(80) variable not null ALTIBASE HDB Patch Notes 6.5.1.7.8 12 / 35 ); drop table CA_ACGRP_MST; create table "CA_ACGRP_MST" ( "GAAP_CD" VARCHAR(20) fixed not null, "FORM_CD" VARCHAR(80) variable not null, "ACGRP_CD" VARCHAR(80) variable not null, "ACGRP_NM" VARCHAR(400) variable not null, "DRCR_CD" VARCHAR(20) fixed not null, "ACGRP_LV" NUMERIC(3), "UP_GRP_CD" VARCHAR(80) variable, "ACGRP_FG" VARCHAR(20) fixed not null, "PRINT_NO" VARCHAR(160) variable default '1' not null ); drop table CA_COA_LDTL; create table "CA_COA_LDTL" ( "GAAP_CD" VARCHAR(20) fixed not null, "ACCT_CD" VARCHAR(80) variable not null, "LANG_CD" VARCHAR(20) fixed not null, "ACCT_NM" VARCHAR(400) variable not null ); WITH T_ACCTAMT AS ( SELECT GRP.ACGRP_CD AS ACCT_CD, COALESCE(LANG.ACGRP_NM, GRP.ACGRP_NM) AS ACCT_NM, GRP.UP_GRP_CD AS UP_ACCT_CD, GRP.ACGRP_CD, GRP.DRCR_CD, GRP.ACGRP_FG, GRP.ACGRP_LV, NULL AS ACCT_LV, GRP.PRINT_NO AS PRINT_NO_GRP, GRP.PRINT_NO AS PRINT_NO_ACCT, 0 AS DR_AMT_THIS FROM CA_ACGRP_MST GRP LEFT OUTER JOIN CA_ACGRP_LDTL LANG ON LANG.GAAP_CD = GRP.GAAP_CD AND LANG.FORM_CD = GRP.FORM_CD AND LANG.ACGRP_CD = GRP.ACGRP_CD ALTIBASE HDB Patch Notes 6.5.1.7.8 13 / 35 AND LANG.LANG_CD = 'KO' WHERE GRP.ACGRP_LV != '1' AND GRP.GAAP_CD = '1' AND GRP.FORM_CD = 'D0012' AND GRP.ACGRP_FG != '999' UNION ALL SELECT COA.ACCT_CD, NULL AS ACCT_NM, COALESCE(COA.UP_ACCT_CD, DTL.ACGRP_CD) AS UP_ACCT_CD, MST.ACGRP_CD, COA.DRCR_CD, COA.ACCT_FG, NULL AS ACGRP_LV, COA.ACCT_LV, MST.PRINT_NO AS PRINT_NO_GRP, COA.PRINT_NO AS PRINT_NO_ACCT, NULL FROM CA_COA_MST COA INNER JOIN CA_ACGRP_DTL DTL ON DTL.GAAP_CD = COA.GAAP_CD AND DTL.ACCT_CD = COA.ROOT_ACCT_CD AND DTL.FORM_CD = 'D0012' INNER JOIN CA_ACGRP_MST MST ON MST.GAAP_CD = DTL.GAAP_CD AND MST.FORM_CD = DTL.FORM_CD AND MST.ACGRP_CD = DTL.ACGRP_CD WHERE COA.GAAP_CD = '1' AND COA.ACCT_LV = '1' ), T_SUMAMT(ACCT_CD, UP_ACCT_CD, DR_AMT_THIS) AS ( SELECT ACCT_CD, UP_ACCT_CD, DR_AMT_THIS FROM T_ACCTAMT WHERE ACCT_LV IS NOT NULL UNION ALL SELECT PR.ACCT_CD, PR.UP_ACCT_CD, CH.DR_AMT_THIS FROM T_ACCTAMT PR ALTIBASE HDB Patch Notes 6.5.1.7.8 14 / 35 INNER JOIN T_SUMAMT CH ON CH.UP_ACCT_CD = PR.ACCT_CD ), T_BASE_DATA AS ( SELECT COA.ACCT_CD, COA.ACCT_NM, COA.UP_ACCT_CD, COA.ACGRP_CD, COA.DRCR_CD, COA.ACGRP_FG, COA.ACGRP_LV, COA.ACCT_LV, COA.PRINT_NO_GRP, COA.PRINT_NO_ACCT, CASE WHEN COA.DRCR_CD = '1' THEN COALESCE(AMT.DR_AMT_THIS, 0) ELSE COALESCE(AMT.DR_AMT_THIS, 0) - COALESCE(AMT.DR_AMT_THIS, 0) END AS DOCU_AMT_THIS, CASE WHEN COA.DRCR_CD = '1' THEN COALESCE(AMT.DR_AMT_THIS, 0) ELSE COALESCE(AMT.DR_AMT_THIS, 0) - COALESCE(AMT.DR_AMT_THIS, 0) END AS DOCU_AMT_PREV FROM T_ACCTAMT COA LEFT OUTER JOIN ( SELECT ACCT_CD, SUM(DR_AMT_THIS) AS DR_AMT_THIS FROM T_SUMAMT GROUP BY ACCT_CD ) AMT ON AMT.ACCT_CD = COA.ACCT_CD ), T_NET_INCOME AS ( SELECT SUM( CASE WHEN (SELECT DRCR_CD FROM CA_ACGRP_MST WHERE ACGRP_FG = '842' AND GAAP_CD = '1' AND FORM_CD = 'D0012') = BD.DRCR_CD THEN DOCU_AMT_THIS ELSE DOCU_AMT_THIS * (-1) END ) AS DOCU_AMT_THIS, SUM( CASE WHEN (SELECT DRCR_CD FROM CA_ACGRP_MST WHERE ACGRP_FG = '842' AND GAAP_CD = '1' AND FORM_CD = 'D0012') = BD.DRCR_CD ALTIBASE HDB Patch Notes 6.5.1.7.8 15 / 35 THEN DOCU_AMT_PREV ELSE DOCU_AMT_PREV * (-1) END ) AS DOCU_AMT_PREV FROM T_BASE_DATA BD INNER JOIN CA_ACGRP_MST MST ON MST.ACGRP_CD = BD.ACCT_CD AND MST.GAAP_CD = '1' AND MST.FORM_CD = 'D0032' AND MST.ACGRP_LV = '2' ), T_CAP_ACCT(ACCT_CD, UP_ACCT_CD) AS ( SELECT ACCT_CD, UP_ACCT_CD FROM T_ACCTAMT WHERE ACGRP_FG = '821' UNION ALL SELECT A.ACCT_CD, A.UP_ACCT_CD FROM T_ACCTAMT A INNER JOIN T_CAP_ACCT B ON B.ACCT_CD = A.UP_ACCT_CD ), T_GROUP_B AS ( SELECT 'GROUP_B' AS GROUP_CODE FROM T_BASE_DATA BASE INNER JOIN CA_ACGRP_MST MST ON MST.ACGRP_CD = BASE.ACCT_CD AND MST.GAAP_CD = '1' AND MST.FORM_CD = 'D0022' AND MST.ACGRP_LV = '2' ), T_GROUP_C AS ( SELECT 'GROUP_C' AS GROUP_CODE FROM ( SELECT ACCT_CD, CASE WHEN ACGRP_FG = '821' OR ACCT_CD = (SELECT MIN(ACCT_CD) FROM T_BASE_DATA WHERE ACGRP_FG = '826' AND ACCT_CD IN (SELECT ACCT_CD FROM T_CAP_ACCT)) ALTIBASE HDB Patch Notes 6.5.1.7.8 16 / 35 THEN DOCU_AMT_THIS + (SELECT DOCU_AMT_THIS FROM T_NET_INCOME) ELSE DOCU_AMT_THIS END AS DOCU_AMT FROM T_BASE_DATA WHERE ACCT_CD IN ( SELECT ACCT_CD FROM T_CAP_ACCT ) AND ( ACCT_LV IS NULL OR ( ACCT_LV IS NOT NULL AND UP_ACCT_CD = (SELECT MAX(ACGRP_CD) FROM CA_ACGRP_MST WHERE ACGRP_FG = '825' AND FORM_CD = 'D0012') ) ) UNION ALL SELECT CONCAT(ACCT_CD, '1') AS ACCT_CD, DOCU_AMT_THIS FROM T_BASE_DATA WHERE ACCT_CD = ( SELECT MIN(ACCT_CD) FROM T_BASE_DATA WHERE ACGRP_FG = '826' AND ACCT_CD IN (SELECT ACCT_CD FROM T_CAP_ACCT) ) UNION ALL SELECT CONCAT(ACCT_CD, '2') AS ACCT_CD, (SELECT DOCU_AMT_THIS FROM T_NET_INCOME) AS DOCU_AMT FROM T_BASE_DATA WHERE ACCT_CD = ( SELECT MIN(ACCT_CD) FROM T_BASE_DATA WHERE ACGRP_FG = '826' AND ACCT_CD IN (SELECT ACCT_CD FROM T_CAP_ACCT) ) ) ) SELECT GROUP_CODE ALTIBASE HDB Patch Notes 6.5.1.7.8 17 / 35 FROM T_GROUP_B UNION ALL SELECT GROUP_CODE FROM T_GROUP_C; 수행결과 [ERR-31455 : Failed to work because an internal exception occurred from an OS.[Contact Altibase's Support Center]] 예상결과 GROUP_CODE -------------- No rows selected. 증상 __OPTIMIZER_VIEW_TARGET_ENABLE =1로 설정된 환경에서, recursive with 구문이 중첩되고 CASE WHEN의 Subquery로 사용될 경우 비정상 종료하는 문제를 수정합니다. 변경사항 Performance View N/A Property N/A Compile Option N/A Error Code N/A Workaround alter system set __OPTIMIZER_VIEW_TARGET_ENABLE = 0; ALTIBASE HDB Patch Notes 6.5.1.7.8 18 / 35 BUG-47806 sm cursor interface 에서 인자 정합성 검사. Module sm_interface Category Fatal 재현빈도 Rare Reproducing Conditions 재현절차 N/A 수행결과 N/A 예상결과 N/A 증상 내부적으로 sm cursor Interface 에서 파라미터의 null pointer에 대한 예외처리가 누락되어 있어, 비정상 종료 할 수 있습니다. 예외처리를 보강하여, 비정상 종료 하지 않지 않도록 수정합니다. 변경사항 Performance View N/A Property N/A Compile Option N/A Error Code N/A Workaround N/A ALTIBASE HDB Patch Notes 6.5.1.7.8 19 / 35 BUG-47813 PCB를 LRU List에 등록한 후 PCB에 접근하면 동시성 문제가 발생할 수 있습니다. Module mm-plancache Category Assert 재현빈도 Impossible Reproducing Conditions 재현절차 N/A 수행결과 N/A 예상결과 N/A 증상 PCB(Plan Cache Block)를 LRU List에 등록한 후 PCB에 접근하는 경우, 잘못된 메모리를 참조하여 비정상 종료가 발생할 수 있습니다. LRU List에 PCB를 등록한 후에는 PCB에 Thread가 동시 접근하지 못하도록 수정합니다. 변경사항 Performance View N/A Property N/A Compile Option N/A Error Code N/A Workaround N/A ALTIBASE HDB Patch Notes 6.5.1.7.8 20 / 35 BUG-47820 start with 구문에 level pseudo column이 사용될 경우 결과값이 틀립니다. Module qp Category Functional Error 재현빈도 Always Reproducing Conditions 재현절차 drop table t1; create table t1 ( i1 integer , i2 integer ); insert into t1 values ( 0,2 ); insert into t1 values ( 1,2 ); SELECT LEVEL FROM ( select C.start_level, C.end_level from DUAL A, (SELECT i1 start_level, i2 end_level FROM t1 ) C ) B WHERE 1=1 START WITH LEVEL >= B.START_LEVEL CONNECT BY LEVEL >= B.START_LEVEL AND LEVEL <= B.END_LEVEL; 수행결과 LEVEL ----------------------- 1 2 2 1 2 2 6 rows selected. 예상결과 LEVEL ----------------------- 1 2 2 3 rows selected. 증상 start with 구문에 level pseudo column이 사용될 경우 결과오류가 ALTIBASE HDB Patch Notes 6.5.1.7.8 21 / 35 발생하여 수정합니다. 변경사항 Performance View N/A Property N/A Compile Option N/A Error Code N/A Workaround No ALTIBASE HDB Patch Notes 6.5.1.7.8 22 / 35 BUG-47836 LEFT OUTER JOIN 시 복합인덱스가 사용되고 OR절 predicate시 사용될 경우 결과 오류가 발생할 수 있습니다. Module qp Category Functional Error 재현빈도 Always Reproducing Conditions 재현절차 drop table CA_ACGRP_MST; create table "CA_ACGRP_MST" ( "GAAP_CD" VARCHAR(20) , "FORM_CD" VARCHAR(20) , "ACGRP_CD" VARCHAR(20) , "UP_GRP_CD" VARCHAR(20) ); alter table "CA_ACGRP_MST" add constraint "CA_ACGRP_MST_PK" primary key("GAAP_CD","FORM_CD","ACGRP_CD"); insert into CA_ACGRP_MST ( GAAP_CD, FORM_CD, ACGRP_CD, UP_GRP_CD) values ( 1, 'D0012', 2, 3); insert into CA_ACGRP_MST ( GAAP_CD, FORM_CD, ACGRP_CD, UP_GRP_CD) values ( 1, 'D0012', 1, 3); insert into CA_ACGRP_MST ( GAAP_CD, FORM_CD, ACGRP_CD, UP_GRP_CD) values ( 1, 'D0012', 3, 3); insert into CA_ACGRP_MST ( GAAP_CD, FORM_CD, ACGRP_CD, UP_GRP_CD) values ( 1, 'D0022', 2, 3); insert into CA_ACGRP_MST ( GAAP_CD, FORM_CD, ACGRP_CD, UP_GRP_CD) values ( 1, 'D0032', 2, 3); drop table CA_ACGRP_LDTL; create table "CA_ACGRP_LDTL" ( "GAAP_CD" VARCHAR(20) , "FORM_CD" VARCHAR(20) , "ACGRP_CD" VARCHAR(20) , "LANG_CD" VARCHAR(20) ); ALTIBASE HDB Patch Notes 6.5.1.7.8 23 / 35 alter table "CA_ACGRP_LDTL" add constraint "CA_ACGRP_LDTL_PK" primary key("GAAP_CD","FORM_CD","ACGRP_CD","LANG_CD"); insert into CA_ACGRP_LDTL ( GAAP_CD, FORM_CD, ACGRP_CD, LANG_CD) values ( 1, 'D0012', 2, 'KO'); insert into CA_ACGRP_LDTL ( GAAP_CD, FORM_CD, ACGRP_CD, LANG_CD) values ( 1, 'D0012', 1, 'KO'); insert into CA_ACGRP_LDTL ( GAAP_CD, FORM_CD, ACGRP_CD, LANG_CD) values ( 1, 'D0012', 3, 'KO'); insert into CA_ACGRP_LDTL ( GAAP_CD, FORM_CD, ACGRP_CD, LANG_CD) values ( 1, 'D0022', 2, 'KO'); insert into CA_ACGRP_LDTL ( GAAP_CD, FORM_CD, ACGRP_CD, LANG_CD) values ( 1, 'D0032', 2, 'KO'); var LANG varchar(20); var FORM varchar(80); var GAAP varchar(20); exec :LANG := 'KO'; exec :FORM := 'D0012'; exec :GAAP := '1'; PREPARE SELECT /* */ A.GAAP_CD, A.FORM_CD, A.ACGRP_CD AS ACCT_CD FROM CA_ACGRP_MST A LEFT OUTER JOIN CA_ACGRP_LDTL AA ON A.ACGRP_CD = AA.ACGRP_CD WHERE A.GAAP_CD = '1' AND (A.FORM_CD = :FORM OR '' = :FORM ); 수행결과 GAAP_CD FORM_CD ACCT_CD ---------------------------------------------------------------------- 1 D0012 1 1 D0012 2 1 D0012 2 1 D0012 2 1 D0012 3 1 D0022 2 ALTIBASE HDB Patch Notes 6.5.1.7.8 24 / 35 1 D0022 2 1 D0022 2 1 D0032 2 1 D0032 2 1 D0032 2 11 rows selected. 예상결과 GAAP_CD FORM_CD ACCT_CD ---------------------------------------------------------------------- 1 D0012 1 1 D0012 2 1 D0012 2 1 D0012 2 1 D0012 3 5 rows selected. 증상 LEFT OUTER JOIN시 복합인덱스가 사용되고 OR 절 predicate시 사용될 경우 결과오류 수정 변경사항 Performance View N/A Property N/A Compile Option N/A Error Code N/A Workaround PREPARE SELECT /*+ NO INDEX(A,CA_ACGRP_MST_PK) */ A.GAAP_CD, A.FORM_CD, A.ACGRP_CD AS ACCT_CD FROM CA_ACGRP_MST A LEFT OUTER JOIN CA_ACGRP_LDTL AA ON A.ACGRP_CD = AA.ACGRP_CD WHERE A.GAAP_CD = '1' AND (A.FORM_CD = :FORM OR '' = :FORM ); work around 사용 시 결과는 올바르지만 출력 순서가 달라질 수 있습니다. ALTIBASE HDB Patch Notes 6.5.1.7.8 25 / 35 BUG-47858 같은 객체 이름을 여러 사용자가 생성하면 ALL_CRT_TBL.sql에 잘못된 storage option가 만들어 질 수 있습니다. Module ux-aexport Category Functional Error 재현빈도 Always Reproducing Conditions 재현절차 drop user TEST1 cascade; drop user TEST2 cascade; create user TEST1 identified by TEST1 DEFAULT TABLESPACE SYS_TBS_DISK_DATA; create user TEST2 identified by TEST2 DEFAULT TABLESPACE SYS_TBS_DISK_DATA; create table TEST2.DRMONE_DEPT (i1 int); grant SELECT ANY TABLE to TEST1 ; create view TEST1.DRMONE_DEPT as select * from TEST2.DRMONE_DEPT; % aexport -u sys -p manager -s localhost % cat ALL_CRT_TBL.sql 수행결과 connect "TEST2" / "TEST2" --############################ -- "TEST2"."DRMONE_DEPT" --############################ create table "DRMONE_DEPT" ( "I1" INTEGER ) tablespace "SYS_TBS_DISK_DATA" pctfree 10 pctused 40 storage ( initextents 0 nextextents 0 minextents 0 maxextents 0 ); 예상결과 connect "TEST2" / "TEST2" --############################ -- "TEST2"."DRMONE_DEPT" ALTIBASE HDB Patch Notes 6.5.1.7.8 26 / 35 --############################ create table "DRMONE_DEPT" ( "I1" INTEGER ) tablespace "SYS_TBS_DISK_DATA" pctfree 10 pctused 40 storage ( initextents 1 nextextents 1 minextents 1 maxextents 4294967295 ); 증상 같은 객체 이름을 여러 사용자가 생성하면 ALL_CRT_TBL.sql에 잘못된 storage option이 만들어 질 수 있는 문제를 수정했습니다. 변경사항 Performance View N/A Property N/A Compile Option N/A Error Code N/A Workaround N/A ALTIBASE HDB Patch Notes 6.5.1.7.8 27 / 35 BUG-47889 altipasswd에서 암호 대소문자 구분이 필요합니다. Module ux-isql Category Functionality 재현빈도 Always Reproducing Conditions 재현절차 1. altibase.properties에서 CASE_SENSITIVE_PASSWORD = 1 로 변경 2. server restart 3. iSQL에서 sys user의 패스워드를 "Manager1"로 변경 alter user sys identified by "Manager1"; exit; 4. server stop 5. server . is 스크립트에서 암호 변경 6. altipasswd에서 새 암호로 변경 7. server start 수행결과 % server start ----------------------------------------------------------------- Altibase Client Query utility. Release Version 6.5.1.7.7 Copyright 2000, ALTIBASE Corporation or its subsidiaries. All Rights Reserved. ----------------------------------------------------------------- ISQL_CONNECTION = UNIX, SERVER = localhost [ERR-9100F : Incorrect Password] 예상결과 % server start ----------------------------------------------------------------- Altibase Client Query utility. Release Version 6.5.1.7.8 Copyright 2000, ALTIBASE Corporation or its subsidiaries. All Rights Reserved. ----------------------------------------------------------------- ISQL_CONNECTION = UNIX, SERVER = localhost [ERR-910FB : Connected to idle instance] Connecting to the DB server... Connected. ... --- STARTUP Process SUCCESS --- ALTIBASE HDB Patch Notes 6.5.1.7.8 28 / 35 Command executed successfully. 증상 altibase.properties 의 CASE_SENSITIVE_PASSWORD 값에 따라, altipasswd가 암호 대소문자 구분하도록 수정했습니다. 변경사항 Performance View N/A Property N/A Compile Option N/A Error Code N/A Workaround N/A ALTIBASE HDB Patch Notes 6.5.1.7.8 29 / 35 BUG-47900 이중화 update XSN 시 에러가 발생했을 때 로그에 잘못된 SN값이 기록되고 있습니다. Module rp Category Other 재현빈도 Always Reproducing Conditions 재현절차 N/A 수행결과 N/A 예상결과 N/A 증상 이중화 update XSN 중 에러가 발생했을 때 로그에 잘못된 SN값이 기록되고 있어서 수정하였습니다. 변경사항 Performance View N/A Property N/A Compile Option N/A Error Code N/A Workaround N/A ALTIBASE HDB Patch Notes 6.5.1.7.8 30 / 35 BUG-47901 이중화 sendStop 함수에서 timeout 이 발생하여도 timeout 처리가 되지 않습니다. Module rp Category Functional Error 재현빈도 Always Reproducing Conditions 재현절차 N/A 수행결과 N/A 예상결과 N/A 증상 이중화 sendStop 함수에서 timeout이 발생해도 timeout 처리가 되지 않는 경우가 있어, 수정합니다. 변경사항 Performance View N/A Property N/A Compile Option N/A Error Code N/A Workaround N/A ALTIBASE HDB Patch Notes 6.5.1.7.8 31 / 35 BUG-47910 통계 수집되지 않은 테이블의 unique constraint가 통계에 일부 포함됩니다. Module ux-aexport Category Functional Error 재현빈도 Always Reproducing Conditions 재현절차 ####################### # iSQL ####################### /* 초기화 */ EXEC DELETE_DATABASE_STATS(); drop table t1 cascade; drop table t2 cascade; drop table t3 cascade; /* 통계 수집 대상 테이블 */ create table t1 (c1 integer primary key, c2 char(10)); create table t3 (c1 integer primary key, c2 char(10)); insert into t1 values (1, 't1'); insert into t3 values (3, 't3'); /* 통계 정보 수집 */ EXEC GATHER_DATABASE_STATS(); /* 통계 수집 되지 않은 테이블과 constraints */ create table t2 (c1 integer primary key, c2 char(10), c3 char(10)); alter table t2 add unique("C2"); alter table t2 add unique("C3"); ####################### # shell ####################### aexport -s 127.0.0.1 -u sys -p manager cat ALL_EXE_STATS.sql; 수행결과 $ cat ALL_EXE_STATS.sql; ... EXEC SET_TABLE_STATS('"SYS"', '"T1"', NULL, 1, 1, 16, 0.000000); EXEC SET_COLUMN_STATS('"SYS"', '"T1"', '"C1"', NULL, 1, 0, 4, '1', ALTIBASE HDB Patch Notes 6.5.1.7.8 32 / 35 '1'); EXEC SET_COLUMN_STATS('"SYS"', '"T1"', '"C2"', NULL, 1, 0, 12, 't1 ', 't1 '); EXEC SET_PRIMARY_KEY_STATS('"SYS"', '"T1"', 1, 1, 0, 0, 0, 1); EXEC SET_UNIQUE_KEY_STATS('"SYS"', '"T2"', '"C2"', EXEC SET_UNIQUE_KEY_STATS('"SYS"', '"T2"', '"C3"', EXEC SET_TABLE_STATS('"SYS"', '"T3"', NULL, 1, 1, 16, 0.000000); EXEC SET_COLUMN_STATS('"SYS"', '"T3"', '"C1"', NULL, 1, 0, 4, '3', '3'); EXEC SET_COLUMN_STATS('"SYS"', '"T3"', '"C2"', NULL, 1, 0, 12, 't3 ', 't3 '); EXEC SET_PRIMARY_KEY_STATS('"SYS"', '"T3"', 1, 1, 0, 0, 0, 1); 예상결과 $ cat ALL_EXE_STATS.sql; ... EXEC SET_COLUMN_STATS('SYS', 'T1', 'C1',NULL, 1, 0, 4, '1', '1'); EXEC SET_COLUMN_STATS('SYS', 'T1', 'C2',NULL, 1, 0, 12, 't1 ', 't1 '); EXEC SET_TABLE_STATS('SYS', 'T3', NULL, 1, 1, 16, 0.000000); EXEC SET_COLUMN_STATS('SYS', 'T3', 'C1',NULL, 1, 0, 4, '3', '3'); EXEC SET_COLUMN_STATS('SYS', 'T3', 'C2',NULL, 1, 0, 12, 't3 ', 't3 '); 증상 통계정보가 수집되지 않은 테이블의 unique constraint가 ALL_EXE_STATS.sql 파일에 일부 포함되는 결함을 수정했습니다. 변경사항 Performance View N/A Property N/A Compile Option N/A Error Code N/A Workaround N/A ALTIBASE HDB Patch Notes 6.5.1.7.8 33 / 35 BUG-47917 외부 프로시저 생성구문에서 parsing 오류가 발생하는 경우가 있습니다. Module qp-psm-trigger-pvo Category Functional Error 재현빈도 Always Reproducing Conditions 재현절차 Drop Library TestLib2; Drop Procedure SimpleExternalProcedure; CREATE OR REPLACE LIBRARY TestLib2 AS 'str_uppercase2.so'; CREATE OR REPLACE PROCEDURE SimpleExternalProcedure (a1 in varchar2, a2 out varchar2) AS language c name "str_uppercase2" library TestLib2; / 수행결과 [ERR-31001 : SQL syntax error 0001 : CREATE OR REPLACE PROCEDURE SIMPLEEXTERNALPROCEDURE (A1 in VARCHAR2, A2 out VARCHAR2) AS language C NAME "str_uppercase2" library TestLib2 ^^ ] 예상결과 Create success. 증상 외부 프로시저 생성구문 중 "AS LANGUAGE C" 에서 parsing 오류가 발생하여, 수정합니다. 변경사항 Performance View N/A Property N/A Compile Option N/A Error Code N/A Workaround N/A ALTIBASE HDB Patch Notes 6.5.1.7.8 34 / 35 BUG-47948 DROP TABLESPACE memory tablespace 와 V$DATABASE 조회 중 동시성 문제로 인해 서버가 비정상 종료할 수 있습니다. Module sm-mem-resource Category Fatal 재현빈도 Frequence Reproducing Conditions 재현절차 N/A 수행결과 N/A 예상결과 N/A 증상 DROP TABLESPACE memory tablespace 와 V$MEMBASE 조회 사이에 동시성 문제가 있어서 수정합니다. 추가로, V$MEM_TABLESPACES, V$NLS_PARAMETERS , V$DB_FREEPAGELISTS 의 조회 시에도 동일한 문제가 있어서 함께 수정합니다. 변경사항 Performance View N/A Property N/A Compile Option N/A Error Code N/A Workaround N/A ALTIBASE HDB Patch Notes 6.5.1.7.8 35 / 35 BUG-47970 Disk Index 에서 inconsistent page 에 대해서 page latch가 풀리지 않는 경우가 있습니다. Module sm-disk-index Category Functional Error 재현빈도 Always Reproducing Conditions 재현절차 N/A 수행결과 N/A 예상결과 N/A 증상 Disk Index 에서 inconsistent page 에 대해서 page latch가 풀리지 않는 경우가 있습니다. mini transaction 의 null 예외처리가 누락된 것이 원인으로, null 예외처리 시 page latch가 풀리도록 수정합니다. 변경사항 Performance View N/A Property N/A Compile Option N/A Error Code N/A Workaround N/A