ORACLE/ADMIN2008. 4. 26. 06:22
반응형
오라클에서 유니코드의 사용

1. 컬럼의 데이터타입에 nchar, nvarchar2를 사용
기존 DB캐릭터셋 변경 없음
캐릭터셋 변환으로 인한 부하 발생

2, DB캐릭터셋을 유니코드로 변경(AL32UTF8)
캐릭터셋 변환으로 인한 부하 없음



OTN Forum > Translated Oracle Product >
http://otn.oracle.co.kr/forum/forum_open_list.jsp?forum_cate=tran


[TIP] characterset 선정시 주의 사항

한글을 지원하는 characterset 에는 아래의 것들이 있습니다.

KO16KSC5601
- 완성형
- 한글 2350자 지원

KO16MSWIN949
- 일명 확장완성형(MS에서 windows 에 만들어 놓은 codepage)
- 한글 11172자 지원
- 한글 순서가 뒤죽박죽(2350자의 KSC5601 에서 지원하는 글자는 가나다 순이지만 그 외 글자는 남는 코드 여기저기에 들어가 있음)
- 8.0.6 이상에서만 사용가능 (8.0.5 이하 버전과의 db link나 client 가 8.0.5 등인 경우는 문제가 발생)

UTF8
- Unicode의 CES 중 하나(구현방법중 하나라고 생각하면 될 듯)
- ascii는 1byte, 그 외 유럽쪽은 2byte, 아시아는 3byte(CJK)
- 한글 11172자 지원(고어도 지원) 및 가나다 순 정렬
=> '가'와 '나'의 차이와 '나'와 '다'의 차이가 같음. 제대로 된 전화번호부를 만들 수 있을 듯...

AL32UTF8
- Unicode의 CES중 하나(9i부터 나온 것으로 알고 있음)
- Length semantics로 하면 4 byte( varchar2(3 char) 로 하면 12byte, UTF8에서는 9byte로 알고 있음)
- UTF8과 한글지원 부분은 똑같은 것으로 알고 있음.
- 8i는 미지원이므로 db link나 8i client 사용시 정상적 처리 불가

* AL16UTF16 (논외)
- Unicode의 CES중 하나
- national characterset 에서만 선택가능
- 모든 글자를 2byte or 4byte로 표현

고로

용량을 줄이면서 한글표현 다하고 싶고 8.0.5는 없다면 ko16mswin949를,
한글 표현 제대로 하면서 가나다 순으로 제대로 정렬될 필요가 있으면서 8i와 전혀 연동할 계획이 없다면 AL32UTF8,
위와 같지만 8i가 껴있다면 UTF8로 하시는 것이 좋을 듯 합니다.



UTF8과 AL32UTF8의 차이점

Supplement Character(UTF8에서 4바이트 이상을 차지하는)를 사용하는 것이 아
니라, 일반적인 다국어라면 UTF8와 AL32UTF8의 차이점은 거의 없다고 보시면 됩
니다.

Oracle 캐릭터셋으로서의:
UTF8은 UNICODE 3.0만을 지원하며, 앞으로도 계속 그렇게 유지됩니다.

하지만, UNICODE라는 캐릭터셋 자체도 www.unicode.org에서 보시면 알겠지만,
계속 진화하고 있습니다. 그래서 오라클에서도 새로운 데이타베이스 버전이 나
올 수록 그 순간의 최신 버전의 유니코드를 AL32UTF8을 통해 지원하게 되는 것
입니다.

AL32UTF8은 따라서,
9.0.x : Unicode 3.0
9.2.x : 3.1
10.1.x : 3.2
10.2.x : 4.0

입니다.

AL32UTF8은 9i 이상에서만 식별이 되므로, 8i와 데이타베이스 링크를 사용해야
한다고 할 때에는 UTF8을 사용하는 것이 좋습니다. 아니면 적어도 NLS_LANG을
UTF8로 해 주어야 할 것입니다. 핵심은 구버전과의 호환에 주의해야 한다는 것
입니다. 그리고, National Character Set으로도 설정할 수 없습니다.

성능에서 서로 차이가 있다고는 볼 수 없습니다.





1. 일반적으로 UTF8이 AL16UTF16보다 느리다는 것은 맞습니다. 아무래도
Variable width charset이 Fixed-width charset보다 느릴 수 밖에요. 하지만 얼
마나 느린가에 대해서는 정확히 말씀드릴 수는 없습니다. 하지만 순수하게 한
글 데이타만 저장할 것이 아니라면 AL16UTF16의 경우 영문 데이타 처리에 공간
적 비용이 매우 큽니다. 그래서 일반적으로는 AL32UTF8 charset을 유니코드
charset으로 사용합니다.

2. Web page processing을 UTF8로 하신다는 것은 다국어 지원 클라이언트를 원
하시는 것으로 받아들여집니다. 당연히 데이타베이스는 유니코드 기반의 데이타
베이스를 사용하셔야 합니다. 한글만 처리할 경우에는 Web Client 자체가 유니
코드 기반일 필요는 없겠지요. 그렇다고 안 되는 것은 아닙니다.

3. 그것은 KO16KSC5601 charset이 순수 한글만 포함된 것이 아니라 한자 4880
자, Hiragana 83자, katakana 86자를 포함하고 있기 때문입니다.

nvarchar2컬럼에 데이터입력
4. TO_NCHAR 또는 N''data''를 이용하시면 되겠습니다.
INSERT INTO ... VALUES(TO_NCHAR(''Data''), N''Data'',..);



UTF8과 KO16KSC5601은 성능 이외의 중요한 차이점이 있습니다.

KO16KSC5601은 한글 완성형(KSC5601)을 지원하는 캐릭터셋으로 한글 2350자, 한
자 4880자, 히라카나와 카타카나 53자를 포함한 캐릭터셋입니다. 2바이트를 원
하신다면 차라리 KO16MSWIN949를 선택하셔야 합니다. 운영체제는 전혀 상관없습
니다. 유닉스에서도 KO16MSWIN949를 문제없이 사용할 수 있습니다.

UTF8을 사용하면 공간 활용도가 줄어들 것입니다. 하지만 한글을 정렬해야 할
작업이 많은 경우 오히려 높은 성능을 보여줄 수 있습니다.

KO16MSWIN949는 상대적으로 공간을 절약할 수 있습니다. 하지만 한글 정렬시
UNICODE_BINARY로 정렬해야 하며 정렬의 성능이 좋지 않을 수 있습니다.

실제 트랜잭션들이 과도하게 몰려 바쁘지 않은 이상 한 트랜잭션에서 느낄 수
있는 성능의 차이는 크지 않습니다.

데이타에서 한글과 영문의 빈도, 사용자 수를 조사하시어 시뮬레이션 해 보신
후 결정하시는 것이 좋을 것 같습니다.




혹 유사한 고민을 하시는 분들이다 멀티랭귀지/멀티캐릭터셑 프로젝트를 하시는
분들께 도움이 될까 하여 결과를 올립니다.

-
1. 우선 멀티 랭귀지/캐릭터 셑을 지원하기 위해 캐릭터셑들의 슈퍼셑인 유니코
드를 DB charset으로 설정하셔야 합니다.

2. 사용자와의 인터페이스 부분 (웹서버든 WAS이든) 에 default charset을 설정
하실 수 있으니 UTF-8등의 유니코드로 설정 하십시오.
이때 http header에 setContentType등을 활용하십시오.

3. jdbc connection은 thin dirver이면 그냥, OCI driver라면 NLS_LANG=.UTF-8
설정하십시오.

위 과정으로도 어떠한 변환 없이 다국어/다캐릭터셑 입출력이 가능합니다.


이제 사용자와의 인터페이스가 유니코드를 지원하지 않는 경우에 대해 이야기
해 보면,

1. 사용자의 캐릭터 셋 정보로 default charset을 설정합니다. (이 방법은 런타
임시에는 변경하기 힘드므로 권장되지 않음)

2. http header의 charset 부분을 사용자 캐릭터 셑으로 변경 하십시오.

3. 일부 웹서버의 경우 input tx를 위해 request에 setCharactersetEncoding으
로 사용자 캐릭터셋을 설정하십시오. (default charset을 설정하는 웹서버의 경
우 header의 contenttype내 charset보다 default charset을 우선합니다. 이런 경
우 set해주세요)

위 과정으로도 다국어/다캐릭터 처리를 해줄 수 있습니다.
원본 : 오라클에서 유니코드 사용
반응형
Posted by [PineTree]
ORACLE/INSTALL2008. 4. 8. 01:06
반응형

Oracle 10.1.0.4 Update

 
지난번 포스팅시 마지막에 예고했었던 오라클 패치업데이트(10.1.0.2 에서 10.1.0.4) 에 관한 내용. 전제로 OS는 리눅스 환경이다.

예비서버의 오라클 패치를 끝내고 본서버와 교체후 이번에는 본서버의 패치를 실행했다. 2번째라 그런지 별 문제없이 끝났다. 다만 Enterprise Manager에서 트러블이 있었는데 이건 다음에 포스팅하겠음.


>> 10.1.0.2(혹은 10.1.0.3)에서 10.1.0.4로의 패치수순

0. HP유닉스, AIX의 경우는 방법이 일부 다르므로 오라클 홈페이지의 메뉴얼이나 KROWN문서를 참조해서 알아서 수정할것.

1. OiSC에서 패치파일(용량 571MB)를 다운로드해서 서버에 복사.

2. 패치를 실행하기전에 먼저 구패키지에 포함되어 있는 Oracle Database 10g Companion CD에서 Oracle Database 10g Products 인스톨 타입을 선택해서 인스톨을 해야한다. 이안에는 Java퍼포먼스를 향상시키는 Natively Compiled Java Libraries (NCOMP)가 들어있는데 이걸 인스톨하지 않으면 나중에 패치를 실행할때 "ORA-29558: JAccelerator(NCOMP) not installed" 라는 에러가 발생하며 더이상 패치 진행이 불가능하다.


3. RAC환경에서 운영시에는 CRS를 먼저 패치를 실행한 후 본 패치를 실행해야한다. CRS의 패치순서는 다음과 같다.
(1) 기존의 Oracle Database 10g 서비스를 전부 다음의 순서로 정지시킨다.
- srvctl을 사용해서 전노드의 모든 RAC인스턴스, 데이터베이스를 정지시킨다.
srvctl stop instance -d <db_unique_name> -i <inst_name_list> [-o <stop_options>]
srvctl stop database -d <db_unique_name> [-o <stop_options>] [-c <connect_str>]
srvctl stop instance -d SERAC -i SERAC1 -o immedate
srvctl stop instance -d SERAC -i SERAC2 -o immedate
srvctl stop database -d SERAC -o immediate

- srvctl을 사용해서 전노드의 모든 ASM인스턴스를 정지시킨다.
srvctl stop asm -n <node_name> [-i <inst_name>] [-o <stop_options>]
srvctl stop asm -n togos-db1 -i +ASM1 -o immedate
srvctl stop asm -n togos-db2 -i +ASM1 -o immedate

- srvctl을 사용해서 전노드의 노드어플리케이션을 정지시킨다.
srvctl stop nodeapps -n <node_name>
srvctl stop nodeapps -n togos-db1
srvctl stop nodeapps -n togos-db2

- 다음 커맨드를 실행해서 모든 노드의 CRS프로세스를 정지시킨다.
# /etc/init.d/init.crs stop (솔라리스, 리눅스)
# /sbin/init.d/init.crs stop (HP유닉스)
# /etc/init.crs stop (AIX)

(3) 그밖에 혹시 ORA_CRS_HOME를 사용하는 어플리케이션, 프로세스가 존재한다면 모두 정지시킨다.

(4) 패치파일을 압축해제한 디렉토리에서 runInstaller를 실행한다.

(5) 파일의 장소를 지정하는 화면까지 이동한다. 소스지정은 products.xml, 인스톨 장소는 기존 인스톨장소인 ORA_CRS_HOME를 선택한후 계속 진행한다. (데폴트는 이름은 OraCr10ghome1, 패스는 /u01/app/oracle/product/10.1.0/crs)

(6) 이후는 쭉 진행하다가 마지막에 커맨드모드에서 다음의 쉘파일을 모든 노드에서 루트권한으로 실행한다. (메세지에 나온다)
$ORA_CRS_HOME/install/root10104.sh

(7) 여기까지로 CRS패치는 모두 종료되었다. 이후 계속해서 데이터베이스의 패치를 진행하기 위해서 다음의 명령들을 실행해서 (1) 에서 소개한 커맨드들을 다시 실행해서 패치중 재기동된 오라클 서비스들을 정지시킨다. 작업이 끝나면 crs_stat -t 커맨드를 실행해서 전 노드의 리소스가 OFFLINE상태가 되었는지를 재확인한다.


4. EM가 기동중이라면 먼저 정지시킨다. (emctl stop dbconsole)

5. 패치파일의 runInstaller를 기동해서 파일의 장소를 지정하는 화면까지 이동한다. 소스지정은 products.xml, 인스톨 장소는 기존 인스톨장소인 ORACLE_HOME를 선택한후 계속 진행한다. (데폴트는 이름은 OraDb10ghome1, 패스는 /u01/app/oracle/product/10.1.0/db)

6. 쭉 순서에 따라 진행한 후 인스톨화면을 종료한다.


여기까지로 기본 패치 프로그램의 인스톨작업은 끝났다. 하지만 아직 전체작업이 끝난것은 아니다. 다음 작업들을 실행하지 않으면 데이타베이스가 에러("ORA-13516: SWRF Operation failed: CATPROC not valid")를 내며 기동되지 않으므로 계속 패치 수순을 진행한다.


>> 패치 인스톨 후의 작업

1. RAC환경의 경우 클러스터의 모든 노드에 대해서 노드어플리케이션을 기동시킨다.
srvctl start nodeapps -n <nodename>
srvctl start nodeapps -n togos-db1
srvctl start nodeapps -n togos-db2

2. ASM사용시에는 ASM인스턴스를 기동시킨다.
srvctl start asm -n <nodename>

srvctl start asm -n togos-db1
srvctl start asm -n togos-db2

3. sysdba권한으로 sqlplus에 로그인한다.
sqlplus / as sysdba

4. 데이터베이스를 기동한다.
SQL> STARTUP NOMOUNT

5. SHARED_POOL_SIZE, JAVA_POOL_SIZE 파라메터의 값을 다음과 같이 수정한다. 패치작업을 종료한후 원래대로 다시 수정해도 상관없다.
SQL> ALTER SYSTEM SET SHARED_POOL_SIZE='180M' SCOPE=both; (에러발생시 both대신 spfile)
SQL> ALTER SYSTEM SET JAVA_POOL_SIZE='180M' SCOPE=both; (에러발생시 both대신 spfile)

6. RAC환경의 경우 CLUSTER_DATABASE 파라메터의 값을 FALSE로 수정한다. 패치작업이 모두 종료되면 다시 TRUE 로 값을 되돌려야 한다. 그렇지 않으면 RAC환경이 정상적으로 기동되지 않는다.
SQL> ALTER SYSTEM SET CLUSTER_DATABASE=FALSE SCOPE=spfile;

7. 수정한 파라메터를 반영시키고 새로운 업데이트를 실시하기위해 데이터베이스를 재기동한다.
SQL> SHUTDOWN
SQL> STARTUP UPGRADE

8. 다음의 커맨드를 실행한다.
SQL> SPOOL patch.log
SQL> @?/rdbms/admin/catpatch.sql
(머신파워에 따라 다르지만 내 경우 위커맨드는 실행후 종료까지 30분정도 걸렸다)
SQL> SPOOL OFF

9. 출력된 patch.log파을을 확인해서 에러가 발생하지 않았는지 확인한다. 에러가 발생했을 경우 문제점을 수정하고 다시 catpatch.sql 을 재실행해야한다.

10. 지금까지 문제가 없을경우 데이터베이스를 다시 재기동한다.
SQL> SHUTDOWN
SQL> STARTUP

11. 다음의 커맨드를 실행해서 INVALID스테이터스 상태가 된 PL/SQL패키지를 재컴파일한다.
SQL> @?/rdbms/admin/utlrp.sql
위커맨드 실행시 스탠다드 에디션의 경우는 OLAP관련의 INVALID오브젝트가 여전히 남게되나 이부분은 엔터프라이즈버전에서만 활성화되는 기능이므로 무시한다.

12. RAC환경의 경우 모든 노드에서 configPatch.pl 스크립트를 실행한다.
# perl $ORACLE_HOME/sysman/install/configPatch.pl
log4j: ERROR 가 발생하지만 무시한다.


이로써 10.1.0.4 의 패치작업은 모두 끝났다. 혹시나 발생할 문제점을 미연에 발견하기 위해 전노드의 재기동을 추천한다. 그리고 Enterprise Manager 기능에 관련해서 문제가 발생할 경우는 이를 수정하는것보다 EM을 삭제후 재설치하는 편이 훨씬 빠르다. EM의 재설치에 관련해서는 이전 포스팅 을 참조한다.


이상.

 

반응형
Posted by [PineTree]
ORACLE/ADMIN2008. 4. 2. 20:00
반응형

Writed by soya98 -- 2005.10.03 월 (soya98@naver.com)

(긁어가지 마시고 " 이 포스트를 내 블로그 담기"로 가져가세요!!

힘들게 정리한것입니다.)

 

OS       : CentOs

OACLE : 9.2.0.4

STATUS: 디비에 자료가 없는 거의 초기 상태에서 실행했다.

 

CentOs 에 설치한 오라클(9.2.0.4)이 한글이 깨지고 말썽이다.

인터넷을 돌며 찾아온 매뉴얼대로 했건만 그것도 믿지 못할 것이였으니..

(사실 믿지 못할 것들이다... 문서화된 책이 가장 신뢰감이 있지만 쩝.. 아쉬운대로..)

일단은 다 만든거 다시 깔기도 구찮고 해서 여러가지로 찾아본 결과 다음이 가장

정확한 답이였음을 알수 있었다. 

일단 중요한 데이타는 거의 없고 프로시져가 2개정도 생성되어 있었으면 테이블명 및

데이타 등은 숫자나 영문이였기에 과감히 실행을 했다.

 

==> 즉 데이타 보전은 확실히 못한다는 무시무시한 경고가 있었다.

 

(하지만 그렇게 많은 데이타들이 축적되기 전에 이런 문제가 벌써 발생 하지 않았을까 싶다.

이미 한글로 디비를 생성해서 보려고 한다면 한글은 다 깨졌을 것이고 이것은 데이타가 많이

쌓이기전에 즉, 오라클 데이터베이스를 생성한뒤 초기 설정에 해당되는 내용인것 이라고 추측 된다.)

 

==>바꾸고 보니 프로시저나 펑션에서 주석으로 깨진 한글 그나마 보이긴 하더라.

여전히 "옜옜옜" 과 같은 이해할수 없는 단어 들이였으나 ....

프로시져나 펑션들은 이미 만들어 놓은 것을 갖다가 올리는 것이므로 그다지 크게 문제될 것은 없었다. 또한 테이블의 데이타는 영문,숫자였으므로 그다지 변화가 없었다.)

 

다음은 서머리 내용!!

 

단.. 문제는 펑션이나 프로시져에 한글로된 주석이 있으면 한글표현은 되나 깨져서 보인다.

즉, 다시 올리고 나서 컴파일일 해줄것!!

( 위의 내용으로 추측가능한 것은 만약 테이블명이나 컬럼명 혹은 속에 있는 데이타가

한글이라면 아래의 내용을 실행하기 전에 반드시 해당데이타 등을 백업을 해주자. )

 

 

1. 오라클에서 한글이

??? 혹은 ¿¿ 식으로 깨지고 있었다.

 

예를 들면

 

SQL> select * from scott.emp;
select * from scott.emp
                    *
1행에 오류:
ORA-00942: ¿¿¿ ¿¿ ¿¿ ¿¿¿¿ ¿¿¿¿

 

2. 해당 메세지에 대해 찾아본 결과

Oracle 데이터베이스 생성시에 Character Set를 기본값으로 설정하게 되면 WE8DEC 로 설정

된다고 한다.!! 이런.. 메뉴얼에선 그냥 선택 하라고 했던게 화근이다.

 

토드 같은 툴로

desc props$ 를 입력한뒤 data 를 조회해 보자(보기가 깔끔해서 추천!!)

(혹은  sqlplus 나 ssh 같은 툴로

SELECT * FROM nls_database_parameters WHERE parameter = 'NLS_CHARACTERSET';

=>system ,sysdba 계정으로 조회가 가능하다.

혹은

select * from props$ where name='NLS_CHARACTERSET';

=>sysdba 계정으로만 조회가 가능하다.)

 

조회를 해보면 (그중 고쳐야 할 부분만 추려낸것이다.)

NAME                        VALUE$          COMMENT$

NLS_CHARACTERSET WE8ISO8859P1 Character set

와 같이 설정되어 있다.

제대로된 설정이라면(내가 원하는 제대로된 설정은 한글과 영문이

말그래도 "제대로" 보여지는 것이다.)

즉, VALUE$ 컬럼에 있는 값이 KO16KSC5601 혹은 KO16MSWIN949 이였어야 한다.

(보통은 KO16MSWIN949 을 많이 추천함

@_@ 참고 good!! KO16MSWIN949에 대해 설명이 쉽게 잘되있삼

http://cafe.naver.com/ramiyan.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=268

)

 

3. 이제는 바꾸어 보자!  WE8ISO8859P1 --> KO16KSC5601

(어짜피 한글사용을 하더라도 정확한 어법에 맞는것만 사용할것이기 때문에 

KO16KSC5601 를 선택했다.)

 

일단은  SSH 툴로 리눅스(CentOs) 에 원격 접속했다.(집에서 하느라 ㅡㅡ;;)

 

sqlplus "/as sysdba"

 

로 접속한다. 일단 디비를 셧다운 시킨뒤 마운트 상태에서 필요한 셋팅을 해주고

다시 디비를 구동한 다음에 캐릭셋을 변경하고 다시 셧다운 시킨뒤 스타트업으로 완전히

실행하는 방식이다. 아래와 같이 실행해 주자.

 

SQL> SHUTDOWN IMMEDIATE;
SQL> STARTUP MOUNT;
SQL> ALTER SYSTEM ENABLE RESTRICTED SESSION;
SQL> ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
SQL> ALTER SYSTEM SET AQ_TM_PROCESSES=0;
SQL> ALTER DATABASE OPEN;
SQL> alter database character set internal_use KO16KSC5601;
SQL> SHUTDOWN IMMEDIATE; -- or NORMAL
SQL> STARTUP;

 

한글 캐릭셋

KO16MSWIN949
KO16KSC5601

 

유럽문자 지원 캐릭셋

WE8ISO8859P1

다른 자료들을 찾아보면

alter database character set internal_use KO16KSC5601;

부분이
ALTER DATABASE CHARACTER SET KO16KSC5601;

와 같이 되어 있다.

아래와 같은 방식으로는 절대 바꿀수가 없다.

 

ERROR at line 1:
ORA-12712: new character set must be a superset of old character set

와 같은 메세지가 뜬다. 이것은

"새로운 캐릭터셋은 반드시 기존 캐릭터셋의 Superset이어야만 한다"

는 의미로 해석이 된다.아래 블로그에서 유용한 자료를 찾았다.

 이렇게 하지 않으면 데이타가 보존이 되지 않는다고 한다.

(http://cafe.naver.com/mudong.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=548

의 캐릭터셋 변경의 실제 부분참고)

4. 자 이제 제대로 됬나 확인해보자

다음과 같이 아무렇게나 에러메세지를 발생해보자

(우리의 주특기 아닌가??)

 

SQL> select * from scott.emp;
select * from scott.emp
                    *
1행에 오류:
ORA-00942: 테이블 또는 뷰가 존재하지 않습니다

 

desc props$ 도 다시 해보자. 2번의 sql을 다시 해보자~

 

반응형

'ORACLE > ADMIN' 카테고리의 다른 글

다국어 지원을 위한 데이터베이스 구축 방안  (0) 2008.04.26
오라클에서 유니코드의 사용  (0) 2008.04.26
오라클 파라미터 관련 사이트 링크  (0) 2007.12.13
DATABASE LINK 사용법  (0) 2007.12.07
oracle lock  (0) 2007.08.14
Posted by [PineTree]
ORACLE2008. 3. 27. 02:31
반응형
특정 테이블을 사용하는 많은 sql 문장들이 있고, 이 문장들이 index를 제대로 타고 있는지 아니면 full scan 하는지를 아는 방법.
반응형

'ORACLE' 카테고리의 다른 글

오라클 12년도 교육 과정  (0) 2012.03.08
Oracle Shared Server 튜닝  (0) 2011.12.13
Oracle ERP에서 사용하는 DB관련 작업  (0) 2007.10.22
Oracle Database 학습법  (0) 2007.09.12
TOAD, DB 관리자의 ‘손과 발’  (0) 2006.11.03
Posted by [PineTree]
ORACLE/Backup & Recovery2008. 3. 14. 02:40
반응형

 

[Unix] 초간단 오라클 백업 스크립트 DB_Oracle 
2007/07/16 17:18

http://blog.naver.com/firstall/100039746941
 

#!/bin/bash
datetime=$(date +%Y-%m-%d-%H)

exp user/userpass file="/위치/화일이름_$datetime.dmp"
gzip /위치/화일이름_$datetime.dmp
find /위치/ -ctime +3 -exec rm -f {} ;
 
 
이렇게 한다면 백업 한후 3일 전의 데이타는 삭제가 됩니다.

 

 

 

 

###############################################################

 

 

 

 

오라클 자동 백업 스크립트 Oracle / DB2 
2006/08/25 21:32

http://blog.naver.com/snake0714/100027849339
 

오라클 자동 백업 스크립트   조회 (70)
 
DB 관련 | 2006/02/20 (월) 15:03   공감 (0)   스크랩 (0)   
 
 

오라클 백업 받는 방법을 앞에서 썼는데요
매일 그짓 할려면 짜증나죠...
자동으로 매일 백업 받도록 하는 방법에 대해서 써보겠습니다.
 
우선 크론(cron)에 대해서 공부를 하시기 바랍니다.
뭐 몰라도 아래를 따라해보는데는 문제가 없겠지만 ...모르고 하는거랑 알고 하는건 다르죠.
요즘의 리눅스에는 /etc/cron.daily, /etc/cron.weekly, /etc/cron.monthly 라는 디렉토리가
있습니다.
여기에 매일, 매주, 매월 자동으로 돌아갈 스크립트들을 넣어두면 알아서 실행해줍니다.
우선 스크립트를 먼저 보고 줄마다 설명을 붙여볼께요..
 
---------------------------------------------------------------------------------
#!/bin/sh
source ~oracle/.bash_profile
makeday=$(date +%y%m%d)
exp 아이디/비밀번호@ORACLESID file=/backup/$makeday.full.dmp full=y  log=/backup/$makeday.backup.log
cd /backup
gzip *
ntpdate  time.kriss.re.kr
---------------------------------------------------------------------------------
 
#!/bin/sh
우선 스크립트를 실행할 쉘을 설정해줍니다.
 
source ~oracle/.bash_profile
혹시 몰라서 오라클 환경 설정값을 불러올수 있도록 했습니다.
~oracle은 오라클이 깔린 기본 디렉토리이고, .bash_profile은 오라클 환경 변수들이
설정되어 있는 파일입니다.
 
makeday=$(date +%y%m%d)
makeday라는 변수에 날짜를 년월일로 세팅해줍니다.
 
exp 아이디/비밀번호@ORACLESID file=/backup/$makeday.full.dmp full=y  log=/backup/$makeday.backup.log
이게 핵심이죠...날짜별로 20031023.full.dmp, 20031023.backup.log 형식으로 파일이 생깁니다.
 
cd /backup
gzip *
용량때문에 압축을 해줍니다. 머 용량이 작으면 그냥 둬도 좋지만 그래도 아끼면 잘살죠..^^
 
ntpdate  time.kriss.re.kr
날짜를 맞춰줍니다.
 
위 스크립트를 /etc/cron.daily 아래에 넣어놓으면 매일 자동으로 일정한 시간(주로새벽)에
실행해줍니다.
마찬가지로 /etc/cron.weekly아래에 넣어놓으면 매주가 되고, /etc/cron.monthly아래는 매달이
되겠죠..
 
파일이름은 아무걸로나 해도 됩니다.

 

반응형
Posted by [PineTree]
ORACLE/Backup & Recovery2008. 3. 5. 20:02
반응형
PURPOSE
-------
The following documentation announces the obsolescence of the incremental exports:

1. "Oracle8i Utilities Release 2 (8.1.6)" (which is included as such in
   "Oracle Documentation Library, Release 8.1.7") says:

   Incremental, Cumulative, and Complete Exports

   Important: Incremental, cumulative, and complete Exports are obsolete
              features that will be phased out in a subsequent release.
              You should begin now to migrate to Oracle's Backup and
              Recovery Manager for database backups.

2. The
Note 120608.1 "[8.1.7.0] Generic Server README for Oracle8i Release 3"
   says:

   5.2.3 Incremental, Cumulative, and Complete Features No Longer Supported
   Incremental, cumulative, and complete Exports are obsolete features.
   They are no longer documented, nor is their use supported by Oracle
   Corporation.

RMAN incremental backup is the only corresponding feature to replace the EXPORT
incremental backup.

This document describes the differences between both.

SCOPE & APPLICATION
-------------------

For those DBAs that use EXPORT incremental backups, the document illustrates
the points they should be aware of when migrating from EXPORT incremental backups
strategy towards RMAN incremental backups.


Comparable features between EXPORT / RMAN
-----------------------------------------


              EXPORT                 |             RMAN
________________________________________________________________________________

                            Levels of increment
________________________________________________________________________________

3 levels                             | 5 levels 0,1,2,3,4 and 2 types
INCTYPE=COMPLETE FULL=Y             |   Level 0 (equivalent)
         baseline for all cumulative | 
         and incremental backups     |
                                     |
INCTYPE=CUMULATIVE FULL=Y           | CUMULATIVE INCREMENTAL 
         backs up changes since last |   backs up all blocks changed since most
         cumulative or complete      |   recent level n-1 or lower
                                     |
INCTYPE=INCREMENTAL  FULL=Y         | DIFFERENTIAL INCREMENTAL
         backs up changes since last |   backs up all blocks changed since most
         incremental, cumulative or  |   recent level n or lower
         complete                    |  

* A higher number of levels in RMAN may reduce recovery time in case of media recovery.

________________________________________________________________________________

                             What is backed up ?
________________________________________________________________________________

If only one row of a table is changed| All blocks changed since the last
the ENTIRE table is backed up in the | backup  <=  level n (for differential)
next incremental export (of any type)| All blocks changed since the last
                                     | backup  <=  level n-1 (for culumative)                               

* The EXPORT incremental backup relies on object level and RMAN on block level.
* The amount of data to be backed up is optimized in RMAN.
________________________________________________________________________________
                                
                                Reporting
________________________________________________________________________________

To display the list of available     | To display the list of available
incremental backups and content:     | incremental backups:
                                     |
SELECT * FROM                        | RMAN> list backupset of database;
SYS.INCEXP                           | 
  List of tables exported in all     |      
  incremental exports                |       
SYS.FIL                              |
  all incremental/cumulative exports |
SYS.INCVID                           |
  ID of the last valid export, used  |
  to determine the ID of next export |
                                     | To report files requiring a new backup if
                                     | a complete recovery would need more than the
                                     | specified number of incremental:
                                     |
                                     | RMAN> report need backup incremental n
                                     |       database;

* With RMAN report command, the DBA can anticipate the need of new backups to
  reduce recovery time.

________________________________________________________________________________

                                  Usage
________________________________________________________________________________

1/ Recreation of a database and      | The incremental RMAN backup allows media
   incremental imports in case of a  | recovery at different levels:
   database erased                   |   * database
                                     |   * tablespace
2/ Recreation of a dropped table     |   * datafile
                                   
* RMAN automatically selects the successive incremental backups to be restored
  and applied during a media recovery.


RELATED DOCUMENTS
-----------------
Oracle Documentation Library, Release 8.1.7 Oracle8i Utilities Release 2 (8.1.6)
Note 120608.1  [8.1.7.0] Generic Server README for Oracle8i Release 3
Note 50875.1   Getting Started with Server-Managed Recovery (SMR) and RMAN
Note 115118.1  Using an incremental export to recover a dropped table
반응형
Posted by [PineTree]
ORACLE/INSTALL2008. 2. 27. 00:22
반응형
 

 Installing Oracle 9iR2 64-bit on RHEL 4 x86-64 (AMD64/EM64T)

/usr/sbin/groupadd oinstall
/usr/sbin/groupadd dba
/usr/sbin/useradd -m -g oinstall -G dba oracle


/etc/passwd 파일 수정 oracle홈 디렉토리 변경

mkdir -p /u0/oracle
chown -R oracle:oinstall /u0
chmod -R 775 /u0


Requirements for Installing Oracle 9iR2 64-bit on RHEL 4 x86-64 (AMD64/EM64T)
1. Install the required OS components

    * This list is based upon a "default-RPMs" installation of RHEL AS/ES 4 update
    1. When a newer "update" level is used, the RPM release numbers (such as 2.4-9.1.87) may be slightly higher
        (such as 2.4-9.1.93 or 2.4-9.2.37). This is fine so long as you are still using RHEL AS/ES 4 RPMs.
    * glibc-kernheaders-2.4-9.1.87.x86_64.rpm
    * glibc-headers-2.3.4-2.9.x86_64.rpm
    * glibc-devel-2.3.4-2.9.x86_64.rpm     << both ARCH's are required. See below.
    * glibc-devel-2.3.4-2.9.i386.rpm    << both ARCH's are required. See above.
    * compat-gcc-32-3.2.3-47.3.x86_64.rpm
    * compat-gcc-32-c++-3.2.3-47.3.x86_64.rpm
    * libstdc++-devel-3.4.3-22.1.x86_64.rpm
    * libaio-0.3.103-3.x86_64.rpm

확인하기
rpm -qa --queryformat "%{NAME}-%{VERSION}-%{RELEASE} (%{ARCH})\n" | grep glibc-kernheaders
rpm -qa --queryformat "%{NAME}-%{VERSION}-%{RELEASE} (%{ARCH})\n" | grep  glibc-headers              
rpm -qa --queryformat "%{NAME}-%{VERSION}-%{RELEASE} (%{ARCH})\n" | grep  glibc-devel
rpm -qa --queryformat "%{NAME}-%{VERSION}-%{RELEASE} (%{ARCH})\n" | grep  glibc-devel
rpm -qa --queryformat "%{NAME}-%{VERSION}-%{RELEASE} (%{ARCH})\n" | grep  compat-gcc-32
rpm -qa --queryformat "%{NAME}-%{VERSION}-%{RELEASE} (%{ARCH})\n" | grep  compat-gcc-32-c++
rpm -qa --queryformat "%{NAME}-%{VERSION}-%{RELEASE} (%{ARCH})\n" | grep  libstdc++-devel
rpm -qa --queryformat "%{NAME}-%{VERSION}-%{RELEASE} (%{ARCH})\n" | grep  libaio




2. Configure the Unix environment

The first critical environment item is related to the gcc v3.2 and g++ v3.2 RPMs that were installed above. Run these commands:

    mv /usr/bin/gcc /usr/bin/gcc.orig
    mv /usr/bin/g++ /usr/bin/g++.orig
    ln -s /usr/bin/x86_64-redhat-linux-gcc32 /usr/bin/gcc
    ln -s /usr/bin/x86_64-redhat-linux-g++32 /usr/bin/g++
   
.bash_profile
   
TMDIR=/tmp
export TMDIR
export ORACLE_BASE=/u0/oracle
export ORACLE_HOME=$ORACLE_BASE/product/9.2/db_1
export NLS_LANG=AMERICAN_AMERICA.KO16KSC5601
export ORA_NLS33=$ORACLE_HOME/ocommon/nls/admin/data
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/java/lib:$ORACLE_HOME/lib:$ORACLE_HOME/oracm/lib
export ORACLE_SID=dbSID   <<==SID
export ORACLE_OWNER=oracle
export LANG=C
export LD_ASSUME_KERNEL=2.4.19 
#CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib:$ORACLE_HOME/network/jlib
export PATH=$ORACLE_HOME/bin:$ORACLE_HOME/OPatch:/sbin:/usr/local/java/bin:$PATH:.
export TNS_ADMIN=$ORACLE_HOME/network/admin
export CLASSPATH
export umask=022
export DISPLAY=ip:0.0

/etc/sysctl.conf

kernel.hostname   = magic.xxx.co.kr
kernel.domainname = magic

kernen.nem = 250 32000 100 128
kernel.shmmax = 1073741824
kernel.shmmni = 4096
kernel.shmall = 2097152
fs.file-max = 327679
net.ipv4.ip_local_port_range = 1024 65000
net.core.rmem_default = 262144
net.core.rmem_max = 262144
net.core.wmem_default = 262144
net.core.wmem_max = 262144

/etc/profile
           if [ $USER = "oracle" ]; then
               if [ $SHELL = "/bin/ksh" ]; then
                   ulimit -p 16384
                   ulimit -n 65536
               else
                   ulimit -u 16384 -n 65536
               fi
           fi
          
/etc/security/limits.conf
          
oracle              soft    nproc   2047
oracle              hard    nproc   16384
oracle              soft    nofile  1024
oracle              hard    nofile  65536

reboot 후에 install
엔진설치
9.2.0.8 패치셋 설치
db생성

반응형
Posted by [PineTree]
ORACLE/SQL2008. 2. 22. 19:33
반응형
PLT 6.9 SUBPROGRAM
PL/SQL을 지원하는 어떤 툴이나 언어에서도 SUBPROGRAM(프로시저와 함수)을 실행할 수 있다. PL/SQL내부에서 식의 일부로서 함수를 실행할 수 있다. EXECUTE는 명령 다음에 입력되는 Stored Procedure를 실행한다.
 
SUBPROGRAM의 개요
PL/SQL 프로시저와 함수는 3GL의 프로시저 및 함수와 매우 비슷하게 동작된다. 모듈화를 통해 관리가 용이하고 적절히 논리적 단위로 나누어진 프로그래밍을 할 수 있다. , 잘 정의된 논리적인 단위로 코드를 분할할 수 있다. PL/SQL에서 이들 단위를 단위 프로그램 또는 SUBPROGRAM이라 부른다. PL/SQL에는 프로시저와 함수라는 두 가지 유형의 SUBPROGRAM이 있다. SUBPROGRAM은 컴파일된 상태로 데이터베이스에 저장되어 있어 Performance가 향상된다.
 
SUBPROGRAM 작성 단계
구문 작성
TEXT 편집기를 이용하여 SCRIPT FILE CREATE PROCEDURE CREATE FUNCTION문을 작성한다.
 
SQL> ed emp_up
 
CREATE OR REPLACE PROCEDURE emp_sal_update(
                                   p_empno IN emp.empno%TYPE, p_sal IN emp.sal%TYPE)
                 IS
                 BEGIN
                                   UPDATE emp
                                                     SET sal = p_sal
                                                     WHERE empno = p_empno;
                                   IF SQL%NOTFOUND THEN
                                                     DBMS_OUTPUT.PUT_LINE(TO_CHAR(p_empno) ||
                                                                      ' 없는 사원번호입니다.');
                                   ELSE
                                                     DBMS_OUTPUT.PUT_LINE(TO_CHAR(SQL%ROWCOUNT) ||
                                                                      '명의 자료를 수정하였습니다.');
                                   END IF;
                 END emp_sal_update;
/
 
코드 컴파일
SCRIPT FILE을 실행 시켜 컴파일하여 컴파일된 코드를 데이터베이스에 저장한다.
SQL> @emp_up
 
Procedure created.
 
에러 수정
코드 컴파일시 에러가 발생하면 에러를 확인하고 수정하여 코드를 다시 컴파일한다.
SQL> @emp_up
 
Warning: Procedure created with compilation errors.
 
SQL> ed emp_up
                -- emp_up를 수정한 후 저장하고 종료한다.
SQL> @emp_up
 
Procedure created.
 
실행
SQL*Plus에서 EXECUTE명령으로 SUBPROGRAM을 실행한다.
SQL> EXECUTE emp_sal_update(7788,3500)
 
PL/SQL procedure successfully completed.
 
SQL> SELECT empno,ename,job,sal
  2  FROM emp
  3  WHERE empno = 7788;
 
    EMPNO ENAME      JOB             SAL
--------- ---------- --------- ---------
     7788 SCOTT      ANALYST        3500
 
PROCEDURE 생성
나중에 실행할 일련의 동작을 저장하기 위해 PL/SQL프로시저를 작성한다. 프로시저는 실행할 때 사용하는 Parameter가 없거나 여러 개를 가질 수도 있다. 프로시저에서는 DECLARE절이 생략되고 IS BEGIN사이에 필요한 변수를 선언하여 사용한다
 
CREATE  [OR  REPLACE]  PROCEDURE  procedure_name
             [(argument1  [mode1]  datatype [{:= | DEFAULT} expression]
             [,argument2  [mode2]  datatype [{:= | DEFAULT} expression], . . .])]
{IS | AS}
BEGIN
             pl/sql_block;
END;
 
OR  REPLACE : procedure_name이 존재할 경우 PROCEDURE의 내용을 지우고 다시 생성
procedure_name : PROCEDURE
argument : 매개변수의 이름
mode : 3가지가 있다
- IN : 입력 매개변수로 상용
 - OUT : 출력 매개변수로 사용
 - IN OUT : 입력, 출력 매개변수로 상용
pl/sql_block : PROCEDURE를 구성하는 코드를 구성하는 PL/SQL의 블록
 
n         SQL*Plus에서 프로시저를 작성할 때 CREATE OR REPLACE를 사용합니다.
n         어떠한 Parameter라도 사용 가능합니다.
n         IS PL/SQL블록을 시작합니다.
n         Local변수 선언은 IS BEGIN사이에 선언 합니다.
 
PROCEDURE 실행
PL/SQL을 지원하는 어떤 툴이나 언어에서도 프로시저를 실행할 수 있다. SQL*Plus에서 프로시저 호출은 Stored Procedure를 참조하는 PL/SQL 문을 실행하기 위해 EXECUTE 명령을 사용할 수 있다. EXECUTE는 명령 다음에 입력되는 Stored Procedure를 실행한다.
procedure_name[(argument1[,argument2, . . . .])]
 
SQL> EXECUTE emp_sal_update(7902,4000)
 
PL/SQL procedure successfully completed.
 
CREATE OR REPLACE PROCEDURE emp_input(
                  v_name    IN            emp.ename %TYPE,
                  v_job       IN            emp.job %TYPE,
                  v_mgr      IN            emp.mgr %TYPE,
                  v_sal        IN            emp.sal %TYPE)
IS
                  v_comm                    emp.comm%TYPE;
                  v_deptno                                    emp.deptno%TYPE;
                  manager_error          EXCEPTION;
BEGIN
                  IF UPPER(v_job) NOT IN ('PRESIDENT','MANAGER','ANALYST',
                                                                       'SALESMAN','CLERK') THEN
                                   RAISE manager_error;
                  ELSIF UPPER(v_job) = 'SALESMAN' THEN
                                   v_comm := 0;
                  ELSE
                                   v_comm := NULL;
                  END IF;
                  SELECT deptno
                                   INTO v_deptno
                                   FROM emp
                                   WHERE empno = v_mgr;
                  INSERT INTO emp
                                   VALUES (empno_sequence.NEXTVAL,v_name,UPPER(v_job),
                                                     v_mgr,SYSDATE,v_sal,v_comm,v_deptno);
EXCEPTION
                  WHEN manager_error THEN
                                   DBMS_OUTPUT.PUT_LINE('담당 업무가 잘못 입력되었습니다.');
                  WHEN NO_DATA_FOUND THEN
                                   DBMS_OUTPUT.PUT_LINE('입력한 MANAGER 없습니다.');
                  WHEN OTHERS THEN
                                   DBMS_OUTPUT.PUT_LINE('기타 에러입니다.');
END;
/
 
SQL> SET SERVEROUTPUT ON
SQL> EXECUTE emp_input('YOONJB','MANAGER',7788,2500)
 
FUNCTION 생성
실행 환경에 반드시 하나의 값을 Return하기 위해 PL/SQL 함수를 사용한다. 함수 선언에서 Datatype이 있는 RETURN 절을 추가하고 PL/SQL 블록에 적어도 한 개의 이상의 RETURN 문을 포함한다. PARAMETER에서 사용하는 IN,OUT,IN OUT PROCEDURE에서 사용한 것과 동일하게 사용 가능하나 대부분 IN을 사용한다.
CREATE  [OR  REPLACE]  FUNCTION  function_name
             [(argument1  [mode1]  datatype [{:= | DEFAULT} expression]
             [,argument2  [mode2]  datatype [{:= | DEFAULT} expression], . . .])]
RETURN  data_type
{IS | AS}
BEGIN
             pl/sql_block;
END;
 
 
OR  REPLACE : function_name이 존재할 경우 FUNCTION의 내용을 지우고 다시 생성
function_name : Function의 이름은 표준 Oracle 명명법에 따른 함수이름
argument : 매개변수의 이름
mode : 3가지가 있다
- IN : 입력 매개변수로 상용
 - OUT : 출력 매개변수로 사용
 - IN OUT : 입력, 출력 매개변수로 상용
data_type : 반환되는 값의 datatype
pl/sql_block : FUNCTION를 구성하는 코드를 구성하는 PL/SQL의 블록
 
RETURN
n         PL/SQL 블록에는 RETURN문이 있어야 한다.
n         함수는 RETURN 절에 지정된 것과 동일한 datatype으로 RETURN 값을 설정해야 한다.
n         다중 RETURN 문은 사용할 수 있지만 한 번의 호출로는 한 개의 RETURN 문만 실행된다.
n         일반적으로 다중 RETURN 문은 IF 문에서 사용한다.
 
FUNCTION 실행
PL/SQL을 지원하는 어떤 툴이나 언어에서도 함수를 실행할 수 있고 PL/SQL내부에서 식의 일부로서 함수를 실행할 수 있다. SQL*Plus에서 FUNCTION 호출은 Stored Function를 참조하는 PL/SQL 문을 실행하기 위해 EXECUTE 명령을 사용할 수 있다. EXECUTE는 명령 다음에 입력되는 Stored Function를 실행한다.
output_variable := function_name[(argument1[,argument2, . . . . .])]
 
SQL> EXECUTE :g_deptno := ename_deptno('ALLEN')
 
PL/SQL procedure successfully completed.
 
CREATE OR REPLACE FUNCTION ename_deptno(
                  v_ename  IN            emp.ename%TYPE)
RETURN NUMBER
IS
                  v_deptno                  emp.deptno%TYPE;
BEGIN
                  SELECT deptno
                                   INTO v_deptno
                                   FROM emp
                                   WHERE ename = UPPER(v_ename);
                  DBMS_OUTPUT.PUT_LINE('부서번호 : ' || TO_CHAR(v_deptno));
                  RETURN v_deptno;
EXCEPTION
                  WHEN NO_DATA_FOUND THEN
                                   DBMS_OUTPUT.PUT_LINE('입력한 MANAGER 없습니다.');
                  WHEN TOO_MANY_ROWS THEN
                                   DBMS_OUTPUT.PUT_LINE('자료가 2 이상입니다.');
                  WHEN OTHERS THEN
                                    DBMS_OUTPUT.PUT_LINE('기타 에러입니다.');
END;
/
 
 
SQL> SET SERVEROUTPUT ON
SQL> VAR g_deptno NUMBER
SQL> EXECUTE :g_deptno := ename_deptno('SCOTT')
부서번호 : 10
 
PL/SQL procedure successfully completed.
 
SQL> PRINT g_deptno
 
 G_DEPTNO
---------
       10
 
함수와 프로시저 비교
프로시저
함수
PL/SQL 문으로서 실행
식의 일부로서 사용
RETURN Datatype이 없음
RETURN Datatype이 필수
값을 Return할 수 있음
값을 Return하는 것이 필수
n         프로시저는 parameter리스트를 가질 수 있지만 값 반환이 필수적 이지는 않다.
n         함수는 다음과 같은 두 가지 점에서 프로시저와 다르다.
n         (expression)의 일부로서 함수를 사용한다.
n         함수는 값을 return하는 것이 필수적이다.
 
TRIGGER
특정 테이블에 DML(INSERT,UPDATE,DELETE)문장이 수행되었을 때 데이터베이스에서 자동적으로 PL/SQL 블록을 수행 시키기 위해서 데이터베이스 TRIGGER를 사용한다. TRIGGER는 트리거링 이벤트가 일어날 때마다 암시적으로 실행된다. 트리거링 이벤트에는 데이터베이스 테이블에서 INSERT, UPDATE, DELETE 오퍼레이션이다.
 
TRIGGER가 사용되는 경우
n        테이블 생성시 CONSTRAINT로 선언 제한이 불가능하고 복잡한 무결성 제한을 유지
n        DML문장을 사용한 사람,변경한 내용,시간 등을 기록함으로써 정보를 AUDIT하기
n        테이블을 변경할 때 일어나야 할 동작을 다른 테이블 또는 다른 프로그램들에게 자동적으로 신호하기
 
TRIGGER에 대한 제한
n         TRIGGER는 트랜잭션 제어 문(COMMIT,ROLLBACK,SAVEPOINT)장을 사용하지 못한다.
n         TRIGGER 주요부에 의해 호출되는 프로시저나 함수는 트랜잭션 제어 문장을 사용하지 못한다.
n         TRIGGER 주요부는 LONG또는 LONG RAW변수를 선언할 수 없다.
n         TRIGGER 주요부가 액세스하게 될 테이블에 대한 제한이 있다.
 
TRIGGER생성
CREATE TRIGGER문장에 의해 TRIGGER를 생성할 수 있다.
CREATE  [OR  REPLACE]  TRIGGER  trigger_name
             {BEFORE | AFTER}  triggering_event [OF  column1, . . .] ON table_name
             [FOR  EACH  ROW  [WHEN  trigger_condition]
trigger_body;
 
trigger_name : TRIGGER의 식별자
BEFORE | AFTER : DML문장이 실행되기 전에 TRIGGER를 실행할 것인지 실행된 후에 TRIGGER를 실행할 것인지를 정의
triggering_event : TRIGGER를 실행하는 DML(INSERT,UPDATE,DELETE)문을 기술한다.
OF column : TRIGGER가 실행되는 테이블에서 COLUMN명을 기술한다.
table_name : TRIGGER가 실행되는 테이블 이름
FOR EACH ROW : 이 옵션을 사용하면 행 레벨 트리거가 되어 triggering문장에 의해 영향받은 행에 대해 각각 한번씩 실행하고 사용하지 않으면 문장 레벨 트리거가 되어 DML문장 당 한번만 실행된다.
 
TRIGGER에서 OLD NEW
행 레벨 TRIGGER에서만 사용할 수 있는 예약어로 트리거 내에서 현재 처리되고 있는 행을 액세스할 수 있다. 즉 두개의 의사 레코드를 통하여 이 작업을 수행할 수 있다. :OLD INSERT문에 의해 정의되지 않고 :NEW DELETE에 대해 정의되지 않는다. 그러나 UPDATE :OLD :NEW를 모두 정의한다. 아래의 표는 OLD NEW값을 정의한 표이다.
문장
:OLD
:NEW
INSERT
모든 필드는 NULL로 정의
문장이 완전할 때 삽입된 새로운 값
UPDATE
갱신하기 전의 원래 값
문장이 완전할 때 갱신된 새로운 값
DELETE
행이 삭제되기 전의 원래 값
모든 필드는 NULL이다.
 
TRIGGER 술어 사용하기
트리거 내에서 오퍼레이션이 무엇인지를 결정하기 위해 사용할 수 있는 3가지 BOOLEAN함수가 있다.
술 어
    
INSERTING
트리거링 문장이 INSERT이면 TRUE를 그렇지 않으면 FALSE RETURN
UPDATING
트리거링 문장이 UPDATE이면 TRUE를 그렇지 않으면 FALSE RETURN
DELETING
트리거링 문장이 DELETE이면 TRUE를 그렇지 않으면 FALSE RETURN
 
TRIGGER 삭제와 억제하기
DROP TRIGGER명령어로 트리거를 삭제할 수 있고 TRIGGER를 잠시 disable할 수 있다.
DROP  TRIGGER  trigger_name;
 
ALTER  TRIGGER  trigger_name  {DISABLE | ENABLE};
 
TRIGGER DATA DICTIONARY
TRIGGER가 생성될 때 소스 코드는 데이터 사전 VIEW user_triggers에 저장된다. VIEW TRIGGER_BODY, WHERE, 트리거링 테이블, TRIGGER 타입을 포함 한다.
SQL> SELECT trigger_type,table_name,triggering_event
  2  FROM user_triggers;
 
TRIGGER_TYPE     TABLE_NAME                     TRIGGERING_EVENT
---------------- ------------------------------ --------------------------
AFTER STATEMENT  EMP                            INSERT OR UPDATE OR DELETE
BEFORE STATEMENT EMP                            INSERT OR UPDATE OR DELETE
BEFORE EACH ROW  EMP                            UPDATE
 
CREATE OR REPLACE TRIGGER emp_sal_chk
BEFORE UPDATE OF sal ON emp
FOR EACH ROW WHEN (NEW.sal < OLD.sal
                           OR NEW.sal > OLD.sal * 1.1)
BEGIN
             raise_application_error(-20502,
                'May not decrease salary. Increase must be < 10%');
END;
/
 
SQL> @emp_sal
반응형

'ORACLE > SQL' 카테고리의 다른 글

Oracle 날짜 관련 함수  (0) 2008.10.29
Oracle 날짜형 데이터의 연산  (0) 2008.06.17
PL/SQL (13) - 커서(cursor)  (0) 2008.02.21
PL/SQL (19) - Collections (중첩테이블 - Nested Table)  (0) 2008.02.21
&lt;25가지 SQL작성법&gt;  (0) 2008.02.19
Posted by [PineTree]
ORACLE/SQL2008. 2. 21. 20:28
반응형

###################################################################################################

#   source site : blog.naver.com/tangamjaelt

#   master : 강용운

#   email : tangamjaelt@korea.com

#   last release : 2007.08.29

###################################################################################################

 

 

1. 커서란...

- 일반적으로 커서는 모니터에 해당 위치를 알려주고 그곳에 입력을 대기중이라고 깜빡거리는 것을 나타낸다.

- 메모장을 켜보면 깜빡거리는 것. 그게 커서이다.

- 같은 맥락으로 PL/SQL에서 커서는 메모리상에 SQL문이 실행되는 위치를 가리킨다.

- 커서를 통해, 메모리에 존재하는 SQL문 실행결과를 바로 접근하여 fetch 할 수 있다. 메모리영역이라 함은 private SQL영역으로 SQL문 실행 및 처리결과를 저장하는 곳이다.

- 이 때 커서는 현재 처리하고 있는 row를 가리키게 된다.

- 실행결과를 1개 row씩 처리하다가 마지막까지 처리가 끝나면 커서를 닫는다.

- 많은 row를 처리하기 위해 명시적 커서를 선언하고 제어한다.

 

 

 

2. 종류

   (1) 암시적커서 (Implicit Cursor) : 모든 DML, PL/SQL Select 문에 대해 선언된다.

        - 모든 SQL문에는 관련된 개별 커서가 존재한다.

        - SQL문을 실행하면 PL/SQL은 암시적 커서를 작성하여 자동관리 한다.

 

   (2) 명시적커서 (Explicit Cursor) : 프로그래머가 선언하고 이름을 지정한다.

        - query 결과를 첫번째 행부터 차례대로 처리할 수 있다.

        - 현재 처리중인 행을 추적한다.

        - 프로그래머가 PL/SQL 블록에 명시적 커서를 수동으로 제어할 수 있다.

        - 여러 행 질의에 의해 반환되는 행집합을 활성 집합이라하고 활성집합의 크기는 검색조건을 만족하는 행(row)수와 같다.

 

        < 명시적 커서 >

        

 

        (1) 커서를 연다.

        (2) 행(row)을 인출(fetch)한다.

        (3) 커서를 닫는다.

 

        - OPEN 문은 질의를 실행하여 결과 집합을 식별한 후 커서를 첫번째 행 앞에 위치시킨다.

        - FETCH 문은 현재 행(row)을 검색하고 지정한 조건(empty?)이 만족할 때까지 커서를 다음 행(row)로 이동시킨다.

        - CLOSE 문으로 마지막 행(row)까지 처리되었으면 커서를 닫는다.

 

 

3. 커서 속성

- %ROWCOUNT : 가장 최근에 인출한 행의 개수

- %FOUND : 가장 최근에 인출한 행이 있으면 TRUE

- %NOTFOUND : 가장 최근에 인출한 행이 없으면 TRUE

- %ISOPEN : 커서가 열려있으면 TRUE.

                    

- 커서가 열려있어야 FETCH가 가능하므로 이 속성을 사용해서 커서의 OPEN 상태를 확인한다.

- CLOSE 된 상태에서 FETCH를 하면 INVALID_CURSOR 예외가 발생한다.

 

   IF NOT cursor_name%ISOPEN THEN

          OPEN curosr_name;

   END IF;

 

 

 

 

4. 커서 선언

 

  CURSOR cursor_name IS

        SELECT문;

 

- 커서 선언에 INTO 절을 포함시키지 않는다. INTO절은 FETCH문에 포함된다.

- 질의에 ORDER BY를 사용하여 특정 순서로 행을 처리할 수 있다.

- CURSOR 질의에 있는 변수를 참조할 수 있으나 변수는 CURSOR문 앞에 선언해야 한다.

 

cursor_test.sql

  DECLARE

         v_mp mobile_phone.product_name%TYPE;

     CURSOR cursor_mp IS

         SELECT product_name FROM mobile_phone;

 

  BEGIN

     OPEN cursor_mp;

          LOOP

              FETCH cursor_mp INTO v_mp;

              EXIT WHEN cursor_mp%NOTFOUND;

                  DBMS_OUTPUT.PUT_LINE(v_mp);

          END LOOP;

          DBMS_OUTPUT.PUT_LINE('총 row수 : ' || cursor_mp%ROWCOUNT);

     CLOSE cursor_mp;

 

  END;

   /

 

- 명시적으로 OPEN, FETCH, CLOSE를 수행하였다.

 

SQL> SET SERVEROUTPUT ON;

SQL> @cursor_test

 

  

 

 

5. 커서 FOR LOOP 사용

 

- 커서 FOR 루프를 사용하면 암시적 커서가 자동으로 실행된다.

- 레코드가 암시적으로 선언된다.

- FOR 루프가 한번 반복될 때마다 행이 인출된다.

- 마지막 행이 처리되면 루프가 종료되고 커서가 자동으로 닫힌다.

- 암시적 커서 실행이 이루어지므로 OPEN, FETCH, CLOSE를 선언하지 않는다. (선언하면 이미 커서가 열렸다는 에러 발생)

 

cursor_test2.sql

  DECLARE

     CURSOR cursor_mp IS

         SELECT brand, product_name FROM mobile_phone;

     record_mp cursor_mp%ROWTYPE

 

  BEGIN

      FOR record_mp IN cursor_mp LOOP
          IF record_mp.brand = 'LG' THEN
              DBMS_OUTPUT.PUT_LINE(record_mp.brand || ' => ' || 
record_mp.product_name);
          END IF;
    END LOOP;

 END;

 /

 

- 이 예제에서는 브랜드가 LG인 상품을 출력하는 프로그램이다.

- 여기 예제에서는 %ROWTYPE을 사용하여 커서에 대한 record 타입 변수 record_mp 를 선언하였다.

- OPEN, FETCH, CLOSE 없이 바로 FOR문을 돌리면 된다.

 

 

 

 

6. 파라미터 사용 커서

- 커서에 파라미터를 정의하고 OPEN 시 파라미터를 전달할 수 있다.

- 실행할 때마다 이전에 사용했던 파라미터의 활성 집합을 닫고, 매번 새 파라미터를 이용해 커서를 OPEN한다.

- OPEN(parameter1, parameter2, ...) 형식으로 사용한다.

 

cursor_test3.sql

 DECLARE
        v_product mobile_phone.product_name%TYPE;
        v_brand mobile_phone.brand%TYPE;

 

     CURSOR cursor_mp(p_brand VARCHAR2) IS
         SELECT brand, product_name FROM mobile_phone
                WHERE brand = p_brand;

 BEGIN
        OPEN cursor_mp('LG');
        LOOP
                FETCH cursor_mp INTO v_brand, v_product;
                EXIT WHEN cursor_mp %NOTFOUND;
                DBMS_OUTPUT.PUT_LINE(v_brand || ' => ' ||  v_product);
        END LOOP;
        DBMS_OUTPUT.PUT_LINE(v_brand || ' 총 ' || cursor_mp%ROWCOUNT || ' 건');
        CLOSE cursor_mp;

 

        OPEN cursor_mp('SAMSUNG');
        LOOP
                FETCH cursor_mp INTO v_brand, v_product;
                EXIT WHEN cursor_mp %NOTFOUND;
                DBMS_OUTPUT.PUT_LINE(v_brand || ' => ' ||  v_product);
        END LOOP;
        DBMS_OUTPUT.PUT_LINE(v_brand || ' 총 ' || cursor_mp%ROWCOUNT || ' 건');
        CLOSE cursor_mp;
 END;
 /

 

- OPEN cursor 를 통해 파라미터를 전달한다.

- LG, SAMSUNG 인 것들을 각각 cursor를 통해 출력하였다.

 

 

 

 

반응형

'ORACLE > SQL' 카테고리의 다른 글

Oracle 날짜형 데이터의 연산  (0) 2008.06.17
PL/SQL  (0) 2008.02.22
PL/SQL (19) - Collections (중첩테이블 - Nested Table)  (0) 2008.02.21
&lt;25가지 SQL작성법&gt;  (0) 2008.02.19
oracle에서 hint의 사용  (0) 2008.02.14
Posted by [PineTree]
ORACLE/SQL2008. 2. 21. 20:25
반응형

###################################################################################################

#   source site : blog.naver.com/tangamjaelt

#   master : 강용운

#   email : tangamjaelt@korea.com

#   last release : 2007.12.22

###################################################################################################

 

인덱스 테이블과 달리 행이 순서대로 정렬되지 않은 모음이다.

특정 데이터형을 지원하지 않는다.

초기화하려면 constructor 메소드를 사용해야 한다.

인덱스 범위는 -2,147,483,647 ~ 2,147,483,647 이다.

검색할 때 항목은 연속적으로 색인화된다.

 

 

중첩테이블 선언

- INDEX BY 절이 사용되지 않는다. 이 절이 있으면 인덱스 테이블, 없으면 중첩 테이블.

  TYPE 형이름 IS TABLE OF 데이터형 [NOT NULL];

 

- 항목을 추가하기 전에 생성자를 호출하여 테이블을 초기화 시킨다.

- 생성자는 오브젝트에 실제로 메모리를 할당하고, 그 오브젝트와 연결된 데이터 구조체를 초기화시키는 함수를 말한다.

- 중첩테이블에서 생성자 함수는 모음을 실제로 생성한 다음, 그것을 선언한 변수에 할당하는 것을 말한다.

 

 

중첩테이블 초기화

 

   TYPE dept_table IS TABLE OF department$ROWTYPE;

   depts dept_table;  -- depts 중첩테이블 변수 선언

 

   depts := dept_table();  -- 생성자 함수 호출. 형이름(). ()안에 아무것도 넣지 않으면 빈 테이블이 생성된다.

 

- dept_table(dept1, dept2) 처럼 항목에 대한 값을 넣으면 테이블에 값이 들어간다.

 

 

중첩테이블 확장

- extend 메소드를 사용해서 항목을 추가한다.

- 모음.EXTEND;

- 모음.EXTEND(5,1);   -- 첫번째 항목을 5번째에 복사한다.

 

 

중첩테이블 삭제

- 모음.DELETE(10)

- 모음.TRIM(끝에서부터잘라낼항목수)

반응형

'ORACLE > SQL' 카테고리의 다른 글

PL/SQL  (0) 2008.02.22
PL/SQL (13) - 커서(cursor)  (0) 2008.02.21
&lt;25가지 SQL작성법&gt;  (0) 2008.02.19
oracle에서 hint의 사용  (0) 2008.02.14
Materialized View 설명  (0) 2008.02.14
Posted by [PineTree]