SELECT 
UTL_RAW.CAST_TO_VARCHAR2(DBMS_LOB.SUBSTR(LOB컬럼,2000, 1)) FROM
LOB테이블

'IT > DB' 카테고리의 다른 글

[SYBASE] isql 관련  (0) 2008.09.21
[SYBASE] isql 접속  (0) 2008.09.20
[SYBASE] 기본 교육  (0) 2008.09.20
[MSSQL] 게시판의 페이지 형태로 읽어오는 Stored Procedure  (0) 2008.09.20
[ORACLE] PL/SQL 정리  (0) 2008.09.20

isql

o input/output file을 지정할 수 있는가?
o OS의 file을 읽어 들일 수 있는가?
o 1> 이 나오게 하려면?
o OS의 명령문을 수행하려면?
o 수행시간을 보여줄 수 있는가 ?
o SQL문장 사용 뒤에 go 대신 다른 문자를 사용할 수 있는가?
o network packet size를 늘리는 법은?
o Column 이름을 몇 row 마다 display할 수 있게 하는 방법?
o 결과에서 컬럼 사이를 |로 구분할 수 있나?
o 결과를 좀더 넓게 볼 수 있는가?
o 결과에서 n rows affected 와 ----을 없앨 수 있는가?

input / output을 지정할 수 있는가?
방법 1) < , >을 사용한다
isql -Usa -Psybase < /tmp/a.sql > /tmp/a.res

방법2) -i , -o를 사용한다
isql -Usa -Psybase -i /tmp/a.sql -o /tmp/a.res


OS의 file을 읽어 들일 수 있는가?

:r 을 사용한다
[digital:/home/ase12 26 ] isql -Usa -Psybase
1> :r /tmp/a.sql


1> 이 나오게 하려면?

reset을 사용한다
1> use pubs2_new
2> go
3> select * from publishers
4> go
5> exit
6> reset


OS의 명령문을 수행하려면?

!!를 사용한다
1> !!ls /tmp
[sh:ls /tmp]
0 ---- a.res ----- ctisql_aadEoa ---- sp_helpdb
000 -- a.result --- ctisql_aaedta ----- sp_who
1 ---- a.sql ------ctisql_aafrBa ------sqlda.h

수행시간을 보여줄 수 있는가 ?

-p 를 사용한다

isql -Usa -Password -p
1> select * from publishers
2> go
pub_id --- pub_name ----------------- city ------ state
-------- -------------------------- ------------ --------
0736 ----- New Age Books ----------Boston -------MA
0877 ----- Binnet & Hardley --------- Washington -- DC
1389 ----- Algodata Infosystems -----Berkeley -----CA

(3 rows affected)
Execution Time (ms.): 0 Clock Time (ms.): 0

SQL문장 사용뒤에 go 대신 다른 문자를 사용할 수 있는가?

-c를 사용한다
isql -c.
A
1> select

name from sysusers
2> .
name
-----------
sandy
kim
leslie
(3 rows affected)

network packet size를 늘리는 법은?

-A 을 사용한다
isql -Usa -Psybase -A4096

Column 이름을 몇 row 마다 display할 수 있게 하는 방법?

-h를 사용한다

3row씩 보여주고 column header를 찍는다
[digital:/home/ase12 38 ] isql -Usa -Psybase -h3
1> use pubs2_new
2> go
1> select * from authors
2> go
au_id au_lname --------------------------------au_fname
-------phone address
-------city ------------state country -----------postalcode
----------- ---------------------------------- ------------
172-32-1176 White ------------------------------Johnson
-------408 496-7223 10932 Bigge Rd.
-------Menlo Park ------CA --------USA -------94025
213-46-8915 Green -----------------------------Marjorie
-------415 986-7020 309 63rd St. #411
-------Oakland ---------CA ------- USA -------94618
238-95-7766 Carson ----------------------------Cheryl
-------415 548-7723 589 Darwin Ln.
-------Berkeley -------- CA ------- USA ------ 94705

au_id au_lname ------------------------------- au_fname
-------phone address
-------city -------------state country ----------postalcode
----------- ---------------------------------- ------------
267-41-2394 O'Leary --------------------------- Michael
-------408 286-2428 22 Cleveland Av. #14
-------San Jose -------CA --------USA --------95128
274-80-9391 Straight ----------------------------Dick
-------415 834-2919 5420 College Av.
-------Oakland --------CA --------USA -------- 94609
341-22-1782 Smith ----------------------------- Meander
-------913 843-0462 10 Mississippi Dr.
-------Lawrence ------ KS --------USA -------- 66044

au_id au_lname -------------------------------- au_fname
-------phone address
-------city ------------state country ------------postalcode
----------- ----------------------------------- -----------
409-56-7008 Bennet -----------------------------Abraham
-------415 658-9932 6223 Bateman St.
-------Berkeley --------CA -------USA ---------94705
427-17-2319 Dull ------------------------------- Ann
-------415 836-7128 3410 Blonde St.

결과에서 컬럼사이를 | 로 구분할 수 있나?

-s로 column separator 사용한다

[digital:/home/ase12 40 ] isql -Usa -Psybase -s'|'
1> select * from sysusages
2> go
dbid - segmap ---- lstart ---- size ------ vstart ------ pad  unreservedpgs
|---|---------|---------|--------|------------|----------|-------------|
|  1 |------- 7 | ------ 0 | ---3072 | --------- 4 | -- NULL | ---------- 5 |
|  1 |------- 7 | --- 3072 | ---2048 | ------ 6148 | -- NULL | ------- 1034 |
|  2 |------- 0 | ------ 0 | ---1024 | ------ 4100 | -- NULL | -------- 391 |
|  2 |------- 7 | --- 1024 | ---5120 | - 201326592 | -- NULL | ------- 5092 |
|  2 |------- 7 | --- 6144 | ---1024 | -- 50331648 | -- NULL | ------- 1024 |
|  3 |------- 7 | ------ 0 | ---1024 | ------ 3076 | -- NULL | -------- 383 |
|  4 |------- 3 | ------ 0 | --51200 | - 117440512 | -- NULL | ------ 50560 |
|  4 |------- 3 | -- 51200 | --20480 | - 117491712 | -- NULL | ------ 20480 |
|  4 |------- 3 | -- 71680 | ---4096 | - 117512192 | -- NULL | ------- 4096 |
|  4 |------- 4 | -- 75776 | --10240 | - 134217728 | -- NULL | ------ 10224 |

결과를 좀더 폭넓게 볼 수 있는가?

-w로 column width를 조정한다
예) -w100 : width를 100으로 한다

결과에서 n rows affected 와 ----을 없앨 수 있는가?

다음과 같이 해 본다
[digital:/home/ase12 82 ] isql -Usa -Psybase -n | \
sed -e '/affected/d' \
-e '/---/d' > resultfile
select * from pubs2_new..publishers
go
exit
[digital:/home/ase12 83 ] cat resultfile
pub_id pub_name -------------- city ---------- state
0736 New Age Books---------- Boston --------- MA
0877 Binnet & Hardley ------- Washington ------  DC
1389 Algodata Infosystems ----Berkeley -------- CA

 

Tistory 태그:

'IT > DB' 카테고리의 다른 글

[ORACLE] BLOB  (0) 2011.01.05
[SYBASE] isql 접속  (0) 2008.09.20
[SYBASE] 기본 교육  (0) 2008.09.20
[MSSQL] 게시판의 페이지 형태로 읽어오는 Stored Procedure  (0) 2008.09.20
[ORACLE] PL/SQL 정리  (0) 2008.09.20

SYBASE를 첨 만났다 ㅡㅡ;;

oracle이랑은 친한데...

여튼.. 이래저래 접속은 했네 ㅋㅋ

isql -Uanylink -Panylink -S$SYBASE_SERVER_NAME (oracle의 sqlplus id/pwd@sid 와 같은..)

#>vi $SYBASE/interface 파일 (oracle의 tnsname.ora 와 같은 넘인것 같다 ㅋ)

 

Tistory 태그: ,

'IT > DB' 카테고리의 다른 글

[ORACLE] BLOB  (0) 2011.01.05
[SYBASE] isql 관련  (0) 2008.09.21
[SYBASE] 기본 교육  (0) 2008.09.20
[MSSQL] 게시판의 페이지 형태로 읽어오는 Stored Procedure  (0) 2008.09.20
[ORACLE] PL/SQL 정리  (0) 2008.09.20

1. 소개
          1) 기본적으로 생성되는 데이터베이스(4개외에는 따로 생성한 디비들)
            - master : 서버 전체에 대한 오브젝들의 정보를 가지고 있는 디비
            - model : 이후 생성될 사용자데이타베이스의 모델이 되는 디비
            - sybsystemprocs : 스토어프로시져가 쌓이는 디비
            - tempdb : 임시공간으로 활용하는 곳
          2) pubs2 : 샘플 데이터베이스를 생성하는 스크립터
            - UNIX : $SYBASE_HOME/scripts/installpubs2
            - NT : $SYBASE_HOME/scripts/instpbs2.sql
          3) T-sql
            - isql -U로그인아이디 -P패스워드 -s서버 -i스크립터명 -o결과저장화일명
            - 표준 ansi-sql에 위배되는지 검사하기
              set fipsflagger on/off (검사하기/안하기)
              예) select type, avg(price) from titles => 사이베이스는 그냥 반복해서 평균뿌림.
              On하면 에러메세지 나오고 내용출력
            - isql안에서 유닉스명령을 수행하려면 : !!
              예) 1> !!isql -Usa -P -iaaa.sql : aaa.sql 스크립터문을 수행.
            - 디비 이동시 : 꼭 go를 밑에 넣어주어야 함.
              > use 디비명
              > go
            - 이전 입력글을 에디팅하여 다시 수행시 :
              > vi
            - 주석문
              > -- sample test 또는 /* 주석 */
          4) SQL Advantage client
            - 설정 : dedit를 이용하여 서버이름을 정하고 IP주소와 포트를 지정해줌
            - 연결 : 접속시 위에서 설정한 서버이름을 선택하고 아이디와 패스워드입력.
2. 테이블 생성 및 수정, 관리
          1) 테이블 생성(DDL)
            - 250개의 칼럼 지정 가능
            - 정수타입 : tinyint, smallint, int, numeric(p,s), decimal(p,s)
              예) 123456.789 : numeric(8,2) => 123456.79,
                               numeric(10) => 123457, numeric(8,-2) => 123500
                               numeric(8,3) => 에러,   numeric(7,2) => 에러
            - 실수타입 : float(p), double precision, real
            - money타입 : money, smallmoney
            - 날짜타입 : datetime, smalldatetime
            - 문자타입 : char(n), nchar(n), varchar(n), nvarchar(n), text
              예) nchar는 national character로 언어별 문자수를 크기지정
                  한글버젼의 경우 char(5)=5bytes, nchar(5)=10bytes
              cf) select @@ncharsize : 현재 버전의 문자크기 구하기
              cf) char,varchar는 max 255, text는 max 2G
            - binary타입 : bit, binary(n), varbinary(n), image(2G까지)
            - 새로운 타입 지정 ( sp_addtype / sp_droptype )
              예) sp_addtype  typ_ch_pub_id, "char(4)", null
                ""를 넣은 이유는 ()가 있기때문
                예) sp_droptype typ_ch_pub_id
                예) sp_rename typ_ch_pub_id, new_typ_ch_pub_id
                    이미 typ_ch_pub_id라는 타입을 쓰고 있어도 변경 가능.
            - Identity : 시스템이 unique한 식별자로 자동 증가하는 칼럼의 유형
              (1) numeric타입 칼럼만 가능
              (2) drop 되어야 다시 시작(delete 소용없음)
              (3) 한 테이블에 꼭 하나만들어가고 갱신이 안됨.
              (4) 입력시 지정할 수 없으나 필요에 따라 지정가능
                  예) set identity_insert 테이블명 on/off
            - 칼러이름 변경시
              예) sp_rename  "aaa.a" ,  aa : 중간에 ""는 사이에 . 이 있기 때문
            - default : 기본 값은 지정. Pk는 디폴트 지정 안됨.
              예) 수정시 / 새로 지정시
              > alter table publishers
              > replace city default "Springfield"
            - null 지정 : sybase는 기본적으로 not null. 따라서 null은 꼭 기술해주어야 함.
          2) 테이블 권한 부여/박탈
            - grant [select/insert/update/delete/reference/all] on 테이블명 to 유저
              예) grant select on emp  to cel, kimds (to public : 누구에게나)
            - revoke [select/insert/update/delete/reference/all] on 테이블명 from 유저
              예) revoke select on emp  from cel, kimds (from public : 누구에게나)
          3) 테이블 수정 (칼럼 추가는 되는데 삭제는 안됨)
            - 수정
             > alter table publishers add address varchar(40) null, country varchar(40) null
            - 삭제 : 임시테이블에 넣어놓고 삭제후 다시 입력하기
             > select * into ccc_backup from ccc (ccc에 데이터가 없어도 ccc_backup생성됨)
             > drop  table ccc
             > create table ccc ......
             > insert ccc select a,b,c from ccc_backup
          4) 데이터 수정 : sybase에서 있는 기능만 설명
            - 두 테이블을 조인하여 수정 가능. 단, 한 테이블의 내용만 수정가능
             > update titles set price=price * $0.90
             > from titles t, publishers p
             > where t.pub_id=p.pub_id and p_state="CA"
            - 오라클의 decode와 유사한 case 구문 : 단 값중에 하나라도 null아닌 값이 있어야함.
              case [필드명]
              when 조건1 then 값1
              when 조건2 then 값2
              else 값3
              end
              예) update titles set price=
                  case when type="business" then price*$1.3
                  else price
                  end
          5) 데이터 삭제 : sybase에서 있는 기능만 설명
            - 롤백이 가능한 삭제
              > delete titles from titles t, publishers p
              > where t_pub_id=p.pub_id and p.state="CA"
            - 롤백이 안되는 삭제 ( select into도 롤백안됨 )
              > truncate table publishers
          6) 데이터 조회
            - 조회
              > select type, avg(price) from titles
              > where type not in ("mod_cook","trad_cook")
              > group by type
              > having avg(price) > $12.00
              > order by type
            - view 조회 : 수정시 뷰가 항목들이 한 테이블안에 존재하면 수정도 가능
              > create view vw_cali_authors
              > as
              > select au_id, au_lname, au_fname from authors
              > where state="CA"
              > with check option    => state가 꼭 "CA"이어야만 수정/추가됨.
3. 인덱스
          1) 인덱스 생성/ 삭제
            - create index 인덱스명 on 테이블명(칼럼명1, 칼럼명2)
            - drop index 테이블명.인덱스명 ( 꼭 테이블명을 기술해주어야 함 )
          2) 인덱스 구분
            - clustered  index : 인덱스키값을 기준으로 테이블을 저장순서를 정렬하여 기록하는
            방식으로 자주 수정이 일어나는 테이블에는 부적절. 기본적으로 한테이블에 하나만 존재하며
            PK에 의해 생성되는 인덱스테이블은 기본적으로 해당 방식으로 이루어짐.
            - nonclustered  index : 실제 데이터 저장순서와는 상관없이 키값과 주소값으로 이루어진
            인덱스테이블을 기준으로 b+tree 검색을 하여 데이터 조회. 여러 개 가능.
4. 임시 테이블
          1) Shareable Temporary Table : tempdb에 생성하는 테이블. 서버가 reboot하면 사라짐.
            - use tempdb하여 create table aaa 하면 됨. 누구나 접근 가능.
          2) Session-specific Temporary Table : 해당 session이 살아있는 동안만.
            - create table #aaa ( a  int null, b  char(2) null )
            - #뒤에 나오는 테이블명은 13자까지. 만든 유저만 접근 가능.
          3) 시스템 테이블들
            - select name,type from sysobjects : 만들어진 모든 시스템 오프젝트명과 타입나옴
            - 타입 : D(default) R(rule) P(produre) TR(trigger) S (system) U(user table) V(view)
5. Constraint
          1) check : 입력값의 조건을 걸어줌 (예: p_id char(4) null check(p_id like "99[0-9][0-9]") )
            (주의할 점)
            > create table publishers (
            > pub_id   char(4) not null,
            > state     char(2) default "OK" null,                       =>조건 1
            > constraint chk_state check ( state in ("CA","OR","WA") )   =>조건 2
            > )
            > insert into publishers(pub_id) values("9909")  => 에러가 남(조건 1,2가 틀림)
          2) primary key, unique
          3) foreign key :  constraint ref_aaa foreign key(칼럼명) references 테이블명(칼럼명)
          4) constraint 추가/삭제 : 기존 데이터에 영향을 안미침(단, PK, UNIQUE는 제외-index때문)
            > alter table  테이블명  add constraint  조건이름   조건들기술…
            > alter table  테이블명  drop constraint  조건이름
          5) 사용자 정의 에러메시지
            - 만들기 단계 : 메시지 생성-> constraint 걸기
              > sp_addmessage  30001(번호),  "메시지 내용"
              > sp_bindmsg  constraint명,  30001(번호)
            - 지우기 단계 : 메시지 걸지정지 -> 메시지 지우기
              > sp_unbinding  constraint명
              > sp_dropmessage   30001(번호)
6. Default
          1) 생성하여 바인드하기
            - create default 디폴트이름  as  "값"
              > sp_bindefault  디폴트이름, "테이블명.칼럼명"/"사용자정의타입"
                : 이미 지정된 필드인 경우 에러남.
          2) 언바인드하고 지우기
            - sp_unbindefault  "테이블명.칼럼명" /"사용자정의타입"
            - drop  default  디폴트이름
7. rule
          1) 생성하여 걸어주기
            - create  rule  롤명  as 변수(@state) 조건(check, betweenm like….)
            - sp_bindrule  롤명,  "테이블명.칼럼명" /"사용자정의타입"
          2) 풀고 삭제하기
            - sp_unbindrule  "테이블명.칼럼명" /"사용자정의타입"
            - drop  rule  롤명
            ------------------------------------------------------------------------------
               Object         생성           삭제            확인       바인트/언바인드
            ------------------------------------------------------------------------------
            사용자정의타입 sp_addtype     sp_droptype    sp_help             /
            테이블         create table   drop table     sp_help             /
                           select into    
            뷰             create view    drop view      sp_help             /
            인덱스         create index   drop index     sp_help
                                                         sp_helpindex    
            디폴트         create default drop default   sp_helptext    Sp_bindefault
                                                                        Sp_unbindefault
            룰             create rule    drop rule      sp_helptext    Sp_bindrule
                                                                        Sp_unbindrule
            메시지         sp_addmessage  sp_dropmessage Sysusermessage Sp_bindmsg
                                                                        Sp_unbindmsg
            ------------------------------------------------------------------------------
8. 함수들
          1) 문자열함수
            ------------------------------------------------------------------------------
             함 수 이 름                        예   제              설   명
            ------------------------------------------------------------------------------
            upper(칼럼명)                 Upper("aa'")=AA        대문자로 바꾸기
            Lower(칼럼명)                 Lower("AA")=aa         소문자로 바꾸기
            Convert(변경될타입,칼럼명)    Convert(char(4),price) 타입을 변경
            Substring(문자,시작,길이)     Substring("abc",2,1)=b 문자열 잘라내기
            Right(문자,길이)              Right("abc",2)=ab      왼쪽에서 잘라내기
            Charindex(찾는문자,문자)      Charindex("b","abc")=2 특정문자위치 찾기
            ascii(글자)                   ascii("T")=84          아스키값구하기
            Char(숫자)                    Char(84)=T             아스키값으로 문자구하기
            Ltrim(문자)                   Ltrim("   abc")=abc    왼쪽의 공백제거하기
            Str(숫자,길이,소수점이하자리) Str(45.26, 1)="45.3"   실수를 문자열로변환하기
            Soundex(문자)                 Soundex("green")
            ------------------------------------------------------------------------------
          2) 날짜 함수
            --------------------------------------------------------------------------------------
             함 수 이 름                            예   제                    설   명
            --------------------------------------------------------------------------------------
            Convert(변경될타입,날짜,타입)  Convert(char(10),date,111)   날짜를 다른 타입으로 변경
            Getdate()                                                   오늘날짜구하기
            Datename(날짜타입,날짜)        Datename(mm,getdate())       해당 날짜의 이름값
            Datepart(날짜타입,날짜)        Datepart(mm,getdate())       해당 날짜의 숫자값
            Dateadd(날짜타입,간격,날짜)    Dateadd(dd,3,getdate())      날짜에 간격만큼 더하기
            Datediff(날짜타입,날짜1,날짜2) Datediff(dd,date,getdate())  날짜1,2의 간격
            --------------------------------------------------------------------------------------
            Cf) convert의 타입
            ------------------------------------------------------------------------------
            타 입    결 과    타 입       결 과       타 입            결 과
            ------------------------------------------------------------------------------
             1     mm/dd/yy     5       dd-mm-yy        9       mon dd yyyy hh:mm:ss
             2     yy.mm.dd     6       dd mon yy       10      mm-dd-yy
             3     dd/mm/yy     7       mon dd yy       11      yy/mm/dd
             4     dd.mm.yy     8       hh:mm:ss        111     yyyy/mm/dd
            ------------------------------------------------------------------------------
            Cf) 날짜 타입
            ------------------------------------------------------------------------------
            타입      설 명   타 입     설 명    타 입     설 명    타 입    설 명
            ------------------------------------------------------------------------------
             yy    년도        wk    주           dw    년도내주     ss     초
             qq    분기        dd    일           hh    시간         ms     1/1000초
             mm    달          dy    년도내날짜   mi    분
            ------------------------------------------------------------------------------
          3) 숫자 함수
            ------------------------------------------------------------------------------
            함 수 이 름                      예   제              설   명
            ------------------------------------------------------------------------------
            Abs(숫자)                 Abs(-99)=99           절대값
            Ceiling(숫자)             Ceiling(123.5)=124    정수로 반올림
            floor(숫자)               Floor(123.5)=123      정수로 자름
            round(숫자,소수점자리수)  Round(2.460,2)=2.460  소수점 자리수 표시
            exp(실수)                 Exp(0)=1
            rand(정수)                Rand(39)=.49234563..  랜덤함수
            log(실수)                 Log(1)=0              로그
            pi()                      Pi()=3.141592…        파이
            Power(숫자,몇승인지)      Power(10,3)=1000      제곱승구하기
            Sqrt(숫자)                Sqrt(100)=10          제곱근구하기
            Sin,cos,tan               Cos(0)=1              사인,코사인,탄젠트구하기
            ------------------------------------------------------------------------------
          4) 기타 함수
            ------------------------------------------------------------------------------
            함 수 이 름                 예   제                  설   명
            ------------------------------------------------------------------------------
            Count(칼럼/*)           Count(*)             레코드의 개수
            Max Max(price)          최대값
            Min Min(price)          최소값
            Sum Sum(price)          합계
            Avg Avg(price)          평균
            Isnull(칼럼명,변환할값) Isnull(price,$0.00)  널일경우 값지정하기
            Suser_name()                                 지금 현재 접속한 유저명
            ------------------------------------------------------------------------------
9. 배치처리
          1) 변수선언 : 변수명앞에 @표시
             cf) 연산상의 주의점
            --------------------------------------------------------------------------------------
             Declare @number int, @copy int, @sum int | Declare @number int, @copy int, @sum int
             Select @number=10                        | Select @number=10, @copy=@number,      
             Select @copy=@number,                    |        @sum=@number+100                
             @sum=@number+100                         |                                        
                                                      | num      copy        sum               
             num      copy        sum                 | -------  ------   -----------          
             -------  ------   -----------            | 10         10         NULL             
             10         10         110                |
            --------------------------------------------------------------------------------------
          2) global 변수
            - @@rowcount : 현재 질의의 영향을 받은 레코드 수
            - @@error : 가장 최근에 일어난 에러번호
            - @@identity : 가장 최근에 일어나 identity의 최대치
            - @@version : 현재 DB의 버전
          3) 문법
            --------------------------------------------------------------------------------------
            If... else       | If exists(select * from auth where id='kimds')
                             |    Select "데이터가 없어요"                  
                             | Else                                         
                             |    begin                                     
                             |       If @@rowcount = 1                      
                             |          Select "데이터가 하나 있어요"       
                             |       Else                                   
                             |          Select "데이터가 여러 개네요.."     
                             |    end                                       
            --------------------------------------------------------------------------------------
            While...         | While @price<30                                          
                             |    Begin                                                 
                             |       Select @price = @price + $1.00                     
                             |       If ( select count(*) from titles where price>@price)
                             |          Countinue                                       
                             |       Else                                               
                             |          Break                                           
                             |    end                                                   
            --------------------------------------------------------------------------------------
            Print            | Print "table %1 is not owned by user %2",@t_name,@t_user
            --------------------------------------------------------------------------------------           
            raiserror        | 변수에 에러지정
                             | (1) raiserror 70500 "Table %1 not found", @t_name
                             | (2) sp_addmessage 70500, "Table %1 not found"에러 출력
                             | (1) raiserror 70500, @t_name
            --------------------------------------------------------------------------------------
10. 트랜잭션 처리
          1) 기본구성
            --------------------------------------------------------------------------------------
            bagin tran           | 트랜젝션 시작 => 처리1 진행 -> 처리2 진행 =>
            처리 1               | 처리3 진행 => 처리3 롤백 => 처리4 진행     
            save tran 지점1      | (따라서) 처리 1,2,4만 진행되었슴.          
            처리2                | Cf) select @@trancount                     
            save tran 지점2      | => begin tran이 몇번째 걸려있는지 단계조회 
            처리3                |
            rollback tran 지점2  |
            처리4                |
            commit tran          |
            --------------------------------------------------------------------------------------
          2) 처리구분
            - unchained mode : 사이베이스 기본모드로 하나의 명령이 바로 commit되는 방식
             (설정) set chained off : 묶어서 처리하려면 begin tran을 꼭 적어주어야 함.
            - chained mode : 여러가지의 처리의 한 단위로 묶어 commit이나 rollback하는 방식
             (설정) set chained on : begin tran을 안써도 됨.
11. Locking
          1) 구분
            - Shared Locks : select하는 동안 걸리는 락으로 읽기만 가능하고 수정은 불가
            - Exclusive Locks : 수정하는 동안 걸리는 락으로 읽기/쓰기 다 불가
            - Update Locks : 수정을 위해 읽는 동안 걸리는 락으로 읽기만 가능.
              단, 수정할 데이터가 없는 경우 바로 락이 풀림.
          2) deadlock : 시스템이 그냥 임의적으로 하나의 락을 일방적으로 풀어버림. 따라서
          트렌젝션의 손실이 일어날 가능성이 있음
            (확인) select @transtate   => "3"은 abort가 된 경우, "0"는 진행중인 경우.
          3) Lock를 거는 방식
            - allpages locking(APL) : 관련 인덱스테이블의 페이지까지 다 lock을 걸기.
              해당 방식이 default이므로 안쓰려면 생성시 지정.
              Create table (...) lock [allpages/datapages/datarows]
            - Datapages locking(DPL) : 인덱스테이블은 안걸고 데이터테이블의 페이지만 걸기.
            - Datarows locking(DRL) : 인덱스테이블 안걸고 데이터의 해당 레코드만 락걸기.
            - DB의 Default Lock변경 : DBA만 권한 있음.
              sp_configure "lock scheme", 0, [allpages/datapages/datarows]
          4) Isolation Level : 데이터의 일관성 유지 레벨
            - dirty read : 처리1 변경단계의 가짜 데이터를 처리2에서 읽는 경우
            - nonrepeatable read : 처리1이 진행중에 처리2가 수행되어 처리1의 값이 중간에 변경
            - phanton read : 처리1이 진행중에 처리2에 의해 처리1에서 다른 데이터를 읽는 경우
            --------------------------------------------------------------------------------------
                            dirty read      nonrepeatable read       phanton read
            --------------------------------------------------------------------------------------
              Level 0          허용               허용                   허용
              Level 1          불가               허용                   허용
              Level 2          불가               불가                   허용
              Level 3          불가               불가                   불가
            --------------------------------------------------------------------------------------
            - 세팅 : set transaction isolation level [0/1/2/3]
            - 확인 : select @@isolation
          5) select title from titles holdlock where pub_id="0877" : udpate할때까지 lock걸기.
            - 오라클의 for update와 유사
12. Cursors
          1) 사용방법
            - 선언(declare)
            - 열기(open)
            - 가져오기(fetch)
            - 닫기(close)
            - 재선언(deallocate)
          2) 예제
            --------------------------------------------------------------------------------------
              Declare biz_book cursor for select title,title_id from titles where type="business"
                  For read only
              Go                                      (=>꼭 단독배치를)
              Declare @title char(80), @title_id char(6)
              Open biz_book
              Fetch biz_book into @title, @title_id   (=> fetch는 항상 forward만 가능)
              While @@sqlstatus = 0                   (0=>하나성공, 1=>에러, 2=>하나이상남음)
                  Begin
                  ....
                  End
              Close biz_book
              Deallocate cursor biz_book
            --------------------------------------------------------------------------------------
          3) 하나이상을 fetch해 올 경우 : set cursor rows 레코드갯수 for biz_book
          4) set close on endtran on/off : commot/rollback후 커서가 close되면 on, 아니면 off
13. stored procedure
          1) 수행단계
            - (1) create하면 내용은 syscounts에, query trees는 sysprocedures에 넣어둠
            - (2) 수행요청을하면 cach확인후 있으면 해당 query tree대로, 없으면 새로 넣고 처리.
          2) 문법 : 프로시져안에서는 뷰,디폴트,룰,다른 프로시져, 트리거 생성 안됨.
            create proc 이름 as 내용들 return
            --------------------------------------------------------------------------------------
              create proc proc_new_price ( @title_id char(6)="000000", @new_price money output )
              as
                  declare @state int
                  exec @state=proc_datacheck   (=> 다른 프로시져 이용하여 결과받기)
                  select @new_price=price from titles where title_id=@title_id
                  select @new_price=@new_price*$1.15
              return
            --------------------------------------------------------------------------------------
          3) 에러 : 0=> 성공, 0>error>-99 (시스템에러), 나머지: 사용자정의에러
          4) 주의사항 : 프로시져A안에서 다른 프로시져B를 부르는 경우 B안에서 문제가 있어 롤백이 있는 경우
             A작업도 같이 롤백됨. 따라서 다른 프로시져부르는 경우 save tran해주기.
          5) Select @@nestlevel : 프로시져 몇 단계까지 들어갔는지 표시
          6) With recompile : 프로시져는 procedure cach를 사용하기 때문에 관련 테이블이 구조가 변경되면
             다시 컴파일을 해주어야 하는데 이것을 해주는 역할
            (예)
            --------------------------------------------------------------------------------------
                             생   성                   |          수   정
            --------------------------------------------------------------------------------------
            Create table test ( a int, b int )         | [ 해결방안 ]                                  
            create proc pr_test ( @num int )           |                                               
                as                                     | (1)생성시 항상 재컴파일하도록                 
                select * from test where a=@num        | create proc test(...) with recompile...return
                return                                 |                                               
            pr_test(1)                                 | (2)수행시 재컴파일하도록(더 낫겟죠)           
            =>full scan방식으로 조회                   | exec pr_test(1) with recompile                
            ========================================== |                                               
            Create index test_idx on test(a)Pr_test(1) | (3)해당 테이블을 기준으로 다바꿔              
            =>index search방식으로 조회가 더 좋은디    | sp_recompile test                             
            --------------------------------------------------------------------------------------
14. Triggers
          1) 생성
            create trigger 트리거명 on 관련테이블 for 관련DML as 작업내용
            (예)
            --------------------------------------------------------------------------------------
            create trigger trg_I_sales
            on salesfor
            insert
            as
               declare @num int
               select count(*) from inserted
               select @@rowcount=@num
               if @num = 0
               begin
                  raiserror 40070, "no data inserted."
                  Rollback tran
               end
            --------------------------------------------------------------------------------------
          2) 처리방식 : 트리거는 특정 테이블에 insert나 delete나 update가 일어날 때 동시에 처리해주거나
                        검사해주어야 하는 것을 걸어주는 것으로 처리 적용대상이 되는 레코드들은 inserted,
                        deleted라는 임시테이블에 저장되어진다.(update는 사실 inserted에도 deleted에도
                        존재하는 것임) . 트리거는 중간에 문제가 생겨서 이전 프로시져의 트렉젝션까지
                        롤백하지는 못함.
          3) Update 트리거의 경우 if update(테이블PK) 해주어 키가 업데이트가 되었는지 확인가능.
          4) Recursive 트리거의 경우 : 무한으로 걸린 경우 16번까지 하다 rollback
15. 시스템 조회명령들
          1) sp_help [오브젝트]
            - 오브젝트명을 입력하지 않으면 해당 DB의 모든 오브젝트에 대한 정보를,
              오브젝트명을 기입한 경우에는 해당 오브젝트의 자세한 정보를 보여줌.
          2) sp_syntax 원하는문법
            - 해당 문법의 사용 방법을 기술해 줌
          3) sp_who [원하는 계정]
            - 계정을 안쓰면 전체 계정에 대한 정보를 기술,
              계정을 기술하면 해당 계정에 대한 정보를 보여줌.
          4) Sp_helpdb [디비명]
            - 디비명을 기입한지 않으면 모든 디비정보를, 기입하면 해당 디비의 정보를 보여줌.
          5) Sp_rename 오브젝트명, 새로 바꿀 오브젝트명
            - 오브젝트명은 변경. 테이블명/칼럼명/타입명/뷰명/인덱스명/constraint
          6) sp_helpconstraint 테이블명
            - 해당 테이블에 걸려있는 constraint정보를 보여줌
          7) sp_depends  테이블명/뷰명/프로시져명
            - 테이블명을 적으면 해당 테이블이 reference걸려있는 모든 오브젝트들을,
              뷰명 적으면 해당 뷰가 참조하는 테이블명을 보여줌. 프로시져는 관련테이블들 리스트업.
          8) sp_helptext 뷰명/디폴트명/롤명/프로시져명
            - 작성된 뷰의 질의문을 보여줌
          9) sp_helpconstraint 테이블명
            - 테이블의 constraint 정보를 보여줌.
          10) Sp_lock
            - 현재 디비에 걸려있는 락정보를 보여줌
          11) sp_cursorinfo 커서명
            - 커서에 대한 정보를 보여줌

 

Tistory 태그:

'IT > DB' 카테고리의 다른 글

[SYBASE] isql 관련  (0) 2008.09.21
[SYBASE] isql 접속  (0) 2008.09.20
[MSSQL] 게시판의 페이지 형태로 읽어오는 Stored Procedure  (0) 2008.09.20
[ORACLE] PL/SQL 정리  (0) 2008.09.20
[DB2] 개발자 친화적인 대안, DB2 Express-C  (0) 2008.09.20

MS-SQL에서 게시판의 페이지 형태로 읽어오는 Stored Procedure
생성시
CreateprocSEL_PAGELIST
@PAGE_NOINT=1,--페이지번호
@PAGE_SIZEINT=20,--한페이지에서읽어올자료수
@TABLE_NAMEVARCHAR(255),--테이블명
@SORT_FIELDVARCHAR(255),--OrderBy절에들어갈소트필드
@FIELDSVARCHAR(1024)='*',--쿼리해올필드들
@WHEREVARCHAR(1024)=NULL,--조건
@SORT_DIRVARCHAR(12)='ASC'--소트구분(오름차순,내림차순)
AS
------------------------------------------------
--페이지단위로보기
------------------------------------------------
DECLARE@STARTINT--ID_Num시작번호
DECLARE@ENDINT--ID_Num끝번호
DECLARE@SQLNVARCHAR(2000)
DECLARE@SQL2NVARCHAR(2000)
SET@END=(@PAGE_NO*@PAGE_SIZE)-1
SET@START=(@PAGE_NO-1)*@PAGE_SIZE
--TempTable에값을써넣는쿼리를만든다.
SET@SQL='SELECT'+@FIELDS+',IDENTITY(int,0,1)ASID_Num'+
'Into#Work_tmp'+
'FROM'+@TABLE_NAME
IF@WHERE<>''
SET@SQL=@SQL+'Where'+@WHERE
SET@SQL=@SQL+'ORDERBY'+@SORT_FIELD+''+@SORT_DIR;
--이놈이실제데이터를읽어오는놈이다.
Set@SQL2='Select*From#Work_tmp'+
'WhereID_Num>='+Cast(@StartasChar)+
'AndID_Num<='+Cast(@ENDasChar)
--같은실행세션에묶어야한다.
--EXEC문이실행종료와동시에세션이끊어지므로TempTable에서데이터를쿼리할수없다.
Set@SQL=@SQL+''+@SQL2
EXECSP_EXECUTESQL@SQL
GO
SETQUOTED_IDENTIFIEROFF
GO
SETANSI_NULLSON
GO
실행시:
EXECSEL_PAGELIST3,20,'C11','C11_CO_CODE','*',NULL,'ASC'

'IT > DB' 카테고리의 다른 글

[SYBASE] isql 접속  (0) 2008.09.20
[SYBASE] 기본 교육  (0) 2008.09.20
[ORACLE] PL/SQL 정리  (0) 2008.09.20
[DB2] 개발자 친화적인 대안, DB2 Express-C  (0) 2008.09.20
[DB2] DB2에서 JDBC 연결하기  (0) 2008.09.20

SQL문

SELECT

DML(데이터 조작어)

INSERT, UPDATE, DELETE

DDL(데이터 정의어) IMPLICIT COMMIT

CREATE, ALTER, DROP, RENAME, TRUNCATE

TCL(트랜잭션 제어)

COMMIT, ROLLBACK, SAVEPOINT

DCL(데이터 제어어)IMPLICIT COMMIT

GRANT, REVOKE

[1] Writing Basic SQL Statements

1. SELECT 기본 문장(선택, 프로잭션, 조인)

SELECT [DISTINCT] { *, column [alias], ... }

FROM table ;

2. SELECT 예제

SELECT * FROM dept ;

SELECT deptno, loc FROM dept ;

SELECT ename, sal, 12 * (sal + 100) FROM emp ;

* Null 값과 연산을 하면 Null이 나온다.

3. Column Alias 예제

SELECT ename AS nme, sal salary

FROM emp ;

SELECT ename "Name", sal*12 "Annual Salary"

FROM emp ;

* 대소문자를 구분하고 공백있는 컬럼 Alias를 만들고 싶을땐 " "로 막는다.

* AS는 안 써도 된다.

* WHERE, GROUP BY절에는 안된다. ORDER BY 절에는 사용 가능.

4. Concatenation 연산자 (|| : pipeline 2개)

SELECT ename||job "Employees" FROM emp ;

--> ename 데이터와 job 데이터가 붙어서 출력된다.

5. 문자열을 데이터로 출력할때

SELECT ename||' '||'is a'||' '||job "Employee Details"

FROM emp ;

* 문자열은 ' '로 막고, 컬럼 Alias는 " "로 막는다.

6. DISTINCT keyword :

중복된 Row를 하나로 만들어 준다. 자동 SORTING[ASC]

SELECT DISTINCT deptno

FROM emp ;

* DISTINCT 대신 UNIQUE를 써도 된다.

7. SQL*Plus Log On 방법

* UserName, PassWord, HostString에 일일이 입력해도 되지만,

UserName에 username/password@HostString이라고 입력하면 된다.

* UNIX상에서 command로 들어 갈 때는 sqlplus username/password 만 입력하면된다.

8. 테이블 구조보는 SQL Command (DESC)

SQL> DESC dept : Column Name, Null?, Data Type display

9. SQL*Plus Editing Commands( 다음 행까지 계속하려면 -(하이픈)으로 연결한다.)

① A[PPEND] text : 현재 line의 마지막 문장 뒤에 text를 붙인다.

② C[HANGE]/old/new : 현재 line의 old text를 new text로 바꾼다.

③ C[HANGE]/text/ : 현재 line을 text를 삭제한다.

④ CL[EAR] BUFF[ER] : buffer의 내용을 모두 지운다.

⑤ DEL : 현재 line을 지운다.

⑥ DEL n : n번째 line을 지운다.

⑦ DEL m n : m ~ n번째 line을 지운다.

⑧ I[NPUT] : 현재 line 다음에 line이 제한없이 추가된다.

⑨ I[NPUT] text : 현재 line 다음에 line이 추가되면서 text가 들어간다.

⑩ L[IST] : buffer전체를 보여준다.

⑪ L[IST] n : n번째 line을 보여준다.

⑫ R[UN] or / : SQL, PL/SQL문장을 실행하라!

⑬ n : n번째 line을 display하면서 Editing 상태로 해준다.

⑭ n text : n번째 line이 text로 바뀐다.

⑮ 0 text : 1번째 line이 추가되면서 text가 1번째 line으로 들어간다.

* Bald로 표시된 명령어는 line번호를 먼저 수행한 후 실행해야 한다.

10. SQL*Plus File Commands

① SAV[E] filename [REP[LACE]|APP[END]] : buffer의 내용을 filename.sql로 저장한다.

② GET filename : filename.sql을 buffer로 불러온다.

③ START filename : filename.sql을 실행하라.

④ @filename : START filename과 같다.

⑤ ED[IT] : buffer의 내용을 edit program으로 실행한다.

⑥ ED[IT] filename : filename.sql을 edit program으로 실행한다.

⑦ SPO[OL] filename : retrieve data를 filename.lst로 저장한다.

⑧ SPOOL OFF : SPOOL을 끝내라.

⑨ SPOOL OUT : retrieve data를 system printer로 출력하라.

⑩ EXIT : SQL*Plus를 종료한다.

* SPOOL 사용법

SQL> spool filename

SQL> select ...

SQL> spool off

11. Special Tip

* 잠시 host상태로 나가고 싶을 때.

SQL> ! ( $)

-- host 상에서 다시 SQL로 들어가려면 exit(lo)

-- unix 상에서 env를 치면 오라클 환경을 볼 수 있다.

* SQL> define -editor

--> Editor가 vi인지..다른 edit프로그램인지를 보여준다.

* line size 바꾸기

SQL> SET PAGESIZE 20 -- 한 page를 20line으로 보여준다.

-- log off하면 사라진다.

* NLS값 보기

SQL> select * from V$NLS_PARAMETERS

* NLS값 바꾸기

SQL> ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD'

-- SESSION : 현 session동안만 YYYY-MM-DD 포맷으로 사용한다는 뜻.

sqlplus가 종료되면 원상태로 복구된다.

[2]Restricting and Sorting Data

1. 비교연산자

= : Equal to

> : Grater than

>= : Greater than or equal to

< : Less than

<= : Less than or equal to

<> : Not equal to

예) SELECT ename, sal, comm

FROM emp

WHERE sal <= comm ;

2. 비교연산자 2

BETWEEN A AND B , IN(list), LIKE, IS NULL

3. BETWEEN 연산자( NOT BETWEEN )

SELECT ename, sal

FROM emp

WHERE sal BETWEEN 1000 AND 1500 ; --> sal >= 1000 and sal <= 1500

4. IN 연산자( NOT IN )

SELECT emp, ename, sal, mgr

FROM emp

WHERE mgr IN (7902, 7566, 7788) ; --> mgr = 7902 or mgr = 7566 or mgr = 7788

5. LIKE 연산자( NOT LIKE )

예1) SELECT ename

FROM emp

WHERE ename LIKE 'S%' ; --> ename이 S로 시작하는 모든 데이터를 찾는다.

예2) SELECT ename

FROM emp

WHERE ename LIKE '_A%' ; --> 두 번째 글자가 A인 모든 데이터를 찾는다.

예3) SELECT ename

FROM emp

WHERE ename LIKE '%A/_%B' ESCAPE '/' ;

--> '/'는 Escape문자로 정의되었기 때문에 '_'도 문자로 인식한다.

즉, ename이 A_로 포함하는 모든 데이터를 찾는다.

* ESCAPE는 모든 문자가 가능하다.

6. IS NULL 연산자

SELECT ename, mgr

FROM emp

WHERE mgr IS NULL ; --> mgr이 null인 데이터를 찾는다.

7. Logical 연산자

AND : 두 개의 조건이 모두 만족해야 OK

OR : 한 개의 조건만 만족하면 OK

NOT

8. AND 연산자

SELECT empno, ename, job, sal

FROM emp

WHERE sal >= 1100

AND job = 'CLERK' ;

9. OR 연산자

SELECT empno, ename, job, sal

FROM emp

WHERE (sal >= 1100 OR job = 'CLERK') ;

10. NOT 연산자

SELECT ename, job

FROM emp

WHERE job NOT IN ('CLERK', 'MANAGER') ;

--> NOT (job = 'CLERK OR job = 'MANAGER')

11. 연산자 우선순위( 산술 > 문자 > 비교 > 논리 )

1 : 모든 비교 연산자

2 : NOT

3 : AND --> False > Null > True

4 : OR --> True > Null > False

예) A AND B에서...

- A가 False이고 B가 Null이면... False 이다.

- A가 True이고 B가 Null이면.... Null이다.

12. SORT (ORDER BY)

* ASC는 default값이다.(작은 값부터..)

* 값이 Null일 때 가장 큰 값이 된다. (ASC일 때...맨 뒤에 붙는다.)

* column alias도 sorting이 된다.

예1) SELECT ename, job, deptno, hiredate "Date"

FROM emp

ORDER BY hiredate["Date" or 4 ] ;

예2) SELECT ename, job, deptno, hiredate

FROM emp

ORDER BY hiredate DESC ;

예3) SELECT empno, ename, sal*12 annsal

FROM emp

ORDER BY empno, annsal ; * select 절에 없는 열을 기준으로 정렬 가능.

예4) SELECT ename, deptno, sal

FROM emp

ORDER BY deptno, sal DESC

[3] Single-Row Functions

1. Character Functions

①LOWER( column|expression )

LOWER('String') --> string : 소문자로 변환

②UPPER( column|expression )

UPPER('String') --> STRING : 대문자로 변환

③INITCAP( column|expression )

INITCAP('string') --> String : 첫글자만 대문자이고 나머지글자는 소문자로 변환

④CONCAT( column1|expression1 ,column2|expression2 )

CONCAT('Good','String') --> GoodString : ||와 같은 역할을 한다.

⑤SUBSTR(column|expression, m [,n]) : m값이 음수면 문자값의 끝부터..)

SUBSTR('String',1,3) --> Str : 1번째부터 3개의 문자를 리턴한다.

⑥LENGTH( column|expression )

LENGTH('String') --> 6 : 문자열의 길이를 리턴한다.

⑦INSTR( column|expression, )

INSTR('String','r') --> 3 : 문자열에 'r'이 몇번째 위치하고 있나를 리턴한다.

⑧LPAD( column|expression,n,'string' ) : n 은 전체 길이

LPAD('String',10,'*') --> ****String

: 10자리수중에 모자란 자리수를 '*'로 왼쪽에 채운다.(문자,숫자 가능!!!)

⑨ RPAD('String',10,'*') --> String****

: 10자리수중에 모자란 자리수를 '*'로 오른쪽에 채운다.(문자,숫자 가능!!!)

⑩ LTRIM(' String') --> 'String' : 문자열의 왼쪽 공백을 버린다.

⑪ RTRIM('String ') --> 'String' : 문자령의 오른쪽 공백을 버린다.

* TRIM(leading/tailing/both, trim_character FROM trim_source )

TRIM( 'S' FROM 'SSMITH') --> MITH

2. Number Functions

① ROUND(45.926, 2) --> 45.93 : 소수점 두자리수까지 보여주면서 반올림한다.

② TRUNC(45.926, 2) --> 45.92 : 소수점 두자리까지만 보여주고 나머지는 버린다.

③ MOD(1600,300) --> 100 : 1600을 300으로 나누고 나머지를 리턴한다.

* ROUND예제(WHOLE NUMBER:정수)

SELECT ROUND(45.923,2), ROUND(45.923,0), ROUND(45.923,-1) FROM DUAL

==> 45.92 46 50

* TRUNC예제

SELECT TRUNC(45.923,2), TRUNC(45.923), TRUNC(45.923,-1) FROM DUAL

==> 45.92 45(n이 생략된면 일의 자리까지 남기고 버린다.) 40

* SYSTEM 날짜를 갖고 오는 방법.

SELECT sysdate FROM dual

3. Date 계산( 날짜를 숫자로 저장)

date + number : date에 number만큼 후의 날자를 보여준다.

date - number : date에 number만큼 전의 날자를 보여준다.

date1 - date2 : date1에서 date2 까지의 총 일수를 보여준다.( date1+date2는 X )

date1 + 숫자/24 : date1에서 시간을 더해 날짜를 보여준다.

4. Date Functions

MONTHS_BETWEEN('01-SEP-95','11-JAN-94') --> 19.6774194

; 두날짜 사이의 달수를 보여준다.

ADD_MONTHS('11-JAN-94', 6) --> 11-JUL-94

; 날짜에 6개월을 더한 날자를 보여준다.

NEXT_DAY('01-SEP-95','FRIDAY') --> '08-SEP-95'

; 해당일 다음에 오는 FRIDAY의 일자를 보여준다.

('SUNDAY'는 1, 'MONDAY'는 2...이런식으로 숫자를 써줘도 된다.)

LAST_DAY('01-SEP-95') --> '30-SEP-95'

; 해당월의 마지막날자를 보여준다.

ROUND('25-JUL-95','MONTH')--> 01-AUG-95 ROUND('25-JUL-95','YEAR')--> 01-JAN-96

TRUNC('25-JUL-95','MONTH') --> 01-JUL-95 TRUNC('25-JUL-95','YEAR') --> 01-JAN-95

5. Conversion Functions

nlsparams : 십진수, 그룹구분자, 지역 통화 기호, 국제 통화 기호

TO_CHAR(date,['format'],[nlsparams]) : date를 format에 맞게 문자열로 변환한다.

- Date Format Elements

YYYY --> 1999 (년출력) , YEAR --> nineteen ninety-nine (년출력)

MM --> 12 (월출력) , MONTH --> DECEMBER (월출력), MON --> DEC

D --> 요일을 숫자로 리턴한다.(일요일은 1, 월요일은 2...)

DD --> 07 (달의 일출력)

DDD --> 200 (연의 일출력)그 해의 총 몇 일째인가를 리턴한다.

DAY --> MONDAY (요일출력) DY-->MON

CC --> 20 (몇 세기인지를 보여준다.)

WW --> 그 해의 몇 번째 주인가를 리턴한다.

W --> 그 달의 몇 번째 주인가를 리턴한다.

* Element들을 소문자로 쓰면 소문자로 나오고 대문자로 쓰면 대문자로 출력된다.

HH or HH12 or HH24 / MI(0-59분) / SS(0-59초)

* 문자열은 " " 묶어 추가한다 DD " of " MONTH --> 12 of DECEMBER

*숫자 접미어는 숫자를 문자로 표기. TH(4->4TH)/ SP(4->FOUR)/ SPTH or THSP(4->FOURTH)

ddspth : 14-> fothteenth

* / . , : 구두점은 결과에 그대로 출력한다. * 공백, 선행제로를 제거하는 fm요소가 있다.

TO_CHAR(number,'format',[nlsparams]) : number를 format에 맞게 문자열로 변환한다.

- Number Format Elements

9 : 999,999 --> 1,234 $: 부동 달러 기호 $99999 -> $1234

0 : 099999 --> 001234 99.999EEEE -> 1.234E+03 B: 0값을 공백으로

L : L99,999 --> FF1,234 (NLS_CURRENCY에 설정되어있는 값이 L로 보여진다.)

TO_NUMBER(char,['format'],[nlsparams]) : 숫자형태의 문자열을 숫자로 변한한다.

TO_DATE(char,['format'],[nlsparams]):날자형태의 문자열을 format에 맞게 날자형식으로 변환 한다.

6. NVL Funcion : 값이 null일 때 설정값을 보여준다.

NVL(number_column, 0) : null일 때 0을 보여준다.

NVL(date_column, '01-JAN-95') : null일 때 '01-JAN-95'를 보여준다.

NVL(character_column, 'Empty') : null일 때 'Empty'를 보여준다.

* column Type과 표현식의 type이 반드시 일치해야 한다.

7. DECODE Function : CASE or IF-THEN-ELSE 형식과 비슷하다.

*DECODE(col/expression, search1, result1 [,search2,result2,…] [,default])

F1 (F2 (F3 (col,arg1),arg2),arg3)

[4] Displaying Data from Multiple Tables (JOIN)

1. EquiJoin : column1과 column2는 Primary Key와 Foreign Key관계인 경우

SELECT emp.empno, emp.ename, emp.deptno, dept.deptno, dept.loc

FROM emp, dept

WHERE emp.deptno = dept.deptno

2. Non-EquiJoin : Join하는 Table 사이에 서로 대응하는 Key가 없는 경우

where절의 Join조건에 '='을 제외한 비교연산자를 사용한다.

SELECT e.ename, e.sal, s.grade

FROM emp e, salgrade s

WHERE e.sal BETWEEN s.losal AND s.hisal

3. Outer Join : 서로 = 되지 않는 row 까지도 모두 보여준다.

정보가 없는쪽 컬럼 뒤에 (+)를 붙인다.( =, and 만 사용가능)

SELECT e.ename, d.deptno, d.dname

FROM emp e, dept d

WHERE e.deptno (+) = d.deptno

ORDER BY e.deptno

4. Self Join : 같은 Table을 그것이 마치 2개의 Table인 것처럼 Join해서 사용한다.

SELECT worker.ename, manager.ename

FROM emp worker, emp manager

WHERE worker.mgr = manager.empno

5. SET OPERATORS

UNION : 중복된 row는 제외하고 보여준다. UNION ALL : 중복된 row까지 모두 보여준다. INTERSECT : A,B의 중복된 row만 보여준다.MINUS : A,B의 중복된 row를 제외한 A row를 보여준다.

[5] Aggregating Data Using Group Functions(그룹함수를 사용한 데이터집계)

1. Group Function : 행집합에 적용하여 그룹당 하나의 결과를 생성한다.

AVG([DISTINCT|ALL] n) : 평균값

COUNT({*|[DISTINCT|ALL] expr}) : row수

MAX([DISTINCT|ALL] expr) : 최대값

MIN([DISTINCT|ALL] expr) : 최소값

SUM([DISTINCT|ALL] n) : 합

STDDEV([DISTINCT|ALL] x) : 표준편차

VARIANCE([DISTINCT|ALL] x) : 분산

* count(*)를 제외한 모든 Group Function은 Null을 배제하고 수행한다.

Null을 포함하고 싶다면 NVL함수를 사용한다.

* DISTINCT나 ALL을 쓰지 않으면 Default가 ALL이다.

* AVG,SUM, STDDEV, VARIANCE는 반드시 숫자형이다.

2. 어떤 컬럼에 해당하는 데이터별 그룹함수를 사용할 때

SELECT [deptno,] COUNT(ename)

FROM emp --> 이문장은 성립되지 않는다. GROUP BY가 없다.

<추가>

GROUP BY deptno

*일반칼럼과 그룹함수를 같이 쓰면 group by절에 일반칼럼 명시(열 별칭 사용못함)

*GROUP BY 열을 SELECT 절에 포함시키지 않아도 된다

3. 그룹함수는 WHERE절에 올수가 없다.

SELECT deptno, AVG(sal)

FROM emp

WHERE AVG(sal) > 2000

GROUP BY deptno

--> 이문장은 성립되지 않는다. WHERE절에 그룹함수가 올 수 없다.

SELECT deptno, AVG(sal)

FROM emp

GROUP BY deptno

HAVING AVG(sal) > 2000

4. HAVING : 그룹함수를 조건절에 적용시키기 위해서 사용한다.

SELECT job, SUM(sal)

FROM emp

WHERE job NOT LIKE 'SALES%'

GROUP BY job

HAVING SUM(sal) > 5000

ORDER BY SUM(sal)

*절 평가 순서 : ① WHERE -> ② GROUP BY절 -> ③ HAVING절

*그룹함수는 두번까지 중첩될수 있습니다. MAX( AVG(SAL))

[6] Subqueries( WHERE 절, HAVING 절, FROM 절 )

1. Subquery 규칙

- 반드시 ()로 묶어야 한다.

- 반드시 비교연산자 오른쪽에 위치해야 한다.

- ORDER BY 절에는 사용할 수 없다.

- 서브쿼리 결과가 한개일때는 Single-Row 비교연산자를 사용해야 한다.

( =, >, >=, <, <=, <> )

- 서브쿼리 결과가 여러개일때는 Multi-Row 연산자를 사용해햐 한다.

2. Subquery 사용예1

* 반드시 비교연산자 오른쪽에 써야한다.

SELECT ename FROM emp

WHERE sal > (SELECT sal FROM emp

WHERE empno = 7566)

3. Subquery 사용예2

SELECT ename, job

FROM emp

WHERE job = (SELECT job

FROM emp

WHERE empno = 7369)

AND

sal > (SELECT sal

FROM emp

WHERE empno = 7876)

4. Subquery 사용예3

SELECT job, AVG(sal)

FROM emp

GROUP BY job

HAVING AVG(sal) > (SELECT MIN(AVG(sal))

FROM emp

GROUP BY job)

5. Subquery 사용예4 (Subquery 결과가 여러개가 나올때 비교연산자 사용법)

SELECT empno, ename

FROM emp

WHERE sal IN (SELECT MIN(sal) ( =ANY 와 같음 )

FROM emp

GROUP BY deptno)

6. ANY(동의어:SOME)연산자를 사용한 Subquery : 조건중에 한개만 만족하면 OK

SELECT empno, ename, job

FROM emp

WHERE sal < ANY (SELECT sal --> OR

FROM emp

WHERE job = 'CLERK')

AND job <> 'CLERK'

7. ALL연산자를 사용한 Subquery : 모든 조건을 만족해야 OK

SELECT empno, ename, job

FROM emp

WHERE sal > ALL (SELECT avg(sal) --> AND

FROM emp

GROUP BY deptno

[7] Multiple-Column Subqueries

1. Multiple-Column Subquery (Pairwise Subquery)

: 서브쿼리의 결과가 두개 이상의 컬럼형식으로 나올 때 비교하는 컬럼도 서브쿼리 컬럼

갯수와 형식이 같아야한다.

SELECT ename, deptno, sal, comm

FROM emp

WHERE (sal, NVL(comm,-1)) IN

(SELECT sal, NVL(comm,-1)

FROM emp

WHERE deptno = 30)

2. NonPairwise Subquery

SELECT ename, deptno, sal, comm

FROM emp

WHERE sal IN (SELECT sal FROM emp

WHERE deptno = 30)

AND

NVL(comm,-1) IN (SELECT NVL(comm,-1) FROM emp

WHERE deptno = 30)

3. Subquery 안에 Null값이 있을 때...

* 매니저가 아닌 사원을 보여주기?

SELECT e.ename

FROM emp e

WHERE e.empno NOT IN

(SELECT m.mgr FROM emp m)

IN은 Null value가 나와도 한개의 조건만 만족하면 OK이지만,

NOT IN은 !=ALL과 같아서 모든조건이 TRUE여만 TRUE인 것이다.

* NOT IN 을 !=ANY 로 바꿔주는게 정답에 가깝다.

4. FROM절에 사용되는 Subquery

SELECT a.ename, a.sal, a.deptno, b.salavg

FROM emp a,

(SELECT deptno, avg(sal) salavg

FROM emp

GROUP BY deptno) b

WHERE a.deptno = b.deptno

AND a.sal > b.salavg

5. EXISTS : EXISTS 뒤에 나오는 서브쿼리의 결과가 한건이 row라도 있다면 O.K

SELECT dname, deptno

FROM dept

WHERE EXISTS (SELECT * FROM emp

WHERE dept.deptno = emp.deptno)

: 행의 존재유무만 확인

[8] Producing Readable Output with SQL*Plus

1. Substitution Variable (치환변수)

& : 변수가 한 번 사용되고 메모리에서 사라진다.

&& : 한 번 입력한 변수는 CLEAR하기 전까지 계속 메모리에 남아있다.

DEFINE variable=value : CHAR 데이터 유형의 사용자 변수를 생성하여 값을 변수에 할당한다.

DEFINE : 현재 DEFINE 된 모든 것들을 보여준다.

DEFINE 변수명 : 지정한 변수명의 DEFINE 사항을 보여준다.

UNDEFINE 변수명 : 지정한 변수명의 DEFINE 상태를 CLEAR한다.

ACCEPT : 변수를 입력하라고 물어보는 Prompt의 Text를 변경할수 있다. USER가

입력하는 값을 HIDE시킬수가 있다. DataType의 Format을 변경할수가 있다.

* SET VERIFY 는 SQL*PLUS 가 치환변수를 값으로 바꾸기 전후의 명령 텍스트 표시를 토글한다.

2. & 치환변수 사용예

SELECT empno, ename, sal, deptno

FROM emp

WHERE empno = &employee_num

3. && 치환변수 사용 예 --> 한번만 물어보게 된다.

SELECT empno, ename, job, &&column_name

FROM emp

ORDER BY &column_name

4. 변수 값이 character or date value일때 꼭 single quotation mark로 묶어 줘야 한다.

SELECT ename, deptno, sal*12

FROM emp

WHERE job = '&job_title'

5. 종합적인 예제(실행중에 열이름, 표현식, 텍스트를 지정)

--> 어떤 절에나 사용해도 된다.

SELECT empno, ename, job, &column_name

FROM emp

WHERE &condition

ORDER BY &order_column

6. ACCEPT 사용예 (file로 만들어서 START시켜야 한다.)

*ACCEPT variable [datatype] [FORMAT format] [PROMPT text] [HIDE]

ACCEPT dept PROMPT 'Provide the department name: '

SELECT *

FROM dept

WHERE dname = UPPER('&dept')

/

Provide the department name: Sales

처리된 결과값...

7. 파일로 만들어서 치환변수를 여러개 처리할때 예제

test.sql

SELECT &1 FROM &2

SQL> @test empno emp

==> &1에 empno, &2에 emp가 들어간다.(define)

SELECT &2 FROM &4

SQL> @test e empno b emp

==> &1에 e, &2에 empno,&3에 b, &4에 emp가 들어간다.(define)

8. SET command 변수

① ARRAY[SIZE] {20 | n} : 데이터 fatch size

② COLSEP {_ | text} : column seperator

③ FEED[BACK] {6 | n | OFF | ON} : n 개이상의 레코드 반환시 레코드 수를 표시

④ HEA[DING] {OFF | ON} : column heading 출력

⑤ LIN[ESIZE] {80 | n} : 가로 80 으로 출력

⑥ PAGES[IZE] {50 | n} : 세로 50 으로 출력

⑦ LONG {80 | n} : long date type의 데이터를 출력할때 80byte까지만 보여주겠다.

⑧ PAU[SE] {OFF | ON | text} : text에 문자열을 넣으면 pause될 때마다 메시지를 보여준다.

⑨ TERM[OUT] {OFF | ON} : 결과를 화면에 보여주겠는가?

⑩ VERIFY {OFF | ON} : 치환변수의 old값과 new값을 보여주면서 결과가 처리된다.

* SHOW {SET command 명} : SET command명의 현재 상태를 보여준다. SQL> SHOW ECHO)

* SHOW ALL : 모든 SET command의 현재 상태를 보여준다.

* SET 상태를 바꿔 주려면... SQL> SET PAUSE ON <-- 이런식으로 하면 된다.

* DEFINE command나 SET command는 자신의 환경파일(login.sql)에 일괄적으로 처리 할수 있다.

* login.sql은 oracle superuser용 환경파일이다.

* SQL Plus command가 다음 줄로 이어질 때는 (-)으로 연결한다.

9. REPORT 출력 예

① SET PAGESIZE 37 --> 세로 37로 출력

② SET LINESIZE 60 --> 가로 60으로 출력

③ SET FEEDBACK OFF

④ TTITLE 'Employee|Report' --> Top Title을 Employee 다음 줄에 Report를 쓰겠다.

⑤ BTITLE 'Confidential' --> Bottom Title을 Confidential로 쓰겠다.

⑥ COLUMN job HEADING 'Job|Category' FORMAT A15 : | 은 text를 두줄로 찍는다.

--> job column Heading을 Job 다음줄에 Category로쓰고 15byte의 자리수로

만들겠다.

형식 : COL[UMN] [{column | alias } [option]]

COL[UMN] [column], COL[UMN] column CLE[AR], CLE[AR] COL[UMN]

옵션 : CLE[AR], FOR[MAT] format, HEA[DING] text, JUS[TIFY] {align}, NUL[L] text,

NOPRI[NT]:열을 숨김니다 <> PRI[NT],

TRU[NCATED] : 첫 행 끝에 표시되는 문자열을 잘라버린다.

WRA[PPED] : 문자열의 끝을 다음 행으로 줄바꿈합니다.

⑦ REM ** Insert SELECT statement --> 주석문

*BREAKE 명령?

[9] Multipulating Data (DML)

*트랜젝션 : 논리 작업 단위를 형성하는 DML 문 모음으로 구성된다., DDL문(한개),DCL문(한개)

1. INSERT 예제1

: 모든 컬럼에 INSERT할 때는 컬럼명을 쓰지 않아도 되지만 테이블 CREATE시

만들어진 순서대로 입력해야한다.

INSERT INTO dept

VALUES (50,'AAA','BBB')

* NULL 값을 갖는 행 삽입시 열목록에서 열을 생략(암시적)하는 방법과

NULL 키워드를 지정(명시적)하는 방법이 있다.

2. INSERT 예제2

INSERT INTO emp ( empno, ename, job, mgr, hiredate, sal, comm, deptno )

VALUES ( 7196, 'GREEN', 'SALESMAN', 7782, SYSDATE, 2000, NULL, 10 )

3. sql 파일로 만들어서 Argument를 받으면서 INSERT 실행하기.

* test.sql 파일

ACCEPT department_id PROMPT 'Please enter the department number: '

ACCEPT department_name PROMPT 'Please enter the department name: '

ACCEPT location PROMPT 'Please enter the location: '

INSERT INTO dept ( deptno, dname, loc )

VALUES (&department_id, '&department_name', '&location' )

SQL> @test = START test

Please enter the department number: 90

Please enter the department name: PAYROLL

Please enter the location: HOUSTON

1 row created

4. 다른 테이블의 row를 Copy하기(VALUES 절을 사용하지 않는다.)

INSERT INTO managers (id, name, salary, hiredate)

SELECT empno, ename, sal, hiredate

FROM emp

WHERE job = 'MANAGER'

5. UPDATE 예제1

UPDATE emp

SET deptno = 20,

sal = 2500,

comm = null

WHERE empno = 7782

6. UPDATE 예제2 (Multiple-Column Subquery를 사용한 예)

UPDATE emp

SET (job, deptno) = (SELECT job, deptno

FROM emp

WHERE empno = 7499)

WHERE empno = 7689

7. UPDATE 예제3 (다른 테이블에 있는 데이터를 SELECT해서 UPDATE하기)

UPDATE employee

SET deptno = (SELECT deptno FROM emp WHERE empno = 7788)

WHERE job = (SELECT job FROM emp WHERE empno = 7788)

8. DELETE 예제1 (조건에 맞는 데이터 지우기)

DELETE FROM dapartment

WHERE dname = 'DEVELOPMENT'

9. DELETE 예제2 (한 테이블의 전체 데이터 삭제)

DELETE FROM department

10. DELETE 규칙

* FROM은 옵션이므로 사용하지 않아도 된다.(예: DELETE department)

* Primary Key, Forien Key 관계가 설정되어 있는 데이터를 DELETE할때는 문제가 발생 할 수 있다.

11. COMMIT

* 변경된 데이터를 Fix시킨다.

* 이전상태의 데이터는 모두 잃게 된다.

* 모든 User가 결과를 볼수 있다.

* LOCK이 풀린다.

* 모든 SavePoint들이 clear된다.

* 자동 커밋 : DDL, DCL, 정상 종료시

12. ROLLBACK

* 변경된 데이터를 undo 시킨다.

* Transaction 전단계의 데이터로 돌아간다.

* Lock이 풀린다.

* 자동 롤백 : 비정상 종료, 시스템 장애

13. SAVEPOINT 예제

* SAVEPOINT : Transaction이 일어난 곳에 Marking을 할 수가 있다.

* 오라클은 자동적으로 눈에 안보이는 savepoint를 찍어 놓는다.

SQL> UPDATE.....

SQL> SAVEPOINT update_done ;

Savepoint created.

SQL> INSERT.....

SQL> ROLLBACK TO update_done ;

Rollback complete.

14. TABLE LOCK 예제 (DBA가 임으로 TABLE에 LOCK을 걸 수가 있다.)

[10] Creating and Managing Tables (DDL)

1. Database Objects

TABLE, VIEW, SEQUENCE, INDEX, SYNONYM

2. Object Naming Rule

- 반드시 첫글자는 문자이어야 한다.

- 길이는 1 ~ 30 글자 이다.

- A-Z, a-z, 0-9, _, $, # 만을 사용할수 있다.

- 동일한 Object명이 존재해서는 안된다.(다른 user가 소유한 table과는 중복가능)

- 오라클 서버의 예약어는 사용할 수 없다.

3. CREATING TABLES( create 권한, 저장영역이 필요 )

CREATE [GLOBAL TEMPORARY] TABLE [schema.]table

( column datatype [DEFAULT expr] [,...] );

*GLOBAL TEMPORARY : 임시 table로 지정, 정의는 모든 세션에서 볼 수 있지만,

데이터는 데이터를 삽입하는 세션에서만 볼 수 있다.

* DEFAULT 값: 다른 열의 이름이나, 의사열은 잘못된 값이다.

* CREATE TABLE dept

( deptno NUMBER(2), dname VARCHAR2(14), loc VARCHAR2(13),

dymd DATE DEFAULT SYSDATE )

4. Data Dictionary

USER_ : 사용자가 소유하는 객체에 대한 정보

ALL_ : 사용자가 ACCESS 할 수 있는 모든 TABLE 에 대한 정보

DBA_ : DBA 롤을 할당 받은 사용자만 ACCESS 할 수 있다.

V$_ : 동적 성능(Performance) 뷰, DB SERVER 성능 및 잠금에 관한 정보.

* DICT 테이블 안에 모든 data dictionary 정보가 있다.

>> 유저가 소유한 개별 객체 유형을 봄.

SELECT * FROM USER_TABLES

>> 유저가 소유한 TABLE, VIEW, 동의어, 시퀀스를 봄.

SELECT DISTINCT object_type

FROM USER_OBJECTS ( USER가 ACCESS 할 수 있는 ALL_OBJECTS )

>> User가 소유한 TABLE을 설명.

SELECT * FROM USER_CATALOG

--> SELECT * FROM cat 이라고 써도 된다.

>> 모든 테이블 이름보기 SELECT * FROM TAB

>> 컬럼 정보 보기 USER_TAB_COLUMNS

5. Data Types

VARCHAR2(size) : Variable-length character data (1 ~ 4000 bytes)

CHAR(size) : Fixed-length character data (1 ~ 2000 bytes)

NUMBER(p,s) : p - precision, s - scale

DATE : B.C.4712-01-01 ~ A.D.9999.12.31

LONG : Variable-length character data (2GB)

- 한 table 당 하나 - constraints 사용 못함

- order by, group by에서 사용못함 - 서브쿼리에서 사용할 때 not copy

LONG RAW : Raw binary data of variable length up to 2 gigabytes

RAW(size) : 2000 byte

CLOB : Single-byte character data up to 4 gigabytes

BLOB : Binary data up to 4 gigabytes

BFILE : binary data stored in an external file; up to 4 gigabytes

6. Subquery를 사용해서 테이블 복사하기(새로운 table 의 datatype 정의는 필요없다)

CREATE TABLE dept30

AS

SELECT empno, ename, sal*12 ANNSAL, hiredate

FROM emp

WHERE deptno = 30

* computed field일때 반드시 컬럼 alias를 줘야 한다. (ANNSAL)

* computed 컬럼으로 만들어진 컬럼 타입 NUMBER일 때 기존의 자릿수는 사라지고

최대자리수로 잡힌다.

* column, type, data 모든것이 복사된다.(NOT NULL constraints 만 상속된다.)

* key constraint는 정의되지 않는다.

* WHERE조건을 false가 되게 만들면 데이터는 복사되지 않는다.

7. 테이블에 컬럼 추가 하기

ALTER TABLE dept30

ADD ( job VARCHAR2(9) )

-> 열을 추가할 때 모든 행은 초기에 null 값을 가진다.( not null 제약조건 X )

8. 테이블에 있는 기존 컬럼 수정하기

ALTER TABLE dept30

MODIFY ( ename VARCHAR2(15) )

* 제약사항.

- 숫자타입에서 자릿수를 늘리는건 가능하다.

- 숫자타입에서 자릿수를 줄일때는 모든 data가 null이거나 데이터가 한건도 없을 때만 가능하다.

- char <--> varchar2 로 바꿀때는 모든 data가 null이거나 데이터가 한건도 없을 때만 가능하다.

- default값도 바꿀 수 있다.(기존 default값은 유지된다.)

- column name 은 modify 가 안된다.

=> 열을 추가(ADD), 수정(MODIFY)할 수 있지만 table에서 삭제할 수 없다.

<oracle 8i 가능>

1.> ALTER TABLE table SET UNUSED (column);

OR

ALTER TABLE table SET UNUSED COLUMN column;

2.>ALTER TABLE table DROP UNUSED COLUMNS;

9. DROP TABLE

DROP TABLE dept30

10. OBJECT 이름 바꾸기

RENAME dept TO department

11. TRUNCATE TABLE

TRUNCATE TABLE department

* ROLLBACK을 절대로 할 수 없다.

* 로그없이 테이블의 전체 데이터가 삭제되고 COMMIT이 된다.

* 저장공간을 해제( DELETE 문은 해제할 수 없다.)

12. 테이블에 주석문 추가하기

COMMENT ON TABLE emp

IS 'Employee Information'

13. 컬럼에 주석문 추가하기

COMMENT ON TABLE emp COLUMN emp.ename

IS 'Employee Name'

14. 주석문 삭제하기

COMMENT ON TABLE emp IS ' '

15. 주석문을 볼수있는 data dictionary

* Column

ALL_COL_COMMENTS

USER_COL_COMMENTS

* Table

ALL_TAB_COMMENTS

USER_TAB_COMMENTS

[11] Including Constraints

1. 오라클의 Constraint Type

NOT NULL : null value를 허용하지 않음.

UNIQUE : 유일한 값을 가지면서 null도 허용한다.

PRIMARY KEY : NOT NULL, UNIQUE, TABLE당 1개 설정, 참조 당함

FOREIGN KEY : Primary에 연결되어 있어서 Primary에 있는 값들만 갖고 있다.(PK,UK 참조)

CHECK : 정해진 값 이외의 것이 들어오면 Error

2. Constraint 규칙

- Constraint을 생성할 때 이름을 주지 않으면 오라클서버는 SYS_Cn 이라고 이름을 자동 생성한다.

- Column level 과 Table level로 Constraint를 정의한다.

- constraint를 볼 수 있는 Data Dictionary는

USER_CONSTRAINTS,USER_CONS_COLUMNS 이다.

3. Constraint 정의

* Column Level

column [CONSTRAINT constraint_name] constraint_type,

* Table Level

column,...

[CONSTRAINT constraint_name] constraint_type (column, ...),

(column, ...),

* not null은 반드시 column level로 정의를 내려야 한다.

4. NOT NULL Constraint : column level

5. UNIQUE Constraint : index 자동 생성

CREATE TABLE dept (

deptno NUMBER(2),

dname VARCHAR2(14),

loc VARCHAR2(13),

CONSTRAINT dept_dname_uk UNIQUE (dname) )

6. PRIMARY KEY Constraint

CREATE TABLE dept (

deptno NUMBER(2),

dname VARCHAR2(14),

loc VARCHAR2(13),

CONSTRAINT dept_dname_uk UNIQUE (dname) ,

CONSTRAINT dept_deptno_pk PRIMARY KEY (deptno) )

7. FOREIGN KEY Constraint

CREATE TABLE emp (

empno NUMBER(4),

ename VARCHAR2(10) [CONSTRAINT epm_ename_nn] NOT NULL,

job VARCHAR2(9),

mgr NUMBER(4),

hiredate DATE,

sal NUMBER(7,2),

comm NUMBER(7,2),

deptno NUMBER(7,2) NOT NULL,

CONSTRAINT emp_deptno_fk FOREIGN KEY (deptno)

REFERENCES dept (deptno) )

--> dept.deptno를 emp.deptno가 Foreign key로 사용하겠다는 뜻.

* column level로 정의할 때는...(FOREIGN KEY 키워드는 생략)

deptno NUMBER(7,2) NOT NULL

CONSTRAINT emp_deptno_fk REFERENCES dept (deptno),

* ON DELETE CASCADE

Foreign key로 연결된 parent data가 삭제될 때 child data도 모두 삭제 되게 만든다.

8. CHECK Constraint

..., deptno NUMBER(2),

CONSTRAINT emp_deptno_ck

CHECK (deptno BETWEEN 10 AND 99), ...

--> deptno의 값은 10에서 99 사이에 있는 값들만 입력이 가능하다는 뜻.

* CURRVAL, NEXTVAL, LEVEL, ROWNUM등 Pseudocolumn엔 허용되지 않는다.

* SYSDATE, UID, USER, USERENV 함수들을 호출할수 없다.

* 제약조건을 추가(ADD), 삭제(DROP)할 수 있지만 수정할 수는 없다.

* 제약조건을 설정(ENABLE) 또는 해제(DISABLE)합니다.

* MODIFT 절을 사용하여 NOT NULL 제약조건을 추가합니다.

9. ADD Constraint

*ALTER TABLE table_name

ADD [CONSTRAINT constraint] type (column),

ALTER TABLE emp

ADD CONSTRAINT emp_mgr_fk

FOREIGN KEY(mgr) REFERENCES emp(empno)

* Constraint 수정은 할 수 없다.

* not null constraint일 경우 ADD로 하지 않고 MODIFY로 한다.

(기존 행에 null data 값이 없어야 한다.)

10. DROP Constraint

*ALTER TABLE table_name

DROP (PRIMARY KEY| UNIQUE (column) |

CONSTRAINT constraint) [CASCADE];

ALTER TABLE emp

DROP CONSTRAINT emp_mgr_fk

* Primary를 삭제할 때 Foreign Key관계(종속된 제약조건)의 Constraint까지 DROP하고 싶으면...

ALTER TABLE dept

DROP PRIMARY KEY CASCADE

* CASCADE CONSTRAINTS 절은 DROP COLUMN 절과 함께 사용됩니다.

ALTER TABLE test1 DROP (pk) CASCADE CONSTRAINTS;

11. DISABLE CONSTRAINT(CREATE TABLE, ALTER TABLE 문에서 사용)

: ENABLE CONSTRAINT 하기 전까지 실행을 멈춘다.

ALTER TABLE emp

DISABLE CONSTRAINT emp_empno_pk CASCADE

12. ENABLE CONSTRAINT(CREATE TABLE, ALTER TABLE 문에서 사용)

ALTER TABLE emp

ENABLE CONSTRAINT emp_empno_pk

* ENABLE 할 때는... 모든 data를 체크하기 때문에 시간이 오래 걸린다.

*

13. USER_CONSTRAINTS Data Dictionary

SELECT constraint_name, constraint_type, search_condition

FROM user_constraints

WHERE table_name = 'EMP'

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

CONSTRAINT_NAME C SEARCH_CONDITION

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

SYS_C00674 C EMPNO IS NOT NULL

SYS_C00675 C DEPTNO IS NOT NULL

EMP_EMPNO_PK P

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

14. USER_CONS_COLUMNS Data Dictionary

SELECT constraint_name, column_name

FROM user_cons_columns

WHERE table_name = 'EMP'

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

CONSTRAINT_NAME COLUMN_NAME

EMP_DEPTNO_FK DEPTNO

EMP_EMPNO_PK EMPNO

EMP_MGR_FK MGR

SYS_C00674 EMPNO

SYS_C00675 DEPTNO

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

[12] Creating Views

* Oracle8부터는 View에도 Data를 갖고 있을 수 있다.

* View를 사용하는 이유?

- 데이터베이스 access를 제한한다.

- 복잡한 쿼리를 쉽게 만든다.

- 데이터의 독립을 허용하기 위해

- 동일한 데이터로부터 다양한 결과를 얻기 위해

* view를 만들 때 ORDER BY절을 사용할 수 없다.

* Simple View에는 DML 문장을 수행 할 수 있지만, 함수 또는 데이터 그룹을 포함하지 못한다.

(복합뷰<Complex VIEW> 는 함수 또는 데이터 그룹을 포함할 수 있다.)

* GROUP함수, GROUP BY절, DISTINCT keyword등을 사용한 view에는 행을 delete 할 수 없다.

* 뷰를 사용한 데이터 엑세스

- USER_VIEWS에서 뷰 정의를 검색한다.(select 문의 텍스트는 LONG 열에 저장된다.)

- 뷰의 기본 테이블에 대한 액세스 권한을 확인한다.

- 데이터를 기본 테이블에서 검색 또는 갱신한다.

1. CREATE VIEW 문장

CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view

[ (alias[, alias]...) ]

AS subquery

[WITH CHECK OPTION [CONSTRAINT constraint]]

[WITH READ ONLY]

OR REPLACE : 만들려고 하는 view가 이미 존재할 때 recreate한다.

FORCE : base table이 존재하지 않아도 view를 강제로 만든다.

NOFORCE : base table이 반드시 존재해야만 view를 만들 수 있다.

WITH CHECK OPTION : view를 만들 때 where조건에 있는 value를

View를 통해서 DML 문장으로 수정하는 것을 막는다.

WITH READ ONLY : view를 통해서 DML문장을 수행하는 것을 막는다.

2. Creating View 예제1

CREATE VIEW empvu10

AS SELECT empno, ename, job

FROM emp

WHERE deptno = 10 ;

--> 이렇게 만들어진 view의 column이름은 empno, ename, job이 된다.

3. Creating View 예제2

CREATE VIEW salvu30

AS SELECT empno employee_number, ename name, sal salary

FROM emp

WHERE deptno = 30 ;

--> column alias를 준 employee_number, name, salary가 view의 column이름이 된다.

4. VIEW 수정하기 (OR REPLACE)

CREATE OR REPLACE VIEW empvu10

(employee_number, employee_name, job_title)

AS SELECT empno, ename, job

FROM emp

WHERE deptno = 10 ;

5. Complex VIEW

CREATE VIEW detp_sum_vu

(naem, minsal, maxsa, avgsal)

AS SELECT d.dname, MIN(e.sal), MAX(e.sal), AVG(e.sal)

FROM emp e, dept d

WHERE e.deptno = d.deptno

GROUP BY d.dname ;

6. WITH CHECK OPTION 사용예

CREATE OR REPLACE VIEW empvu20

AS SELECT *

FROM emp

WHERE deptno = 20

WITH CHECK OPTION CONSTRAINT empvu20_ck ;(deptno 가 20만 작업 가능)

( constraint name을 주지 않으면 SYS_Cn으로 만들어 진다. )

* 예를들어 다음과 같은 update문장을 수행하면 error가 난다.

UPDATE empvu20

SET deptno = 10

WHERE empno = 7788 ;

--> ORA-01402: view WITH CHECK OPTION where-clause violation

7. WITH READ ONLY 사용예

CREATE OR REPLACE VIEW empvu10

(employee_number, employee_name, job_title)

AS SELECT empno, ename, job

FROM emp

WHERE deptno = 10

WITH READ ONLY ;

* 예를들어 다음과 같은 DELETE문장을 수행하면 error가 난다.

DELETE FROM empvu10

WHERE employee_number = 7782 ;

--> ORA-01752: Cannot delete from view without exactly one key-preserved table

8. View 없애기

DROP VIEW empvu10 ;

9. 만들어진 View를 볼때

SELECT * FROM salvu30 ;

* 인라인 view : FROM 절에 사용, 객체가 아님.

10. View를 통한 DML 작업 수행에 관한 규칙

*뷰가 다음을 포함한 경우 행을 제거할 수 없슴.

- 그룹함수 - GROUP BY절 - DISTINCT 키워드 - 의사열 ROWNUM 키워드

*뷰가 다음을 포함한 경우 데이터를 수정할 수 없슴.

- 위에서 언급된 모든 조건(제거할 수 없슴)

- ROWNUM 의사 열 : 하위 질의에서 반환되는 가 행에 1에서 시작하는 순차값을 할당.

*뷰가 다음과 같은 경우 데이터를 추가할 수 없슴.

- 뷰가 위에서 언급한 포함하는 경우.(제거, 수정)

- 기본 테이블에서 뷰에 의해 선택되지 않은 열에 NOT NULL 제약 조건이 있는 경우.

11. "TOP-N" 분석 수행

SELECT [column_list], ROWNUM

FROM (SELECT [column_list] FROM table

ORDER BY TOP-N_column)

WHERE ROWNUM <= N ( where 절은 < 또는 <= )

[13] Other Database Objects (Sequence, Index, Synonym)

1. Sequence?

- unique한 숫자를 자동으로 부여한다.

- 공유 가능하다.

- primary key 성격을 갖는다.

- cache 설정을 할 수 있기 때문에 빠른 속도를 낼 수 있다.

2. CREATE SEQUENCE 문장

CREATE SEQUENCE sequence

[INCREMENT BY n] : default 1

[START WITH n] : default 1

[{MAXVALUE n | NOMAXVALUE}]

[{MINVALUE n | NOMINVALEU}]

[{CYCLE | NOCYCLE}]

[{CACHE n | NOCACHE{] ; : default 20개의 cache

INCREMENT BY n : n만큼 증가 한다.

START WITH n : 처음 시작하는 숫자는 n이다.

MAXVALUE n : MAX값은 n이다.

NOMAXVALUE : MAX값은 무한대다. (10^27 OR -1) --> default

MINVALUE n : MIN값은 n이다.

NOMINVALUE : MIN값은 무한대다. (-(10^26) OR 1 ) --> default

CYCLE | NOCYCLE : MAX나 MIN값으로 갔을때 다시 처음부터 새로

시작할 건지를 설정한다. default는 NOCYCLE

CACHE n | NOCACHE : n만큼의 CACHE를 줄 것인지를 설정한다.

--> default는 cache 20으로 잡는다.

3. CREATE SEQUENCE 예제

CREATE SEQUENCE dept_deptno

INCREMENT BY 1

START WITH 91

MAXVALUE 100

NOCACHE

NOCYCLE ;

4. USER_SEQUENCES data dictionary

SELECT sequence_name, min_value, max_value, increment_by, last_number

FROM USER_SEQUENCES ;

* last_number는 다음에 sequence 가능 한 숫자를 보여준다.

5. NEXTVAL 과 CURRVAL

NEXTVAL : Sequence가 1개 증가된다.

CURRVAL : 현재 sequence 값을 보여준다.

* 사용가능

- SELECT문장에서 SELECT list

- INSERT문장에서 SELECT list, values절 list

- UPDATE문장에서 SET절

* 사용불가

- View의 SELECT list

- SELECT문장에서 DISTINCT keyword

- SELECT문장에서 GROUP BY, HAVING, ORDER BY절

- SELECT, DELETE, UPDATE문장 안에 있는 subquery

- CREATE TABLE, ALTER TABLE문장에서 DEFAULT expression

* CACHE가 20으로 정의 했을 때...

① INSERT INTO dept

VALUES (dept_deptno.NEXTVAL, ...) --> 1

② SELECT last_number FROM user_squences --> 21

③ SELECT dept_deptno.CURRVAL FROM dual --> 1

④ SELECT dept_deptno.NEXTVAL FROM dual --> 2

6. SEQUENCE 사용예

INSERT INTO dept( deptno, dname, loc )

VALUES (dept_deptno.NEXTVAL, 'MARKETING', 'SAN DIEGO')

--> 증가된 sequence값이 deptno에 저장된다.

* 현재의 sequence값을 보려면...

SELECT dept_deptno.CURRVAL FROM dual ;

* SELECT에서 sequence값 증가시키기

SELECT dept_deptno.NEXTVAL FROM dual ;

7. SEQUENCE 수정하기

ALTER SEQUENCE dept_deptno

INCREMENT BY 1

MAXVALUE 999999

NOCACHE

NOCYCLE ;

* sequence에 대한 ALTER privilege를 갖고 있어야 한다.

* maxvalue가 current value보다 적을 땐 반드시 drop하고 re-create해야 한다.

* START WITH 문을 변경할 수 없습니다.( 삭제 후 다시 생성 )

8. SEQUENCE 제거하기

DROP SEQUENCE dept_deptno ;

9. INDEX ?

- Retrieve를 빨리 하기 위해서

- DISK I/O를 줄일수 있다.

- 테이블과는 독립적이다.

* PRIMARY KEY or UNIQUE constraint 생성시 오라클 서버에서 자동으로 생성되는것과, CREATE INDEX를 사용해서 만들어지는 index가 있다.

* INDEX는 많이 만든다고 좋은게 아니다.

* INDEX는 이렇때 만드는게 좋다.

- WHERE절이나 JOIN조건에 자주나오는 column

- column의 범위가 클때

- null value를 많이 갖고 있는 column

- 전체 row에서 2~4% 정도의 row를 찾을때

10. CREATE INDEX

CREATE INDEX index

ON table (column[, column]...) ;

CREATE INDEX emp_ename_idx

ON emp (ename) ;

11. USER_INDEXES and USER_IND_COLUMNS data dictionary

SELECT ic.index_name, ic.column_name, ic.column_position, ix.uniqueness

FROM user_indexes ix, user_ind_columns ic

WHERE ic.index_name = ix.index_name

AND ic.table_name = 'EMP' ;

12. INDEX 제거하기

DROP INDEX emp_ename_idx ;

13. SYNONYM ?

user가 synonym을 사용하면 스키마를 별도로 명시할 필요가 없어진다.

14. CREATE SYNONYM

CREATE [PUBLIC] SYNONYM synonym

FOR object ;

* PUBLIC은 모든 user에게 synonym권한을 주는 것이고, DBA권한이 있는 사람만

사용이 가능하다.

* PUBLIC을 안쓰면 만든 사람만 사용한다.

CREATE SYNONYM d_sum

FOR dept_sum_vu ;

--> dept_sum_vu라는 view테이블을 d_sum으로 사용 하겠다.

15. PUBLIC SYNONYM

CREATE PUBLIC SYNONYM dept

FOR alice.dept

--> alice가 만든 dept테이블을 dept로 모든 유저에게 명시 하겠다.

16. SYNONYM 제거

DROP SYNONYM d_sum ;

* public으로 정의된 SYNONYM은 DBA만 제거가 가능하다.

[14] Controlling User Access (GRANT, REVOKE)

* 시스템 권한(System Privilege): 데이터 베이스를 액세스할 수 있다.

* 객체 권한(Object Privilege) : 데이터 베이스 객체 내용을 조작할 수 있다.

1. System Privilege? --> DBA권한

- Create new users ( CREATE USER )

- Remove users ( DROP USER )

- Remove tables ( DROP ANY TABLE )

- Backup tables ( BACKUP ANY TABLE )

2. Creating User

CREATE USER scott

IDENTIFIED BY tiger ;

3. system privilege에서의 GRANT

GRANT privilege [, privilege...]

TO user [, user...]

[WITH ADMIN OPTION] ;

* WITH ADMIN OPTION : dba가 권한을 주는 user에게도 admin 권한을 줄 수 있다.

* user system privilege(DBA 가 USER에게 할당 할 수 있는 권한)

CREATE SESSION : 테이터베이스에 connect하는 권한

CREATE TABLE : 테이블 만드는 권한

CREATE SEQUENCE : sequence 만드는 권한

CREATE VIEW : view 만드는 권한

CREATE PROCEDURE : stored prcedure, function 만드는 권한

GRANT create table, create sequence, create view

TO scott

--> scott에게 table, sequence, view만드는 권한을 준다.

4. ROLE : 사용자에게 부여할 수 있는 관련 권한을 하나로 묶어 명명한 그룹

Grant를 줄 role user를 만든후 그 role user에 grant를 주고,

role user의 권한을 각각의 user에게 넘겨준다.

① SQL> CREATE ROLE manager ;

Role created.

② SQL> GRANT create table, create view TO manager ;

Grant succeeded.

③ SQL> GRANT mananger TO brake, clock ;

Grant succeeded.

5. User Password 변경하기

ALTER USER user IDENITIFIED BY password ;

예) ALTER USER scott IDENTIFIED BY lion ;

6. Object Privileges?

* 객체마다 다르다.

* 소유자는 객체에 대한 모든 권한을 갖는다.

* 소유자는 자신의 객체에 대한 특정 권한을 부여할 수 있다.

7. Object Privilege에서의 GRANT

GRANT object_priv [(columns)| ALL]

ON object

TO {user|role|PUBLIC}

[WITH GRANT OPTION] ;

* sue, rich 라는 user에게 emp 테이블을 select 권한을 준다.

GRANT select

ON emp

TO sue, rich ;

* scott, manager라는 user에게 dept 테이블의 dname,loc 컬럼을 update할 수 있게 권한을 준다.

GRANT update (dname, loc)

ON dept

TO scott, manager ;

* WITH GRANT OPTION

GRANT select, insert

ON dept

TO scott

WITH GRANT OPTION ;

--> scott에게 dept 테이블의 select, insert권한을 주면서 scott가 다른 유저에게도

이 권한을 줄 수 있게 한다.

* PUBLIC : 모든 유저에게 권한을 부여한다.

GRANT select

ON alice.dept

TO PUBLIC ;

--> 모든유저에게 alice가 만든 dept 테이블의 select권한을 준다.

* 모든 유저에게 모든 object권한을 주기

GRANT ALL

ON emp

TO PUBLIC ;

8. 권한 없애기 (REVOKE)

REVOKE {privilege [, privilege...] | ALL}

ON object

FROM {user[, user...]|role|PUBLIC}

[CASCADE CONSTRAINTS]

REVOKE select, insert

ON dept

FROM scott ; --> scott에게서 dept테이블의 select, insert권한을 없앤다.

* CASCADE CONSTRAINTS : 이 옵션을 않쓰면 revoke할 때 forien key

관계의 table을 revoke할 수 없다.

9. Privilege Grant를 볼 수 있는 Data Dictionary

ROLE_SYS_PRIVS : System privilege 권한에 대한 정보

ROLE_TAB_PRIVS : table(object) privilege 권한에 대한 정보

USER_ROLE_PRIVS : role정보

USER_TAB_PRIVS_MADE : 내가 다른 사람에게 준 TABLE 권한에 대한 정보

USER_TAB_PRIVS_RECD : 내가 다른 사람에게 받은 TABLE 권한에 대한 정보

USER_COL_PRIVS_MADE : 내가 다른 사람에게 준 COLUMN 권한에 대한 정보

USER_COL_PRIVS_RECD : 내가 다른 사람에게 준 COLUMN 권한에 대한 정보

*****************************************************************

TABLE <--> PROCEDURE

VIEW : DML 수행

SEQUENCE : ALTER, SELECT

******************************************************************


개발자 친화적인 대안, DB2 Express-C


Grant Hutchison│Product Manager, IBM

요즘 무료 RDBMS (관계형 데이터베이스 관리 시스템) 옵션들이 많이 있다. 이 중 몇몇은 오픈 소스이고, 어떤 것은 상용이지만 무료로 사용할 수 있다. C/C++, Java™, .NET, PHP를 사용하여 애플리케이션을 개발하고 있고 혁신적인 기술과 탄탄한 개발자 커뮤니티 기반을 갖춘 믿을 수 있는 데이터 서버를 찾고 있다면, 새로운 DB2 Express-C를 주목하기 바란다. 이 글에서 DB2 Express-C를 사용하는 방법을 설명하고 애플리케이션 최적화를 위한 자동화 및 튜닝 시나리오를 제공한다.

왜 DB2 Express-C 인가?

DB2 Express-C는 DB2 Universal Database™ (UDB) Express Edition V8.2.2와 같은 핵심 기술에 기반하고 있다. DB2 Express-C는 리눅스와 Windows 플랫폼 (32-bit와 64-bit)에서 사용 가능하며 IBM에서 무료 다운로드를 제공한다. IBM은 DB2 Universal Database Express Edition (DB2 Express) 버전인 DB2 Universal Database Express Edition (DB2 Express)을 2006년 1월 30일 발표했다. C/C++, 자바, .NET, PHP 등 모든 애플리케이션들을 구현하고 전개할 수 있는 강력한 기반을 제공한다.

IBM Cloudscape™와 Express-C는 이제 IBM에서 무료 라이센스로 사용할 수 있으며 애플리케이션 개발과 전개에 사용될 수 있다. 이 두 개의 데이터베이스 서버 모두 SQL과 JDBC 같은 오픈 표준에 기반한 것이기 때문에 두 데이터 서버 간에 자바 애플리케이션과 데이터베이스를 마이그레이션 하기도 편하다. Cloudscape나 Apache Derby를 사용하고 있다면 무료 유틸리티인 Cloudscape Workbench를 사용하여 데이터베이스를 DB2로 마이그레이션 하고 새로운 DB2 Express-C를 실행시킬 수 있다. DB2 Express-C는 Cloudscape 보다 더 큰 다운로드와 디스크 풋프린트를 갖고 있지만 DB2 Express는 더 많은 툴들을 제공한다. 또한, .NET 애플리케이션도 완전히 지원하고 PHP 애플리케이션에는 이상적이다. DB2 Express-C는 최대 두 개의 CPU와 4GB 메모리 까지 활용할 수 있고 데이터베이스의 크기는 제한이 없다. DB2는 많은 디스크에 걸쳐 데이터베이스를 분산하여 확장성과 퍼포먼스를 높이고 있다.

DB2 Express-C는 제품화 준비가 된 데이터베이스 서버로서 매 새로운 릴리스 마다 향상된 혁신적인 기술에 기반하고 있다. DB2는 1995년 이후 Windows에서, 1999년 부터는 리눅스에서 사용 가능하다. DB2의 역사를 알고싶다면 "The Big Picture: IBM DB2 Information Management Software and DB2 Universal Database" (developerWorks, 2003년 1월)을 읽어보기 바란다.

"만약 내 데이터베이스 서버가 4GB 메모리와 2 CPU 이상을 필요로 한다면?" 리눅스, Windows, UNIX용 UDB Enterprise Server Edition (ESE)으로 바꾸면 된다. DB2 ESE는 테라바이트의 데이터를 지원할 수 있는 입증된 플랫폼이다. DB2 ESE는 Database Partitioning Feature (DPF)를 추가하여 데이터베이스 병렬 연산을 수행할 수 있다. DB2 Express-C에서 다른 DB2 에디션으로 전향하는 일은 간단하다. 핵심 데이터베이스 엔진이 같기 때문이다.

DB2 Express-C의 등장과 함께 IBM DB2 전문가들로 구성된 새로운 포럼이 만들어졌다. 이 포럼은 이 새로운 무료의 데이터 서버에 대한 궁금증을 해소할 수 있는 좋은 장소이다. DB2 Express-C는 완벽한 매뉴얼도 갖추고 있고, PDF 포맷이나 DB2 Information Center에서 검색도 가능하다. DB2 Information Center는 온라인 상에서 지속적으로 업데이트 되며 최신 버전을 다운로드 할 수 있고 전용 서버에 설치할 수도 있다. DB2 UDB 제품 매뉴얼 모두 사용할 수 있다. DB2 Information Center는 리눅스, UNIX, Windows용 DB2 UDB의 모든 에디션 공통이기 때문에, Database Partitioning Feature (DPF) 같은 고급 기능들은 DB2 Express-C 환경에는 적용할 수 없다.

리눅스에서 DB2 Express-C를 사용하려면 검증된 최신 리눅스 배포판을 점검해보는 것이 좋다. 리눅스용 DB2에 대한 좋은 참고자료로는 DB2 Universal Database Version 8.2 for 리눅스 HOWTO가 있다.

설치와 실행

DB2 Express-C 설치하기

DB2 Express-C의 최소 메모리 조건은 그래픽 툴이 없는 256MB 또는 그래픽 툴을 가진 512MB이다. 이 글에서 설명하는 머신은 2GB 메모리에 적합하다. 나는 Windows(32-bit)용 DB2 Express-C를 다운로드 했다. 다운로드는 391MB였고 설치는 매우 간단했다. ZIP 파일의 압축이 풀리면(내 시스템 상에서 압축이 풀린 디렉토리는 그렇게 크지 않은 412MB에 불과하다.) setup 실행파일을 실행한다. 이렇게 되면DB2 Express Launchpad가 시작한다. (그림 1) 그래픽 설치자가 DB2 Express-C를 설치할 장소와 DB2 Administration Server의 사용자 아이디와 패스워드를 묻는다. 나는 전형적인 설치작업을 수행했다. 개발 툴과 라이브러리를 포함시켰다. 총 설치 시간은 4분 이내였다.

설치를 계속해 나가다 보면 새로운 윈도우(그림 2)가 디스플레이 된다. 계속 진행하여 첫 번째 DB2 데이터베이스를 만든다. SAMPLE이라고 하는 DB2 Express-C에서 제공하는 샘플 데이터베이스가 있다. DB2 Express-C에서 제공하는 툴을 사용하여 제품 환경에 SAMPLE 데이터베이스를 설정하고, 백만 개 이상의 열을 가진 데이터 테이블의 퍼포먼스 문제들도 다룰 것이다.

DB2 Express-C는 관리하기 수월한 데이터 베이스이다. 완벽한 그래픽 툴과 명령행 툴이 데이터베이스 관리자(DBA)를 돕는다. 가장 일반적으로 사용되는 그래픽 툴은 DB2 Control Center이고 가장 많이 사용되는 명령행 툴은 DB2 CLP(Command Line Processor)이다. 툴 이름을 보면 특징적인 것은 없지만 매력적인 기능을 갖고 있다.

DB2 Express-C에서 제공하는 그래픽 툴은 다양한 범주로 나뉜다. (그림3) General Administration Tools 목록에 DB2 Control Center가 있다. 대부분의 다른 그래픽 툴들은 DB2 Control Center내에서 접근할 수 있다.

DB2 Control Center( 그림 4)는 DBA에게 데이터베이스의 운영 상황을 제공한다. 이 예제를 보면, SAMPLE 데이터베이스 크기는 25MB이고 아직 백업되지 않았다. 자동 관리 역시 설정되지 않았다.

DB2 그래픽 툴 위자드로는 DB2의 일반적인 관리 작업들을 수행하는 방법을 빠르게 배울 수 있다. DB2 Control Center의 각 객체는 객체 트리의 객체를 오른쪽 클릭하여 조작한다. 많은 위자드들은 새로운 DB2 DBA가 백업 데이터베이스 이미지를 만들고 이전 이미지들을 복구하는 등의 일반적인 태스크를 수행할 때 쓰인다. (그림 5)

그림 6을 보면, SAMPLE 데이터베이스가 537MB로 늘어났다. 이 데이터베이스에는 백업 자동화와 관리가 설정되었다. DB2 Express-C가 규정한 alert 상황이 있다. ( 그림 6) 이제 이 상황을 파악하고 해결하는 방법을 알아보자.

DB2만의 유일한 기능은 환경을 실시간으로 모니터링하고 DBA에게 비정상적인 상황들을 공지하는 기능이다. 그림 7에서, DB2가 SAMPLE 데이터베이스에서 시간 당 많은 잠금(lock) 에스컬레이션을 탐지했다. DB2는 데이터베이스 객체에 대한 잠금을 사용하여 트랜잭션 일관성을 보장한다. 이 예제에서 DB2는 한 시간 내에 1150 잠금 에스컬레이션을 수행했다. DB2는 DB2 서버에 할당된 메모리를 가지고 그렇게 많은 잠금 열을 관리할 수 없었다. 이 상황은 잠금 관리용 DB2 서버 메모리를 늘려서 쉽게 해결될 수 있다. DBA가 직접 수정하거나 자동화 처리된다. DB2의 상태 모니터링 기능은 규모가 큰 DB2 Enterprise Server Edition (ESE)을 통해서 DB2 Express-C에도 적용된다. DB2 Express-C가 여러분의 애플리케이션의 트랜잭션 일관성을 보장할 것이다. 각 트랜잭션은 기록되어 데이터베이스 내의 데이터 무결성을 보장한다.

분석 시나리오

데이터베이스 애플리케이션 퍼포먼스는 고객의 솔루션 만족도에 직접적인 영향을 미친다. 최적의 퍼포먼스를 이룩하는 것은 거의 예술의 경지로 취급 받는다. DB2 Express-C는 완벽한 툴(그래픽과 비 그래픽)을 제공하여 고성능의 신뢰성 있는 애플리케이션을 만들 수 있도록 한다. 이 시나리오에서 우리는 우리 회사에서 가장 봉급을 많이 받는 부서를 결정할 것이다. 최적의 퍼포먼스를 이룩하기 위해 DB2 Express-C에서 제공하는 툴 조합을 사용할 것이다.

이 시나리오에서 사용되는 툴은 다음과 같다.

  • db2batch
  • Visual Explain
  • Design Advisor
  • Activity Monitor

db2batch 유틸리티는 쿼리의 런타임 퍼포먼스를 분석하는데 적합한 툴이다. 이 시나리오에서 다음과 같은 SQL 문장을 사용하여 분석을 수행한다.

SELECT DECIMAL(AVG(salary),12,2) as average_sal, location, deptname FROM staff a, org b WHERE b.deptnumb=a.dept GROUP BY dept,location, deptname ORDER BY average_sal DESC

STAFF 테이블은 백만 개 이상의 레코드로 늘어났고 쿼리에 드는 시간도 늘어났다. 그림 8에서, 이 쿼리의 경과 시간은 18초이다. (뉴욕 본사가 최고로 많이 걸렸다. 예상했던 결과이다.)

그림 9는 값비싼 테이블 스캔이 STAFF 테이블에 대해 수행되고 Hash Join 연산이 ORG와 STAFF 테이블의 데이터에 근거하여 수행되었다는 것을 보여주고 있다. 이 테이블에 대한 인덱스가 없기 때문에 DB2는 쿼리 실행 중에 사용할 것이다. 우리는 DB2 Design Advisor를 사용할 것이고 DB2에게 적절한 새로운 인덱스를 ORG와 STAFF 테이블에 붙여서 쿼리 퍼포먼스를 높일 것을 요청한다.

그림 10은 DB2 Design Advisor로부터 온 피드백이다. DEPT와 SALARY 칼럼을 사용하여 STAFF 테이블에 인덱스를 생성할 것을 권고하고 있다. Design Advisor용 쿼리 워크로드는 파일에 제공되거나 애플리케이션 실행 중에 캡쳐될 수 있다.

그림 11은 이 인덱스가 쿼리 실행에 도움이 되었다는 것을 보여주고 있다. 쿼리의 경과 시간이 현격하게 향상되었다. 이제는 7초 밖에 안 걸린다.

그림 12는 STAFF 테이블의 새로운 인덱스가 쿼리 액세스 계획에 사용되고 있다는 것을 확인하는 모습이다. 쿼리의 실행 비용 역시 줄어든다.

마지막으로, 이 쿼리의 실행 중에 사용될 전체 시스템 리소스를 결정하는 방법도 궁금할 것이다. DB2 UDB V8.2에 추가된 새로운 툴인 Activity Monitor는 다양한 SQL 함수와 프로시저를 사용하여 실행 시스템에 대한 퍼포먼스 데이터를 가져온다. 그림 13을 보면, 쿼리가 두 개의 소트를 수행하는데 걸리는 시간이 12초 미만이라는 것을 알 수 있다. Activity Monitor에는 DB2 Express-C 환경을 분석하는데 사용할 수 있는 리포트가 많이 있다.

개발자, 개발자, 개발자

전형적인 DB2 Express-C는 C/C++, 자바, .NET 애플리케이션을 개발할 때 사용할 필수 드라이버와 인터페이스를 제공한다. PHP나 Perl 애플리케이션을 개발하는 것에 관심이 있다면 여기에 사용할 수 있는 드라이버가 있다. PHP와 Perl 인터페이스가 개발되어 DB2 팀 내 엔지니어들이 관리한다. DB2는 저장 프로시저, 트리거, 함수(테이블과 스칼라)를 포함하여 많은 서버측 프로그래밍 언어를 지원한다. DB2 저장 프로시저는 C/C++, COBOL, Java (JDBC 또는 SQLJ), .NET (CLR 호환 언어), SQL Procedure Language (SQL PL)를 사용하여 작성될 수 있다. 저장 프로시저 언어에 따라 선택은 다양하지만 가장 일반적으로 사용되는 언어는 자바와 SQL PL이다.

SQL Procedure Language (SQL PL) 저장 프로시저는 원시 프로시저로 간주된다. 리눅스와 Windows 상의 DB2 데이터베이스 내의 객체로서 저장되기 때문이다. SQL PL은 유일한 ANSI SQL 표준 기반의 저장 객체 언어로서 진화해 왔다. SQL PL은 전체 DB2 데이터베이스 서버 제품군에서 지원된다. (리눅스, UNIX, Windows, iSeries, z/OS 용). DB2 Express-C는 매우 유용한 그래픽 툴인 Development Center를 제공하여 자바와 SQL PL 프로시저를 비롯하여 SQL 저장 프로시저의 개발, 테스트, 전개를 관리한다. 그림 14 는 SQL PL 프로시저의 구현, 테스트, 전개에 사용되는 DB2 Development Center의 모습이다. 이 그림에서 보이는 프로시저는 high_rollers이고 DB2 Express-C 내에서 저장 및 실행된다. 저장 프로시저 실행은 DB2 내에서 엄격히 제어되기 때문에 DB2 데이터로의 액세스를 보안화 하는 기술이라고 할 수 있다.

자바

DB2에서 자바 애플리케이션을 개발하기는 쉽다. 모든 DB2 클라이언트와 서버가 JDBC 3 순응 (type-4) 드라이버를 제공하기 때문이다. 현재 DB2에 포함된 두 개의 다른 JDBC가 있다. 원래 드라이버(db2java.zip)는 Application (type 2)과 Network (type 3) 드라이버로 알려져 있다. 새롭고 보다 유연한 JDBC 드라이버(db2jcc.jar)는 type 2 또는 type 4 모드에서 사용될 수 있고, 최신 자바 클라이언트/서버 산업 벤치마크에서 사용되었다. (SPECjAppServer 2004 with DB2 and WebSphere Application Server ? 참고자료). JDBC (db2jcc.jar)용 DB2 드라이버는 DB2 런타임 클라이언트에 번들 된다. 애플리케이션이 순수 자바이면 CLASSPATH에 db2jcc_license_cu.jar와 db2jcc.jar를 삽입할 수 있다. 이 파일들은 <DB2 Installation location>\SQLLIB\java 디렉토리에 있다. IBM WebSphere Application Server와 DB2 데이터 서버 같은 Java 2 Platform Enterprise Edition (J2EE)서버는 확장성 있는 애플리케이션을 실행할 분산 애플리케이션 인프라를 제공한다.

PHP

PHP("PHP: Hypertext Preprocessor")는 광범위하게 사용되는 오픈 소스의 범용 스크립팅 언어로서 웹 개발에 이상적이고 HTML에 삽입될 수 있다. PHP는 확장성 있는 웹 애플리케이션을 위한 선택으로서 전 세계적으로 빠르게 채택되고 있다. PHP의 DB2 지원은 PHP용 IBM DB2 확장(참고자료")까지 이르렀다. PHP는 수 백만 개의 웹 애플리케이션을 움직일 수 있는 오픈 소스 스크립팅 언어이고 PHP는 1995년 도입된 이래 꾸준히 진화해 오고 있다. PHP용 DB2 확장은 소스 코드로 제공된다. 코드를 컴파일 하지 않고 Windows에서 이 확장을 사용하고 싶다면 Windows용 필수 라이브러리도 있다. (참고자료)

DB2 환경을 설치 및 실행하는 가장 쉬운 방법 중 하나는 IBM과 Zend Technologies에서 개발한 무료 Zend Core™ for IBM을 다운로드 하는 것이다. Zend Core for IBM는 PHP 개발 및 제품 환경으로서 IBM Cloudscape 데이터베이스 서버와 긴밀히 통합되어 있다. 이것은 데이터베이스 기반 애플리케이션의 개발 및 전개 토대가 된다. PHP 지원 및 DB2 지원 등 전체적인 웹 스택 지원이 필요하면 지원 옵션도 사용할 수 있다. Zend Core for IBM은 Cloudscape 데이터베이스 서버와 무료 DB2 Express를 삽입하여 전개를 용이하게 한다. 나중에 전체 DB2 Express Edition 라이센스를 구매하면 DB2 Express 제품 번들에도 지원이 가능하다. 그림 15 는 DB2용 PHP 확장 모습을 보여주고 있는 Zend Core for IBM 관리 웹 콘솔 모습이다.

.NET

DB2 Express-C는 DB2 .NET 1.1 Data Provider와 Microsoft Visual Studio .NET 2003용 애드인(add-in)을 제공한다. IBM 익스플로러와 통합 DB2 도움말이 Visual Studio내에 있다. ( 그림 16) DB2 Express-C가 설치되면 Visual Studio .NET 2003의 존재 여부를 검사하고, 존재할 경우에 DB2 기능을 Visual Studio에 추가한다. 이러한 애드인으로 .NET 애플리케이션의 개발 시간이 줄어든다. DB2 UDB v8.2의 릴리스로 인해, .NET(CLR - Common Language Runtime) 저장 프로시저 지원이 새로운 옵션으로서 추가되었다.

DB2 add-ins for Visual Studio 2005 - Developer Release용 DB2 애드인을 무료로 다운로드 할 수 있다. Developer Release에는 DB2 .NET 2.0 Data Provider와 최근에 릴리스 된 Microsoft Visual Studio 2005 IDE용 애드인 세트가 포함되어 있다.

C/C++ 및 기타

DB2 Express-C는 데이터 액세스, DB2 CLI, Embedded SQL에 두 개의 기본적인 C API를 제공한다. 가장 일반적으로 사용되는 C/C++ API는 DB2 Call Level Interface (CLI)이고, 이것은 X/Open CLI 표준에 근거하고 있다. 이 API는 Windows 애플리케이션에 사용되는 Microsoft ODBC (Open Database Connectivity) API를 매우 닮아있다. DB2 데이터에 대한 Embedded SQL의 접근 방식은 애플리케이션 프로세서를 사용하여 모든 SQL 레퍼런스들을 DB2 서버에 대한 원시 액세스 인터페이스로 대체하는 것이다. Embedded SQL은 SQL 문이 잘 정의도어 있고 애플리케이션 개발 동안에 알려져 있다면 매우 큰 효력을 발휘할 수 있다. SQL은 타당성 검사를 할 수 있고 액세스 계획은 개발 동안에는 잠기기 때문에 애플리케이션 퍼포먼스가 높아진다. SQL 문은 기본적으로 역동적이고, DB2 CLI API 같은 역동적인 SQL 액세스 기술을 많이 선호하고 있다.

COBOL, Perl, Python 같은 DB2 Express-C용 옵션들이 많이 있다. Perl 드라이버는 오픈 소스 Perl 커뮤니티에서 사용할 수 있고 IBM에서 전적으로 관리 및 지원한다. SourceForge.net ( 참고자료 )에서 DB2에 사용할 수 있는 Python 드라이버가 업데이트 되어 있다. Perl, PHP, Python 드라이버 모두 전개에는 DB2 Run-time이, 컴파일과 구현에는 DB2 Application Development Client (DB2 Express-C)가 필요하다.

전개 가이드

데이터베이스 애플리케이션을 전개하려면 고려해야 할 사항들이 있다.

1. DB2 서버 설치하기
2. DB2 클라이언트 설치하기
3. 애플리케이션 전개하기
4. 데이터베이스 전개하기

DB2 서버 환경을 설치는 DB2 그래픽 인스톨러(db2setup (리눅스)/ setup (Windows))를 사용하거나 응답 파일(db2setup -R (리눅스) / setup /U <file-name> (Windows))을 사용하여 비교적 간소하게 설치할 수 있다.

DB2 Run-Time Client는 모든 애플리케이션 프로그래밍 인터페이스(API)와 네트워크 클라이언트 드라이버를 제공하여 리눅스, 유닉스, Windows 상의 DB2에 직접 액세스 한다. Windows의 경우 보다 단순한 클라이언트가 있다. (DB2 Run-Time Client Lite) 풋프린트가 더 적다. DB2 Run-Time Client Lite는 Windows Installer 기반 설치에서 사용될 수 있는 Merge Module도 제공하여 Windows 애플리케이션에서 DB2에 연결을 쉽게 삽입할 수 있다.

애플리케이션 전개 까지는 이 글에서는 설명하지 않겠다. 데이터베이스의 전개는 DB2 백업 이미지를 사용하거나 데이터베이스는 로드 파일로 추출된 데이터에서 구현될 수 있다. 저장 프로시저, 트리거, 뷰, 사용자 정의 함수 같은 애플리케이션 객체들이 알맞게 정의되고 액세스 가능한지를 확인하라.

작동 가이드

DB2 Express-C는 리눅스, 유닉스, Windows용 전체 DB2 서버와 같은 데이터베이스 서버 핵심 기술을 바탕으로 하고, DB2 UDB V8.1과 V8.2에 도입된 많은 기능들은 DBA의 관리 작업을 돕는다. DB2 DBA는 테라바이트의 DB2 시스템 또는 DB2 서버를 관리한다. DB2 Express-C에서는 자가 관리와 자가 튜닝 기능도 사용할 수 있기 때문에 최소한의 DB2 DBA의 기술로도 DB2 Express-C 데이터베이스 서버를 사용하는 애플리케이션의 가용성을 최대화 할 수 있다.

Cloudscape

Cloudscape는 순수 자바 데이터베이스 서버이고 자바 애플리케이션이나 중간 규모의 웹 애플리케이션용 임베디드 데이터베이스 엔진으로서 이상적이다. Cloudscape V10은 2004년 IBM에서 처음 릴리스 되었다. 당시에는 무료의 데이터베이스 서버 라이센스로 릴리스 되었다. 동시에 같은 코드 베이스를 가진 Apache Derby Project가 Apache Software Foundation의 인큐베이터 프로젝트로서 시작되었다. ( 참고자료 ) Cloudscape V10은 2005년 8월에 업데이트 되었다. Cloudscape V10.1 릴리스 이전에 Apache Software Foundation의 Derby Project가 인큐베이션 단계에서 벗어나서 Apache DB 프로젝트의 정식 멤버가 되었다. 매우 활동적인 커뮤니티가 있고 데이터베이스 서버는 많은 고객, 연구원, 비즈니스 파트너들이 사용하고 있다. Cloudscape V10.1은 Derby 10.1 코드 베이스에 인스톨러, 드라이버, 툴 등이 추가된 것이다. IBM은 Cloudscape V10.1 고객을 위해 지원 옵션을 제공한다.

파트너를 위한 자료

IBM Virtual Innovation Center( 그림 17)에서는 ISV(독립 소프트웨어 벤더)와 비즈니스 파트너를 위한 애플리케이션을 제공하고 있다. 솔루션에 DB2 Express Edition V8.2.2를 사용할 계획이 있다면 반드시 등록해야 한다.

요약

DB2 Express-C는 독특한 기능을 가진 데이터 서버의 새로운 대안이다. DB2 Express-C를 다운로드 하여 사용하고 DB2 사용자 커뮤니티에도 참여하기 바란다.

참고자료
교육
DB2 Universal Database Express Edition for Linux and Windows product page
DB2 Universal Database, Version 8.2 for Linux HOWTO
SPECjAppServer 2004 with DB2 and WebSphere Application Server
Apache Derby Project
• "DB2 UDB를 이용한 애플리케이션 개발 (developerWorks, November 2005)
• Interested in using DB2 for Visual Basic .NET or C# .NET applications? Read the latest articles from Sonali Surange:
○ "DB2 UDB for Visual Studio 2005 developers, Part 1: Overview of IBM Database Add-ins for Visual Studio 2005" (developerWorks, December 2005)
○ "DB2 UDB for Visual Studio 2005 developers, Part 2: Build applications and Web sites for DB2 using IBM Database Add-ins for Visual Studio 2005" (developerWorks, December 2005)
developerWorks technical events and webcasts.
developerWorks Information Management zone
Power solutions with DB2 Express to deliver Information on Demand.
제품 및 기술 얻기
DB2 Express-C
Zend Core for IBM, Zend Studio V5.1
• Extensions for PHP:
DB2 native extensions for PHP
DB2 extensions for PHP
Library for extension on Windows
Updated Python driver
IBM trial software
토론
Participate in the discussion forum.
developerWorks blogs

제공 : DB포탈사이트 DBguide.net

Tistory 태그: ,

v8 이전의 JDBC driver을 DB2 JDBC drvier라고 하고,

v8 이후에 새롭게 추가된 JDBC driver를 Universal JDBC driver라고 명명하고 설명합니다.

v8 이상에서는 Universal JDBC Driver를 사용할 것을 권장합니다.

Class files

- db2java.zip : DB2 JDBC Type 2 and Type 3 Driver

- db2jcc.jar   : Universal Type 2 and Type 4 Driver

License jar files (Universal JDBC driver를 사용할 때 필요)

- db2jcc_license_cu.jar : for connecting DB2 v8 for LUW

- db2jcc_license_cisuz.jar : for connecting DB2 for iSeries and z/OS

JDBC Drvier class name

- DB2 JDBC Type 2 Driver : COM.ibm.db2.jdbc.app.DB2Driver

- DB2 JDBC Type 3 Driver : COM.ibm.db2.jdbc.net.DB2Driver

- Universal JDBC Type 2 Driver : com.ibm.db2.jcc.DB2Driver

- Universal JDBC Type 4 Driver : com.ibm.db2.jcc.DB2Driver

JDBC url name

- DB2 JDBC Type 2 Driver : jdbc:db2:db_name

- DB2 JDBC Type 3 Driver : jdbc:db2://host_name:port_name/db_name

- Universal JDBC Type 2 Driver : jdbc:db2:sample

- Universal JDBC Type 4 Driver : jdbc:db2://host_name:port_name/db_name

Windows DB2 사용시 주의점.

JDBC Type4를 사용했을경우 SUN JDK 사용시, IBM CodeSet으로 자동변환이 안되기

때문에 DATABASE생성시 UTF-8코드로 생성해주어야 함.

p.s. IBM에서 DB2 사용시 JDBC Type2를 권장한다고 함.

JDBC Type4 SAMPLE :

import java.sql.*;

public class DbProcess {
public static void main(String[] args) throws Exception{
  Connection con = null;
     Statement stmt = null;
     ResultSet rs = null;
     String url = "jdbc:db2://localhost:50000/sample";
     String user = "admin";
     String password = "1111";
  try {
            Class.forName("com.ibm.db2.jcc.DB2Driver").newInstance();
            System.out.println("Driver Loading");
        } catch (ClassNotFoundException ex) {
            ex.printStackTrace();
        } catch (IllegalAccessException ex) {
            ex.printStackTrace();
        } catch (InstantiationException ex) {
            ex.printStackTrace();
        }
        try {
            con = DriverManager.getConnection(url, user, password);
            System.out.println("get Connection Object");
        } catch (SQLException ex) {
            ex.printStackTrace();
        }

        stmt = con.createStatement();
        System.out.println("get Statment Object");
        rs = stmt.executeQuery("select EMPNO from EMPLOYEE");
        System.out.println("get ResultSet Object");
        while(rs.next()){
         System.out.println(rs.getString(1));
        }
     rs.close();
     stmt.close();
     con.close();
}
}

Tistory 태그: ,

'IT > DB' 카테고리의 다른 글

[ORACLE] PL/SQL 정리  (0) 2008.09.20
[DB2] 개발자 친화적인 대안, DB2 Express-C  (0) 2008.09.20
[DB2] DB2 - SQL state [54048]; error code [-1585];  (0) 2008.09.20
[DB2] 명령어 모음  (0) 2008.09.20
[ORACLE] 파티션테이블  (0) 2008.09.19

SQL state [54048]; error code [-1585]; DB2 SQL error: SQLCODE: -1585, SQLSTAT
E: 54048, SQLERRMC: null; nested exception is com.ibm.db2.jcc.b.SqlException: DB
2 SQL error: SQLCODE: -1585, SQLSTATE: 54048, SQLERRMC: null
com.ibm.db2.jcc.b.SqlException: DB2 SQL error: SQLCODE: -1585, SQLSTATE: 54048,
SQLERRMC: null

//여러 개 아우터조인 했을때 발생..

쿼리문을 토드에서 날려보면..

ERROR [54048] [IBM][DB2/6000] SQL1585N  충분한 페이지 크기를 갖는 시스템 임시 테이블 스페이스가 없습니다.  SQLSTATE=54048

저런 메세지가 나온다...

아마도... 임시테이블 공간이 없나??(내가 설정한게 아니라 모르겠다.ㅠㅠ)

불필요한 값들의 컬럼을 지우고 나면 쿼리문 제대로 수행하는듯...


'IT > DB' 카테고리의 다른 글

[DB2] 개발자 친화적인 대안, DB2 Express-C  (0) 2008.09.20
[DB2] DB2에서 JDBC 연결하기  (0) 2008.09.20
[DB2] 명령어 모음  (0) 2008.09.20
[ORACLE] 파티션테이블  (0) 2008.09.19
[ORACLE] ERROR 관련  (0) 2008.09.19

DB2 명령어 모음

서버 구성 파일 db2 get dbm cfg

인스턴스 이름을 변경하거나, service name, port 등을 변경 winntsystem32driversetcservices 파일수정

인스턴스 레벨의 변수를 수정 db2 update dbm cfg using [파라미터] [값]

DB2 Start db2start

DB2 Stop db2stop

db2 deactivate db (db2 activate db 로 메모리 상주시)

db2 force application all

db2stop

DB 연결끊기 db2 terminate

DB2 확인 시작프로그램>IBM DB2>일반관리도구>제어센터

db 생성 db2 create db database명

db 연결 db2 connect to database명 user userid using password

Tablespace의 정보 db2 list tablespaces | more

db2 list tablespace show detail | more

Table의 list db2 list tables for all | more

Table의 column 정보 db2 “select tabschema, tabname, colname, typename,

length, scale, default, nulls from syscat.columns “

제어센터 이용

db 목록 db2 list db directory

tablespace(ex. GisaTBS)가 부족할 경우

# su ? root

smit에서 datavg1에 Logical Volume 64M 짜리를 하나 만듬

# cd /dev

# chown db2inst1:db2iadm1 gisalv2

$ su ? db2inst1

$ db2 connect to depsdb

$ db2 “alter tablespace GisaTBS

add (device ‘/dev/rgisalv2’ 16000)”

TableSpace가 Backup Pending 상태에 빠졌을 경우

$ db2 list tablespaces | more

$ db2 backup database depsdb tablespace GisaTBS ( ex. GisaTBS가 백업 보류 )

TableSpace가 Check Pending 상태에 빠졌을 경우

[다음은 테이블의 점검보류 상태를 조회하는 것이다.

SUBSTR은 SYSCAT.TABLES의 CONST_CHECKED 컬럼에 있는 처음 2바이트를 추출하는데 사용된다.

첫번째 바이트는 외부 키 의무 규정을 나타내고,

두번째 바이트는 점검 의무 규정을 나타낸다.]

$ db2 “ SELECT TABNAME, SUBSTR( CONST_CHECKED, 1, 1 ) AS FK_CHECKED

, SUBSTR( CONST_CHECKED, 2, 1 ) AS CC_CHECKED

FROM SYSCAT.TABLES

WHERE STATUS = 'C' “

그 다음 T1과 T2 테이블을 점검 보류 상태로 설정합니다

$ db2 SET CONSTRAINTS FOR T1, T2 OFF

다음과 같이 수행하여 T1에 대한 제한 조건을 점검하고 첫번째 위반만을 얻습니다.

$ db2 SET CONSTRAINTS FOR T1 IMMEDIATE CHECKED

T1 및 T2에 대한 제한 조건을 점검하고, 예외 테이블 E1과 E2로 위반 행을 기입한다.

$ db2 SET CONSTRAINTS FOR T1, T2 IMMEDIATE CHECKED

FOR EXCEPTION IN T1 USE E1, IN T2 USE E2

IMMEDIATE CHECKED 옵션으로 T1의 FOREIGN KEY 제한 조건 점검과 T2의 CHECK 제한 조건 점검이 무시되도록 합니다.

$ db2 SET CONSTRAINTS FOR T1 FOREIGN KEY, T2 CHECK IMMEDIATE UNCHECKED

에러 메세지 발생시 $HOME/sqllib/db2dump 디렉토리내의 db2diag.log 파일을 조사

db2 “ ? Sql0805 ” ex. db2 " ? list "

갑자기 느려졌을 경우- LOCK 상태확인 db2 get snapshot for locks on depsdb

- Index 설정 여부 dynexpln ?d depsdb “select …..” -o explain.out

손상된 데이터베이스의 강제 삭제

$HOME/instance_name$ rm -r SQL0000x 디렉토리 삭제 0000x는 디비 생성 순서, 손상된 디비의 물리적 디렉토리

runstats 명령

db2 runstats on table 테이블명 [WITH DISTRIBUTION

[AND [DETAILED] {INDEXES ALL | INDEX 색인명}] |

{AND | FOR} [DETAILED] {INDEXES ALL | INDEX 색인명}]

[SHRLEVEL {CHANGE | REFERENCE}]

db2 runstats on table inst.albums with distribution and detailed indexes all

테이블스페이스 및 테이블의 생성

$ db2 create regular tablespace dms04 managed by database using

(file '/dms/dms04' 1000) extentsize 2;

$ db2 create table test1 (partno integer, subpart integer) in DMS04

테이블스페이스 및 테이블의 상태

$ db2 list tablespaces

$ db2 list tablespaces show detail

$ db2 list tablespace containers for tblspace_id

$ db2 list tablespace containers for tblspace_id show detail

$ db2 list tables for all

$ db2 "select tbspace , definer , tbspaceid, tbspacetype,datatype

from syscat.tablespaces "

$ db2 "select tabname , tbspaceid, tbspace, index_tbspace , long_tbspace

from syscat.tables where tabname = 'SYSTABLES' "

$ du -k

테이블스페이스 및 테이블을 삭제 $ db2 drop tablespace test1space

$ db2 drop table userid.test1

DB Application 관리 $ db2 list applications show detail

$ db2 force application ( agent-id ); agent-id는 숫자5자리

Db2batch - SQL 조회에 대한 BMT용 유틸러티 $ db2batch “SQL 조회문”

Dynexpln - 동적 SQL에 대하여 db2expln을 수행

$ dynexpln [[-d <database>] [-e <statement terminator>]

[-f <input file>] [-g] [-i] [-t|

-o <output file> ] [-s <SQL statement>]

[-u <userid> <password> ] ] [ -h | -?]

// 옵션

-e <statement terminator> = SQL 구분자 (default 값은 no terminator)

-g = show optimizer plan graphs

-h 또는 -? = 도움말

-i = show operator ID numbers

-s <SQL statement> = 보고자 하는 SQL 문

-t = terminal output desired

제어센터를 실행시킨 후 해당 데이터베이스에서 오른쪽 마우스버튼을 클릭

limt 쿼리 select * from staff fetch first 5 rows only

select empno, lastname, yyt

from ( select empno, lastname, firstnme,

rownumber() over (order by empno) as yyt

from employee

) as t

where yyt between 20 and 30

ex. select empno, row_number() over() as n from employee ;

select empno, row_number() over(order by empno desc) as n from employee ;

select job, years, row_number() over(partition by job order by years) as n from staff ;

autoincrement 쿼리

CREATE TABLE TESTTB

(TEST INTEGER GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1, NO CACHE )

,NAME VARCHAR (15)

,YEAR INTEGER ) ;

A. Sequence 생성

① db2 connect to sample

② db2 “create sequence s1 start with 2 increment by 3 maxvalue 20 cycle”

B. NEXTVAL

① db2 “values NEXTVAL FOR s1”

② db2 “insert into myempl values (NEXTVAL FOR s1, ‘JOHN’, 50000)

C. Sequence 변경

① db2 “alter sequence s1 minvalue 1”

D. Sequence 삭제

① db2 “drop sequence s1 restrict”

auto commit 설정

db2cli.ini 파일에서 설정 또는 odbc connect 에서 설정.

명령센터>자동확약 체크

heap 크기 바꾸기 - 바꾸고난후 db2stop ; db2start;

db2 update db cfg for db이름 using APPLHEAPSZ 크기 ;

db2 update db cfg for db이름 using dbheap 크기

db2 update db cfg for db이름 using catalogcache_sz 크기

제어센타에서 칼럼을 변경하거나 삭제, 데이타 삽입

데이터 삽입은 제어센터의 아이콘들중 명령센터 프로그램을 실행 .

삭제 버튼은 처음에 테이블을 만들때만 쓰입니다. 즉 만들어진 후엔 기능을 사용할 수 없음.

현재날짜 char로 변환

SUBSTR(CHAR(CURRENT DATE,ISO),1,4) CONCAT SUBSTR(CHAR(CURRENT DATE,ISO),6,2) CONCAT SUBSTR(CHAR(CURRENT DATE, ISO),9,2)

dual 테이블사용

SELECT CURRENT TIMESTAMP FROM SYSIBM.SYSDUMMY1

insert into문

insert into aaa (TDM_ID, FEM_NO, ST_Dimension, ST_Spring_Rate )

select '2010', FEM_NO, ST_Dimension, ST_Spring_Rate from aaa where tdm_id = '1000'

또는

insert into aaa (TDM_ID, FEM_NO, ST_Dimension, ST_Spring_Rate )

= (select '2010', FEM_NO, ST_Dimension, ST_Spring_Rate from aaa where tdm_id = '1000')

CLP바로실행하기

db2cmd -c -i -w db2

SQL파일 실행하기

db2 -svtf 파일명.sql

참조. http://database.sarang.net

'IT > DB' 카테고리의 다른 글

[DB2] DB2에서 JDBC 연결하기  (0) 2008.09.20
[DB2] DB2 - SQL state [54048]; error code [-1585];  (0) 2008.09.20
[ORACLE] 파티션테이블  (0) 2008.09.19
[ORACLE] ERROR 관련  (0) 2008.09.19
[MSSQL] 날짜 형식 변환  (0) 2007.06.29

+ Recent posts