ORACLE/ADMIN2008. 11. 26. 11:33
반응형
(V7.X ~ V9.X) Modifying a database to run under a new ORACLE_SID
================================================================

1. Shutdown instance

2. Backup all control, redo and data files.

3. Go thru the .profile, .cshrc, .login, oratab, tnsnames.ora(for net v2)
, and redefine the environment variable ORACLE_SID to a new value.
ie search thru disks and do a grep ORACLE_SID *

4. cd $ORACLE_HOME/dbs and rename the following files:

o init<sid>.ora (or use pfile to point to the init file.)
o control file(s) This is optional if you don't rename any of
the controlfiles, and the control_files parameter is used.
control_files would be set in the initSID.ora file or in a file
it references with the ifile parameter. Make sure control_files
doesn't point to any old file names, if you renamed them.

o crdb<sid>.sql & crdb2<sid>.sql This is optional. These are
only used at database creation.

5. cd $ORACLE_HOME/rdbms/admin and rename the file:
o startup<sid>.sql This is optional.
(On some platforms, this file may be in $ORACLE_HOME/rdbms/install.)
Make sure the contents of this file do not reference old initSID.ora
files that have been renamed. This file simplifies the process to
"startup exclusive" your database.

6. To rename the database files and redo log files, you would follow
the instructions in the bulletin: 98863.723.

7. Change the ORACLE_SID environment variable to the new value.

8. start up database and verify it works. Once you have done this,
shutdown the database and take a final backup of all control, redo
and data files.

9. When the instance is started, the control file gets updated with
the current ORACLE_SID.


Changing the dbname for a database
----------------------------------

1. sqldba

2. connect internal

3. alter database backup controlfile to trace;
This will write in a trace file, the CREATE CONTROLFILE command that
would recreate the controlfile as it currently exists.

4. Exit and go to the directory where your trace files are located.
They are usually in the $ORACLE_HOME/rdbms/log directory.
If user_dump_dest is set in the initSID.ora, then go to the directory
listed in the user_dump_dest variable.
The trace file will have the form "ora_NNNN.trc with NNNN being a
number.

5. Get the CREATE CONTROLFILE command from the trace file and put it in
a new file called something like ccf.sql.

6. Edit the ccf.sql file and modify the CREATE CONTROLFILE command.
Just change the word "REUSE" to "SET",and "NORESETLOGS" to
"RESETLOGS", and modify the dbname.
Old line:
CREATE CONTROLFILE REUSE DATABASE "olddbname" NORESETLOGS ...
New line:
CREATE CONTROLFILE set DATABASE "newdbname" RESETLOGS ...
Then save the ccf.sql file.

7. Rename the old control files for backup purposes and so they are not
in the way of creating the new ones.

8. Edit initSID.ora so that db_name="newdbname".

9. sqldba

10. connect internal

11. startup nomount

12. @ccf

13. alter database open resetlogs;

14. Make sure the database is working. Shutdown and backup the database.


Reference Documents
-------------------
<Note:15390.1>

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

# UNIX 환경
# 단순 SID 변경은 .profile 변경 및 dbs 의 init<원한는SID> 로만 변경 하면 된다.
# 결과적으로 단순 SID 변경은 Process 만 변경 된다.
# 간만에 SID 변경할 일이 있어서 테스트 한번 해봤음 ㅇ_ㅇ;
# 늘 그렇지만 엄청 새롭다.

TESTTG ==> TESTTGB 로 변경한다고 가정
1. vi .profile 에서 ORACLE_SID 를 원하는 SID 로 변경
   export ORACLE_SID=TESTTGB
2. dbs 에서 init<SID>.ora 을 init<원하는SID>.ora 로 copy 한다.
    cd /app/oracle/product/10.2.0/dbs
    cp initTESTTG.ora initTESTTGB.ora
# 작업 하시 편하게 pfile 환경에서 한다. pfile 생성은
   SQL> create pfile from spfile ;

3.  2번에서 생성한, initTESTTGB.ora 에서 db_name 을 수정한다.
     *.db_name='TESTTGB'

     주의 사항 :

     1.Control File Path 에 주의 하자  ( 원래 DB 가 떠 있는 동일 Machine 에서 하면 Overwrite 된다 ㅇ_ㅇ;)

         #*.control_files='/an01/TEST/TESTTG/control01.ctl'              -- 원본
         *.control_files='/an01/TEST/TESTTG/TESTTGB_control01.ctl' -- 테스트

     2. SGA , PGA 를 적당히 Edit 하자

     3. 필요하다면 필요한 Tablespace 의 Datafile 만 선택 하자 Control file 을 생성하자.

     4. Archive Dest 를 Edit 하자 ( Mount 이후에 alter system 으로 변경 가능하다 )

4. controlfile 재생성 ( 아래와 같이 )
화일 생성을 아래와 같이 TRACE 떨군 후에 Editing
SQL> alter database backup controlfile to trace  ;
Database altered.
STARTUP NOMOUNT
CREATE CONTROLFILE SET DATABASE "TESTTGB" RESETLOGS  NOARCHIVELOG
    MAXLOGFILES 16
    MAXLOGMEMBERS 3
    MAXDATAFILES 100
    MAXINSTANCES 8
    MAXLOGHISTORY 292
LOGFILE
  GROUP 1 '/an01/TEST/TESTTG/redo01.log'  SIZE 10M,
  GROUP 2 '/an01/TEST/TESTTG/redo02.log'  SIZE 10M,
  GROUP 3 '/an01/TEST/TESTTG/redo03.log'  SIZE 10M
-- STANDBY LOGFILE
DATAFILE
  '/an01/TEST/TESTTG/system01.dbf',
  '/an01/TEST/TESTTG/undotbs01.dbf',
  '/an01/TEST/TESTTG/sysaux01.dbf',
  '/an01/TEST/TESTTG/users01.dbf'
CHARACTER SET UTF8
;

5. controlfile 재성성 후 Recover Database 진행
(  새로 생성한 control file 을 통한 복구이기 때문에 using backup control 사용

   테스트용이라 until cancel 로 하고 바로 cancel 적용

   SID 변경 후 recovery 도 되고, recovery 후 SID 변경이 가능하다.

   개인적으로, 작업 하기 쉬운건 Recovery 후 SID 변경 을 더 편하다

   아주 가끔 백업 본이 이상하던지, archive file 이상해서, 복구가 안되는 케이스가 발생한다. )
SQL> RECOVER DATABASE using backup controlfile until cancel ;
ORA-00279: change 9151408584711 generated at 11/19/2009 23:56:21 needed for
thread 1
ORA-00289: suggestion : /app/oracle/product/10.2.0/dbs/arch1_12_703375834.dbf
ORA-00280: change 9151408584711 for thread 1 is in sequence #12
 
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
Cancel
Media recovery cancelled.

6. RESETLOGS 로 OPEN 한다.
SQL> alter database open resetlogs ;

Database altered.

7. DB NAME 변경된것을 확인 한다.
SQL>  select dbid,name, to_char(created,'YYYY/MM/DD HH24:MI:SS') from v$database ;

      DBID NAME      TO_CHAR(CREATED,'YY
---------- --------- -------------------
3876231960 TESTTGB   2009/11/20 00:26:00

8. Local Listenr 변경 및 Remote tnsnames.ora 에서 TESTTG ==> TESTTGB 로 변경

EM 은 SID 변경에 따라서 당근 재생성 해야 한다.

단순 SID 만 변경해도, EM CONFIG정보는 HOSTNAME_SID 라는 디렉토리에 저장된다.

반응형
Posted by [PineTree]
ORACLE/TUNING2008. 11. 24. 16:39
반응형
힌트의 사용법
 
{SELECT | INSERT | UPDATE | DELETE} /*+ hint [text] [hint [text]] ... */
혹은
{SELECT | INSERT | UPDATE | DELETE} --+ hint [text] [hint [text]] ...
 
-         이러한 힌트의 사용은 SQL 전체가 아닌 쓰여진 SQL 블럭에만 적용됩니다.
 
 
힌트의 종류 별 분류
Optimization Goals and Approaches
             ALL_ROWS 혹은 FIRST_ROWS
             CHOOSE
             RULE
 
Acess Method Hints
             AND_EQUAL
             CLUSTER
             FULL
             HASH
             INDEX 혹은 NO_INDEX
             INDEX_ASC 혹은 INDEX_DESC
             INDEX_COMBINE
             INDEX_FFS
             ROWID
 
Join Order Hints
             ORDERED
             STAR
 
Join Operation Hints
             DRIVING_SITE
             HASH_SJ, MERGE_SJ 혹은 NL_SJ
             LEADING
             USE_HASH 혹은 USE_MERGE
             USE_NL
Parallel Execution Hints
             PARALLEL 혹은 NOPARALLEL
             PARALLEL_INDEX
             PQ_DISTRIBUTE
             NOPARALLEL_INDEX
 
Query Transformation Hints
             EXPAND_GSET_TO_UNION
             FACT 혹은 NOFACT
             MERGE
             NO_EXPAND
             NO_MERGE
             REWIRTE 혹은 NOREWRITE
             STAR_TRANSFORMATION
             USE_CONCAT
 
Other Hints
             APPEND 혹은 NOAPPEND
             CACHE 혹은 NOCACHE
             CURSOR_SHARED_EXACT
             DYNAMIC_SAMPLING
             NESTED_TABLE_GET_REFS
             UNNEST 혹은 NO_UNNEST
             ORDERED_PREDICATES
  
힌트의 설명 및 사용법
 
ALL_ROWS
             /*+ ALL_ROWS */
-         최소한의 자원을 사용하여 결과값의 전체를 추출하게 합니다.
 
AND_EQUAL
             /*+ AND_EQUAL (table index index [index] [index] [index] ) */
-         복수의 단일 컬럼을 스캔하여 머지 방식으로 처리하게 합니다.
 
APPEND_HINT
             /*+ APPEND */
-         직렬 모드 데이터베이스에서 Direct INSERT를 실행하게 합니다.
-         Enterprise Edition 이 아닌 데이터베이스의 기본 모드는 직렬 모드입니다. 이러한 직렬 모드 데이터 베이스에서의 INSERT 작업은 Conventional를 기본값으로 하고 병렬 처리 시에는 Direct INSERT를 기본값으로 합니다.
 
CACHE_HINT
             /*+ CACHE (table) +/
-         풀 테이블 스캔의 사용 시, 테이블에서 읽어온 블럭을 버퍼의 LRU 리스트 의 MRU 쪽에 위치시킵니다. 작은 테이블의 사용 시 유용합니다.
 
CHOOSE_HINT
             /*+ CHOOSE +/
-         Rule-Based 와 Cost-Based 방식 간의 선택을 유도합니다. 선택 기준은 사용 객체의 분석 정보 존재 여부이며, 사용되는 객체들중 하나라도 분석 정보가 존재한다면 Cost-Based 방식을 사용하게 됩니다.
 
CLUSTER_HINT
             /*+ CLUSTER (table) +/
-         지정 테이블의 클러스터 스캔을 유도합니다. 클러스터된 객체에만 사용할 수 있습니다.
 
CURSOR_SHARING_EXACT
             /*+ CURSOR_SHARING_EXACT +/
-         바인드 변수 값의 교체를 불가능하게 합니다.
-         기본적으로 CURSOR_SHARING 파라미터를 사용하여, 안전하다고 판단될 시 SQL 내의 바인드 변수 값을 교체할 수 있게 되어 있습니다.
 
DRIVING_SITE
             /*+ DRIVING_SITE (table) +/
-         오라클이 선택한 SITE 대신, 지정한 SITE를 사용하여 쿼리를 실행합니다. Rule-Based 와 Cost-Based, 두 모드 다 사용 가능합니다.
 
DYNAMIC_SAMPLING
             /*+ DYNAMIC_SAMPLING ( [table] n ) +/
-         해당 객체의 Selectivity 와 Cardinality 에 대한 보다 자세한 정보를 자동으로 생성시켜 실행합니다.
-         값은 0 부터 10 까지 지정할 수 있으며, 높을 수록 보다 자세한 정보를 생성하게 됩니다. 테이블에 해당 값을 지정하지 않았을 경우, 기본 값은 CURSOR 레벨의 값이 쓰여집니다.
 
EXPAND_GSET_TO_UNION
             /*+ EXPAND_GSET_TO_UNION +/
-         GROUP BY GROUPING SET 혹은 GROUP BY ROLLUP 등과 같은 구문을 포함하는 쿼리에 사용할 수 있습니다.
-         이 힌트는 기존의 쿼리를 개별적인 그룹 생성 후, UNION ALL 방식으로 실행되게 유도합니다.
 
FACT_HINT
             /*+ FACT (table) +/
-         스타 변형 구문에서 사용되며 해당 테이블이 FACT 테이블로 사용되게 유도합니다.
 
FIRST_ROWS
             /*+ FIRST_ROWS (n) +/
-         전체 결과값의 반환 대신 지정한 숫자만큼 로우의 결과값을 반환하는데 집중하게 유도합니다.
 
FULL_HINT
             /*+ FULL (table) */
-         지정한 테이블에 대해 풀 테이블 스캔을 유도합니다.
 
HASH_HINT
             /*+ HASH (table) */
-         지정한 테이블에 대해 hash 스캔을 수행하도록 유도합니다.
-         클러스터 테이블 만을 대상으로 합니다.
 
HASH_AJ
             /*+ HASH_AJ */
-         EXISTS 구문 뒤에 오는 서브 쿼리에 사용되며 HASH_SJ, MERGE_SJ 혹은 NL_SJ 등을 사용할 수 있습니다.
-         HASH_SJ 은 hash semi-join 이고, MERGE_SJ 은 sort merge semi-join 이며 NL_SJ 은 nested loop semi-join 입니다.
 
INDEX
             /*+ INDEX (table index [index] [index] ... ) */
-         지정한 테이블의 인덱스 스캔을 실행하도록 유도합니다.
-         Domain, B-tree, bitmap, bitmap join 인덱스 등이 사용될 수 있으나, bitmap 인덱스 들의 사용 시, INDEX 힌트보다는 INDEX_COMBINE 힌트 사용이 추천됩니다.
 
INDEX_ASC
             /*+ INDEX-ASC (table [index] [index] ... ) +/
-         해당 테이블의 인덱스를 순차적 방식으로 스캔하게 합니다.
-         해당 쿼리가 인덱스 범위 스캔의 사용 시, 인덱스 값의 순차적 방식으로 읽게 됩니다.
 
INDEX_COMBINE
             /*+ INDEX_COMBINE (table [index] [index] ... ) +/
-         해당 테이블에 Bitmap 인덱스의 존재 시, Bitmap 인덱스를 통한 액세스를 유도합니다.
-         힌트 내에 인덱스의 이름이 쓰여지지 않을 시, 해당 인덱스의 Boolean 값을 사용하여 최적의 Cost를 산출하여 실행하게 됩니다.
 
INDEX_DESC
             /*+ INDEX_DESC (table [index] [index] ... ) +/
-         지정한 인덱스에 대해 인덱스 스캔을 역순으로 실행합니다.
-         해당 쿼리가 인덱스 범위 스캔의 사용 시, 인덱스 컬럼의 값을 사용하여 역순으로 실행합니다.
-         파티션 인덱스에서는 파티션 별 개별적인 실행이 이루어집니다.
 
INDEX_FFS
/*+ INDEX_FFS (table [index] [index] ... ) +/
-         풀 테이블 스캔 대신에 빠른 풀 테이블 스캔의 실행을 유도합니다.
 
LEADING_HINT
             /*+ LEADING (table) +/
-         테이블 간의 조인 시에 지정한 테이블을 먼저 수행하도록 유도합니다.
-         두 개 이상의 LEADING 힌트의 사용 시, 힌트 자체가 사용되어 지지 않습니다.
-         ORDERED 힌트와 더불어 사용시, LEADING 힌트는 사용되지 않습니다.
 
MERGE
             /*+ MERGE (table) +/
-         각 쿼리의 결과값을 머지합니다.
-         해당 쿼리 내에 GROUP BY 절의 사용 이나 SELECT 구문에 DISTINCT 가 사용되었을 시, 머지의 실행이 가능할 경우에만 힌트가 실행됩니다.
-         IN 과 서브 쿼리의 사용 시, 서브 쿼리와 상위 쿼리 간의 상호 관계가 없을 때에만 머지의 실행이 가능합니다.
-         이 힌트는 Cost-based 가 아닙니다. 따라서 액세스하는 실행 쿼리 블럭에 MERGE 힌트가 반드시 명시되어야만 합니다. 그렇지 않을 경우 옵티마이저는 다른 실행 계획을 수립합니다.
 
MERGE_AJ
             HASH_AJ 를 참조하십시요.
 
MERGE_SJ
             HASH_AJ 를 참조하십시요.
 
NL_AJ
             HASH_AJ 를 참조하십시요.
 
NL_SJ
             HASH_AJ 를 참조하십시요.
 
NOAPPEND
             /*+ NOAPPEND +/
-         병럴 모드에서의 INSERT 작업을 Conventional 방식으로 수행합니다.
-         병렬 모드에서는 Direct-path INSERT 가, 직렬 모드에서는 Conventional INSERT가 기본값입니다.
 
NOCACHE
             /*+ NOCACHE (table) +/
-         풀 테이블 스캔의 사용 시, 테이블에서 읽어온 블럭을 버퍼의 LRU 리스트 의 LRU 쪽에 위치시킵니다. 기본 모드입니다.
 
NO_EXPAND
             /*+ NO_EXPAND +/
-         실행 쿼리 내에 OR 나 WHERE 절의 IN 이 사용되었을 시, Cost-Based 옵티마이저가 쿼리 처리를위해 OR 를 사용한 확장을 사용하는 것을 방지합니다.
-         일반적으로 옵티마이저는 위와 같은 경우 OR – 확장의 가격이 확장을 사용하지 않는 것보다 적을 시, 확장 방식으로 수행합니다.
 
NO_FACT
             /*+ NO_FACT (table) +/
-         Star 변형 시, 해당 테이블의 FACT 테이블로서의 사용을 방지합니다.
 
NO_INDEX
             /*+ NO_INDEX (table [index] [index] ... ) +/
-         지정 테이블의 인덱스 사용을 방지합니다.
 
NO_MERGE
             /*+ NO_MERGE (table) +/
-         머지 처리 방식의 사용을 방지합니다.
 
NOPARALLEL
             /*+ NOPARALLEL (table) +/
-         지정한 테이블의 병렬 처리를 방지합니다.
-         테이블의 지정된 PARALLEL 값에 대해서 우선권을 가집니다.
-         중첩 테이블에 대해서는 병렬 처리를 할 수 없습니다.
 
NOPARALLEL_INDEX
             /*+ NOPARALLEL_INDEX (table [index] [index] ... ) +/
-         인덱스 스캔 작업의 병렬 처리를 방지합니다.
-         인덱스에 지정된 PARALLEL 값에 우선권을 가집니다.
 
NO_PUSH_PRED
             /*+ NO_PUSH_PRED (table) +/
-         결과값에 대한 조인 방식 서술의 강제적 수행을 방지합니다.
 
NO_PUSH_SUBQ
             /*+ NO_PUSH_SUBQ +/
-         서브 쿼리의 결과값을 머지하지 않는 실행 계획이 실행 계획 설립 단계에서 제일 마지막으로 참조되는 것을 방지합니다.
-         일반적으로 서브 쿼리의 Cost 가 높거나, 처리 로우의 갯수를 크게 줄여주지 못할 때에는 서브 쿼리를 마지막에 참조하는 것이 성능 향상에 도움이 됩니다.
 
NOREWRITE
             /*+ NOREWRITE +/
-         해당 쿼리 블럭의 쿼리 재생성의 실행을 방지합니다.
-         QUERY_REWRITE_ENALBE 파라미터에 대해 우선권을 가집니다.
-         NOREWRITE 힌트의 사용 시, Function-Based 인덱스의 사용이 금지됩니다.
 
NO_UNNEST
             /*+ NO_UNNEST +/
-         해당 서브 쿼리 블럭의 UNNESTING 설정의 사용을 방지합니다.
 
ORDERED
             /*+ ORDERED +/
-         FROM 절에 나열된 테이블의 순서대로 조인 작업을 실행합니다.
 
ORDERED_PREDICATE
             /*+ ORDERED_PREDICATE +/
-         옵티마이저에 의한 조인 관계의 Cost를 산출하기 위해 미리 정해둔 조인 관계 별 실행 순서의 사용을 방지합니다.
n         인덱스 키를 사용한 조인 관계들은 제외됩니다.
-         이 힌트는 쿼리의 WHERE 절에 사용하십시요.
 
PARALLEL
             /*+ PARALLEL (table [ [, n |, DEFAULT |, ] [, n | DEFAULT ] ] ) +/
-         병렬 처리에 사용될 서버 프로세스의 갯수를 설정합니다.
-         병렬 처리 조건에 위배될 시, 힌트는 사용되지 않습니다.
-         임시 테이블에 대한 PARALLEL_HINT 사용 시, 힌트는 사용되지 않습니다.
 
PARALLEL_INDEX
             /*+ PARALLEL_INDEX (table [ [index] [, index]...]
[ [, n |, DEFAULT |, ] [, n | DEFAULT ] ] ) +/
-         파티션 인덱스의 인덱스 범위 스캔 작업의 병렬 처리에 할당될 서버 프로세스의 갯수를 지정합니다.
 
PQ_DISTRIBUTE
             /*+ PQ_DISTRIBUTE (table [,] outer_distribution, inner_distribution) +/
-         병렬 조인 시, Producer 프로세스와 Consumer 프로세스 간의 데이터 전달 방식을 지정합니다.
 
PUSH_PRED
             /*+ PUSH_PRED (table) +/
-         결과값에 대한 조인 방식 서술의 강제적 수행을 실행합니다.
 
PUSH_SUBQ
             /*+ PUSH_SUBQ +/
-         머지가 불가능한 서브 쿼리들의 우선 실행 계획을 실행 계획 수립시 먼저 참조하도록 합니다.
-         서브 쿼리의 사용 객체가 Remote 테이블이거나, 머지 조인의 사용 시 힌트는 실행되지 않습니다.
 
REWRITE
             /*+ REWRITE [ ( [materialized_view] [materialized_view]...) ] +/
-         실행 계획의 가격에 상관없이 Materialized View 를 사용하여 쿼리 재생성을 하도록 합니다.
-         Materialized View 를 지정할 시, 지정한 Materialized View 의 가격에 상관없이 무조건 쿼리 재생성을 실행합니다.
-         Materialized View 를 지정하지 않을 시, 오라클은 사용 가능한 모든 Materialized View 를 참조하여 그 중 가장 가격이 낮은 Materialized View 를 사용하여 쿼리 재생성을 합니다.
-         Materialized View 를 지정하지 않는 힌트의 사용이 권장됩니다.
 
ROW_ID
             /*+ ROWID (table) +/
-         지정한 테이블의 스캔을 ROWID 방식으로 수행하게 합니다.
 
RULE
             /*+ RULE +/
-         실행 계획을 Rule-Based 방식으로 실행하게 합니다.
-         해당 쿼리 블럭에 다른 힌트 또한 사용되었을 경우, 다른 힌트들은 사용되지 않습니다.
 
STAR
             /*+ STAR +/
-         Star 쿼리 계획이 사용 가능하다면, 실행하게 합니다.
-         Star 쿼리 계획이란 가장 큰 테이블이 마지막 순서로 조인되며, 조인될 시 가장 큰 테이블 내의 Concatenated 인덱스에 대해 Nested Loop 조인 방식으로 실행되는 것을 말합니다.
-         최소한 세개 이상의 테이블이 사용되며, 제일 큰 테이블의 Concatenated 인덱스의 생성에 최소한 세 개 이상의 컬럼이 사용되어야 하며, 액세스나 조인 방식에 충돌이 없어야만 이 힌트는 사용됩니다.
 
STAR_TRANSFORMATION
             /*+ STAR_TRANSFORMATION +/
-         옵티마이저가 Star 변형 작업에 최적화된 실행 계획을 수립, 실행하도록 합니다.
-         힌트를 사용하지 않을 시, 옵티마이저는 일반적인 작업에 최적화된 실행 계획을 수행합니다.
-         힌트를 사용하였어도 변형 작업에 맞추어진 실행 계획을 실행한다는 보장은 없습니다. 다른 일반적인 힌트의 사용과 마찬가지로 비교 분석 후, 오라클의 판단에 따라 다른 실행 계획이 실행될 수 있습니다.
 
UNNEST
             /*+ UNNEST +/
-         서브 쿼리 블럭에 대해 인증성 만을 검사하게 합니다.
-         인증이 되었다면 그 이상의 검증 작업없이 서브쿼리에 대한 UNNESTING 의 설정을 가능하게 합니다.
 
USE_CONCAT
             /*+ USE_CONCAT +/
-         WHERE 절의 OR 조인 을 UNION ALL 로 변경하여 수행하게 합니다.
-         일반적으로 이러한 변경은 결과값의 병합 수행의 가격이 수행하지 않을 시의 가격 보다 낮을 때에만 실행됩니다.
 
USE_HASH
             /*+ USE_HASH (table [table]...) +/
-         Hash 조인 방식으로 각 테이블을 조인하게 합니다.
 
USE_MERGE
             /*+ USE_MERGE (table [table]...) +/
-         Sort-Merge 방식으로 각 테이블을 조인하게 합니다.
 
USE_NL
             /*+ USE_NL (table [table]...) +/
- Nested-Loop 방식으로 각 테이블을 조인하게 합니다

반응형
Posted by [PineTree]
ORACLE/SQL2008. 11. 24. 11:10
반응형

-------------------------------------------------------------------------------------
 단일 행 함수
-------------------------------------------------------------------------------------

* initcap - 첫번째 영문자만 대문자로 바꾸어준다.

select ename, initcap(ename) from emp; 

--> 결과값 : KEVIN --> Kevin

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

* concat - 문자열 합치기. ||와 같으나 최대 2개만 가능

select ename || job || deptno, concat(ename,job) from emp;

--> 결과값 : SMITHCLERK20 / SMITHCLERK
 

select ename || job || deptno, concat(ename,job,deptno) from emp;

--> 에러 : concat에는 최대 2개까지만 가능..

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

* substr - 글자 수 기준 문자열 추출 , substrb - 바이트기준 문자열 추출

select substr('oracle',1,3), substr('대한민국',1,2) from dual; 


--> 결과값 : ora , 대한 (바이트와 상관없다.)

select substrb('oracle',1,3), substrb('대한민국',1,1) from dual;


--> substrb 는 바이트기준으로 출력한다. 한글은 2바이트,영문 1바이트

--> 결과값 : ora /  (3byte ora / 한글은 2바이트이기때문에 출력불가)

select substr('oracle',2) from dual;


--> 결과값 : racle ( 2번째 문자부터 끝까지 )

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

 * length - 글자수,비영어권에서 보편적임 , lengthb - 바이트수

select length('oracle'),length('대한민국'),
          lengthb('oracle'),lengthb('대한민국') from dual;

 --> 결과값 : 6 / 4 (4글자기준) / 6 / 8 (4글자 8byte기준)
       

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

* instr - 특정 문자열이 처음 발견 된 위치 값 리턴

select instr('oracle ORACLE oralb','ora',1),
         instr('oracle ORACLE oralb','ora',2),
         instr(lower('oracle ORACLE oralb'),lower('ora'),2)

from dual;

--> 결과값 : 1 / 15 / 8 (대소문자구분없이하기위해 소문자로 형변환)

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

        
* lpad, rpad - 특정 크기를 지정하여 공백부분에 특정 문자열로 채워준다.

                      숫자는 바이트라는 것에 절대 유의하자.

select lpad('오라클',20,'?'), lpad('?',20,'?'),rpad('?',20,'?'),rpad('오라클',20,'?') from dual;

--> 결과값 :

??????????????오라클 / ???????????????????? / ???????????????????? / 오라클??????????????

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

* ltrim , rtrim - 특정 문자열 혹은 공백 제거


select ltrim('오오징어오라클','오징' ), ltrim('오오징어오라클','클라' ),
       rtrim('오오징어오라클','오징' ), rtrim('오오징어오라클','클라' ),
    rtrim('오징어             ') ,ltrim('             오징어') ,
       rtrim(ltrim ('               오오징어오라클                ') )
from dual;

--> 결과값 :

어오라클 / 오오징어오라클 / 오오징어오라클 / 오오징어오 / 오징어 / 오징어 / 오오징어오라클

rtrim은 오른쪽에서 부터 제거되는 대신에, 지정 문자역시 뒤집어 입력해야한다.

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

* translate - 특정 문자열을 사용자가 지정한 매칭값으로 바꿔준다.

select translate('oracle',
                      'abcdefghijklmnopqrstuvwxyz',
                     'ABCDEFGHIJKLMNOPQRSTUVWXYZ')
from dual;


--> 결과값 'ORACLE' - 대소문자 변환이 되었다.

select translate('공공칠빵',
                      '공일이삼사오육칠팔구빵',
                      '01234567890')
from dual;


--> 결과값 : 0070 (바뀌어질 것과 바뀌는 것의 타입은 전혀 상관없다.)

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

* replace - 문자열 바꾸기, 대소문자 구별..

select replace('oracle oracle9i ORACLEDBA', 'ora', '오라') from dual; 

--> 결과값 : 오라cle 오라cle9i ORACLEDBA
 

select replace(upper('oracle oracle9i ORACLEDBA'),upper('ora'), '오라') from dual; 

--> 결과값 : 오라CLE 오라CLE9I 오라CLEDBA

--> 대소문자 구별을 없애기 위해, 모든값을 대문자로 강제 형변환하였다.

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

reverse - 문자열 순서 뒤집기

select reverse('oracle oracle9i ORACLEDBA') from dual; 

--> 결과값 : ABDELCARO i9elcaro elcaro

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

* round - 반올림, 옵션 숫자가 음수면 정수자리, 양수면 소수자리 반올림

select 91.459, round(91.459,-3),round(91.459,-2) , round(91.459,-1) ,round(91.459,0) ,
       round(91.459,1) ,round(91.459,2), round(91.459,3)
from dual;

--> 결과값 : 91.459 / 0 / 100 / 90 / 91 / 91.5 / 91.46 / 91.459

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

* trunc - 숫자 절삭, 옵션 숫자가 음수면 정수자리, 양수면 소수자리

select 91.459, trunc(91.459,-3),trunc(91.459,-2) , trunc(91.459,-1) ,trunc(91.459,0) ,
       trunc(91.459,1) ,trunc(91.459,2), trunc(91.459,3)
from dual;

--> 결과값 : 91.459 | 0 | 0 | 90 | 91 | 91.4 | 91.45 | 91.459

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

* mod(나머지), power(제곱), sqrt(루트)

select mod(5,2), power(5,2), sqrt(2) from dual;
--> 결과값 : 1 / 25 / 1.4142135623731

* sign

select sign(5-2), sign(5-5), sign(2-5), sign(-3) from dual;
--> 결과값 : 1 / 0 / -1 / -1

* chr - ascii 코드에 해당하는 문자 리턴
select chr(65), chr(97), ascii('A'),ascii('a') from dual;
--> 결과값 : A / a / 65 / 97

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

-- 1.5.2 날짜 연산 (p.113)
-------------------------------------------------------------------------------------

* sysdate


select sysdate+1 , sysdate-1,sysdate-1/24,sysdate+1/24 from dual; 
--> 1 일 증감, 1시간 전,  1시간 후


select sysdate - to_date('2006-10-13', 'yyyy-mm-dd') from dual;
--> 1.67614583333333 (현재 날짜시간에서 해당날짜를 뺀 값, 대략 1.6일정도) 

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

* to_date

select to_date('2006-10-13', 'yyyy-mm-dd') from dual;
--> 2006-10-13 00:00:00


select to_date('20061013','yyyymmdd') from dual;
--> 2006-10-13 00:00:00


select to_date('20060931','yyyymmdd') from dual;
--> 에러.. 달력에9월 31일은 존재하지 않는다.

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

* months_between - 달 차이 구하기. (9월과 5월은 4달...)


select months_between('20061014','20060914') from dual;
--> 1 (1달 뒤)


select months_between('20060914','20061014') from dual;
--> -1 (1달 전)


select months_between(sysdate,'20060901') from dual;
--> 1.44128136200717 (대략 1달 보름)

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

* add_months -달 계산


select add_months(sysdate,2) from dual;
--> 2006-12-14 16:19:44 (현재 시각에 2달을 더하기.)


select add_months(sysdate,-2) from dual;
--> 2006-08-14 16:20:02 (현재 시각에 2달을 뺐다.)

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

* next_day - 가장 최근에 돌아오는 특정요일의 날짜 검색

select next_day(sysdate,'FRI') from dual;
select next_day(sysdate,'FRIDAY') from dual;

--> 돌아오는 금요일의 날짜와 현재와 같은 시각 리턴

select next_day(sysdate,'금') from dual;
select next_day(sysdate,'금요일') from dual; 
--> 한글은 sqlgate에서 실행불가, sqlplus에서 실행하자.

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


* last_day - 특정 월의 마지막 날짜 

select last_day(sysdate) from dual;

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

* 현재시각을 기준으로 특정값만 추출 --> 숫자 출력

select sysdate,
    to_char(sysdate,'yyyy') 년,to_char(sysdate,'mm') 월,
    to_char(sysdate,'dd') 일 , to_char(sysdate,'hh') 시,
    to_char(sysdate,'mm') 분,to_char(sysdate,'ss') 초
from dual;
--> 2006 10 15 03 10 42

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

* 현재시각을 기준으로 특정값만 추출 #2  --> 영문출력

select sysdate,  -- mon <-> month 같다 dy <-> day
    to_char(sysdate,'year') 년,to_char(sysdate,'month') 월,
    to_char(sysdate,'day') 일 ,to_char(sysdate,'hh') 시,
    to_char(sysdate,'mm') 분,to_char(sysdate,'ss') 초 ,
    to_char(sysdate,'dy')
from dual;
-->two thousand sixoctober  sunday   03 10 02

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

* 분기 (quarter) , 몇째 주  , 그 해의 주차, 요일에 해당하는 숫자

select to_char(sysdate,'q'), to_char(sysdate,'w'),
       to_char(sysdate,'ww'),to_char(sysdate,'d'),
    to_char(sysdate,'dd'),to_char(sysdate,'ddd')
from dual;
--> 4(4분기), 3(10월 3째주), 42(2006년 42주차),
--- 2 (월요일), 16(16일), 289(2006년 289일째) d / dd / ddd

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

* 요일값 구하기

--> to_char(sysdate,'d') 
--> 리턴값은 다음과 같은 숫자 - 일요일(1) 월(2) 화(3)수(4)목(5)금(6)토(7)


리눅스기반 오라클에서 리턴값 한글로 강제 변환 방법

1) 방법 1  (case구문은 oracle 9i 부터 사용)

select case to_char(sysdate,'d')
    when '1' then '일요일'
       when '2' then '월요일'
       when '3' then '화요일'
       when '4' then '수요일'
       when '5' then '목요일'
       when '6' then '금요일'
       when '7' then '토요일'
       end "오늘의 요일명"   --> alias , 쌍따옴표 주의!!
from dual;

2) 방법 2

select case
       when to_char(sysdate,'d')='1' then '일요일'
       when to_char(sysdate,'d')='2' then '월요일'
       when to_char(sysdate,'d')='3' then '화요일'
       when to_char(sysdate,'d')='4' then '수요일'
       when to_char(sysdate,'d')='5' then '목요일'
       when to_char(sysdate,'d')='6' then '금요일'
       when to_char(sysdate,'d')='7' then '토요일'
       end "오늘의 요일명"
from dual;

3) 방법 3 (오라클 8i 이전에 주로 사용..)

select decode(to_char(sysdate,'d'),'1','일요일'
                                   ,'2','월요일'
                                   ,'3','화요일'
                                   ,'4','수요일'
                                   ,'5','목요일'
                                   ,'6','금요일'
                                   ,'7','토요일')
"오늘의 요일명"
from dual;                              

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

* 현재 시각 (표준시각 current_date)

select sysdate, current_date from dual;

--> 2006-10-19 20:20:14(시스템시간) / 2006-10-19 11:20:15(세계표준시)

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

* 날짜 타입 서수형으로의 변환

select to_char(sysdate, 'yyspth'),to_char(sysdate, 'mmspth'),
       to_char(sysdate, 'ddspth')
from dual;
--> sixth tenth sixteenth (200 '6'년 '10'월 '16'일)

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

* 현재 날짜 원하는 형식으로 변환

select to_char(sysdate,'yyyy"년" mm"월" dd"일"')
from dual;
--> 2006년 10월 16일

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

* 'fmyyyy-mm-dd' 날짜중 0을 제거/삽입 

select ename, to_char(hiredate,'yyyy-mm-dd') hiredate,
       to_char(hiredate,'fmyyyy-mm-dd') hiredate, --> 제거 
      to_char(hiredate,'fmyyyy-mmfm-dd') hiredate --> /yyyy제거 mm삽입 
from emp;
--> 1981-04-02 -> 1981-4-2 (0을 삭제하자.)

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

* 통화기호와 자리표시

select ename,sal,
       to_char(sal,'09999'),  --> 00800   --> 01600
       to_char(sal,'$9,999'), -->  $800   --> $1,600
       to_char(sal,'L9,999')  -->  $800   --> $1,600
from emp;

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

* 현재 설정 (언어, 통화, 달력등 보기)

select * from v$nls_parameters;

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

* 날짜 계산


select '20061016'-'20061010'
from dual;
--> 6 (문자열 숫자열로 오라클 서버가 자동 형변환)

select sysdate-'20061010'
from dual;
--> 에러

select to_char(sysdate,'yyyymmdd')-'20061010'
from dual;
--> 6 (강제형변환을 해주어야한다)

select sysdate - to_date('20061010','yyyymmdd')
from dual;
--> 6.43899305555555

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

* to_yminterval


select sysdate, add_months(sysdate,14),
       sysdate + to_yminterval('01-02') -- only Oracle 9i upper!
from dual; 
--> 2006-10-16 10:33:15 / 2007-12-16 10:33:15 / 2007-12-16 10:33:15
--- 14개월 / 1년 2개월 후 

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

* to_dsinterval


select sysdate + to_dsinterval('001 02:03:04')
from dual;
--> 1일 2시간 3분 4초 후... / 2006-10-17 12:37:41

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

* to_yminterval + to_dsinterval


select sysdate
     + to_yminterval('01-02')
     + to_dsinterval('001 02:03:04')
from dual;
--> 1년 2월 1일 2시간 3분 4초 후.. / 2007-12-17 12:39:39

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

* extract - Oracle 9i이상에서만 동작한다.

    --> 날짜데이터에서 특정값을 숫자형으로 추출..(우측정렬)
    --> to_char와 결과물은 같지만, to_char는 문자열이다.(좌측)


select sysdate,
       extract(year from sysdate),
       to_char(sysdate,'yyyy'),   
       extract(month from sysdate),
       to_char(sysdate,'mm'),
       extract(day from sysdate)+1,  --> 원래 숫자형이므로 형변환 X
       to_char(sysdate,'dd')+1  --> 1을 더하면서 강제형변환이 일어났다.
from dual;

-->

2006-10-19 20:28:53 / 2006(우) / 2006(좌) / 10(우) / 10(좌) / 20(우) / 20(우)

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

* 실수로 반복 입력한 데이터의 삭제.. --> rowid와 rownum을 이용..

select rownum, rowid, name,jubun
from member;

--> 잘못입력된 데이터의 데이터 입력시 자동생성되는 rowid와 rownum을 검색하자

delete member
where rowid like 'AAAHZuAAJAAAAAP%';

--> rowid를 검색하여, 그 행을 조건절을 이용하여 삭제.

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

* 클라이언트 정보 검색

select userenv('language') "language",
       userenv('terminal') "terminal",
       userenv('sessionid') "sessionid"
from dual;

--> 현재 설정된 언어 값 / 접속컴퓨터터미널이름 / 세션ID

AMERICAN_AMERICA.KO16MSWIN949 / MVP386 /167

select uid, user from dual;

--> 59 (USER ID) / SCOTT(접속계정)

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

* 순위 매기기

방법 1)

select ename "사원명",deptno "부서번호",sal "급여",
       rank() over(order by sal desc) "전체등수",   --공동랭크 포함 - 공동2등 다음 4등
       rank() over(partition by deptno order by sal desc) "부서별등수",
       dense_rank() over(order by sal desc) 전체서열, --공동랭크 불포함 - 공동2등 다음 4등
       dense_rank() over(partition by deptno order by sal desc) 부서별서열
from EMP;

방법 2) 인라인 쿼리문 - 사실상 이 문제에는 필요없다.

select *
from
(
select ename "사원명",deptno "부서번호",sal "급여",
       rank() over(order by sal desc) "전체등수",   --공동랭크 포함 - 공동2등 다음 4등
       rank() over(partition by deptno order by sal desc) "부서별등수",
       dense_rank() over(order by sal desc) 전체서열, --공동랭크 불포함 - 공동2등 다음 4등
       dense_rank() over(partition by deptno order by sal desc) 부서별서열
from EMP
) T
where "전체등수" <=10
order by 2,3 desc;

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

-- Quiz )

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

1. member 테이블에서 여자만 출력하시오.

select *

from member

where substr(jubun,7,1) in (2,4)

select *

from member

where substr(jubun,7,1) =  '2' or substr(jubun,7,1) =  '4'

--> 위의 in 구문보다 아래의 OR 구문이 대용량DB에서 속도면에서 유리하다.

--> 2와 4에 홑따옴표(')를 붙여주지 않아도 동작은 되지만, 무결성을 위해 붙여주자

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

2. 아래와 같은 테이블이 있다.

create table filetab
(fileno number,
filename varchar2(200)
) tablespace users;

insert into filetab values(1,'c:\aaa\bbb\ccc\sales.xls');
insert into filetab values(2,'d:\aaa\salesinfo.doc');
insert into filetab values(3,'c:\research.xxls');
insert into filetab values(4,'d:\aaa\bbb\marketing.hwp');

1) 확장자가 xls인 파일만 출력하시오.

select *

from filetab

where filename like '%.xls';

--> 데이터중에 .xls와 .xxls가 있다. 점(.)을 꼭 넣어 구분해주자.

2) 아래와 같이 출력하시오.

--------------------------------
 fileno      filename
--------------------------------
1            sales.xls
2            salesinfo.doc
3            research.xxls
4            marketing.hwp

-->

select fileno,

         reverse(substr(reverse(filename),1,instr(reverse(filename),'\',1)-1)) filename
from filetab;

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

Quiz ) - 2006.10.14.16:36:00

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

1. 오늘 입대하면 언제 제대할까? (군 기간은 2년)
select add_months(sysdate,24) from dual;
--> 2008-10-14 16:36:34

2. 오늘 입대하면 몇끼를 먹어야 제대할까? (단, 하루3끼)
select (add_months(sysdate,24)-sysdate)*3 from dual;
--> 2193

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

Quiz ) 아래와 같이 출력하시오.

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

 이름  주민번호 계통 성별 나이

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

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

insert into member values('귀화남','7510165234567');
insert into member values('귀화녀','7611126234567');
commit;

select * from MEMBER;

방법 1) 복잡하고 잘못된 코딩

select name 이름,jubun 주민번호,

    case when substr(jubun,7,1) in ('1','2','3','4')
       then '한국계'
      else '외국계'
    end "원래국적" ,
    decode(substr(jubun,7,1),'1','남'
                                        ,'3','남'
                                        ,'5','남'
                                       ,'여') "성별" , --> 계통


    case when substr(jubun,7,1) in ('1','2') then to_char(sysdate,'yyyy') - ('19' || substr(jubun,1,2))
         when substr(jubun,7,1) in ('3','4') then to_char(sysdate,'yyyy') - ('20' || substr(jubun,1,2))
         when substr(jubun,7,1) in ('5','6') then to_char(sysdate,'yyyy') - ('19' || substr(jubun,1,2))        
           when substr(jubun,7,1) in ('7','8') then to_char(sysdate,'yyyy') - ('20' || substr(jubun,1,2)) 
        end "현재나이"       --> 나이계산
from member;

방법 2) 간단한 코딩 

select T.*,
add_months(to_char(sysdate,'yyyy')||'-02-20',12*(60-현재나이)) "정년일",
to_date(to_char(sysdate,'yyyy-mm-dd'),'yyyy-mm-dd') - 입사일 "근무일수",
add_months(to_char(sysdate,'yyyy')||'-02-20',12*(60-현재나이)) -
to_date(to_char(sysdate,'yyyy-mm-dd'),'yyyy-mm-dd') "남은일수"
from
(
select name 성명, jubun 주민번호, hiredate 입사일,
  case when substr(jubun,7,1) in ('1','2','3','4') then '한국계'
       else '외국계' end 혈통,
  case when substr(jubun,7,1) in ('1','3','5') then '남'
       else '여' end 성별,
  case when substr(jubun,7,1) in ('1','2','5','6') 
       then extract(year from sysdate) - (to_number(substr(jubun,1,2))+1899)
       else extract(year from sysdate) - (to_number(substr(jubun,1,2))+1999)
       end 현재나이     
from MEMBER
) T;


-->
귀화인 7510165234567 외국계 남 31
귀화여 7611126234567 외국계 여 30
이순신 7001031234567 한국계 남 36
김하늘 8012252234567 한국계 여 26
남자애 0005023234567 한국계 남 6
여자애 0103014234567 한국계 여 5

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

-- 컬럼 추가
----------------------------------------------------------------------------------

alter table member
add hiredate date;

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

Quiz ) member 테이블에서 아래와 같이 추출. 단 정년은 60세 되는해의 2월 20일이다.

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

성명 주민번호 입사일 계통 성별 현재나이 근무일수 정년일 남은일수

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

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

select *
from member;

update member set hiredate=to_date('1998-01-04','yyyy-mm-dd')
where name='이순신'; 
update member set hiredate=to_date('1999-12-14','yyyy-mm-dd')
where name='김하늘'; 
update member set hiredate=to_date('2002-09-10','yyyy-mm-dd')
where name='남자애'; 
update member set hiredate=to_date('2003-03-20','yyyy-mm-dd')
where name='여자애'; 
update member set hiredate=to_date('2000-01-30','yyyy-mm-dd')
where name='귀화인'; 
update member set hiredate=to_date('2000-01-30','yyyy-mm-dd')
where name='귀화여'; 

commit;

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

정답 )

select T.*,


add_months(to_char(sysdate,'yyyy')||'-02-20',12*(60-현재나이)) "정년일",


to_date(to_char(sysdate,'yyyy-mm-dd'),'yyyy-mm-dd') - 입사일 "근무일수",


add_months(to_char(sysdate,'yyyy')||'-02-20',12*(60-현재나이)) -
to_date(to_char(sysdate,'yyyy-mm-dd'),'yyyy-mm-dd') "남은일수"


from
(
select name 성명, jubun 주민번호, hiredate 입사일,


  case when substr(jubun,7,1) in ('1','2','3','4') then '한국계'
       else '외국계' end 혈통,


  case when substr(jubun,7,1) in ('1','3','5') then '남'
       else '여' end 성별,


  case when substr(jubun,7,1) in ('1','2','5','6') 
       then extract(year from sysdate) - (to_number(substr(jubun,1,2))+1899)
       else extract(year from sysdate) - (to_number(substr(jubun,1,2))+1999)
       end 현재나이     


from MEMBER
) T;

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

Quiz ) emp테이블의 사원중 1년간 총연봉(급여+보너스)가 30000이상인 사람 추출

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

방법1)

select ename, coalesce(sal*12+comm, comm, sal*12, 0)
from emp
where coalesce(sal*12+comm, comm, sal*12, 0) >= 30000;

방법2) 인라인쿼리


select *
from
(
select ename 사원명, coalesce(sal*12+comm,comm,sal*12,0) 연봉
from emp
) T
where T.연봉 >= 30000; 

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

Quiz ) 급여가 아닌 연봉으로 순위 출력

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

select *
from
(
select ename "사원명",deptno "부서번호",to_char(coalesce(sal*12+comm,comm,sal*12,0),'$999,999') "연봉",
       rank() over(order by coalesce(sal*12+comm,comm,sal*12,0) desc) "전체등수",   --공동랭크 포함 - 공동2등 다음 4등
       rank() over(partition by deptno order by coalesce(sal*12+comm,comm,sal*12,0) desc) "부서별등수",
       dense_rank() over(order by coalesce(sal*12+comm,comm,sal*12,0) desc) 전체서열, --공동랭크 불포함 - 공동2등 다음 4등
       dense_rank() over(partition by deptno order by coalesce(sal*12+comm,comm,sal*12,0) desc) 부서별서열
from EMP
) T
where "전체등수" <=10
order by 2,3 desc;       coalesce(sal*12+comm,comm,sal*12,0)

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

 7장 연습문제

1. 현재 날짜 출력하고 컬럼명은 'Current Date'로 출력하시오


select to_char(sysdate,'yyyy-mm-dd') "Current Date"
from dual;

2. EMP 테이블에서 현재 급여에서 15%증가된 급여를 사원번호, 이름,업무,급여,

  증가된 급여(New Salary), 증가액(Increase)를 출력


select empno,ename,job,sal,round(nvl(sal+sal*0.15,0),0) "인상된 급여",round(nvl(sal*0.15,0),0) "증가액"
from emp;

3. EMP테이블에 이름,입사일,입사일로부터 6개월 후 처음 돌아오는 월요일의 날짜 출력


select ename,hiredate,next_day(add_months(hiredate,6),'monday')
from emp;

4. EMP테이블에서 이름,입사일, 입사일로부터 현재까지의 월수, 총급여, 현재급여 출력

select ename,hiredate,round(months_between(sysdate,hiredate),0) 근무개월수,
       round(months_between(sysdate,hiredate),0)*sal 총월급,
       round(months_between(sysdate,hiredate),0)*(nvl(sal,0)+nvl(comm,0)) 총급여
from emp
order by 5 desc;

5. 다음과 같이 출력하시오.

Dream Salary

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

KING earns   $5,000 monthly but wants   $15,000
SCOTT earns   $3,000 monthly but wants    $9,000
FORD earns   $3,000 monthly but wants    $9,000
JONES earns   $2,975 monthly but wants    $8,925

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

select ename || ' earns' || to_char(sal,'$999,999') || ' monthly but wants ' || to_char(sal*3,'$999,999')
from emp
order by sal desc;

6. EMP테이블에서 모든 사원의 이름과 급여를 출력.

  단, 이름은 15자리로 지정하고, 공백부분은 *로 채워라.


select ename,lpad(to_char(sal,'$9,999'),15,'*')
from emp
order by sal

7. EMP테이블에서 모든 사원의 이름,업무,입사일,입사요일 출력
select ename,job,hiredate,
       case
         when to_char(hiredate,'d') =1 then '일요일'
            when to_char(hiredate,'d')='2' then '월요일'
            when to_char(hiredate,'d')='3' then '화요일'
            when to_char(hiredate,'d')='4' then '수요일'
            when to_char(hiredate,'d')='5' then '목요일'
            when to_char(hiredate,'d')='6' then '금요일'
            when to_char(hiredate,'d')='7' then '토요일'
       end "입사요일"      
from emp;

8. EMP테이블에서 이름이 6글자 이상인 사원의 이름,이름글자수,업무 출력
select ename,length(ename) 이름길이,job
from emp
where length(ename) >= 6
order by ename desc;

9. EMP테이블에서 모든 사원의 정보를 이름,업무,급여,보너스,급여+보너스 출력
select ename,job,sal,nvl(comm,0) 보너스,nvl2(sal+comm,comm,0) "급여+보너스"
from emp
order by 5 desc;

반응형

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

insert 할 때 value값에 & 들어있을 때..  (1) 2008.12.30
문자열 처리 함수(Character Functions)  (0) 2008.12.29
oracle vs ms-sql 함수 비교  (0) 2008.11.24
Oracle 과 Mssql 날짜비교 함수  (0) 2008.11.24
RTRIM  (0) 2008.11.24
Posted by [PineTree]
ORACLE/SQL2008. 11. 24. 10:42
반응형

Math Functions


Function

Oracle

SQL Server

Absolute value

ABS

ABS

Arc cosine

ACOS

ACOS

Arc sine

ASIN

ASIN

Arc tangent of n

ATAN

ATAN

Arc tangent of n and m

ATAN2

ATN2

Smallest integer >= value

CEIL

CEILING

Cosine

COS

COS

Hyperbolic cosine

COSH

COT

Exponential value

EXP

EXP

Round down to nearest integer

FLOOR

FLOOR

Natural logarithm

LN

LOG

Logarithm, any base

LOG(N)

N/A

Logarithm, base 10

LOG(10)

LOG10

Modulus (remainder)

MOD

USE MODULO (%) OPERATOR

Power

POWER

POWER

Random number

N/A

RAND

Round

ROUND

ROUND

Sign of number

SIGN

SIGN

Sine

SIN

SIN

Hyperbolic sine

SINH

N/A

Square root

SQRT

SQRT

Tangent

TAN

TAN

Hyperbolic tangent

TANH

N/A

Truncate

TRUNC

N/A

Highest number in list

GREATEST

N/A

Lowest number in list

LEAST

N/A

Convert number if NULL

NVL

ISNULL

Standard deviation

STDDEV

STDEV

Variance

VARIANCE

VAR

 

 

String Functions

Function

Oracle

SQL Server

Convert character to ASCII

ASCII

ASCII

String concatenate

CONCAT

(expression + expression)

Convert ASCII to character

CHR

CHAR

Return starting point of character in character string (from left)

INSTR

CHARINDEX

Convert characters to lowercase

LOWER

LOWER

Convert characters to uppercase

UPPER

UPPER

Pad left side of character string

LPAD

N/A

Remove leading blank spaces

LTRIM

LTRIM

Remove trailing blank spaces

RTRIM

RTRIM

Starting point of pattern in character string

INSTR

PATINDEX

Repeat character string multiple times

RPAD

REPLICATE

Phonetic representation of character string

SOUNDEX

SOUNDEX

String of repeated spaces

RPAD

SPACE

Character data converted from numeric data

TO_CHAR

STR

Substring

SUBSTR

SUBSTRING

Replace characters

REPLACE

STUFF

Capitalize first letter of each word in string

INITCAP

N/A

Translate character string

TRANSLATE

N/A

Length of character string

LENGTH

DATALENGTH or LEN

Greatest character string in list

GREATEST

N/A

Least character string in list

LEAST

N/A

Convert string if NULL

NVL

ISNULL

 

 

Date Functions

Function

Oracle

SQL Server

Date addition

(use +)

DATEADD

Date subtraction

(use -)

DATEDIFF

Last day of month

LAST_DAY

N/A

Time zone conversion

NEW_TIME

N/A

First weekday after date

NEXT_DAY

N/A

Convert date to string

TO_CHAR

DATENAME

Convert date to number

TO_NUMBER(TO_CHAR())

DATEPART

Convert string to date

TO_DATE

CAST

Get current date and time

SYSDATE


 

반응형

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

문자열 처리 함수(Character Functions)  (0) 2008.12.29
단일 행 함수  (0) 2008.11.24
Oracle 과 Mssql 날짜비교 함수  (0) 2008.11.24
RTRIM  (0) 2008.11.24
Oracle 날짜 관련 함수  (0) 2008.10.29
Posted by [PineTree]
ORACLE/SQL2008. 11. 24. 10:41
반응형
Oracle 과 Mssql 날짜비교 함수
 
 
CREATE TABLE TEMP_DATE
( ID   INT,
 INDATE DATETIME )
INSERT INTO  TEMP_DATE (ID, INDATE )
SELECT '1', SYSDATE  FROM  OPENQUERY(ORACLE_LINK,'SELECT SYSDATE FROM DUAL')
SELECT  *   FROM TEMP_DATE

          날짜   08 22 2006 의 형식을  2006-08-22 00:00:00 으로 변경하기
         SELECT @t_PLAN_STARTDATE = CAST(@Plan_StartDate    AS DATETIME  )
        SELECT @t_PLAN_ENDDATE = CAST(@Plan_EndDate    AS DATETIME  )


### DBMS에 따른 날짜포맷 변환 ###
Oracle - MS SQL - DB2 UDB 의 서로 다른 날짜 형식을 맞추기위한 SQL문
--------------------------------------------------------------------------------
DBMS 별 시간, 날짜 조회 쿼리
--------------------------------------------------------------------------------
1. Oracle
- 날짜+시분초 까지 조회가능
select sysdate from dual;
- 날짜+밀리초+시간존 까지 조회
select current_timestamp from dual;
 
2. MS SQL
- 날짜 + 밀리초 단위까지 조회가능
select getdate();
 
3. DB2 UDB
- 날짜+밀리초까지 조회 가능
select current timestamp from sysibm.sysdummy1;
- 날짜만 조회
select current date from sysibm.sysdummy1;
- 밀리초 단위의 시간만 조회
select current time from sysibm.sysdummy1;
 
--------------------------------------------------------------------------------
DBMS 별 default date format
--------------------------------------------------------------------------------
1. Oracle
한글 : YYYY/MM/DD                       영어 : DD-MON-YYYY
 
2. MS SQL
한글 :  YYYY/MM/DD HH:MI:SS      영어 : MM-DD-YYYY HH:MI:SS
 
3. DB2 UDB
TIMESTAMP 타입 : YYYY-MM-DD-HH:MI:SS.MMMMMM
DATE 타입 : YYYY-MM-DD
TIME 타입 : HH:MI:SS.MMMMMM
 
--------------------------------------------------------------------------------
날짜 포맷 변환
--------------------------------------------------------------------------------
[ 형식 : 'YYYY.MM.DD' ]
1. Oracle : TO_CHAR(date_exp, 'YYYY.MM.DD')
2. MSSQL : CONVERT(VARCHAR, date_exp, 102)
3. DB2 : REPLACE(CHAR(DATE(date_exp),ISO), '-', '.')
 
[ 형식 : 'HH:MI:SS' ]
1. Oracle : TO_CHAR(date_exp, 'HH:MI:SS')
2. MSSQL : CONVERT(VARCHAR, date_exp, 108)
3. DB2 : CHAR(TIME(date_exp) , JIS )
 
[ 형식 : 'YYYY/MM/DD' ]
1. Oracle : TO_CHAR(date_exp, 'YYYY/MM/DD')
2. MSSQL : CONVERT(VARCHAR, date_exp, 111)
3. DB2 : REPLACE(CHAR(DATE(date_exp), ISO), '-', '/')
[ 형식 : 'YYYYMMDD' ]
1. Oracle : TO_CHAR(date_exp, 'YYYYMMDD')
2. MSSQL : CONVERT(VARCHAR, date_exp, 112)
3. DB2 : CHAR(DATE(date_exp))
[ 형식 : 'HH24:MI:SS' ]
1. Oracle : TO_CHAR(date_exp, 'HH24:MI:SS')
2. MSSQL : CONVERT(VARCHAR(8), date_exp, 114)
3. DB2 : CHAR(TIME(date_exp))
[ 형식 : 'YYYY.MM.DD HH24:MI' ]
1. Oracle : TO_CHAR(date_exp, 'YYYY.MM.DD HH24:MI')
2. MSSQL : CONVERT(VARCHAR, date_exp, 102) + ' ' + CONVERT(VARCHAR(5), date_exp, 114)
3. DB2 : REPLACE(CHAR(DATE(date_exp), ISO), '-', '.') || CAST( TIME(date_exp) AS CHAR(5))
[ 형식 : 'YYYY/MM/DD HH24:MI:SS' ]
1. Oracle : TO_CHAR(date_exp, 'YYYY/MM/DD HH24:MI:SS')
2. MSSQL : CONVERT(VARCHAR, date_exp, 111) + ' ' + CONVERT(VARCHAR(8), date_exp, 114)
3. DB2 : REPLACE(CHAR(DATE(date_exp), ISO), '-', '/') || CAST( TIME(date_exp))
반응형

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

단일 행 함수  (0) 2008.11.24
oracle vs ms-sql 함수 비교  (0) 2008.11.24
RTRIM  (0) 2008.11.24
Oracle 날짜 관련 함수  (0) 2008.10.29
Oracle 날짜형 데이터의 연산  (0) 2008.06.17
Posted by [PineTree]
ORACLE/SQL2008. 11. 24. 10:30
반응형

RTRIM


  분류

  Single-Row Functions > Character Functions Returning Character Values

  * 함수의 분류와 모든 목록에 관해서는 아래 페이지를 참고하세요.
  - http://www.soqool.com/servlet/board?cmd=view&cat=100&subcat=1030&seq=1

  * 분석함수에 관해서는 아래 페이지를 참고하세요.
  - http://www.soqool.com/servlet/board?cmd=view&cat=100&subcat=1030&seq=2


  적용 가능 version

  8i 이상
  * 8i 와 이후 버전만을 표시합니다.


  문법

  

  * 위의 Syntax Diagram을 읽는 방법은 아래 페이지를 참고하세요.
  - http://www.soqool.com/servlet/board?cmd=view&cat=100&subcat=1020&seq=8


  함수설명

  RTRIM 함수는 첫번째 파라미터로 주어지는 문자열의 오른쪽부분에서 두번째 파라미터로 주어지는 문자열에 속한 모든 문자들을 제거한다.
  즉, 첫번째 문자열을 오른쪽에서부터 왼쪽으로 검색시, 두번째 문자열에 포함되지 않은 문자가 처음으로 나타날 때까지 문자를 제거한다.
  두번째 파라미터를 생략하면 문자열 오른쪽에서 공백(' ')을 모두 제거한다.
  
  

  관련자료

  LTRIM 함수
  TRIM 함수


  예제

  SELECT RTRIM ('SoQooL@@##@#', '#@') rtrim1
       , RTRIM ('   SoQooL         ') rtrim2
    FROM DUAL



  RTRIM1 RTRIM2  
  ------ ---------
  SoQooL    SoQooL



  



  References

  1. Oracle Database SQL Reference 10g Release 2 (10.2) Part Number B14200-02
  - http://download-west.oracle.com/docs/cd/B19306_01/server.102/b14200/functions141.htm

 

  2. 출처

  - http://www.soqool.com/servlet/board?cmd=view&cat=100&subcat=1030&seq=448&page=1&position=1

반응형

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

oracle vs ms-sql 함수 비교  (0) 2008.11.24
Oracle 과 Mssql 날짜비교 함수  (0) 2008.11.24
Oracle 날짜 관련 함수  (0) 2008.10.29
Oracle 날짜형 데이터의 연산  (0) 2008.06.17
PL/SQL  (0) 2008.02.22
Posted by [PineTree]
ORACLE/ADMIN2008. 11. 21. 13:20
반응형

 
배경
 
1. 하드웨어 장애로 인해 신규 시스템 구입
2. DB가 저장되어 있는 하드디스크는 건재
3. 10.2.0.1은 Windows XP버젼 10.2.0.3은 Windows Vista 버젼
 
물리설계의 변경
 
1. 이전버젼은 오라클 프로덕트, 백업영역이 데이타파일과 동일한 디스크에 저장
2. 신규버젼은 오라클 프로덕트, 백업영역을 데이타파일과 다른 디스크에 저장
 
순서
 
1. 오라클 인스톨
    인스톨 드라이브 : C 드라이브
 
2. 환경변수 설정
 ORACLE_BASE=C:\Oracle
 ORACLE_HOME=C:\oracle\product\10.2.0\db_1\
 ORA_NLS=C:\oracle\product\10.2.0\db_1\/nls
 TNS_ADMIN=C:\oracle\product\10.2.0\db_1\\network\admin
 ORACLE_SID=OSITDB99
 NLS_DATE_FORMAT=YYYY/MM/DD HH24:MI:SS
 NLS_LANG=JAPANESE_JAPAN.JA16SJIS
 
3. 화일카피 (이전시스템의 디스크에서 신규시스템의 디스크로)
F:\u01\oradata\OSITDB99
F:\u02\oradata\OSITDB99
C:\oracle\admin
C:\oracle\flash_recover_area
4. init.ora화일 편집
F:\oracle\admin\OSITDB99\adump → C:\oracle\admin\OSITDB99\adump
F:\oracle\admin\OSITDB99\bdump → C:\oracle\admin\OSITDB99\bdump
F:\oracle\admin\OSITDB99\cdump → C:\oracle\admin\OSITDB99\cdump
F:\oracle\admin\OSITDB99\udump → C:\oracle\admin\OSITDB99\udump
 
5. 서비스 등록
OracleServiceOSITDB99
6. DB리커버리
불완전리커버리실시 (완전리커버리용 백업파일이 존재하지 않았기 때문)
7. alter database open upgrade
버젼이 upgrade되었기 때문에 alter database open으로는 DB오픈 실패
8. catupgrd.sql
$ORACLE_HOME/rdbms/admin 에 있는 catupgrd.sql실행
 
주의점
1. 버젼이 다르기 때문에 데이타파일을 그대로 카피해도 데이타베이스 기동이 안됨
   (OS에 의한 백업과 동일한 결과였지만 버젼이 문제)
2. cataupgrd.sql을 실행시키지 않으면 정상적인 DB조작이 안됨
반응형

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

oracle유저 이외의 유저가 sqlplus등을 사용하는 방법  (0) 2008.11.27
DBNAME, SID 변경하기.  (0) 2008.11.26
[Oracle] Datafile Size 변경하기  (0) 2008.11.19
sqlplus 사용법 (ORACLE)  (0) 2008.11.04
Oracle Data Dictionary Views  (0) 2008.09.12
Posted by [PineTree]
ORACLE/ADMIN2008. 11. 19. 14:12
반응형
1. 기존의 datafile을 resize하여 늘리는 경우.

datafile size를 증가하는 경우는 disk에 free space만 있다면 다음과 같이 간단합니다.
다음과 같이 늘리면 되나 줄일 경우는 계산을 하여 줄여야 합니다.

SQL>alter database datafile   '/oracle/dbs/toolsORA.dbf' resize 100M;

2. 기존의 datafile을 줄이는 경우.

만일 지정한 size만큼 data가 있다면 error가 발생되고 resize되지 않습니다.
SQL> alter database datafile   '/oracle/dbs/toolsORA.dbf' resize 100M;
alter database datafile   '/oracle/dbs/toolsORA.dbf' resize 100M'
*
ERROR at line 1:
ORA-03297: file contains used data beyond requested RESIZE value

[방법 1]
1) 줄이고자하는 file id를 확인합니다.
SVRMGR> select file_id, file_name from dba_data_files;

2) 얼마를 사용했는지 확인합니다.
SVRMGR> select block_id, blocks from dba_extents
     2> where file_id='FILE_ID' order by block_id;
     FILE_ID 대신에 줄이려는 file id를 기술합니다.

3)현재 사용중인 db block size를 확인합니다.
SVRMGR> show parameter db_block_size

만일 2048일 경우 다음과 같이 계산합니다.

2)에서 조회된 마지막의 block_id, blocks 값을 가지고 계산합니다.
block_id * 2048 + blocks * 2048 의 결과에 한 block더한 값만큼만 줄이는
것이 가능합니다.
만일 마지막으로 조회된 값이 block_id가 578261, blocks가 515일 경우
578261*2048 + 515*2048 =1185333248로 최소한 1.2GB이상은 써야 합니다.

4) 실제 datafile을 줄입니다.
svrmgr>alter database datafile   '/oracle/dbs/toolsORA.dbf' resize
1200M;

[방법 2]
1) 기존의 data export
exp username/password file=filename owner=username log=username.log

2) tablespace drop
svrmgr>drop tablespace tbs including contents;
rm datafile

tbs대신에 작게 만드시려는 tablespace name을 기술합니다.
datafile대신에 tablespace와 연계된 모든 datafile을 remove합니다.

3) tablespace재생성
svrmgr>create tablespace tbs
             datafile '...' size 100M;
원하시는 size로 줄입니다.

4) data import
imp username/password file=filename fromuser=username touser=username
commit=y log=imp.log


[자료출처 :
www.oracle.co.kr]

반응형
Posted by [PineTree]
ORACLE/ORACLE TOOL2008. 11. 11. 17:30
반응형

SQL Developer

문서화와 모니터링, 그리고 관리

 

Oracle SQL Developer 1.5의 새로운 기능 활용하기

 

Oracle SQL Developer 1.5에서는다양한기능들이새롭게선보였다. 처 음에는사소한것처럼보이는기능조차도사용자들의일상적인작업에상 당히유용한도움을줄수있다. 본기사에서는Oracle Database의객체와 스키마를 문서화하고 관리할 수 있도록 돕는 Oracle SQL Developer 1.5 기능에대해다루고있다. 여기에서는다음을배울수있다.

 

•프로젝트 내 다른 참가자와 손쉽게 객체 세부 사항 공유

•인스턴트 보고서를 이용하여 데이터베이스 세션 및 테이블스페이 스에 대한 상세 내역을 입수하고 세션을 종료하며 데이터베이스를 닫을 수 있음

•복사및내보내기유틸리티를활용하여손쉽게여러스키마와연동 할 수 있음

 

본 기사의 예제는 Oracle SQL Developer 1.5.1을 필요로 한다. Oracle SQL Developer 1.5의 프로덕션 릴리스를 설치했다면, 이를 열고 Help - > Check For Updates를이용하여Oracle SQL Developer 1.5.1로업데 이트한다. 아니면OTN에서 전체 Oracle SQL Developer 1.5.1 설치를 다운로드하여 새로운 빈 폴더로 압축을 해제한다(기존 Oracle SQL Developer 폴더에서압축을해제하면안된다).

 

설치가진행되는동안Oracle SQL Developer 1.2.x 또는1.5에서Oracle SQL Developer 1.5.1로 데이터베이스 커넥션 및 환경 설정을 마이그레 이션할수있다. 환경설정을마이그레이션하기를원치않는경우, 설치이 후 모든 이전 릴리스에서 데이터베이스 커넥션을 가져올 수 있다. 커넥션 을가져오려면,

 

1. Oracle SQL Developer의 이전 릴리스를 시작한다.

2. Connections Navigator에서 Connections을 선택한다.

3. 오른쪽 마우스 버튼을 클릭하고 Export Connections을 선택한다.

4. 적절한 위치로 브라우저하고 connections.xml과 같은 파일명을 입력한 다음, Save를 클릭 한다.

5. 이전 릴리스를 닫고 Oracle SQL Developer 1.5.1을 시작한다.

6. Connections Navigator에서 Connections을 선택한다.

7. 오른쪽 마우스 버튼을 클릭하고 Import Connections을 선택한다

8. 파일로 브라우저하고 Open을 클릭한 다음, OK를 클릭한다.

 

본 기사에서는 Oracle Database 인스턴스 내HR 및OE 예제 스키마에 액세스해야한다.

 

데이터베이스 문서 작성하기

 

여러분은 자신만의 리뷰 또는 다른 사람과의 공유를 위해HTML 포맷으 로스키마에대한문서를작성할수있다. 다음과같은단계에따라스키마 문서를작성하고볼수있다.

 

1. 현재 HR 스키마에 대한 커넥션이 없다면, 하나를 만들어 HR_ORCL라고 명명한다(커넥션을 만드는 데 대한 상세 정보는“http://www.oracle.com/technology/oramag/oracle/08 -sep/o58sql.html#next#next”에서 확인할 수 있으며“, http://www.oracle.com/technology /oramag/oracle/08-may/o38sql.html”에서도 설명하고 있다).

2. HR_ORCL 커넥션을 오른쪽 마우스 버튼을 누르고 Generate DB Doc를 선택한다.

3. 만들어진 파일을 위해 적당한 위치를 선택하거나 \working과 같은 폴더를 만든다. 만들어 진 파일을 다른 사람들과 공유할 계획이라면 공유 파일 서버 위치를 이용한다(이 파일을 이 동하거나 복사할 수 있다).

 

기본브라우저에index.html 파일이자동으로열리게된다. 자동으로열리 지않으면브라우저에서\working\index.html 파일을탐색해이를연다. HTML 문서내모든데이터베이스객체에대한상세내역을보려면, 상단 좌측에있는스키마패널의객체유형을선택한다. 그러면, 해당유형의모 든 객체 목록이 스키마 패널 아래의 패널에 나타난다. 여기에서 객체를 선 택해해당상세내역을중앙패널에표시한다. 예를들어EMPLOYEES 테 이블의 상세 내역을 디스플레이하고, 최상위 패널에서 Tables와그아래 패널의

EMPLOYEES를선택한다(<그림1> 참조).

 

 

보고서를 이용한 모니터링 및 관리

 

Oracle SQL Developer’s View -> Reports 기능으로 여러 표준 시스템 보고서를선택하여데이터베이스및스키마의상세내역을볼수있다. 또한 손쉽게액세스할수있도록Tools 메뉴와Connections Navigator에서각 각2개의보고서가제공된다. 이들모두SYSTEM 또는SYS와같은권한이 높은(privileged users) 사용자에게 적합하다(일부 제약 조건을 가진HR 와같은권한이낮은-nonprivileged user-사용자로서도실행할수있음). Sessions 보고서는현재의활성및비활성세션에대한상세내역을보여준 다. 다음과같은단계에따라Sessions 보고서를표시할수있다.

 

1. SYSTEM 사용자를 위해 SYSTEM_ORCL라는 새로운 커넥션을 만든다.

2. Tools -> Monitor Sessions을 선택한다.

3. Select Connection 대화 상자에서 SYSTEM_ORCL를 선택하고 OK를 클릭하여 보고서를 연다.

 

예를 들어 사용자의 세션이 분명하게 닫히지 않은 경우, 권한이 높은 사용 자는Sessions 보고서에서세션을종료할수있다(기본HR 스키마는세션 을 종료할 수 없다). 만약 실습을 진행하는 동안, HR 커넥션이 계속 활성 상태를유지하면, 금방만든Sessions 보고서내에서HR 세션을선택하여 오른쪽 마우스 버튼을 누르고 Kill Session을 선택한 다음, Apply를클릭 한다.

 

이 레벨에서 이용할 수 있는 다른 보고서는 Manage Database 보고서다. Connections Navigator 내SYSTEM_ORCL connection을 오른쪽 마 우스버튼으로누리고Manage Database를선택한다. 이보고서는여러분 의데이터베이스테이블스페이스에대한상세내역을표시한다. 이보고서를 SYS connection에서 실행하면, Oracle SQL Developer 내에서 데이 터베이스를닫고재시작할수있다(Shutdown 버튼은권한이낮은사용자 들이이용할수없다).

 

객체를 새 스키마로 복사하기

 

여러 스키마를 함께 실행하는 경우 종종 여러 스키마 간에 객체와 그 데이 터를 복제하는 작업이 이루어지게 된다. Oracle SQL Developer 내에서 이를 수행할 수 있는 많은 방법이 있으며 대표적으로 다음과 같은 방법을 들수있다.

 

•먼저 DDL(Data Definition Language)를 만들고 실행하여 테이블 을 생성한 다음, 일련의 insert 문을 실행하여 새로운 데이터를 입 력하는 방식으로 차례로 객체를 복사한다.

•Tools -> Copy를 이용하여 그 데이터를 포함한 테이블의 복사본을 만든다.

•Tools -> Database Copy를 이용하여 데이터베이스의 복사본을 만든다.

•Database Export 마법사를 이용하여 여러 테이블과 기타 데이터 베이스 객체를 위한 DDL과 insert 문을 만든다.

 

다음 예제에서는4가지 메소드를 각각 이용하여 그 강점과 한계를 비교할 것이다.

 

1. 해당 스키마를 위해 OE_ORCL라는 이름의 새로운 데이터베이스 커넥션을 만든다.

2. OE_ORCL 커넥션을 선택하고 Tables 노드를 확장한다.

3. CATEGORIES 테이블을 오른쪽 마우스 버튼으로 누르고 Export DDL -> Save to Worksheet를 선택한다(<그림 2> 참조).

 

 

SQL Worksheet에나타난SQL은OE 스키마이름을포함하고있기때문 에 새로운 스키마 내에서 실행하는 데 적합하지 않다(이 SQL 구문은 DBMS_METADATA 패키지를이용하여수집되며일련의환경설정에 따라실행된다). OE 스키마이름없이SQL을생성하려면, 다음과같은단 계를따른다.

 

1. Tools -> Preferences를 선택하고 트리 내에서 Database 노드를 확장한 다음 ObjectViewer Parameters를 선택한다.

2. Show Storage 및 Show Schema 옵션의 확인란을 지우고 Show Constraints as Alter의 확인란을 선택한다.

3. OK를 클릭한다.

4. SQL Worksheet를 비우고 이전 단계를 반복한다: CATEGORIES 테이블을 오른쪽 버튼으 로 누르고 Export DDL -> Save to Worksheet를 선택한다. SQL Worksheet 내 SQL 코드 에는 더 이상 OE prefix가 포함되어 있지 않다.

 

이제 다음과 같은 단계를 거쳐 CATEGORIES 테이블과 그 데이터를 HR_ORCL 스키마로복사한다.

 

1. SQL Worksheet Connections 목록 내 HR_ORCL 커넥션을 선택하고 Run Script를 클릭 (또는 F5 누르기)하여 HR 스키마 내에 표시된 DDL이 실행되도록 한다.

2. HR_ORCL 노드를 확장하고 새로운 CATEGORIES 테이블을 검토한다. 여기에는 그 어떤 데 이터도 포함되지 않는 점을 유념해야 한다.

3. Connections Navigator에서 OE_ORCL 커넥션의 CATEGORIES 테이블을 오른쪽 마우스 버튼으로 누르고 Export Data -> Insert를 선택한다.

4. Export Data 대화 상자에서 클립보드로 출력물을 전송하고 Apply를 클릭한다.

5. HR_ORCL 사용자를 위해 새 SQL Worksheet를 열고 Ctrl-V를 눌러 클립보드의 내용을 붙 여 넣는다.

6. Run Script를 클릭(또는 F5 누름)하고 SQL을 실행한다.

7. Commit 버튼을 클릭(또는 F11 누름)하고 HR_ORCL 커넥션 내 CATEGORIES 테이블 데이 터를 검토한다.

 

앞의단계는1개의테이블과그데이터만을복사하기위한것이다. 1개객체 와그데이터를복사하는보다빠른방법은Copy context-menu 명령이다.

 

1. OE_ORCL 커넥션의 INVENTORIES 테이블을 오른쪽 마우스 버튼으로 누르고 Table -> Copy를 선택한다.

2. Copy 대화 상자에서 HR을 새 테이블 소유자로 선택하고 New Table Name에 INVENTORIES 를 입력한 다음 Include Data의 확인란을 선택한다.

3. Apply를 클릭한다.

4. 새 INVENTORIES 테이블을 보려면 HR_ORCL 커넥션의 Tables 노드의 새로 고침을 실행 한다.

 

여러테이블과그데이터를위한DDL 코드를만드려면Database Export마법사를이용해야한다. OE 스키마에서HR 스키마로하나의테이블집 합을복사하려면다음과같은단계를따른다.

 

1. Tools -> Database Export를 선택한다. 적절한 파일 위치에 브라우징하고 기본 파일명을 그대로 둔 다음, export.sql을 내보낸다(Tools -> Preferences를 선택하고 트리 내 Database 노드를 선택한 다음, 환경 설정 내에 익스포트를 저장하는 Select 기본 경로를 설정하는 방식으로 이 파일을 위한 기본 경로를 선택할 수도 있다).

2. Export Wizard에서 OE_ORCL 커넥션을 선택하고 Storage Schema 및 Show Schema 옵 션의 확인란을 지우도록 한다. Include Drop Statement and Automatically Include Dependent Objects의 확인란을 선택한다. Next를 클릭한다.

3. Types to Export 화면에서Toggle All의 확인란을 지우고 Tables and Data의 확인란을 선 택한다. Next를 클릭한다.

4. Specify Objects 화면의 OE 목록에서 Go를 클릭하여 선택할 테이블의 목록(list of tables to select)을 채운다. OE.ORDER_ITEMS 테이블만 우측 패널로 보낸다. Next를 클릭한다.

5. Specify Data 화면에서Go를 클릭하여 테이블의 목록을 채운다. OE.ORDER_ITEMS 테이 블만 우측 패널로 보내고 이를 선택해 해당 테이블을 하이라이트 한다. 다음의 빈 상자에, order_id < 2355을 입력하고 Apply Filter를 클릭한다(<그림 3> 참조). Next, 그 다음 Finish 를 클릭한다.

 

 

이제SQL Worksheet에나타난export.sql 스크립트는추가테이블을포 함하고 있다. 이는 여기에서 만들어지지 않은 제약 조건이 이들 테이블에 종속되기때문이다. 또한, 제한된데이터집합이반환된다.

SQL Worksheet의 커넥션 목록에서HR_ORCL을 선택하고 스크립트 를 실행한다. 변경을 커밋한 다음, Database Export 마법사가OE_ORCL 스키마에서 복사한 테이블을 보려면HR_ORCL 노드의 새로 고침을 실 행한다.

 

마지막으로 Oracle SQL Developer 내Database Copy를 이용하는 것은 객체를다른스키마로복사하는데매우효과적인방법이다. insert 문의스 크립트를작성하는대신, Database Copy가백그라운드의새테이블로데 이터를입력한다. Database Copy는또한, BLOBs와CLOBs를새스키마 로복사한다.

 

이비교실습을완료하려면, Database Copy를이용하여하나의객체집합 을HR 스키마로복사한다.

 

1. Tools -> Database Copy를 선택한다. OE_ORCL for Source Connection 및 HR_ORCL for Destination Connection를 선택한다. 여러분이 여기에서 선택할 수 있는 것은 새 객체 를 생성하고 기존 객체 내 데이터를 삭제(truncate)하여 새 데이터로 대체될 수 있도록 하 거나 객체를 드롭(및 대체)하는 것뿐이다.

2. Truncate Objects를 선택하고 Next를 클릭한다. Copy Summary는 모든 테이블이 삭제될 것이라는 것을 표시한다. 이는 여러분이 원하는 것이 아니기 때문에 Back을 클릭하고 Create Objects를 선택한 다음, Next를 클릭한다. 이를 통해 기존 객체가 드롭되거나 삭제 되지 않도록 보장하게 된다.

3. Finish를 클릭한다.

4. HR_ORCL 커넥션 내에 생성된 테이블과 데이터를 검토한다.

 

Database Export와 Database Copy는 2가지 점에서 큰 차이가 있다. Database Export는내보낼객체유형을선택할수있도록하며각카테고 리 내에서 개별 객체를 제한한다. 또한, Database Export를 이용하면 GRANT 문을 생성하고DROP 문을 포함하며INSERT 문을 생성하도 록결정할수있기때문에새로운또는기존스키마를위해반환할수있는 스크립트를원하는대로생성할수있는능력을갖게된다.

 

결론

 

본 기사에서는 Oracle SQL Developer 1.5에서 소개된 일부 기능을 검토 하고있다. 여러분은데이터베이스상세내역을공유하고세션을모니터링 및관리하며여러스키마간에데이터베스객체를복사하는새로운방법으 로생산성을높일수있다.

 

 

필자소개

 

Sue Harper는 오라클의 선임 제품 매니저(senior principal product manager)로서 런던에 거주하고 있다.그의 테크니컬 블로그, sueharper.blogspot.com에서는 Oracle SQL Developer 기능 및 특징에 대해 다루고 있다.

 

 

출처 : 한국 오라클

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

반응형
Posted by [PineTree]
ORACLE/TUNING2008. 11. 11. 10:50
반응형

Transaction internals

 

 

목차

  • 1 Redo Layer
    • 1.1 Database Block Address (DBA)
    • 1.2 Appendix of Redo Layer
  • 2 Undo Layer
    • 2.1 Appendix of Undo Layer
  • 3 Enqueue Layer
    • 3.1 Appendix of Enqueue Layer
  • 4 Block Layer
    • 4.1 Appendix of Block Layer
  • 5 PGA Layer
    • 5.1 Appendix of PGA Layer

Redo Layer

Database Block Address (DBA)

오라클에서 제공하는 DBMS_UTILITY 패키지를 이용하여 16진수로 표시되는 DBA를 손쉽게 상대 파일 번호와 블록 번호를 확인하는 방법

SQL> set serveroutput on
DECLARE
l_dba NUMBER := TO_NUMBER ('00C00012','XXXXXXXX');
l_file NUMBER := DBMS_UTILITY.DATA_BLOCK_ADDRESS_FILE (l_dba);
l_block NUMBER := DBMS_UTILITY.DATA_BLOCK_ADDRESS_BLOCK (l_dba);
BEGIN
DBMS_OUTPUT.PUT_LINE ('File : '||l_file);
DBMS_OUTPUT.PUT_LINE ('Block : '||l_block);
END;

Appendix of Redo Layer

1.check_redo_scn.sql

col member for a40
set linesize 140
select a.first_change#, a.status, b.member
from v$log a, v$logfile b
where a.group#=b.group#
/

2.dba2_fb.sql

set serveroutput on
DECLARE
l_dba NUMBER := TO_NUMBER ('&dba','XXXXXXXX');
l_file NUMBER := DBMS_UTILITY. DATA_BLOCK_ADDRESS_FILE (l_dba);
l_block NUMBER := DBMS_UTILITY.DATA_BLOCK_ADDRESS_BLOCK (l_dba);
BEGIN
DBMS_OUTPUT.PUT_LINE ('File : '||l_file);
DBMS_OUTPUT.PUT_LINE ('Block : '||l_block);
END;
/

3.param.sql (SYS User로 수행)

set pages 0
set heading off
set linesize 120
col name for a40
col value for a60
SELECT ksppinm as name,
ksppstvl as value
FROM sys.x$ksppi x , sys.x$ksppcv y
WHERE ( x.indx = y.indx )
AND ksppinm like '%&1%'
order by ksppinm
/

4.check_flush.sql


select name, value
from v$sysstat
where name in ('IMU Flushes','IMU commits','redo size','IMU undo allocation size', 'user commits')
order by name
/

Undo Layer

Appendix of Undo Layer

1) rowid2fb.sql


var v_rowid_type number;
var v_object_number number;
var v_relative_fno number;
var v_block_number number;
var v_row_number number;
set serveroutput on
exec dbms_rowid.rowid_info
('&1', :v_rowid_type, :v_object_number, :v_relative_fno, :v_block_number,:v_row_number);
/

2) print.sql

print v_relative_fno
print v_block_number
/

3) chk_undostat.sql

set linesize 140
select to_char(a.begin_time,'HH24:MI:SS') begin,
to_char(a.end_time, 'HH24:MI:SS') end,
a.maxquerylen max_q_len,
a.maxqueryid max_q_id,
a.tuned_undoretention tuned_ur,
substr(b.sql_text,1,15) sql_text
from v$undostat a, v$sql b
where a.maxqueryid=b.sql_id(+)
and rownum<=4
/

Enqueue Layer

Appendix of Enqueue Layer

1) v$lock 뷰 정의

-------------------------------------------------------
-- GV$LOCK 정의
-------------------------------------------------------
SELECT s.inst_id ,
l.laddr "ADDR",
l.kaddr "KADDR",
s.ksusenum "SID",
r.ksqrsidt "TYPE",
r.ksqrsid1 "ID1",
r.ksqrsid2 "ID2",
l.lmode "LMODE",
l.request "REQUEST",
l.ctime , "CTIME",
decode( l.lmode , 0 , 0 , l.block ) "BLOCK"
FROM v$_lock l ,
x$ksuse s ,
x$ksqrs r
WHERE l.saddr=s.addr
AND l.raddr=r.addr

 

-------------------------------------------------------
-- GV$_LOCK 정의
-------------------------------------------------------
SELECT USERENV( 'Instance' ) ,
laddr ,
kaddr ,
saddr ,
raddr ,
lmode ,
request ,
ctime ,
BLOCK
FROM v$_lock1
UNION ALL
SELECT inst_id ,
addr ,
ksqlkadr ,
ksqlkses ,
ksqlkres ,
ksqlkmod ,
ksqlkreq ,
ksqlkctim ,
ksqlklblk
FROM x$ktadm
WHERE bitand( kssobflg , 1 ) !=0
AND ( ksqlkmod!=0 OR ksqlkreq!=0 )
UNION ALL
SELECT inst_id ,
addr ,
ksqlkadr ,
ksqlkses ,
ksqlkres ,
ksqlkmod ,
ksqlkreq ,
ksqlkctim ,
ksqlklblk
FROM x$ktatrfil
WHERE bitand( kssobflg , 1 ) !=0
AND ( ksqlkmod!=0 OR ksqlkreq!=0 )
UNION ALL
SELECT inst_id ,
addr ,
ksqlkadr ,
ksqlkses ,
ksqlkres ,
ksqlkmod ,
ksqlkreq ,
ksqlkctim ,
ksqlklblk
FROM x$ktatrfsl
WHERE bitand( kssobflg , 1 ) !=0
AND ( ksqlkmod!=0 OR ksqlkreq!=0 )
UNION ALL
SELECT inst_id ,
addr ,
ksqlkadr ,
ksqlkses ,
ksqlkres ,
ksqlkmod ,
ksqlkreq ,
ksqlkctim ,
ksqlklblk
FROM x$ktatl
WHERE bitand( kssobflg , 1 ) !=0
AND ( ksqlkmod!=0 OR ksqlkreq!=0 )
UNION ALL
SELECT inst_id ,
addr ,
ksqlkadr ,
ksqlkses ,
ksqlkres ,
ksqlkmod ,
ksqlkreq ,
ksqlkctim ,
ksqlklblk
FROM x$ktstusc
WHERE bitand( kssobflg , 1 ) !=0
AND ( ksqlkmod!=0 OR ksqlkreq!=0 )
UNION ALL
SELECT inst_id ,
addr ,
ksqlkadr ,
ksqlkses ,
ksqlkres ,
ksqlkmod ,
ksqlkreq ,
ksqlkctim ,
ksqlklblk
FROM x$ktstuss
WHERE bitand( kssobflg , 1 ) !=0
AND ( ksqlkmod!=0 OR ksqlkreq!=0 )
UNION ALL
SELECT inst_id ,
addr ,
ksqlkadr ,
ksqlkses ,
ksqlkres ,
ksqlkmod ,
ksqlkreq ,
ksqlkctim ,
ksqlklblk
FROM x$ktstusg
WHERE bitand( kssobflg , 1 ) !=0
AND ( ksqlkmod!=0 OR ksqlkreq!=0 )
UNION ALL
SELECT inst_id ,
ktcxbxba ,
ktcxblkp ,
ksqlkses ,
ksqlkres ,
ksqlkmod ,
ksqlkreq ,
ksqlkctim ,
ksqlklblk
FROM x$ktcxb
WHERE bitand( ksspaflg , 1 ) !=0
AND ( ksqlkmod!=0 OR ksqlkreq!=0 )

2) chk_lock.sql

select a.sid, b.object_name, a.type, a.id1, a.id2, a.lmode, a.request, a.block
from v$lock a, dba_objects b
where a.sid in (&sid.....)
and a.type='TM'
and a.id1=b.object_id(+)
order by sid
/

 

Block Layer

Appendix of Block Layer

1) dba2fb.sql

set feedback off
set serveroutput on
DECLARE
l_dba NUMBER := TO_NUMBER ('&dba','XXXXXXXX');
l_file NUMBER := DBMS_UTILITY.DATA_BLOCK_ADDRESS_FILE (l_dba);
l_block NUMBER := DBMS_UTILITY.DATA_BLOCK_ADDRESS_BLOCK (l_dba);
BEGIN
DBMS_OUTPUT.PUT_LINE ('alter system dump datafile '||l_file||' block '||l_block||';');
END;
/
set feedback on

2) hex2chr.sql

select chr(to_number('&1', 'XXXXXXXX')) from dual;

PGA Layer

Appendix of PGA Layer

1. getworarea.sql script


col sql format a13
col est_opt_sz heading "est|opt_sz" format 999.9
col est_one_sz heading "est|one_sz" format 999.9
col last_mem_used heading "last|mem_used" format 999.9
col total_exe heading "total|exe" format 999
col opt_exe heading "opt|exe" format 999
col onepass_exe heading "onepass|exe" format 999
col multipass_exe heading "multipass|exe" format 999
col active_time heading "active|time" format 999.9
col last_tmp_sz heading "last|tmp_sz" format 999
SELECT
--SUBSTR( sql_text , 57 , 11 ) AS SQL , -- for sort test
SUBSTR( sql_text , 103 , 10 ) AS SQL, -- for hash test
ROUND( estimated_optimal_size/1024/1024 , 1 ) AS est_opt_sz ,
ROUND( estimated_onepass_size/1024/1024 , 1 ) AS est_one_sz ,
ROUND( last_memory_used/1024/1024 , 1 ) AS last_mem_used ,
optimal_executions AS opt_exe,
onepass_executions AS onepass_exe,
multipasses_executions AS multipass_exe,
ROUND( active_time/1000000 , 1) AS active_time,
ROUND( last_tempseg_size/1024/1024 , 1 ) AS last_tmp_sz
FROM v$sql_workarea swa ,
v$sql sq
WHERE swa.address = sq.address
AND swa.hash_value = sq.hash_value
AND sql_text LIKE 'select count(*) from (select %'
order by 4,1
/

 

 

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

반응형
Posted by [PineTree]