'02.Oracle/DataBase'에 해당되는 글 232건

  1. 2018.06.19 mariadb 달력 테이블 만들기
  2. 2015.05.22 [펌] DBMS_STATS.GATHER_SYSTEM_STATS
  3. 2015.05.22 테이블의 정확한 통계 수집을 위해 미리 알려줘야할 정보를 수집하는 DBMS함수
  4. 2015.05.22 [펌] 통계정보 생성 하기 [ dbms_stats.gather_schema_stats Procedure] [출처] 통계정보 생성 하기 [ dbms_stats.gather_schema_stats Procedure]|
  5. 2014.11.21 [펌] ORA-06508 PL/SQL: could not find program unit being called ~
  6. 2014.11.14 [펌] Oracle CURD Package Sample
  7. 2014.11.05 Orange windows 64bit ERROR:ORA-12154:TNS:couldnot resolve service name 2
  8. 2014.07.23 [펌] [Oracle] MySQL의 Limit처럼 사용해보자.
  9. 2014.07.23 [펌] DBMS별 지원되는 최대 컬럼수(Oracle,ms-sql,mysql,db2)
  10. 2014.04.11 How to configure distributed transaction in Oracle Database Gateway for ODBC? (ORA-02047)
  11. 2014.04.11 [펌] ORA-02047: cannot join the distributed transaction in progress 1
  12. 2013.12.30 [펌] Sequence Cache 문제점
  13. 2013.02.06 [펌] 오라클 페이징 기법
  14. 2013.02.05 TOAD for Oracle Freeware 9.7
  15. 2012.10.06 [펌] Optimizer의 원리와 Tuning (상)
  16. 2012.09.21 Oracle] 통계 함수
  17. 2012.09.21 Oracle PIVOT
  18. 2012.09.21 pivot and unpivot queries in 11g
  19. 2012.09.21 Oracle over() 구문
  20. 2012.09.21 oracle pivot 데이터를 가로를 세로로...
  21. 2012.09.20 [ORACLE] 각종 관리상 팁
  22. 2012.09.18 orcale like 대신 instr
  23. 2012.09.18 SQL문 기초에서중급까지(L7)CASE문
  24. 2012.09.02 [펌] SQL Tuning Advisor
  25. 2012.09.02 [펌] 다양한 검색조건의 튜닝방법
  26. 2012.09.02 [펌] SQL튜닝 방법론
  27. 2012.05.16 oracle 한글 에러코드 1
  28. 2012.05.02 html5 한글명세서
  29. 2012.03.26 Group By 에서 문자열 합치기 - 버전별 정리
  30. 2012.03.16 집합 쿼리(UNION, INTERSECT, MINUS)
02.Oracle/DataBase2018. 6. 19. 10:33
반응형

call SP_B_GPS_REG_DATES( 

        '20170101',

        '20171231'

    );


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


CREATE OR REPLACE PROCEDURE `wbdb`.`GenerateRangeDates`(IN S_INDATE DATE, IN E_INDATE DATE)

BEGIN


    -- CREATE TEMPORARY TABLE IF NOT EXISTS dates (day DATE);

DELETE FROM B_GPS_REG_DATES_TMP;


    loopDate: LOOP

        INSERT INTO B_GPS_REG_DATES_TMP

        (

        YY, MM, DD, QUARTER, INDATE

        )

        VALUES 

        (

        -- SUBSTR(S_INDATE,1,4), SUBSTR(S_INDATE,6,2), SUBSTR(S_INDATE,9,2), QUARTER(S_INDATE), S_INDATE

SUBSTR(S_INDATE,1,4), SUBSTR(S_INDATE,6,2), SUBSTR(S_INDATE,9,2), QUARTER(S_INDATE), CONCAT(SUBSTR(S_INDATE,1,4), SUBSTR(S_INDATE,6,2), SUBSTR(S_INDATE,9,2))

        )

        ; 

        SET S_INDATE = DATE_ADD(S_INDATE, INTERVAL 1 DAY);


        IF S_INDATE <= E_INDATE 

            THEN ITERATE loopDate;

            ELSE LEAVE loopDate;

        END IF;

    END LOOP loopDate;


    -- SELECT day FROM dates;

    -- DROP TEMPORARY TABLE IF EXISTS dates;


END

Posted by 1010
02.Oracle/DataBase2015. 5. 22. 14:18
반응형

출처 : [한국 Oracle Technology Network]의 기술 지원 게시판

 

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

No. 22383 : DBMS_STATS.GATHER_SYSTEM_STATS를 이용한 통계정보 수집 가이드
========================================================================================

 

PURPOSE
-------

 

   이 자료는 DBMS_STATS.GATHER_SYSTEM_STATS 함수를 사용하여 system table에 대한

   통계 정보 수집 시 stats table과 AUX_STATS$ table에 나타나는 정보에 대한 분석 및 
   통계 정보 생성 시 필요한 INTERVAL에 대한 내용과 통계정보 수집 상태를 나타내는

   NOWORKLOAD, BADSTATS, AUTOGATHERING 상태에 대한 설명입니다.


Explanation
-----------

 

다음과 같은 문서를 참고하여 test 후, 확인하였습니다.
<Note:153761.1> Gathering System Statistics Returns only 'NOWORKLOAD'.
<Note:149560.1> Collect and Display System Statistics (CPU and IO) for CBO usage.

 

DBMS_STATS.GATHER_SYSTEM_STATS를 사용하여 20분 동안의 통계정보를 생성하는

간단한 절차를 test를 통해 알아보기로 한다. 통계정보 수집 시간이 최소 권장 사항인 60분

이상이 되지 않아도 오라클에서 통계정보를 측정하기 위한 기준치 만큼의 자원 소비가 있으면 
PVAL2가 badstats로 나오지 않고 autogathering으로 정상으로 나오는 것을 알 수 있다.


Step 
-----
1. sqlplus "/as sysdba"
2. EXECUTE DBMS_STATS.CREATE_STAT_TABLE( ownname => 'SYSTEM',

    stattab => 'mystats'); 
3. ALTER SYSTEM SET JOB_QUEUE_PROCESSES = 1;

4. EXECUTE DBMS_STATS.GATHER_SYSTEM_STATS( interval => 20, stattab => 'mystats',

     statid => 'DAY', statown => 'SYSTEM'); 
    EXECUTE DBMS_STATS.GATHER_SYSTEM_STATS('INTERVAL', 20);

 

< 참고 > statid 로 DAY 와 NIGHT 이 있으므로, DBMS_STATS.GATHER_SYSTEM_STATS 
             함수의 파라미터로 선택하여 사용 가능함.

 

5. select * from system.mystats; 
    select count(*) from system.mystats;

 

   위의 select 수행 결과 no rows selected로 나오면 아래와 같이 수행한다. 

   EXECUTE DBMS_STATS.GATHER_SYSTEM_STATS( gathering_mode=>'START',

    stattab => 'mystats', statid => 'DAY', statown => 'SYSTEM');

 

   또한 START 를 MANUAL하게 해주지 않으면 다음과 같이 NOWORKLOAD로 나타난다.

 

SQL> select PNAME, PVAL2 from SYS.AUX_STATS$ where pname ='STATUS';

 

PNAME     PVAL2
---------  --------------------------------------------------------------------
STATUS    NOWORKLOAD


6. DBMS_STATS.GATHER_SYSTEM_STATS 함수에서 START 를 해주면 아래와 같이 
   AUTOGATHERING 상태로 바뀐다.

 

SQL> select PNAME, PVAL2 from SYS.AUX_STATS$ where pname ='STATUS';

 

PNAME    PVAL2
--------  ---------------------------------------------------------------------
STATUS   AUTOGATHERING


7. 아직 20분이 경과되지 않으면 아래와 같이 진행 상황을 확인할 수 있다.

 

SQL> alter session set nls_date_format='mm-dd-YYYY HH24:MI';
SQL> select c1, to_date(c2), to_date(c3) from system.mystats;

 

C1                               TO_DATE(C2)        TO_DATE(C3)
--------------------------------------------------------------
MANUALGATHERING      12-21-2004 02:46   12-21-2004 02:46
 

8. MANUAL하게 STOP을 하려면 아래와 같이 수행한다.

 

EXECUTE DBMS_STATS.GATHER_SYSTEM_STATS( gathering_mode=>'STOP',

stattab => 'mystats', statid => 'DAY', statown => 'SYSTEM'); 


<주의> 만약, DBMS_STATS.GATHER_SYSTEM_STATS 함수를 이용하여 STOP을
실행한 이후에 아래 9번과 같은 명령을 수행 시 PVAL2가 badstats 로 나온다면 이것은

interval 이 충분하지 않아 그 기간 동안에 작업 WORKLOAD가 부족하기 때문입니다.


따라서, interval 동안 SINGLE BLOCK I/O와 multiblock I/O에 대한 workload가 오라클에서

통계정보를 측정하기 위한 기준치 만큼의 자원 소비가 없으면 정보가 부족하여 발생하는

현상으로 보입니다. 즉, 지속적인 i/o에 대한 통계치를 제대로 수집하지 못해서 발생하는

것입니다. 시스템에 대한 통계 정보 수집 시 interval은 최소한 60분, default로 120분입니다. 
  

9. 20분이 지나면 아래와 같은 spool 결과를 볼 수 있고, sys.aux_stats$ table에서

    PVAL2 가 AUTOGATHERING에서 COMPLETED 로 변경됨을 알 수 있다. 
     
SQL> select SNAME, PNAME, PVAL1, PVAL2 from SYS.AUX_STATS$

         where pname ='STATUS';

 

SNAME                  PNAME              PVAL1        PVAL2                    
--------------------------------------------------------------------------------
SYSSTATS_INFO     STATUS                               COMPLETED     


10. 통계정보를 보관하기 위해 생성한 'mystats' 라는 stats table을 drop하려면 
     이와 같이 DBMS_STATS.DROP_STAT_TABLE procedure를 수행한다. 

 

EXECUTE DBMS_STATS.DROP_STAT_TABLE( ownname => 'SYSTEM', stattab =>'mystats');

 

< 권장 사항 >

dbms_stats.gather_system_stats package 사용 시 이 두 개의 파라미터를 Tuning 후

parameter file에 설정하면 보다 나은 CBO의 효과를 얻을 수 있다.

  ~ optimizer_index_caching  (range of value : 0 to 100)
  ~ optimizer_index_cost_adj (range : 1 to 10000)


< 참고 >

이와 같은 시스템 통계정보 생성 작업을 dbms_job.submit 프로시져를 이용하여 수행할 수도 있다.

이렇게 job으로 등록했을 경우에는 통계정보 생성 중에 dba_jobs 와 dba_jobs_running 뷰를

조인하여 확인해 보면 WHAT 컬럼에 아래와 같은 job scheduling이 걸리는 것을 볼 수 있다.

 

sql>dbms_stats.gather_system_stats(gathering_mode => 'AUTO_STOP', statown => 'SYS');


Example
----------

위의 작업에 대한 spool on 수행 결과입니다.

 

SQL> select * from sys.aux_stats$;

SQL> SELECT count(*) from system.mystats;

SQL> select job, what from user_jobs;                                    
SQL> select PNAME, PVAL2 from SYS.AUX_STATS$ where pname ='STATUS';

SQL> select * from sys.aux_stats$;

SQL> exec DBMS_STATS.IMPORT_SYSTEM_STATS ('mystats','DAY','SYSTEM');

BEGIN DBMS_STATS.IMPORT_SYSTEM_STATS ('mystats','DAY','SYSTEM'); END;

*
ERROR at line 1:
ORA-20003: Unable to import system statistics 
ORA-06512: at "SYS.DBMS_STATS", line 5437 
ORA-06512: at line 1


SQL> EXECUTE DBMS_STATS.GATHER_SYSTEM_STATS( gathering_mode=>'STOP',

          stattab => 'mystats', statid => 'DAY', statown => 'SYSTEM');

 

SQL> select c1, to_date(c2), to_date(c3) from system.mystats;

C1                             TO_DATE(C2)      TO_DATE(C3)                     
------------------------------ ---------------- ----------------                
COMPLETED              12-21-2004 02:46   12-21-2004 03:10                
                                                                               

SQL> select SNAME, PNAME, PVAL1, PVAL2 from SYS.AUX_STATS$

         where pname ='STATUS';

 

SQL> EXECUTE DBMS_STATS.GATHER_SYSTEM_STATS( gathering_mode=>'START',

         stattab => 'mystats', statid => 'DAY', statown => 'SYSTEM');

 

SQL> select PNAME, PVAL2 from SYS.AUX_STATS$ where pname ='STATUS';

                                                                               

SQL> select count(*) from system.mystats;

SQL> select PNAME, PVAL2 from SYS.AUX_STATS$ where pname ='STATUS';

                                                                               

SQL> exec DBMS_STATS.IMPORT_SYSTEM_STATS ('mystats','DAY','SYSTEM');

BEGIN DBMS_STATS.IMPORT_SYSTEM_STATS ('mystats','DAY','SYSTEM'); END;

*
ERROR at line 1:
ORA-20003: Unable to import system statistics 
ORA-06512: at "SYS.DBMS_STATS", line 5437 
ORA-06512: at line 1


SQL> spool off

 

위의 DBMS_STATS.IMPORT_SYSTEM_STATS 수행 시 ORA-20003 error에 대해서는

이 문서 <Note:154601.1>을 참조하시기 바랍니다. User table로부터의 system 통계 정보를

Data Dictionary로 transfer할 때 ORA-20003 에러에 대한 해결방법입니다.

 

위 과정 전체를 JOB으로 등록하여 DBMS_JOB.SUBMIT으로 수행하는 방법은 아래

참고 노트에 나와 있습니다.


Reference Documents
-------------------
<Note:153761.1>
<Note:149560.1>

Posted by 1010
02.Oracle/DataBase2015. 5. 22. 14:17
반응형
테이블의 정확한 통계 수집을 위해 미리 알려줘야할 정보를 수집하는 DBMS함수

call dbms_stats.getther_table_stats('user',''table');


Posted by 1010
02.Oracle/DataBase2015. 5. 22. 14:14
반응형

출처 : http://blog.naver.com/darkturtle/50070269004


B. GATHER_SCHEMA_STATS Procedure

스키마 OWNER 의 모든OBJECT 에 대한 통계정보를 수집한다.

전체적으로 GATHER_TABLE_STATS 와 같고 아래 부분이 다르다.

스키마 유저만 지정 하면 GATHER OPTION  이 작동하여 모든 Object 의 정보가 수집 된다.



DBMS_STATS.GATHER_SCHEMA_STATS (

   ownname          VARCHAR2,

   estimate_percentNUMBER   DEFAULT to_estimate_percent_type

                 (get_param('ESTIMATE_PERCENT')),

   block_sample     BOOLEAN DEFAULT FALSE,

   method_opt       VARCHAR2 DEFAULT get_param('METHOD_OPT'),

   degree           NUMBER   DEFAULT

 to_degree_type(get_param('DEGREE')),

  granularity      VARCHAR2 DEFAULTGET_PARAM('GRANULARITY'),

   cascade          BOOLEAN  DEFAULT

to_cascade_type(get_param('CASCADE')),

   stattab          VARCHAR2 DEFAULT NULL,

   statid           VARCHAR2 DEFAULT NULL,

   options          VARCHAR2 DEFAULT 'GATHER',

   objlist          OUT      ObjectTab,

   statown          VARCHAR2 DEFAULT NULL,

   no_invalidate    BOOLEAN DEFAULT to_no_invalidate_type (

                                     get_param('NO_INVALIDATE')),

  force             BOOLEAN DEFAULT FALSE);

  

DBMS_STATS.GATHER_SCHEMA_STATS (

   ownname          VARCHAR2,

   estimate_percentNUMBER   DEFAULT to_estimate_percent_type

                                               (get_param('ESTIMATE_PERCENT')),

   block_sample     BOOLEAN DEFAULT FALSE,

   method_opt       VARCHAR2 DEFAULT get_param('METHOD_OPT'),

   degree           NUMBER  DEFAULT to_degree_type(get_param('DEGREE')),

  granularity      VARCHAR2 DEFAULTGET_PARAM('GRANULARITY'),

   cascade          BOOLEAN  DEFAULT to_cascade_type(get_param('CASCADE')),

   stattab          VARCHAR2 DEFAULT NULL,

   statid           VARCHAR2 DEFAULT NULL,

   options          VARCHAR2 DEFAULT 'GATHER',

   statown          VARCHAR2 DEFAULT NULL,

   no_invalidate    BOOLEAN DEFAULT to_no_invalidate_type (

                                     get_param('NO_INVALIDATE'),

   force            BOOLEAN DEFAULT FALSE);

 

 

 

Parameter

Description

Options

통계정보가 수집될 Object 에 대한 설명

GATHER : 스키마의 모든 Object 에 대해서 수집하라.

GATHER AUTO : 필요한 모든 정보를 자동으로 수집하라.

    GATHER AUTO 시에 설정 가능한 값은 ownname, stattab, statid, objlist,

     ,statown 만 가능하고 나머지 파라미터는 무시 된다.

GATHER STALE : *_tab_modification views 를 통해서 결정된 상태 변경이

     많은 테이블만 대상으로 통계정보를 수집한다.

GATHER EMPTY : 현재 통계정보가 존재하는 테이블만 대상으로

통계정보를 수집한다.

LIST AUTO : GATHER AUTO 옵션으로 진행될 Object list  Return 한다.

LIST STALE : GATHER STALE 옵션으로 진행될 Object list  Return 한다.

LIST EMPTY : GATHER EMPTY 옵션으로 진행될 Object list  Return 한다.

Objlist

통계정보가 상했거나없는 Object List


1. 통계정보가맛간 테이블 리스트 출력

<!--[if !supportLists]--><!--[endif]-->

SQL> setserveroutput on

SQL> declare

    mystaleobjs dbms_stats.objecttab;

    begin

    -- check whether there is any stale objects

   dbms_stats.gather_schema_stats(ownname=>'SCOTT', -

 options=>'LISTSTALE',objlist=>mystaleobjs);

    for i in 1 .. mystaleobjs.count loop

   dbms_output.put_line(mystaleobjs(i).objname);

    end loop;

    end;

  /


<!--[if !supportLists]-->2. 자동으로 통계정보수집 시에 대상 테이블 리스트 출력

SQL> setserveroutput on

SQL>declare

     mystaleobjs dbms_stats.objecttab;

    begin

    dbms_stats.gather_schema_stats(ownname=>‘SCOTT’,

options=>'LISTAUTO',objlist=>mystaleobjs);

    for i in 1 .. mystaleobjs.count loop

   dbms_output.put_line(mystaleobjs(i).objname);

    end loop;

   end ;

    /

PL/SQL proceduresuccessfully completed.

 

 

 

 -- 통계정보 생성이 필요한 테이블 리스트업 (DATA 이행등, STALE TABLE LIST 추출) 
SELECT *
FROM ALL_TAB_MODIFICATIONS
WHERE TABLE_OWNER IN ( 'SCOTT' )
and INSERTS > 100000 ;

-- 통계정보 생성 스크립트 작성 
SELECT 'exec dbms_stats.GATHER_TABLE_STATS(OWNNAME=>'''||table_owner||''',TABNAME=>'''||table_name||''');'
FROM ALL_TAB_MODIFICATIONS
WHERE TABLE_OWNER IN ( 'SCOTT' )
and INSERTS > 100000 ;


Posted by 1010
02.Oracle/DataBase2014. 11. 21. 19:21
반응형

출처 : http://tip.daum.net/question/62996518


ORA-06508 PL/SQL: could not find program unit being called ~

 

<< 환경 >>

인터페이스 모듈을 프로시져로 작성하고 있습니다.

Oracle9i Enterprise Edition Release 9.2.0.8.0 - 64bit Production

 

인스턴스 instance-1 이 있구요.

인스턴스 안에 스키마 user-1 , user-2가 있습니다.

 

user-2에서 프로시져를 작성했구요 프로시져 안에서 user-1 에서 만든 패키지 pkg_1를 콜합니다.

pkg_1은 user-2의 다른 pkg_2를 콜합니다.

 

( user_2.프로시져 -> user_1.pkg_1 -> user_2.pkg_2 ) 이런 식입니다.

 

<< 에러현상 재현>>

여러분들이 많이 쓰시는 Toad나 Orange, Develper 등에서 user_2로 login해서 작업합니다.

 

작업1] session-1st를 생성 -> 1st session에서 프로시져를 실행했을때 문제없이 돌아갑니다.

 

작업2] session-2nd를 생성 -> 2nd session에서 프로시져를 실행했을때 마찬가지로 문제없이 돌아갑니다.

 

작업3] session-1st에서 프로지져안에서 콜하는 pkg_2를 컴파일 합니다. (user_2는 권한가지고있음)

        (이때 pkg_1은 invalid 상태로 변합니다.)

 

작업4] session-2nd에서 해당 프로시져를 콜하면 위와 같은 에러메시지가 나옵니다.

 

작업5] session-1st에서 invalid인 pkg_1을 재컴파일하지 않은 상태에서 프로지져실행 -> 잘돌아갑니다. (이때 invalid한 pkg_1은 valid한 상태로 바뀝니다.)

 

작업6] session-2nd에서 프로시져를 실행 -> 같은 에러가 나옵니다.

 

작업7] session-3rd를 생성 -> 3rd session에서 프로시져를 실행했을때 문제없이 돌아갑니다.

 

작업8] session-2nd에서 프로시져를 실행 -> 같은 에러가 나옵니다

 

==> 정리하면 pkg_2를 컴파일하는 session은 전혀 문제가 없습니다.

==> session이 유지되고 있는 상태에서 다른 session이 자신이 access하는 pkg_2를 컴파일 하면 해당 session은 에러를 발생시키지만...새로 맺는 session은 에러를 발생시키지 않습니다.

 

이 현상을 파악하는데....1개월이 걸렸습니다.

 

그런데..해결 방안이 떠오르질 않네요..

 

좀 더 구체적으로 말씀드리자면...session-2nd는 EAI SERVER에서 Connection Pool이라고 생각하시면 됩니다. 그러니...새로운 .session을 맺으라는 얘기는 db를 restart하라는 얘기와 같습니다.

 

[[제 생각]]

제가 알기론 db가 구동될때...ORACLE SUB_PROGRAM(fn,sp,pkg등)정보를 Dictionary cache에 올리는 걸로 알고 있는데...이쪽에 원인이 있다고 생각하는데..(동기화등등 ) 암튼 지금..넘 막연하네요.

 

조치는 해야 하는데..하루하루가...죽을맛입니다...

 

그럼 부탁드리구요..좋은 하루 되세요...



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



pl/sql의 hot deploy가 안되는 경우입니다....

 

 1. dependency가 아주 깊이 있는 경우 invalid된 package가 자동 compile이 안되는 경우가 있읍니다.

 2. 수정에 의해 invalid된 package안에서 package level의 변수(전역변수)를 사용한 경우

    발생할수 있읍니다.

 

아래의 오라클 문서를 참고하세요.

 

ORA-04068 Errors from User-Written and Oracle Packages
 Doc ID:Note:106206.1Type:BULLETIN
 Last Revision Date:14-NOV-2006Status:PUBLISHED


Problem Description
-------------------

You receive the following error from user-written and Oracle packages:

   ORA-04068  existing state of packages%s%s%s has been discarded


Causes of ORA-4068 Errors
-------------------------

1) A dependent object was altered through a DDL statement.

   When a package is compiled, all copies in the shared pool are
   flagged as invalid.  The next invocation of the package sees
   this flag set, and goes to get a new copy.  

   If the package is now invalid, cannot compile, or relied on 
   a package state (i.e., package level variables), then this error 
   occurs because the current copy of the package is no longer valid 
   and must be thrown out.

2) The package was changed or recompiled (both DDL) and the package
   being used contains package level variables.

   Same as above.  When a package dependency is altered through
   DDL statements (DROP, CREATE, ALTER, ...), this package is
   flagged as invalid through cascade invalidation.

3) A package relied on another package that had no body, and during
   execution, the call failed.

   When a package is compiled, it only looks for the specification.  
   During execution, it calls a non-existent routine and throws an 
   error.  This error then invalidates the package.

   Another variation is if the procedure being called is not defined
   in the package body and possibly as a standalone routine.

4) A remote dependent object has been altered through a DDL statement.
   This can occur between database instances or from Forms or Reports
   to a database instance.

   The default remote dependency model uses the Timestamp model, and when 
   an execution of a procedure takes place, the remote object's timestamp 
   is validated, thus forcing invalidation on the local package.

   To check for these situations, several SQL statements can be run:

  a. To check the package's last compile:

     SELECT object_name, object_type, owner, status, last_ddl_time FROM
       dba_objects WHERE object_name = '<PACKAGE NAME>';

     For example:

     SQL> SELECT object_name, object_type, owner, status, last_ddl_time FROM
       2    dba_objects WHERE object_name = 'DBMS_SQL';

     OBJECT_NAME
     ------------------------------------------------------------------------
     OBJECT_TYPE   OWNER                          STATUS  LAST_DDL_
     ------------- ------------------------------ ------- ---------
     DBMS_SQL
     PACKAGE       SYS                            VALID   13-JUL-99

     DBMS_SQL
     PACKAGE BODY  SYS                            VALID   13-JUL-99

     DBMS_SQL
     SYNONYM       PUBLIC                         VALID   13-JUL-99

     SQL> 

  b. To check the dependent objects last alteration:

     SELECT object_name, object_type, owner, status, last_ddl_time FROM
       dba_objects WHERE ( object_name, object_type ) IN ( SELECT
       referenced_name, referenced_type FROM dba_dependencies WHERE name =
       '<PACKAGE NAME>' );

     For example:

     SQL> SELECT object_name, object_type, owner, status, last_ddl_time FROM
       2    dba_objects WHERE ( object_name, object_type ) IN ( SELECT
       3    referenced_name, referenced_type FROM dba_dependencies WHERE name =
       4    'DBMS_SQL' );

     OBJECT_NAME
     -----------------------------------------------------------------------------
     OBJECT_TYPE   OWNER                          STATUS  LAST_DDL_
     ------------- ------------------------------ ------- ---------
     DBMS_SQL
     PACKAGE       SYS                            VALID   13-JUL-99

     DBMS_SYS_SQL
     PACKAGE       SYS                            VALID   13-JUL-99

     STANDARD
     PACKAGE       SYS                            VALID   13-JUL-99


     SQL> 

  c. To check for existing errors on package:

     SELECT name, type, text FROM dba_errors WHERE name = '<PACKAGE NAME>';

     For example:

     SQL> SELECT name, type, text FROM dba_errors WHERE name = 'DBMS_SQL';

     no rows selected

     SQL> 


Solutions for ORA-4068 Errors
-----------------------------

1) Simply re-execute the package.

   For example:

   Session 1:  Create the package and body for package p_pack:

   SQL> create or replace package p_pack as
     2      p_var varchar2(1);
     3      procedure p;
     4  end p_pack;
     5  /

   Package created.

   SQL> create or replace package body p_pack as
     2      procedure p is
     3          begin
     4              p_var := 1;
     5          end;
     6  end p_pack;
     7  /

   Package body created.

   SQL> 

   Session 2:  Execute the package:

   SQL> exec p_pack.p

   PL/SQL procedure successfully completed.

   SQL> 

   Session 1:  Recreate the package and body:

   SQL> create or replace package p_pack as
     2      p_var varchar2(1);
     3      procedure p;
     4  end p_pack;
     5  /

   Package created.

   SQL> create or replace package body p_pack as
     2      procedure p is
     3          begin
     4              p_var := 1;
     5          end;
     6  end p_pack;
     7  /

   Package body created.

   SQL> 

   Session 2:  Re-execute the package:

   SQL> exec p_pack.p
   begin p_pack.p; end;

   *
   ERROR at line 1:
   ORA-04068: existing state of packages has been discarded
   ORA-04061: existing state of package "SCOTT.P_PACK" has been invalidated
   ORA-04065: not executed, altered or dropped package "SCOTT.P_PACK"
   ORA-06508: PL/SQL: could not find program unit being called
   ORA-06512: at line 1


   SQL> exec p_pack.p

   PL/SQL procedure successfully completed.

   SQL> 

   As background, when the ORA-4068 is raised, ORACLE will throw away all 
   existing instantiations of the package.  When the package (more properly, 
   the subprogram referring to the package) is re-executed, ORACLE will 
   re-instantiate the package automatically (if possible), which 
   typically will succeed, and re-execution of the subprogram will succeed.

   An important proviso is that the ORA-4068 error must be unhandled on exit 
   from the subprogram in order for this solution to work.  It's only when an 
   _unhandled_ ORA-4068 is returned by PL/SQL to ORACLE that the needed 
   deinstantiations take place.  
   (The ORA-4068 may be handled in the subprogram and various actions 
   taken in the handler, but the error must be reraised in order for it to be 
   unhandled on exit from PL/SQL to get the desired deinstantiations.)


2) Attempt to recompile the package by using the ALTER PACKAGE command.

   For example:

   SQL> ALTER PACKAGE DBMS_SQL COMPILE;

   Package altered.

   SQL> 

3) Verify that proper execute permissions have been provided.  In PL/SQL 
   stored program units, roles are disabled prior to the release of Oracle 
   8i.  Oracle 8i definers rights follow the previous release model of 
   requiring explicit permission to the object.  

   In Oracle 8i, if invoker's rights are set on the routine, then execution 
   is done with roles enabled, so permission could be granted explicitly to 
   the schema executing or through a role.  For additional information,
   refer to Note 162489.1 entitled "Invokers Rights Procedure Executed by Definers Rights Procedures".

 


   For example:

   SQL> SELECT owner, table_name, privilege FROM dba_tab_privs WHERE
     2    table_name = 'DBMS_SQL' AND ( grantee = 'SCOTT' OR grantee = 'PUBLIC' );

   OWNER                          TABLE_NAME
   ------------------------------ ------------------------------
   PRIVILEGE
   ----------------------------------------
   SYS                            DBMS_SQL
   EXECUTE


   SQL> 

4) If errors exist (check DBA_ERRORS or USER_ERRORS views with above
   query), then take the appropriate action to correct the errors.  

   If the package is a system package that comes with the Oracle server, 
   the scripts are located in $ORACLE_HOME/rdbms/admin.  Most packages have
   their own .sql and .plb script to build the specification and body (see
   below for names).  

   System packages that come with the Oracle server, as well as other Oracle 
   products, typically need to be owned by a particular schema.  In the case 
   of the Oracle server DBMS packages, these need to be owned by SYS.  If these
   packages are not owned by SYS, some packages start getting 'ORA-6509 PL/SQL 
   ICD vector missing for this package' errors.

5) If duplicate SYS owned objects exist, clean them up.  Refer to 
   Note 1030426.6, entitled "HOW TO CLEAN UP DUPLICATE OBJECTS OWNED BY 
   SYS AND SYSTEM SCHEMA", for information on this.


$ORACLE_HOME/rdbms/admin Packages
---------------------------------
System Package Name   Package Spc   Package Bdy   Owner
-------------------   -----------   -----------   -----
DBMS_ALERT            dbmsalrt.sql  prvtalrt.plb  SYS
DBMS_APPLICATION_INFO dbmsapin.sql  prvtapin.plb  SYS
DBMS_AQ               dbmsaq.plb    prvtaq.plb    SYS
DBMS_AQADM            dbmsaqad.sql  prvtaqad.plb  SYS
DBMS_CRYPTO_TOOLKIT   dbmsoctk.sql  prvtoctk.plb  SYS
DBMS_DDL              dbmsutil.sql  prvtutil.plb  SYS
DBMS_DEBUG            dbmspb.sql    prvtpb.plb    SYS
DBMS_DEFER            dbmsdefr.sql  prvtdefr.plb  SYS
DBMS_DEFER_QUERY      dbmsdefr.sql  prvtdefr.plb  SYS
DBMS_DEFER_SYS        dbmsdefr.sql  prvtdefr.plb  SYS
DBMS_DESCRIBE         dbmsdesc.sql  prvtdesc.plb  SYS
DBMS_DISTRIBUTED_TRUST_ADMIN
                      dbmstrst.sql  prvttrst.plb  SYS
DBMS_HS               dbmshs.sql    prvths.plb    SYS
DBMS_IOT              dbmsiotc.sql  prvtiotc.plb  SYS
DBMS_JOB              dbmsjob.sql   prvtjob.plb   SYS
DBMS_LOB              dbmslob.sql   prvtlob.plb   SYS
DBMS_LOCK             dbmslock.sql  prvtlock.plb  SYS
DBMS_LOGMNR           dbmslm.sql    prvtlm.plb    SYS
DBMS_LOGMNR_D         dbmslmd.sql   dbmslmd.sql   SYS
DBMS_OFFLINE_OG       dbmsofln.sql  prvtofln.plb  SYS
DBMS_OFFLINE_SNAPSHOT dbmsofsn.sql  prvtofsn.plb  SYS
DBMS_ORACLE_TRACE_AGENT
                      dbmsotrc.sql  prvtotrc.plb  SYS
DBMS_ORACLE_TRACE_USER
                      dbmsotrc.sql  prvtotrc.plb  SYS
DBMS_OUTPUT           dbmsotpt.sql  prvtotpt.plb  SYS
DBMS_PCLXUTIL         dbmsutil.sql  prvtutil.plb  SYS
DBMS_PIPE             dbmspipe.sql  prvtpipe.sql  SYS
DBMS_RANDOM           dbmsrand.sql  dbmsrand.sql  SYS
DBMS_RECTIFIER_DIFF   dbmsrctf.sql  prvtrctf.plb  SYS
DBMS_REFRESH          dbmssnap.sql  prvtsnap.plb  SYS
DBMS_REPAIR           dbmsrpr.sql   prvtrpr.plb   SYS
DBMS_REPCAT           dbmshrep.sql  prvtbrep.plb  SYS
DBMS_REPCAT_ADMIN     prvthdmn.plb  prvtbdmn.plb  SYS
DBMS_REPCAT_INSTANTIATE
                      dbmsrint.sql  prvtbrnt.plb  SYS
DBMS_REPCAT_RGT       dbmsrgt.sql   prvtbrgt.plb  SYS
DBMS_REPUTIL          dbms_gen.sql  prvtgen.plb   SYS
DBMS_RESOURCE_MANAGER dbmsrmad.sql  prvtrmad.plb  SYS
DBMS_RESOURCE_MANAGER_PRIVS
                      dbmsrmpr.sql  prvtrmpr.plb  SYS
DBMS_RLS              dbmsrlsa.sql  prvtrlsa.plb  SYS
DBMS_ROWID            dbmsutil.sql  prvtutil.plb  SYS
DBMS_SESSION          dbmsutil.sql  prvtutil.plb  SYS
DBMS_SHARED_POOL      dbmspool.sql  prvtpool.plb  SYS
DBMS_SNAPSHOT         dbmssnap.sql  prvtsnap.plb  SYS
DBMS_SPACE            dbmsutil.sql  prvtutil.plb  SYS
DBMS_SPACE_ADMIN      dbmsspc.sql   prvtspad.plb  SYS
DBMS_SQL              dbmssql.sql   prvtsql.plb   SYS
DBMS_STATS            dbmsstat.sql  prvtstat.plb  SYS
DBMS_TRACE            dbmspbt.sql   prvtpbt.plb   SYS
DBMS_TRANSACTION      dbmsutil.sql  prvtutil.plb  SYS
DBMS_UTILITY          dbmsutil.sql  prvtutil.plb  SYS
OUTLN_PKG             dbmsol.sql    prvtol.plb    SYS
UTL_COLL              utlcoll.sql   prvtcoll.plb  SYS
UTL_FILE              utlfile.sql   prvtfile.plb  SYS
UTL_HTTP              utlhttp.sql   prvthttp.plb  SYS
UTL_RAW               utlraw.sql    prvtrawb.plb  SYS
UTL_REF               utlref.sql    prvtref.plb   SYS


References
----------

"Oracle7 Server Application Developer's Guide", (A32536-1)

"Oracle8 Server Application Developer's Guide", (A54642-01)

"Oracle8i Application Developer's Guide - Fundamentals Release 8.1.5", 
   (A68003-01)


Related Articles
----------------

Note 19857.1 OERR:  ORA 4068  "existing state of packages%s%s%s has been 
               discarded"

Note 19854.1 OERR:  ORA 4065  "not executed, altered or dropped %s"

Note 19850.1 OERR:  ORA 4061  "existing state of %s has been invalidated"

Note 20065.1 OERR:  ORA 6508  "PL/SQL: could not find program unit being 
               called"

Note 1012129.102 ORA-4068,4067,6508 When Executing a Procedure Using PL/SQL

Note 117118.1  Errors Running or Compiling DBMS_RANDOM or DBMS_CRYPTO_TOOLKIT

Note 1030426.6 HOW TO CLEAN UP DUPLICATE OBJECTS OWNED BY SYS AND SYSTEM 
                 SCHEMA

Note 1012129.102  ORA-4068,4067,6508 WHEN EXECUTING A PROCEDURE USING PLSQL


Related Errors
--------------

ORA-4061
ORA-4063
ORA-4065
ORA-4067 
ORA-4068
ORA-4088
ORA-6508
ORA-6509
ORA-6568



ORA-6512


Posted by 1010
02.Oracle/DataBase2014. 11. 14. 20:23
반응형

출처 : http://blog.beany.co.kr/archives/485

예전에 테스트로 만들어 본 Oracle CURD Package Sample

  • Package 정의
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
CREATE OR REPLACE PACKAGE SP_CMM_DEVL_0170
AS
TYPE REF_TYPE IS REF CURSOR;
 
-- 다중 반환
PROCEDURE MULTI_RETURN (
                p_search_str IN  VARCHAR2
               ,p_return_1   OUT REF_TYPE
               ,p_return_2   OUT VARCHAR2
              );
 
-- 목록
PROCEDURE LST (
                p_search_str IN  VARCHAR2
               ,p_return     OUT REF_TYPE
              );
 
-- 입력
PROCEDURE INS (
                p_word_kor  IN VARCHAR2
               ,p_abbr_nm   IN VARCHAR2
               ,p_word_eng  IN VARCHAR2
               ,p_word_desc IN VARCHAR2
               ,p_reg_id    IN VARCHAR2
               ,p_reg_ip    IN VARCHAR2
               ,p_reg_dt    IN VARCHAR2
              );
 
-- 수정
PROCEDURE UPD (
                p_seq       IN NUMBER
               ,p_word_kor  IN VARCHAR2
               ,p_abbr_nm   IN VARCHAR2
               ,p_word_eng  IN VARCHAR2
               ,p_word_desc IN VARCHAR2
               ,p_upd_id    IN VARCHAR2
               ,p_upd_ip    IN VARCHAR2
               ,p_upd_dt    IN VARCHAR2
              );
 
-- 삭제
PROCEDURE DEL (
                p_seq IN NUMBER
              );
 
END SP_CMM_DEVL_0170;
/
  • Package Body 구현
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
CREATE OR REPLACE PACKAGE BODY SP_CMM_DEVL_0170
IS
 
-- 다중 반환
PROCEDURE MULTI_RETURN (
                p_search_str IN  VARCHAR2
               ,p_return_1   OUT REF_TYPE
               ,p_return_2   OUT VARCHAR2
)
IS
    v_query   VARCHAR2(1000);
    v_message VARCHAR2(2000);
BEGIN
     
    v_query := 'SELECT  SEQ
                       ,WORD_KOR
                       ,ABBR_NM
                       ,WORD_ENG
                       ,WORD_DESC
                       ,REG_ID
                       ,REG_IP
                       ,REG_DT
                       ,UPD_ID
                       ,UPD_IP
                       ,UPD_DT
                FROM   SAMPLE_DIC
               WHERE  1 = 1';
 
    IF (LENGTH(p_search_str) > 0) THEN
        v_query := v_query || ' AND WORD_KOR LIKE ''' || p_search_str || '%''';
    END IF;
     
    v_query := v_query || ' ORDER BY SEQ';
     
    OPEN p_return_1 FOR v_query;
     
    v_message  := 'Procedure 반환값!!';
    p_return_2 := v_message;
END MULTI_RETURN;
 
-- 목록
PROCEDURE LST (
                p_search_str IN  VARCHAR2
               ,p_return     OUT REF_TYPE
)
IS
    v_query VARCHAR2(1000);
BEGIN
     
    v_query := 'SELECT  SEQ
                       ,WORD_KOR
                       ,ABBR_NM
                       ,WORD_ENG
                       ,WORD_DESC
                       ,REG_ID
                       ,REG_IP
                       ,REG_DT
                       ,UPD_ID
                       ,UPD_IP
                       ,UPD_DT
                FROM   SAMPLE_DIC
               WHERE  1 = 1';
 
    IF (LENGTH(p_search_str) > 0) THEN
        v_query := v_query || ' AND WORD_KOR LIKE ''' || p_search_str || '%''';
    END IF;
     
    v_query := v_query || ' ORDER BY SEQ';
     
    OPEN p_return FOR v_query;
END LST;
 
-- 입력
PROCEDURE INS (
                p_word_kor  IN VARCHAR2
               ,p_abbr_nm   IN VARCHAR2
               ,p_word_eng  IN VARCHAR2
               ,p_word_desc IN VARCHAR2
               ,p_reg_id    IN VARCHAR2
               ,p_reg_ip    IN VARCHAR2
               ,p_reg_dt    IN VARCHAR2
)
IS
BEGIN
    INSERT INTO SAMPLE_DIC (
                             SEQ
                            ,WORD_KOR
                            ,ABBR_NM
                            ,WORD_ENG
                            ,WORD_DESC
                            ,REG_ID
                            ,REG_IP
                            ,REG_DT
                           )
    VALUES (
             SAMPLE_DIC_SEQ.NEXTVAL
            ,p_word_kor
            ,p_abbr_nm
            ,p_word_eng
            ,p_word_desc
            ,p_reg_id
            ,p_reg_ip
            ,p_reg_dt
           );
END INS;
 
-- 수정
PROCEDURE UPD (
                p_seq       IN NUMBER
               ,p_word_kor  IN VARCHAR2
               ,p_abbr_nm   IN VARCHAR2
               ,p_word_eng  IN VARCHAR2
               ,p_word_desc IN VARCHAR2
               ,p_upd_id    IN VARCHAR2
               ,p_upd_ip    IN VARCHAR2
               ,p_upd_dt    IN VARCHAR2
)
IS
BEGIN
    UPDATE  SAMPLE_DIC
    SET     WORD_KOR  = p_word_kor
           ,ABBR_NM   = p_abbr_nm
           ,WORD_ENG  = p_word_eng
           ,WORD_DESC = p_word_desc
           ,UPD_ID    = p_upd_id
           ,UPD_IP    = p_upd_ip
           ,UPD_DT    = p_upd_dt
    WHERE  SEQ        = p_seq;
END UPD;
 
-- 삭제
PROCEDURE DEL (
                p_seq IN NUMBER
)
IS
BEGIN
    DELETE
    FROM SAMPLE_DIC
    WHERE SEQ = p_seq;
END DEL;
 
END SP_CMM_DEVL_0170;
/


Posted by 1010
02.Oracle/DataBase2014. 11. 5. 18:46
반응형

64Bit OS에서 오렌지 설치 후  TNS 문제로 접속이 않되는 경우

설치 위치를 변경해 보는것이 좋다 C:\Program Files (x86) 아래가 아닌곳으로

 

ex) C:\orange



Posted by 1010
02.Oracle/DataBase2014. 7. 23. 15:08
반응형

내가 지식이 얕은 건지, 어떻게든 돌아가게는 만든다는 주먹구구식 마인드 때문인지,
Oracle DB에 입력되어 있는 순차적인 데이터의 선택적 추출은
이 방법밖에 알지 못한다..

자, 이제 그 방법에 대해 알아보자.

먼저 MySQL 에서는 
# [MySQL]
SELECT a.love_id 
FROM love a
LIMIT 1000, 2000;


하면, 실제 입력된 데이터의 순서에 맞추어 1000번 부터 2000번까지의 데이터가 나온다.

하지만.... 망할 ORACLE 에는 없다는 거....

어떤 분들은 'rownum으로  WHERE rownum BETWEEN 1000 AND 2000 하면 되지 않느냐??'
라고 하는데..... 잘 찾아보면, rownum 은 결과 값에 매겨지는 상대적인 값이므로,
절대적인 신뢰감이 없고, 위의 수식도 먹지 않는다..... 
뭐.. 안 믿으시면 한 번 해보시라.. --;;

그럼.. 어떻게 해야할까?
우리의 친구 꼼수를 한 번 발동 시켜볼까?

* 해법 *
************************************************************************************************
# [Oracle]
1. 아래 쿼리는, 데이터가 실제적으로 들어간 순서에 맞게 rownum을 부여 하여,
그 값을 하나의 컬럼으로 출력될 수 있게 해준다.
SELECT a.rownum as rnum, a.love_id
FROM love a;

2. 1에서 만들어진 쿼리를 아래와 같이 서브쿼리화 하여, between 사용이 가능해진다.
SELECT b.love_id
FROM (SELECT a.rownum as rnum, a.love_id FROM love a) as b
WHERE b.rnum BETWEEN 1000 AND 2000;

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

자, 그럼,, 저 위의 방식을 이용하여 마음껏(???) limit 인 척 해보자.


출처 : http://blackbull.tistory.com/25

Posted by 1010
02.Oracle/DataBase2014. 7. 23. 15:06
반응형

DBMS별 지원되는 최대 컬럼수(Oracle,ms-sql,mysql,db2)


지원되는 최대 컬럼수

사용된 DBMS
Oracle: Oracle8i Enterprise Edition Release 8.1.7.0.1 - Production
DB2   : DB2/NT 7.2.1
MySQL : 4.0.7-gamma-nt
MS-SQL: Microsoft SQL Server  2000 - 8.00.760 (Intel X86) 
            Enterprise Edition on Windows NT 5.0 (Build 2195: Service Pack 3)

사용된 질의
create table long_test
(
id1     varchar(10),
id2     varchar(10),
id3     varchar(10),
id4     varchar(10),
id5     varchar(10),
id6     varchar(10),
id7     varchar(10),
id8     varchar(10),
id9     varchar(10),
id10    varchar(10),
id11    varchar(10),
id12    varchar(10),
.
.
.



오라클과 ms-sql의 경우, 최대 1000, 1024개의 컬럼을 지원한다고 명시되어 있다.
MySQL의 경우, 명시적인 언급을 찾을 수 없어서 실험을 통해 얻은 값이다.
DB2의 경우는 table space의 페이지크기와 컬럼의 데이터타입에 따라 가변적이다.

오라클 : 1000
MySQL  : 3230
MS-SQL : 1024
DB2    : 가변적. 최대 컬럼수를 구하는 공식은 다음과 같다.
         4K page size allows a maximum of 500 columns 
         8K, 16K, and 32K page sizes allow a maximum of 1012 columns. 
         The actual number of columns for a table is determined by the following formula: 
         Total Columns * 8 + Number of LOB Columns * 12 + Number of Datalink Columns * 28 <= row size limits for page size. 

This article comes from dbakorea.pe.kr (Leave this line as is) 

출처 : https://www.linux.co.kr/home2/board/subbs/board.php?bo_table=lecture&wr_id=233&sca=3&page=9


Posted by 1010
02.Oracle/DataBase2014. 4. 11. 16:40
반응형

I am connecting from Oracle to MS SQL Server through an ODBC connection using Oracle SQL Developer. (How)

I want to query the schema of the MS SQL database using the data dictionary mapping of the Oracle Database Gateway for ODBC.

This works well:

select * from all_tables@katimssql;

But this doesn't:

create table alltables_mssql as 
select * from all_tables@katimssql;

Output:

Error report:
SQL Error: ORA-00604: error occurred at recursive SQL level 1
ORA-02047: cannot join the distributed transaction in progress
ORA-06512: at "SYS.HS$_DDTF_SQLTABLES", line 58
ORA-06512: at line 1

Does anyone know the solution of this?
Thanks in advance,
Kati


 

Details:

Oracle Database 11g Express Edition Release 11.2.0.2.0
Microsoft SQL Server 2008 (SP2) - 10.0.4000.0 (X64)
ODBC Driver: SQL Server Native Client 11.0 (32 bit)

initkatimssql.ora:

HS_FDS_CONNECT_INFO=katimssql
HS_FDS_TRACE_LEVEL = ON
HS_TRANSACTION_MODEL = READ_ONLY_AUTOCOMMIT

I tried these, none of them worked, the error message is the same.

HS_FDS_TRACE_LEVEL = off
HS_TRANSACTION_MODEL = SINGLE_SITE
HS_TRANSACTION_MODEL = READ_ONLY_AUTOCOMMIT
HS_TRANSACTION_MODEL = READ_ONLY
Posted by 1010
02.Oracle/DataBase2014. 4. 11. 16:32
반응형

ora-02047: cannot join the distributed transaction in progress
Cause: Either a transaction is in progress against a remote database that does not fully support two phase commit, and an update is attempted on another database, or updates are pending and and an attempt is made to update a different database that does not fully support two phase commit.
Action: complete the current transaction and then resubmit the update request

출처 : http://dpldpl.tistory.com/7

ORA-02047 동작중의 분산 트랜잭션(transaction)는 결합할 수 없습니다.

 

원인은 이기종 데이터베이스 시스템 간의 인터페이스 작업 시(ex. oracle to mssql)

데이터 처리를 함에 있어서(ex. Insert, Update, Delete)

커밋을 하지 않았기 때문에 발생하는 오류이다.

 

단일 시스템에서는 커밋을 하지 않아도 무방하지만

이기종 시스템간의 데이터 처리시에는 DML 구문뒤에 꼭 커밋을 해주어야 한다.

 

by. 덕평물류 전산정보팀(DPL Dream Partner in Logitics)

Posted by 1010
02.Oracle/DataBase2013. 12. 30. 11:04
반응형

우리는 오라클 Sequence를

중요한 문서나 회원에 고유번호로 활용하는 경우가 종종 있다.

 

당연히 1부터 빈틈없이 자동으로 증가해줄것이라고 믿는다.

 

하지만 퍼포먼스를 위해 Sequence의 Cache를 사용했다면 그렇지 않을 수 있다.

 

Sequence의 Cache는...

원하는 숫자 만큼 미리 만들어 Shared Pool의 Library Cache에 상주 시키는 기능이다.

 

다시말해,

Cache가 저장된 수 만큼 Disk I/O가 발생하지 않는 장점도 있고

반면에 Library Cache가 날아간다면 Sequence Cache도 날아가게 된는 단점도 있다.

 

 

만약 Cache를 50으로 했다면 1~50까지 읽었가는(Nextval) 동안에는 Library Cache에서 읽어간다.

51번째를 요청할때 다시 50이 증가된 51~100까지 다시 Library Cache에 저장하는 것이다.

Disk I/O가 2번 밖에 발생하지 않았다.^^;;; 좋은 기능임엔 틀림없다.

 

하지만 오류 아닌 오류가 아래와 같이 있으므로 유의해서 사용해야 한다.

  1. DB가 비정상적으로 종료가 되었거나 (PMON이 죽거나, shutdown abort를 사용했을경우)

  2. Library Cache에서 우선순위 경합에 밀려 cache aged out 되는 경우다.
    다시말해, 사용 빈도가 적어 메모리에서 삭제되는 경우를 말한다.^^;

Cache 50에 Current값이 1이라고 할지라도....

위와 같은 현상이 발생한다면 다음 시퀀스는 51이 된다.

(참고: http://kr.forums.oracle.com/forums/thread.jspa?threadID=463133)

 

 

해결 방법은 2가지다.

  1. Cache를 사용하지 않는 것.
  2. dbms_shared_pool package를 이용해 Library Cache에 항상 상주하도록 강제설정하는 방법이다.

무엇보단 근본적인 방법인 1번을 추천하고 싶다. 특별한 경우가 아니면 Cache를 사용하지 말자....^^;;

 

출처 : http://blog.naver.com/PostView.nhn?blogId=xacti&logNo=80109572891&parentCategoryNo=3&viewDate=&currentPage=1&listtype=0

Posted by 1010
02.Oracle/DataBase2013. 2. 6. 11:41
반응형

출처 : http://dbclose.tistory.com/75

 

오라클은 MySql 에서 지원하는 order by LIMIT 를 지원하지 않아 페이징 처리 속도가 느리다.

알려진 오라클 페이징 기법을 테스트 하여 속도를 비교해 보자

SAMPLE 테이블에 100만건의 데이트를 입력 후 10개씩 보여지는 마지막 페이지를 조회
정렬 조건은 PRIMARY KEY DESC 정렬

1. 페이지 수를 계산하여 셀렉트

SELECT B.* FROM (
SELECT
CEIL(ROWNUM/10) PAGE
--, COUNT(*) OVER() AS TOTAL_COUNT
, A.* FROM (
SELECT * FROM OP_SAMPLE
ORDER BY ID DESC
) A
) B
WHERE PAGE = 100000;


100만 건인 경우 수행시간 : 1.327초, TOTAL_COUNT 까지 조회시 : 3.848초
10만 건인 경우 수행시간 : 0.135초 TOTAL_COUNT 까지 조회시 : 0.255초



2. ROW_NUMBER()를 이용한 페이징

SELECT * FROM (
SELECT A.*, ROW_NUMBER() OVER(ORDER BY ID DESC) AS NUM
FROM OP_SAMPLE A
)
WHERE NUM BETWEEN 999991 AND 1000000;

100만 건인 경우 수행시간 : 1.136초
10만 건인 경우 수행시간 : 0.253초



3. ROWNUM을 이용한 페이징

SELECT * FROM (
SELECT ROWNUM AS RNUM, Z.* FROM (
SELECT * FROM OP_SAMPLE ORDER BY ID DESC
) Z WHERE ROWNUM <= 1000000
) WHERE RNUM >= 999991;

100만 건인 경우 수행시간 : 0.826초
10만 건인 경우 수행시간 : 0.087초



4. ROWNUM + 인덱스를 이용한 페이징

SELECT * FROM (
SELECT /*+ INDEX_DESC(Z OP_SAMPLE_PK) */ ROWNUM AS RNUM, Z.* FROM (
SELECT * FROM OP_SAMPLE
) Z WHERE ROWNUM <= 1000000
) WHERE RNUM >= 999991;

100만 건인 경우 수행시간 : 0.687초
10만 건인 경우 수행시간 : 0.079초



참고로 MySql 쿼리 조회시 (mysql 5, innoDB)

SELECT * FROM OP_SAMPLE
ORDER BY ID DESC LIMIT 999991, 10;

100만 건인 경우 수행시간 : 0.033초
Posted by 1010
02.Oracle/DataBase2013. 2. 5. 23:29
반응형

TOAD for Oracle Freeware 10.6 Free Download

Secure TOAD for Oracle Freeware Download Options

Download Now! TOAD for Oracle Freeware 10.6

More download options:

 

TOAD for Oracle Freeware 9.7

Thank you for downloading
Free Download

TOAD for Oracle Freeware 9.7


Simplify Oracle database administration tasks
  • Server 1 Brothersoft(US) Click to Download
  • Posted by 1010
    02.Oracle/DataBase2012. 10. 6. 01:03
    반응형

    Optimizer의 원리와 Tuning (상)

    Oracle Optimizer의 원리 이해 및 SQL & 애플리케이션의 튜닝(상):

    옵티마이저의 질의 처리 단계에 대한 이해

    오라클에서 사용하는 옵티마이저(Optimizer)는 크게 RBO(Rule Base Optimizer)와 CBO(Cost Base Optimizer) 2개로 구분된다. 1992년 Oracle 7에서 처음 CBO가 지원된 이래 새로운 기능들이 적용되면서 CBO가 계속 향상되고 있는 데 반해, RBO는 오라클이 더 이상은 추구하지 않는 옵티마이저로서, 현재의 Oracle Database 10g에서도 명맥은 남아 있지만 향후는 더 이상 지원되지 않을 것이다.

    옵티마이저의 입장에서 질의(query) 처리는 5단계로 나눌 수 있는데, 옵티마이저는 서브질의와 뷰의 병합(merge) 등을 수행하는‘Query Rewrite’단계와 ‘Query Optimization’단계에 참여한다. 여기서 옵티마이저는 ▲ 데이타를 어떠한 방법으로 액세스할 것이며 ▲ 올바른 결과를 어떻게 제공할 것이며 ▲ 데이타를 얼마나 효과적으로 액세스할 것인가를 결정한다. ‘QEP Generation’단계는‘Query Optimization’단계에서 제공된 정보를 이용해서 질의에 대한 최적의 실행계획(execution plan)을 만들어 내는 단계이다. CBO에서는 질의 실행계획(QEP)을 구하기 위하여 RBO보다 복잡한 단계를 거치게 된다<그림 1>, <표 1>.







    소프트 파싱과 하드 파싱

    SQL 문장이 옵티마이저에 의해 처리되고 그 결과물로서, SQL 문장이 어떻게 실행될 것인지의 정보, 즉, QEP가 생기게 된다. 이들 정보는 한번 쓰고 버리는 것이 아니라 오라클의 캐쉬(cache) 영역인 SGA의 공유 풀 (shared pool)에 이들 모든 정보를 캐쉬화해 관리한다. 다음 번에 같은 SQL 문장이 사용자에 의해서 실행되면, 이를 재활용하게 된다.

    SQL 문장이 실행되면, 우선 SQL 문장 텍스트의 스트링을 해쉬 함수를 통과시켜 결과 값에 해당되는 버킷(어레이형 구조)에 매달린 체인 정보에서 같은 SQL 문장이 존재하는지 찾는 처리절차를 수행하게 된다. 또한 같은 SQL 문장을 찾았어도 여러 버전이 존재할 수 있다. 여러 버전이란, 같은 SQL 문장(대/소문자, 화이트 스페이스 등이 모두 같아야 함)이지만 서로 다른 스키마의 테이블(예, scott의 emp, sys의 emp)이거나, 바인드 변수 를 사용한 경우는 바인드 변수의 타입, 길이 등에 의해서도 서로 다른 버전이 된다는 것이다. 이와 같이 같은 SQL 문장에 같은 버전을 찾았다면 이를 ‘소프트 파싱(soft parsing)’이라고 한다.

    그렇지만, 체인을 다 찾았는데 같은 문장을 발견하지 못했다면, 해당 SQL 문장이 Parsing/Optimizing 단계를 거친 결과로 나온 정보를 저장하기 위해 공유 풀로부터 메모리를 확보받고, 기록한 정보를 체인에 매달게 된다. 이를 ‘하드 파싱(hard parsing)’이라고 한다. 당연히 하드 파싱의 작업량이 소프트 파싱의 작업량에 비해 월등히 클 것이다<그림 2>.



    이와 같은 소프트 파싱과 하드 파싱의 과정을 생각해 볼 때, 집중적인 SQL 문장이 실행되는 OLTP(초당 수천 ~ 수만 개 이상)에서 하드 파싱이 많다면 어떻게 될까? 한정된 메모리인 캐쉬에 새로운 메모리를 계속 할당하고, LRU 알고리즘에 의해 제거하고, 체인에 매달고 끊는 등의 일들을 반복해야 할 것이다. 또한 하드 파싱은 복잡한 처리과정을 거치므로 많은 자원(CPU)을 사용하게 된다. 그러므로 OLTP 환경에서는 이와 같은 하드 파싱을 가능한 줄이도록 해야 한다. 특히 SQL 실행 규모가 큰 OLTP 업무는 1% 미만을 권장한다.

    애플리케이션을 개발할 때 이러한 하드 파싱을 줄이기 위한 방법으로 거의 대부분의 데이타베이스 접속 방식(JDBC, ODBC, ADO, PRO*C 등) 에서 자주 사용되는 SQL 문장들은 바인드 변수 기법들을 사용하여 개발하는 방법들을 제공하고 있다. 또한 일부에서는 소프트 파싱 자체도 줄일 수 있는 기법들을 제공하고 있다. 실제 이러한 기법을 적용해서 튜닝한 결과, 시스템 CPU/메모리 측면에서 40~50% 이상 개선된 사례가 많이 있다. 혹시 현재 운영중인 시스템이 사용자가 많아지면서 CPU 리소스가 급격히 증가해, 라이브러리 캐쉬, 공유 풀 경합 현상이 발생한다면, 이러한 점을 의심해 볼 수 있다.

    <표 4>는 SQL 문장을 바인드 변수를 사용한 공유 SQL과, 상수를 결합한 형태로 SQL 문장을 만들어 실행시키는 비공유 SQL을 9,999회 실행시켜 오라클의 공유 풀 메모리 사용현황과 파싱시 CPU 사용시간을 테스트 한 것이다(단, 그 결과치는 실행 서버별로 차이가 있다).



    결론적으로 보면, 비공유 SQL 방식의 사용 메모리와 CPU 사용률이 실행 규모에 비례해 증가하고, 실행된 SQL 문장이 기존에 캐쉬화되어 있는 SQL 문장들을 밀어내는 역할을 한다는 것을 알 수 있다.

    이와 같은 SQL 문장을 공유하기 위해서 오라클 입장에서 처리해주는 CURSOR_SHARING이라는 파라미터를 제공하기도 한다. 그러나, CURSOR_SHARING은 모든 상수를 다 바인드 변수로 바꿔버리기 때문에 개발자가 의도하지 않은 Literal까지도 바꾸게 되므로, 애플리케이션을 수정할 수 있다면 가능한 애플리케이션 단에서 바인드 변수를 사용하는 것이 효과적이다.

    하드 파싱을 줄이기 위해 모든 업무에 바인드 변수 사용방법을 적용하는 것은 잘못된 생각이다. 옵티마이저의 입장에서 보면, 바인드 변수 기법 보다는 Literal을 사용한 비공유 SQL 방식을 좋아한다. Literal SQL 문장일 경우는 상수 값에 따라서 범위를 정확히 알 수 있기 때문에 효과적인 플랜을 결정하는 주요 결정요소로 작용하기 때문이다. 즉 바인드 변수 기법은 옵티마이저의 판단에는 좋지 않지만 SQL 문장이 집중적으로 실행되는 OLTP 환경에서 하드 파싱의 비율을 줄이기 위한 방법인 것이다. 즉, 업무의 특징에 따라서 다른 적용방식이 사용되어야 한다. 다음은 OLTP와 DW의 특징에 따라 다르게 고려되어야 할 사항이다.

    • OLTP의특징
    - 목표 : 신속한 응답시간, 적은 데이타 처리량
    - 파싱 타임을 최소화하고 SQL 등이 공유될 수 있도록 바인드 변수를 사용해야한다.
    - 인덱스의 사용률이 높아야 한다.
    - 정렬(sorting)을 최소화해야 한다.
    - Nested Loop Join(FIRST_ROWS_n) 방식으로 많이 유도한다.

    • DW의특징
    - 목표 : 최고의 처리량, 방대한 데이타 처리량
    - 인덱스의 참조는 중요한 사항이 아니다.
    - 정렬 또는 Aggregate함수 등이 중요한 역할을 한다.
    - Hash Join 등을 많이 사용하도록 유도한다.
    - 파싱 타임 등은 그리 중요하지 않으며, 바인드 변수의 사용이 문제가 될 수 있다.

    - 병렬 질의 등의 사용률을 높인다.

    Rule Base Optimizer

    의 최적화(query optimization)에서 RBO(Rule Base Optimizer)는 정해진 랭킹(ranking)에 의해 플랜을 결정한다. 같은 랭킹이라면 Where 절의 뒤부터, From절 뒤의 객체가 우선 순위를 갖는다. 한 객체(예 : 테이 블)에서 같은 랭킹의 인덱스가 있다면 가장 최근에 만들어진 인덱스를 사 용한다. 이는 CBO(Cost Base Optimizer)에서도 같이 적용되는 사항이다.

    다분히 RBO는 개발자들이 프로그래밍 단계에서 SQL 문장 구조의 인위적인 조정 등으로 인덱스를 사용 못하게 하는 등 개발자가 코딩에 신경을 많이 써야 하는 문제점이 있다. 또한 RBO는 해당 질의에 대한 테이블의 인덱스가 존재한다면 전체 90% 이상의 대상이어도 인덱스를 선택한다는 것이다. 즉, RBO는 무조건 다음과 같은 미리 정해진 룰을 기준으로 플랜을 결정하게 된다. 1992년 Oracle 7에서 CBO가 지원되면서 CBO는 계속적인 신기능의 적용으로 발전해 온 반면, RBO는 더 이상의 기능 향상은 없으며, 향후는 CBO만 지원될 계획이다. 그러므로 RBO에 더 이상의 미련을 갖지 말기 바라며, CBO의 훌륭한 기능들을 적극 활용하길 바란다.

    다음은 RBO의 랭킹을 정리한 것이다.

    Path 1 : Single Row by Rowid
    Path 2 : Single Row by Cluster Join
    Path 3 : Single Row by Hash Cluster Key with Unique or Primary Key
    Path 4 : Single Row by Unique or Primary Key
    Path 5 : Clustered Join
    Path 6 : Hash Cluster Key
    Path 7 : Indexed Cluster Key
    Path 8 : Composite Index
    Path 9 : Single-Column Indexes
    Path 10 : Bounded Range Search on Indexed Columns
    Path 11 : Unbounded Range Search on Indexed Columns
    Path 12 : Sort-Merge Join
    Path 13 : MAX or MIN of Indexed Column
    Path 14 : ORDER BY on Indexed Column
    Path 15 : Full Table Scan

    특히 Path 8, 9, 10에 주의를 해야 한다. 예를 들면, ‘emp’ 테이블에 ‘A’ 인덱스가 “deptno”로 구성되어 있고, ‘B’ 인덱스가 “deptno + empno”로 구성되어 있다면, 다음과 같은 SQL 문장은 ‘A’ 인덱스를 사용 하게 된다. 조건이 Bounded Range Search(Between)로 왔기 때문에 아래의 SQL 문장에서 (A)와 (B)의 랭킹은 (A) ==> Rank 9 , (B) ==> Rank 10 조건이 되므로 싱글 칼럼 인덱스를 사용한다는 것이다.



    그러면, 이제CBO에 대해 살펴보기 전에, 참고로 RBO를 CBO로 전환한 사례를 잠깐 소개하겠다.

    현재 RBO를 사용하고 있는 상황에서 마이그래이션시 CBO로 전환하고 싶으나, 막연히 두려운 부분도 많을 것이다. 실제 RBO에서 CBO로 전환하고 나서 가장 효과를 보는 부분은 배치잡 형태이다. 특히 Oracle9i Database 이상의 WORKAREA_SIZE_POLICY=AUTO로 운영하는 곳 이라면 더욱 더 그럴 것이다. 그러나 OLTP의 변화는 조심해야 한다. 아래의 경우는, 이전하면서 옵티마이저 모드를 RBO에서 CBO로 전환한 것 뿐만 아니라, 블록 사이즈와 CBO 옵티마이저에 민감한 db_file_multi block_read_count 값도 크게 늘렸다. 특히 WORKAREA_SIZE_ POLICY=AUTO로 필요한 워킹 메모리(Sort, Hash, Bitmap 등)를 옵티마이저가 판단하에 가능한 충분히 사용하게 하는 방식을 사용하였다.

    그러다 보니, CBO에 영향을 주는 소트 메모리와 해쉬 메모리가 풍부하게 되었고, 블록 사이즈도 커졌으며, 풀 테이블 스캔의 정도를 결정하는 db_file_multiblock_read_count 값도 아주 커진 상태이다. 또한 마이그래이션되면서 데이타가 재정리되어 있는 상태이므로, 풀 테이블 스캔과 Sort Merge Join, Hash Join의 경향이 커진 상태이다. 그러므로 배치잡의 경우는 최적의 조건이 되었으나, 기존에 주로 Nested Loop Join을 선호하 던 RBO 환경의 OLTP들은 많은 플랜의 변화에 직면하게 된다. 그러면 이러한 부분을 어떻게 보정해 줄 것인가?

    optimizer_index_caching, optimizer_index_cost_adj의 파라미터가 그 해답일 것이다. 가능한 Nested Loop Join를 선호하고, CBO의 옵티마이저 모드가 인덱스에 점수를 더 주어서 인덱스의 비중을 키울 수가 있는 것이다. 물론 이러한 전환형태 말고 옵티마이저 모드를 FIRST_ROWS_n으로 운영하거나, 아웃라인을 이용하는 방법 등도 있을 것이다. 여러 방법이 있겠지만, 필자는 아래와 같은 방법을 선호한다.

    다음은 마이그래이션시 RBO에서 CBO로 전환한 사례이다.



    Cost Base Optimizer

    질의 최적화에서 CBO(Cost Base Optimizer)는 해당 SQL 문장이 참조하고 있는 객체들(테이블, 인덱스 등)에 대한 수집된 통계정보(statistics)의 값과 데이타베이스 파라미터(init.ora) 설정 값을 기초로 가장 적은 비용 (cost)이 발생되는 플랜을 결정하는 옵티마이저 방식이다.

    여기서 중요한 사실은 RBO에서는 전혀 사용되지 않았던 통계정보를 CBO에서는 이용한다는 것이다. 이들 통계정보는 DBA에 의해서 또는 자동 수집 기능(Oracle9i Database Release 2, Oracle Database10g)에 의해 객체들의 통계정보를 관리하는 시스템 딕셔널리(Dictionary)에 저장되고, 이 정보를 CBO 옵티마이저가 이용하는 것이다. 이들 정보는 SQL 문장을 실행하는 데 얼마만큼의 I/O 횟수가 발생할 것인가를 계산하기 위한 각종 데이타를 가지고 있다. 여기서 중요한 사실은 I/O 크기는 중요하지 않으며 I/O 횟수가 중요하다는 것이다. 즉, CBO 옵티마이저는 SQL 문장에 대한 여러 가지 경우의 수별로 I/O의 횟수에 비례한 비용을 산출해내고, 이들 비용에서 가장 작은 비용을 갖는 플랜을 결정한다는 것이다. 즉, 비용 은 I/O 횟수에 비례하는 값이라고 보면 쉬울 것이다.

    그러나, Oracle Database 10g부터는 비용의 단위 기준이 I/O에서 처리시간으로 바뀌었다(time base). 또한 Oracle9i Database부터 시스템 통계정보(CPU, 디스크 액세스 타임)를 이용해서 I/O로 환산한 방식을 제공하였으나, 이것은 단지 옵션이었다. 그러나, Oracle Database 10g부터는 시스템 통계정보(CPU, 디스크 액세스 타임)를 이용해서 처리시간으로 환산한 방식을 디폴트로 사용하므로 상당히 정확한 플랜을 만들어내며, 실행 예측 시간도 상당히 정확하다.

    그러면, 여기서 잠깐 CBO에서 사용되는 통계정보가 저장된 Dictinary 정보 예를 참고로 살펴보자.

    [USER|ALL|DBA]_TABLES : Table의 통계정보
    NUM_ROWS,BLOCKS,AVG_ROW_LEN,SAMPLE_SIZE,LAST_ANALYZED

    [USER|ALL|DBA]_INDEXES : Index의 통계정보
    BLEVEL,LEAF_BLOCKS,DISTINCT_KEYS,AVG_LEAF_BLOCKS_PER_KEY,
    AVG_DATA_BLOCKS_PER_KEY,CLUSTERING_FACTOR,NUM_ROWS,SAMPLE_SIZE,
    LAST_ANALYZED

    [USER|ALL|DBA]_TAB_COLUMNS : Column의 통계정보
    NUM_DISTINCT,LOW_VALUE,HIGH_VALUE,DENSITY,NUM_NULLS,NUM_BUCKETS,
    LAST_ANALYZED,SAMPLE_SIZE,AVG_COL_LEN

    [USER|ALL|DBA]_TAB_HISTOGRAMS : Column의Data 분포도 정보
    TABLE_NAME,COLUMN_NAME,ENDPOINT_NUMBER,ENDPOINT_VALUE,
    ENDPOINT_ACTUAL_VALUE

    기타 파티션 / 클러스터 등에 대한 통계정보

    그러면“select * from dept where deptno = 10”과 같은 SQL 문장을 실행해야 한다고 가정하자. 여기서 dept Table은 deptno에 대한 인덱스가 있고, 테이블은 전체 10 블록으로 구성되어 있으며, 풀 테이블 스캔일 경우 I/O 단위를 결정하는 파라미터는 DBA가 db_file_multiblock_read_count=8로 지정하여 운영하고 있다고 가정하자 . 여기서 RBO라면 무조건 인덱스를 타는 플랜을 결정하였을 것이다.

    그러나, CBO의 경우는 deptno의 인덱스를 이용해 실행하면, 3회(인덱스는 싱글 블록 단위 I/O)의 I/O가 발생한다고 가정하고, 풀 테이블 스캔의 경우는 2회(8블록 + 2블록)의 I/O가 발생한다고 가정하면, CBO에서는 인덱스가 있음에도 I/O 횟수 측면에서 더 효과적인 풀 테이블 스캔을 선택한다는 것이다. 그러므로 CBO는 이와 같이 가능한 정확한(현실 데이타와 맞는) 통계정보와 적절한 데이타베이스의 파라미터인 init.ora에 의해 플랜이 결정되는 것이다.

    CBO에서만 가능한 기능들

    CBO는 오라클의 신기능을 지원하도록 지속적으로 발전하고 있으며, 다음의 경우는 반드시 CBO에서만 플랜 결정시 검토되거나 무조건 CBO로 동작되는 경우이다. 예를 들어, 파티션 테이블을 사용한다면 통계정보가 없더라도 무조건 CBO로 동작된다는 것이다.

    • Partitioned tables (*)
    • Index-organized tables
    • Reverse key indexes
    • Function-based indexes
    • SAMPLE clauses in a SELECT statement (*)
    • Parallel execution and parallel DML
    • Star transformations
    • Star joins
    • Extensible optimizer
    • Query rewrite (materialized views)
    • Progress meter
    • Hash joins
    • Bitmap indexes
    • Partition views (release 7.3)
    • Hint (*)
    • Parallel DEGREE & INSTANCES - ‘DEFAULT’도 해당 (*)

    CBO의 옵티마이저에 영향을 줄 수 있는 파라미터

    옵티마이저가 플랜을 수립하는 데 영향을 줄 수 있는 파라미터 값이 무엇인지를 알고 있는 것이 무엇보다 중요하다. 실제 옵티마이저가 참조하는 파라미터는 Oracle9i Database 기준으로 보더라도 60여 개에 이른다. 특히 DBA는 이들 옵티마이저의 파라미터 설정에 신중해야 한다. 또한 이들 파라미터의 효과적인 설정은 개발 중이거나, 마이그래이션 중에 업무의 특징을 판단한 다음, 해당 업무에 가장 효과적인 것을 설정해야 한다. 기준이 잘못되면 개발자들은 SQL 문장마다 힌트를 넣기 바쁠 것이고, 많은 인적 자원을 튜닝에 소모해야 할 것이다. 그러므로 대부분의 업무들이 최적화되어 잘 운영될 수 있는 형태로 이들 파라미터를 바꿔가면서 기준을 정하는 것이 중요하다. 물론 이들 값보다도 CBO에서 사용되는 통계정보가 중요하다는 것은 당연한 사실이다. 오라클에서는 개발장비에도 운영장비에 있는 통계정보와 같게 운영할 수 있도록 DBMS_STATS 패키지를 제공한다.

    다음은 질의 수행시 옵티마이저가 플랜을 수립하기 위해 참조한 파라미터 중 일부이다(버전마다 다르다).

    OPTIMIZER_PERCENT_PARALLEL (Default = 0)
    Optimizer_Percent_Parallel의 Parameter는 CBO가 비용을 계산하는 데 영향을 주는 파라미터이다. 즉 수치가 높을수록 병렬성을 이용하여 풀 테이블 스캔으로 테이블을 액세스하려고 한다. 이 값이 0인 경우는 최적의 시리얼 플랜이나 패러렐 플랜을 사용하며, 1~100일 경우는 비용 계산에서 객체의 등급을 사용한다.

    OPTIMIZER_MODE (Default=Choose(Oracle7 ~ Oracle9i
    Database),ALL_ROWS)
    {Choose(<=9i)|Rule(<=9i)|First_rows|First_rows_n(> =Oracle9i)|All_rows}

    기본적인 옵티마이저 모드를 결정한다 (왼쪽상자 기사 ‘옵티마이저 모드의 종류 및 특징’ 참조).

    HASH_AREA_SIZE, HASH_JOIN_ENABLED (Oracle Database 10g : _ hash_join_enabled=true)
    위의 파라미터 값에 따라서 Hash Join으로 유도할 수 있다. Hash Join이 가능하고 해쉬 메모리가 충분하다면, 플랜에 Hash Join의 경향이 커진다.

    OPTIMIZER_SEARCH_LIMIT (Default = 5)
    옵티마이저에게 조인 비용을 계산할 경우, From절에 나오는 테이블의 개수에 따라서 조인의 경우의 수가 있을 수 있으며, 옵티마이저는 이들 각각의 경우의 수에 대한 조인 비용을 계산하게 된다. 물론 일부 예외사항은 있다. 예를 들어, Cartesian Production Join 등은 우선 순위가 낮으므로 뒤로 미뤄질 것이다. 이 파라미터의 값이 5일 경우 From절에 5개의 테이블에 대해서 모든 조인의 경우의 수를 가지고 비용을 계산하게 되며, 그 개수는 5!=120개의 경우의 수 에 대한 조인 비용을 계산하게 되므로 옵티마이저가 많은 시간을 소모하게 되므로 성능에 영향을 미칠 수도 있다.

    SORT_AREA_SIZE , SORT_MULTIBLOCK_READ_COUNT
    위의 파라미터의 값에 따라서 Sort Merge Join으로 유도할 수 있다. 소트 메모리가 충분하다면, 플랜에 Sort Merge Join의 경향이 커진다.

    DB_FILE_MULTIBLOCK_READ_COUNT
    이 파라미터의 수치가 클수록 인덱스 스캔보다는 풀 테이블 스캔의 비중이 높아진다. 이 파라미터는 옵티마이저의 플랜 결정에 민감하게 영향을 주는 값이다. 즉, 이 값이 커지면 풀 테이블 스캔과 병행해서 Sort Merge Join 또는 Hash Join의 경향이 커진다.

    OPTIMIZER_INDEX_CACHING (Default = 0)
    CBO가 Nested Loop Join을 선호하도록 조절하는 파라미터, Nested Loop Join시 버퍼 캐쉬 내에 이너 테이블의 인덱스를 캐쉬화하는 비율(%)을 지정하므로 Nested Loop Join시 성능이 향상되며, 옵티마이저는 비용 계산시 이 비율을 반영하여 Nested Loop Join을 선호하도록 플랜이 선택된다(0~100). 100에 근접할수록 인덱스 액세스 경로가 결정될 가능성이 높다. 기존의 RBO를 CBO로 전환시 옵티마이저를 RBO 성향으로 보정하는 데 효과적이다.

    OPTIMIZER_INDEX_COST_ADJ (Default = 100)
    옵티마이저가 인덱스를 사용하는 위주의 플랜으로 풀릴 것인지 또는 가능한 사용하지 않을 쪽으로 풀릴 것인지의 비중을 지정한다. CBO는 RBO처럼 인덱스를 사용하도록 플랜이 주로 만들어지게 되나, 인덱스가 있다고 해서 RBO처럼 인덱스를 이용한 플랜으로 처리되는 것은 아니다. 인덱스를 이용하는 플랜 위주로 하고자 한다면 100(%) 이하를, 가능한 인덱스를 사용하지 않고자 한다면 100 이상을 지정한다(1 ~ 10000). 이 파라미터는 기존의 RBO를 CBO로 전 환시 옵티마이저를 RBO의 인덱스 위주 성향으로 보정하는데 효과적이다.

    WORKAREA_SIZE_POLICY (AUTO | MANUAL)

    옵티마이저가 [HASH|SORT|BITMAP_MERGE|CREATE_ BITMAP] *_AREA_SIZE를 자동으로 결정하는 PGA 자동 관리 방식으로, 인스턴스에 속한 모든PGA의 메모리의 합이PGA_AGGREGATE_TARGET에서 설정된 메모리를 가능한 넘지 않는 범위 내에서 Workarea(Sort, Hash, Bitmap 등)를 충분히 사용하고자 하는 방식이다. 플랜은 할당된 Workarea를 가지고 플랜을 결정하게 되므로 풍부한 메모리에 의해 Hash Join, Sort Merge Join등을 선호하는 경향이 높다. 내부적으로 히든 파라미터로 *_AREA_SIZE의 값을 가지고 플랜을 결정할 수도 있으나 인위적인 설정 없이는 자동 할당된 메모리로 플랜이 결정된다.

    OPTIMIZER_DYNAMIC_SAMPLING (Default = 1(Oracle9i Database), 2(Oracle Database 10g))

    더 나은 플랜을 결정하기 위한 목적으로 더 정확한 Selectivity & Cardinality 를 구하기 위한 방법으로 0 ~ 10 레벨이 있으며, 레벨이 높을수록 SQL 문장의 실행 시점에 통계정보를 만들기 위해 테이블의 데이타를 샘플링하기 위한 추가적인 Recursive SQL이 발생된다.

    DYNAMIC_SAMPLING(0 ~ 10) 힌트를 통해서도 같은 기능을 할 수 있다. 그러나 내부적으로 추가적인 테이블 액세스 의 비용이 발생하므로OLTP에서는 주로 사용하지 않는다. 특히OLTP 환경에 서 레벨을 디폴트 값 이상 높여 놓지 않도록 한다. Oracle Database 10g의 경우 통계정보가 없다면 ‘다이나믹 샘플링’이 적용된다.


    다음은 Oracle Database 10g의 플랜 및 다이나믹 샘플링의 예이다.

    옵티마이저 모드의 종류 및 특징

    • 인스턴스 레벨 : optimizer_mode = {Choose|Rule|First_rows| First_rows_n| All_rows}

    • 세션 레벨 : 인스턴스 레벨에 우선
    ALTER SESSION SET optimizer_mode =
    {Choose|Rule|First_rows|First_rows_n|All_rows}

    • 스테이트먼트 레벨 : 힌트를 사용하며, 인스턴스, 세션 레벨에 우선

    • Oracle9i Database에서 FIRST_ROWS_n 옵티마이저 모드가 추가되었음(N : 1, 10, 100, 1000).

    • Oracle Database 10g에서는 CHOOSE, RULE 모드는 더 이상 지원되지 않으나, 기능은 남아있다.

    • OPTIMIZER_MODE=CHOOSE 일경우
    통계정보가 없다면 기본적으로 RBO로 플랜이 결정된다. 그러나, ‘RULE’, ‘DRIVING_SITE’ 힌트 이외의 힌트가 왔다면 CBO로 결정된다(힌트는 룰의 규정을 깨므로 CBO로 동작됨).

    • Parallel Degree, Partition Table, SAMPLE절 등이 있으면 무조건 CBO

    • OPTIMIZER_MODE=First_rows|First_rows_n|All_rows일 경우 통계 정보의 존재 여부와 관계 없이 무조건 CBO로 처리하려고 함.

    통계정보가 없다면 Heuristics Value를 이용하거나, Oracle9i Database 이상일 경우는 다이나믹 샘플링의 레벨에 따라 테이블의 데이타를 샘플링해서 CBO로 플랜이 결정된다. 그러나, 플랜이 비효율적일 수 있다.

    • 통계정보가 있으나 옵티마이저 모드가 RULE일 경우, 다른 힌트가 오지 않은 경우와 Parallel Degree, Partition Table, SAMPLE절 등이 나오지 않은 경우는 RBO로 처리된다.

    CBO를 위한 통계정보 운영 방법

    통계정보는 CBO의 플랜 결정에 사용되는 객체들의 물리적인 구성정보를 나타낸다. 즉, 테이블이 몇 블록으로 구성되어 있으며, 몇 건의 로우들을 가지고 있으며, 평균 로우 길이는 어느 정도이며, 칼럼의 Min/Max 값의 분포, Distinct 값, 인덱스의 레벨, 키(key)당 Leaf Block 수 등의 정보들을 나타낸다. 이들 정보는 CBO의 플랜 결정의 기초 자료로 사용된다. 이들 통계정보를 생성하기 위해서는 ANALYZE 명령어를 이용하거나 DBMS_STATS 패키지를 이용하면 된다. 그러나 2개의 차이점에 주의해야 하며, DBMS_STATS를 지원하는 Oracle8i Database 이상부터는 DBMS_STATS를 사용하기를 권장하고 있다.

    Analyze 명령어와 DBMS_STATS의 차이점

    Analyze는 Serial Statistics Gathering 기능만 있는 반면, DBMS_STATS은 Parallel Gathering 기능이 있다.

    Analyze는 파티션의 통계정보를 각 파티션 테이블과 인덱스에 대해서 수집하고, Global Statistics는 파티션 정보를 가지고 계산하므로, 비정확할 수 있다. 그러므로 파티션 또는 서브파티션이 있는 객체에는 DBMS_STATS를 사용하여야 한다.

    DBMS_STATS은 전체 클러스터에 대해서는 통계정보를 수집하지 않는다. 그러므로 Analyze를 사용한다.

    DBMS_STATS은 CBO와 관련된 통계정보만을 수집한다. 즉, 테이블의 EMPTY_BLOCKS, AVG_SPACE,CHAIN_CNT 등은 수집되지 않는다.

    DBMS_STATS은 사용자가 지정한 통계정보 테이블에 수집된 통계정보를 저장할 수 있고, 딕셔너리로 각 칼럼, 테이블, 인덱스, 스키마 등을 반영할 수 있다.

    DBMS_STATS IMPORT/EXPORT 기능 및 추가적인 기능이 많다. 이 기능을 이용하여 운영 DB의 통계정보를 개발장비의 통계정보로 복사할 수 있으므로 개발장비의 플랜을 운영장비와 같게 만들 수 있다(매뉴얼 참조).

    다음은 Analyze 명령어에만 있는 기능이다.

    • Structural Integrity Check 기능
    analyze { index/table/cluster } (schema.){ index/table/cluster } validate structure (cascade) (into schema.table);

    • Chained Rows 수집 기능
    ANALYZE TABLE order_hist LIST CHAINED ROWS INTO ;

    시스템 통계정보 (>= Oracle9i Database)

    시스템 통계정보는 객체의 통계정보와 같이 사용되는 정보로서, 기존의 Oracle8i Database까지의 I/O 중심의 플랜 방식에 CPU와 디스크 I/O 속도와 같은 시스템 자원의 효율을 반영하여 보다 효율적인 플랜을 결정하기 위한 방법으로, Oracle9i Database에서 처음 소개되었으며, 옵션 기능으로 DBA에 의해 사용될 수도 있고 사용하지 않을 수도 있었다. Oracle Database 10g에서는 시스템 통계정보가 기본적으로 수집되고 사용된다. 그러므로 기존의 I/O 횟수만 가지고 플랜을 결정하던 부분이 Oracle Database 10g에서는 시스템의 자원의 성능도 고려되어 보다 정확한 플랜을 결정할 수 있게 되었다.

    이들 시스템 통계정보는 DBMS_STATS 패키지를 이용해서 수집된다.

    Oracle Database 10g에서는 기본적으로 수집되는 값들이 있으며, 또한 사용자가 수집해야 하는 항목도 있다. 다음은 Oracle Database 10g의 시스템 통계정보의 수집형태를 보여주고 있다.



    더 자세한 내용 : 오라클 매뉴얼 [Database Performance Tuning Guide and Reference]

    http://munduki.tomeii.com/darkhorse/entry/ORACLE-Oracle-Optimizer의-원리-이해-및-SQL-애플리케이션의-튜닝 상

    Posted by 1010
    02.Oracle/DataBase2012. 9. 21. 06:30
    반응형


     

    1. Ranking Family

    (1) RANK() - 상위 순으로 등수를 부여하는 경우 정렬 결과를 기준으로 전체 순위를 출력

    ☞사용법

    RANK() OVER(

    [PRTITION BY < value expression1>] [,...]

    ODER BY<value expression2> [collate clause] [ASC:DESC]

    [NULLS FIRST:NULLS LAST])

    OVER : 순위를 부여하기 위한 대상 집합의 정렬 기준과 분할 기준 정의

    PARTITION BY : value expression1을 기준으로 분할, 생랼하면 전체 집합을 대상으로 순위부여

    ODER BY : 각 분할내에서 데이터를 정렬하는 기준 칼럼 지정

    NULLS FIRST|NULLS LAST : 정렬 결과에서 NULL값의 위치 지정


    (2) DENSE_RANK() - RNAK함수의 변형 동일 순위를 무시한 연속 순위를 출력
    RNAK함수는 1등이 2건인 경우 다음순위를 3등으로 부여 하지만, DENSE_RANK 함수는 다음순위를 2등으로 부여한다.

    질의

    SELECT id,score,
    rank()over(ORDER BY score ASC)as rank,
    dense_rank() over(order by score asc)as dense_rank
    From ksdb_score;

    결과
    ID SCORE RANK DENSE_RANK
    --------- ---------- ---------- ----------
    200040394 83 1 1
    200020182 88 2 2
    200231047 89 3 3
    200020182 90 4 4
    200020183 90 4 4
    200020183 92 6 5
    200172058 93 7 6
    200040394 95 8 7


    (3) CUME_DIST()- 그룹 값 내에서 어떤 값의 cumulative distribution(누적분포)을 계산

    ☞사용법

    CUME_DIST(expr)


    (4) PERCENT_RANK()-


    (5) NTILE() - 출력결과를 사용자가 지정한 그룹 수로 나누어 출력

    ☞사용법

    NITLE(expr) OVER(

    [PARTITION BY< value expression1>][,...]

    ORDER BY <value espression2> [collate clause] [ASC : DESC]

    [NULLS FIRST:NULLS LAST])


    질의

    SELECT Cid,bday,
    NTILE(3) OVER(ORDER BY bday) class
    FROM ksdb_customer_info;

    결과

    CID BDAY CLASS
    ------ -------- ----------
    100004 60/05/02 1
    100010 72/08/02 1
    100011 74/09/21 1
    100006 75/04/05 1
    100001 75/07/01 2
    100002 77/02/01 2
    100007 80/01/04 2
    100003 80/01/25 2

    100009 81/01/30 3
    100005 82/06/01 3
    100008 85/04/04 3

    11 개의 행이 선택되었습니다.

    (6) ROW_NUMBER() - 분할별로 정렬된 결과에 대해 순위를 부여하는 기능 분할은 전체 행을 특정 칼럼을 기준으로 분리하는 기능으로 GROUP BY 절에서 그룹화하는 방법과 같은 개념

    ☞사용법

    ROW_NUMBER() OVER(

    [PARTITION BY< value expression1>][,...]

    ORDER BY <value espression2> [collate clause] [ASC : DESC]

    [NULLS FIRST:NULLS LAST])

    질의

    SELECT id,score,
    RANK()OVER(ORDER BY score ASC)as rank,
    DENSE_RANK()OVER(order by score asc)as dense_rank,
    ROW_NUMBER()OVER(order by score asc)as row_number
    From ksdb_score;

    결과
    ID SCORE RANK DENSE_RANK ROW_NUMBER
    --------- ---------- ---------- ---------- ----------
    200040394 83 1 1 1
    200020182 88 2 2 2
    200231047 89 3 3 3
    200020182 90 4 4 4
    200020183 90 4 4 5
    200020183 92 6 5 6
    200172058 93 7 6 7
    200040394 95 8 7 8

    8 개의 행이 선택되었습니다.

    ↑RANK나 DENSE_RANK에서는 점수가 같으면 순위가 같게4,4 나오지만 ROW_NUMBER에서는 순서대로 4,5 로 번호를 부여한다.

    2. Aggregate Family

    (1) SUM(), AVG(), MAX(), MIN()

    ☞사용법

    AVG([DISTINCT|ALL] expr)

    SUM([DISTINCT|ALL] expr)


    expr의 데이터 타입은 NUMBER 데이터 타입만 가능

    (2) COUNT() - 테이블에서 조건을 만족하는 행의 개수를 반환

    COUNT(*)는 NULL을 가진 행과 중복되는 행을 모두 포함하는 행의 수를 계산

    COUNT(expression)는 NULL을 가진 행을 제외한 행의 수를 계산하여 반환

    (3) STDDEV() VARIANCE() - 인수로 지정된 칼럼에 대해 조건을 만족하는 행을 대상으로 표준편차와 분산을 구하는 함수로 숫자 데이터 타입에만 사용할 수 있으며, NULL 은 계산에서 제외된다.

    (4)RATIO_TO_REPORT()

    3. Lead/Lag Family

    LEAD() LAG() - 동일한 테이블에 있는 다른 행의 값을 참조하기 위한 함수

    LAG 분석함수는 현재 행을 기준으로 이전값을 참조

    LEAD 분석함수는 현재 행을 기준으로 이후값을 참조

    LEAD LAG 분석함수에서 지정하는 인수는 현재행을 기준으로 몇 번째 행을 참조할 것인지를 지정

    음수는 사용할 수 없다.

    ☞사용법

    ROW_NUMBER() OVER(

    [PARTITION BY< value expression1>][,...]

    ORDER BY <value espression2> [collate clause] [ASC : DESC]

    [NULLS FIRST:NULLS LAST])


    질의

    SELECT id,score,
    LEAD(score, 1)OVER(ORDER BY score)as next_score,
    LAG(score,1)OVER(order by score)as prev_score
    From ksdb_score;

    결과

    ID SCORE NEXT_SCORE PREV_SCORE
    --------- ---------- ---------- ----------
    200040394 83 88
    200020182 88 89 83 ←88 이후 점수 : 89
    200231047 89 90 88 88 이전 점수 : 83
    200020182 90 90 89
    200020183 90 92 90
    200020183 92 93 90
    200172058 93 95 92
    200040394 95 93

    8 개의 행이 선택되었습니다.

    [출처] 분석함수|작성자 은영

    Posted by 1010
    02.Oracle/DataBase2012. 9. 21. 05:34
    반응형

    Oracle PIVOT

    A common requirement for queries is to turn rows into columns, or the other way around.

    In Excel, we can do this using TRANSPOSE, a bit of patience & know-how, and ctrl+shift+enter.


    In Oracle, if we have aggregate data displaying months by row, the old way was to use a bunch of DECODEs (or similar)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    SELECT t.name
    ,SUM (DECODE (TO_CHAR (e.start_date,'mon'),'jan',1,0)) jan
    ,SUM (DECODE (TO_CHAR (e.start_date,'mon'),'feb',1,0)) feb
    ,SUM (DECODE (TO_CHAR (e.start_date,'mon'),'mar',1,0)) mar
    ,SUM (DECODE (TO_CHAR (e.start_date,'mon'),'apr',1,0)) apr
    ,SUM (DECODE (TO_CHAR (e.start_date,'mon'),'may',1,0)) may
    ,SUM (DECODE (TO_CHAR (e.start_date,'mon'),'jun',1,0)) jun
    ,SUM (DECODE (TO_CHAR (e.start_date,'mon'),'jul',1,0)) jul
    ,SUM (DECODE (TO_CHAR (e.start_date,'mon'),'aug',1,0)) aug
    ,SUM (DECODE (TO_CHAR (e.start_date,'mon'),'sep',1,0)) sep
    ,SUM (DECODE (TO_CHAR (e.start_date,'mon'),'oct',1,0)) oct
    ,SUM (DECODE (TO_CHAR (e.start_date,'mon'),'nov',1,0)) nov
    ,SUM (DECODE (TO_CHAR (e.start_date,'mon'),'dec',1,0)) dec
    FROM events e, bookings b, resources r, resource_types t
    WHERE e.event_no = b.event_no
    AND r.code = b.resource_code
    AND r.type_code = t.code
    GROUP BY t.name;
    NAME JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC
    -------------------- --- --- --- --- --- --- --- --- --- --- --- ---
    Catering 0 0 2 1 0 0 0 0 0 0 0 0
    Stationary 0 0 1 1 0 0 0 0 0 0 0 0
    Video equipment 0 0 1 1 1 0 0 0 1 0 0 0
    Audio equipment 0 0 0 0 0 0 0 0 0 1 0 0
    Computer equipment 0 0 1 0 0 0 0 0 0 0 0 0
    Locations 0 0 2 2 2 1 1 1 1 1 0 0
    6 rows selected

    Oracle 11g introduced pivot queries.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    SELECT * FROM
    ( SELECT COUNT(*) c, t.name, TO_CHAR(start_date,'mon') mth
    FROM events e, bookings b, resources r, resource_types t
    WHERE e.event_no = b.event_no
    AND r.code = b.resource_code
    AND r.type_code = t.code
    GROUP BY t.name, to_char(start_date,'mon')
    )
    PIVOT
    (SUM(c) -- Add up all my counts
    FOR mth -- Transposing the months
    IN ('jan' as jan
    ,'feb','mar','apr','may','jun'
    ,'jul','aug','sep','oct','nov','dec')
    );
    NAME JAN 'feb' 'mar' 'apr' 'may' 'jun' 'jul' 'aug' 'sep' 'oct' 'nov' 'dec'
    -------------------- --- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----
    Catering 2 1
    Stationary 1 1
    Video equipment 1 1 1 1
    Audio equipment 1
    Computer equipment 1
    Locations 2 2 2 1 1 1 1 1
    6 rows selected
    Note line 12 where we can provide column aliases to the fresh output.

    As with most esoteric SQL functions, there are quite a few good examples on the web that I'm not out to emulate - the prime purpose of this post was to help remind me what's going on.
    That being said, Tim Hall and Arup Nanda have the most concise articles.

    I particularly like Lucas Jellema's example linked by Arup using
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    select value
    from
    (
    (
    select
    'a' v1,
    'e' v2,
    'i' v3,
    'o' v4,
    'u' v5
    from dual
    )
    unpivot
    (
    value
    for value_type in
    (v1,v2,v3,v4,v5)
    )
    )
    /
    I wonder if that might be an interesting catalyst in some future queries

     

    출처 : http://www.grassroots-oracle.com/2012/05/oracle-pivot.html 

    Posted by 1010
    02.Oracle/DataBase2012. 9. 21. 05:30
    반응형

    pivot and unpivot queries in 11g

    Pivot queries involve transposing rows into columns (pivot) or columns into rows (unpivot) to generate results in crosstab format. Pivoting is a common technique, especially for reporting, and it has been possible to generate pivoted resultsets with SQL for many years and Oracle versions. However, the release of 11g includes explicit pivot-query support for the first time with the introduction of the new PIVOT and UNPIVOT keywords. These are extensions to the SELECT statement and we will explore the syntax and application of these new features in this article.

    pivot

    We will begin with the new PIVOT operation. Most developers will be familiar with pivoting data: it is where multiple rows are aggregated and transposed into columns, with each column representing a different range of aggregate data. An overview of the new syntax is as follows:

    SELECT ...
    FROM   ...
    PIVOT [XML]
       ( pivot_clause
         pivot_for_clause
         pivot_in_clause )
    WHERE  ...
    

    In addition to the new PIVOT keyword, we can see three new pivot clauses, described below.

    • pivot_clause: defines the columns to be aggregated (pivot is an aggregate operation);
    • pivot_for_clause: defines the columns to be grouped and pivoted;
    • pivot_in_clause: defines the filter for the column(s) in the pivot_for_clause (i.e. the range of values to limit the results to). The aggregations for each value in the pivot_in_clause will be transposed into a separate column (where appropriate).

    The syntax and mechanics of pivot queries will become clearer with some examples.

    a simple example

    Our first example will be a simple demonstration of the PIVOT syntax. Using the EMP table, we will sum the salaries by department and job, but transpose the sum for each department onto its own column. Before we pivot the salaries, we will examine the base data, as follows.

    SQL> SELECT job
      2  ,      deptno
      3  ,      SUM(sal) AS sum_sal
      4  FROM   emp
      5  GROUP  BY
      6         job
      7  ,      deptno
      8  ORDER  BY
      9         job
     10  ,      deptno;
    
    
    JOB           DEPTNO    SUM_SAL
    --------- ---------- ----------
    ANALYST           20       6600
    CLERK             10       1430
    CLERK             20       2090
    CLERK             30       1045
    MANAGER           10       2695
    MANAGER           20     3272.5
    MANAGER           30       3135
    PRESIDENT         10       5500
    SALESMAN          30       6160
    
    9 rows selected.
    

    We will now pivot this data using the new 11g syntax. For each job, we will display the salary totals in a separate column for each department, as follows.

    SQL> WITH pivot_data AS (
      2          SELECT deptno, job, sal
      3          FROM   emp
      4          )
      5  SELECT *
      6  FROM   pivot_data
      7  PIVOT (
      8             SUM(sal)        --<-- pivot_clause
      9         FOR deptno          --<-- pivot_for_clause
     10         IN  (10,20,30,40)   --<-- pivot_in_clause
     11        );
    
    
    JOB               10         20         30         40
    --------- ---------- ---------- ---------- ----------
    CLERK           1430       2090       1045
    SALESMAN                              6160
    PRESIDENT       5500
    MANAGER         2695     3272.5       3135
    ANALYST                    6600
    
    5 rows selected.
    

    We can see that the department salary totals for each job have been transposed into columns. There are a few points to note about this example, the syntax and the results:

    • Line 8: our pivot_clause sums the SAL column. We can specify multiple columns if required and optionally alias them (we will see examples of aliasing later in this article);
    • Lines 1-4: pivot operations perform an implicit GROUP BY using any columns not in the pivot_clause (in our example, JOB and DEPTNO). For this reason, most pivot queries will be performed on a subset of columns, using stored views, inline views or subqueries, as in our example;
    • Line 9: our pivot_for_clause states that we wish to pivot the DEPTNO aggregations only;
    • Line 10: our pivot_in_clause specifies the range of values for DEPTNO. In this example we have hard-coded a list of four values which is why we generated four pivoted columns (one for each value of DEPTNO). In the absence of aliases, Oracle uses the values in the pivot_in_clause to generate the pivot column names (in our output we can see columns named "10", "20", "30" and "40").

    It was stated above that most pivot queries will be performed on a specific subset of columns. Like all aggregate queries, the presence of additional columns affects the groupings. We can see this quite simply with a pivot query over additional EMP columns as follows.

    SQL> SELECT *
      2  FROM   emp
      3  PIVOT (SUM(sal)
      4  FOR    deptno IN (10,20,30,40));
    
         EMPNO ENAME      JOB              MGR HIREDATE         COMM         10         20         30         40
    ---------- ---------- --------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
          7654 MARTIN     SALESMAN        7698 28/09/1981       1400                             1375
          7698 BLAKE      MANAGER         7839 01/05/1981                                        3135
          7934 MILLER     CLERK           7782 23/01/1982                  1430
          7521 WARD       SALESMAN        7698 22/02/1981        500                             1375
          7566 JONES      MANAGER         7839 02/04/1981                           3272.5
          7844 TURNER     SALESMAN        7698 08/09/1981          0                             1650
          7900 JAMES      CLERK           7698 03/12/1981                                        1045
          7839 KING       PRESIDENT            17/11/1981                  5500
          7876 ADAMS      CLERK           7788 23/05/1987                             1210
          7902 FORD       ANALYST         7566 03/12/1981                             3300
          7788 SCOTT      ANALYST         7566 19/04/1987                             3300
          7782 CLARK      MANAGER         7839 09/06/1981                  2695
          7369 SMITH      CLERK           7902 17/12/1980                              880
          7499 ALLEN      SALESMAN        7698 20/02/1981        300                             1760
    
    14 rows selected.
    

    In this case, all the EMP columns apart from SAL have become the grouping set, with DEPTNO being the pivot column. The pivot is effectively useless in this case.

    An interesting point about the pivot syntax is its placement in the query; namely, between the FROM and WHERE clauses. In the following example, we restrict our original pivot query to a selection of job titles by adding a predicate.

    SQL> WITH pivot_data AS (
      2          SELECT deptno, job, sal
      3          FROM   emp
      4          )
      5  SELECT *
      6  FROM   pivot_data
      7  PIVOT (
      8             SUM(sal)        --<-- pivot_clause
      9         FOR deptno          --<-- pivot_for_clause
     10         IN  (10,20,30,40)   --<-- pivot_in_clause
     11        )
     12  WHERE  job IN ('ANALYST','CLERK','SALESMAN');
    
    
    JOB                10         20         30         40
    ---------- ---------- ---------- ---------- ----------
    CLERK            1430       2090       1045
    SALESMAN                               6160
    ANALYST                     6600
    
    3 rows selected.
    

    This appears to be counter-intuitive, but adding the predicates before the pivot clause raises a syntax error. As an aside, in our first example we used subquery factoring (the WITH clause) to define the base column set. We can alternatively use an inline-view (as follows) or a stored view (we will do this later).

    SQL> SELECT *
      2  FROM  (
      3         SELECT deptno, job, sal
      4         FROM   emp
      5        )
      6  PIVOT (SUM(sal)
      7  FOR    deptno IN (10,20,30,40));
    
    
    JOB               10         20         30         40
    --------- ---------- ---------- ---------- ----------
    CLERK           1430       2090       1045
    SALESMAN                              6160
    PRESIDENT       5500
    MANAGER         2695     3272.5       3135
    ANALYST                    6600
    
    5 rows selected.
    

    aliasing pivot columns

    In our preceding examples, Oracle used the values of DEPTNO to generate pivot column names. Alternatively, we can alias one or more of the columns in the pivot_clause and one or more of the values in the pivot_in_clause. In general, Oracle will name the pivot columns according to the following conventions:

    Pivot Column Aliased? Pivot In-Value Aliased? Pivot Column Name
    N N pivot_in_clause value
    Y Y pivot_in_clause alias || '_' || pivot_clause alias
    N Y pivot_in_clause alias
    Y N pivot_in_clause value || '_' || pivot_clause alias

    We will see examples of each of these aliasing options below (we have already seen examples without any aliases). However, to simplify our examples, we will begin by defining the input dataset as a view, as follows.

    SQL> CREATE VIEW pivot_data
      2  AS
      3     SELECT deptno, job, sal
      4     FROM   emp;
    
    
    View created.
    

    For our first example, we will alias all elements of our pivot query.

    SQL> SELECT *
      2  FROM   pivot_data
      3  PIVOT (SUM(sal) AS salaries
      4  FOR    deptno IN (10 AS d10_sal,
      5                    20 AS d20_sal,
      6                    30 AS d30_sal,
      7                    40 AS d40_sal));
    
    
    JOB        D10_SAL_SALARIES D20_SAL_SALARIES D30_SAL_SALARIES D40_SAL_SALARIES
    ---------- ---------------- ---------------- ---------------- ----------------
    CLERK                  1430             2090             1045
    SALESMAN                                                 6160
    PRESIDENT              5500
    MANAGER                2695           3272.5             3135
    ANALYST                                 6600
    
    5 rows selected.
    

    Oracle concatenates our aliases together to generate the column names. In the following example, we will alias the pivot_clause (aggregated column) but not the values in the pivot_in_clause.

    SQL> SELECT *
      2  FROM   pivot_data
      3  PIVOT (SUM(sal) AS salaries
      4  FOR    deptno IN (10, 20, 30, 40));
    
    
    JOB       10_SALARIES 20_SALARIES 30_SALARIES 40_SALARIES
    --------- ----------- ----------- ----------- -----------
    CLERK            1430        2090        1045
    SALESMAN                                 6160
    PRESIDENT        5500
    MANAGER          2695      3272.5        3135
    ANALYST                      6600
    
    5 rows selected.
    

    Oracle generates the pivot column names by concatenating the pivot_in_clause values and the aggregate column alias. Finally, we will only alias the pivot_in_clause values, as follows.

    SQL> SELECT *
      2  FROM   pivot_data
      3  PIVOT (SUM(sal)
      4  FOR    deptno IN (10 AS d10_sal,
      5                    20 AS d20_sal,
      6                    30 AS d30_sal,
      7                    40 AS d40_sal));
    
    
    JOB           D10_SAL    D20_SAL    D30_SAL    D40_SAL
    ---------- ---------- ---------- ---------- ----------
    CLERK            1430       2090       1045
    SALESMAN                               6160
    PRESIDENT        5500
    MANAGER          2695     3272.5       3135
    ANALYST                     6600
    
    5 rows selected.
    

    This time, Oracle generated column names from the aliases only. In fact, we can see from all of our examples that the pivot_in_clause is used in all pivot-column naming, regardless of whether we supply an alias or value. We can therefore be selective about which values we alias, as the following example demonstrates.

    SQL> SELECT *
      2  FROM   pivot_data
      3  PIVOT (SUM(sal)
      4  FOR    deptno IN (10 AS d10_sal,
      5                    20,
      6                    30 AS d30_sal,
      7                    40));
    
    
    JOB          D10_SAL         20    D30_SAL         40
    --------- ---------- ---------- ---------- ----------
    CLERK           1430       2090       1045
    SALESMAN                              6160
    PRESIDENT       5500
    MANAGER         2695     3272.5       3135
    ANALYST                    6600
    
    5 rows selected.
    

    pivoting multiple columns

    Our examples so far have contained a single aggregate and a single pivot column, although we can define more if we wish. In the following example we will define two aggregations in our pivot_clause for the same range of DEPTNO values that we have used so far. The new aggregate is a count of the salaries that comprise the sum.

    SQL> SELECT *
      2  FROM   pivot_data
      3  PIVOT (SUM(sal)   AS sum
      4  ,      COUNT(sal) AS cnt
      5  FOR    deptno IN (10 AS d10_sal,
      6                    20 AS d20_sal,
      7                    30 AS d30_sal,
      8                    40 AS d40_sal));
    
    JOB        D10_SAL_SUM D10_SAL_CNT D20_SAL_SUM D20_SAL_CNT D30_SAL_SUM D30_SAL_CNT D40_SAL_SUM D40_SAL_CNT
    ---------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- -----------
    CLERK             1430           1        2090           2        1045           1                       0
    SALESMAN                         0                       0        6160           4                       0
    PRESIDENT         5500           1                       0                       0                       0
    MANAGER           2695           1      3272.5           1        3135           1                       0
    ANALYST                          0        6600           2                       0                       0
    
    5 rows selected.
    

    We have doubled the number of pivot columns (because we doubled the number of aggregates). The number of pivot columns is a product of the number of aggregates and the distinct number of values in the pivot_in_clause. In the following example, we will extend the pivot_for_clause and pivot_in_clause to include values for JOB in the filter.

    SQL> SELECT *
      2  FROM   pivot_data
      3  PIVOT (SUM(sal)   AS sum
      4  ,      COUNT(sal) AS cnt
      5  FOR   (deptno,job) IN ((30, 'SALESMAN') AS d30_sls,
      6                         (30, 'MANAGER')  AS d30_mgr,
      7                         (30, 'CLERK')    AS d30_clk));
    
    
    D30_SLS_SUM D30_SLS_CNT D30_MGR_SUM D30_MGR_CNT D30_CLK_SUM D30_CLK_CNT
    ----------- ----------- ----------- ----------- ----------- -----------
           6160           4        3135           1        1045           1
    
    1 row selected.
    

    We have limited the query to just 3 jobs within department 30. Note how the pivot_for_clause columns (DEPTNO and JOB) combine to make a single pivot dimension. The aliases we use apply to the combined value domain (for example, "D30_SLS" to represent SALES in department 30).

    Finally, because we know the pivot column-naming rules, we can reference them directly, as follows.

    SQL> SELECT d30_mgr_sum
      2  ,      d30_clk_cnt
      3  FROM   pivot_data
      4  PIVOT (SUM(sal)   AS sum
      5  ,      COUNT(sal) AS cnt
      6  FOR   (deptno,job) IN ((30, 'SALESMAN') AS d30_sls,
      7                         (30, 'MANAGER')  AS d30_mgr,
      8                         (30, 'CLERK')    AS d30_clk));
    
    
    D30_MGR_SUM D30_CLK_CNT
    ----------- -----------
           3135           1
    
    1 row selected.
    

    general restrictions

    There are a few simple "gotchas" to be aware of with pivot queries. For example, we cannot project the column(s) used in the pivot_for_clause (DEPTNO in most of our examples). This is to be expected. The column(s) in the pivot_for_clause are grouped according to the range of values we supply with the pivot_in_clause. In the following example, we will attempt to project the DEPTNO column.

    SQL> SELECT deptno
      2  FROM   emp
      3  PIVOT (SUM(sal)
      4  FOR    deptno IN (10,20,30,40));
    
    SELECT deptno
           *
    ERROR at line 1:
    ORA-00904: "DEPTNO": invalid identifier
    

    Oracle raises an ORA-00904 exception. In this case the DEPTNO column is completely removed from the projection and Oracle tells us that it doesn't exist in this scope. Similarly, we cannot include any column(s) used in the pivot_clause, as the following example demonstrates.

    SQL> SELECT sal
      2  FROM   emp
      3  PIVOT (SUM(sal)
      4  FOR    deptno IN (10,20,30,40));
    
    SELECT sal
           *
    ERROR at line 1:
    ORA-00904: "SAL": invalid identifier
    

    We attempted to project the SAL column but Oracle raised the same exception. This is also to be expected: the pivot_clause defines our aggregations. This also means, of course, that we must use aggregate functions in the pivot_clause. In the following example, we will attempt to define a pivot_clause with a single-group column.

    SQL> SELECT *
      2  FROM   emp
      3  PIVOT (sal
      4  FOR    deptno IN (10,20,30,40));
    
    PIVOT (sal AS salaries
           *
    ERROR at line 3:
    ORA-56902: expect aggregate function inside pivot operation
    

    Oracle raises a new ORA-56902 exception: the error message numbers are getting much higher with every release!

    execution plans for pivot operations

    As we have stated, pivot operations imply a GROUP BY, but we don't need to specify it. We can investigate this by explaining one of our pivot query examples, as follows. We will use Autotrace for convenience (Autotrace uses EXPLAIN PLAN and DBMS_XPLAN to display theoretical execution plans).

    SQL> set autotrace traceonly explain
    
    SQL> SELECT *
      2  FROM   pivot_data
      3  PIVOT (SUM(sal)
      4  FOR    deptno IN (10 AS d10_sal,
      5                    20 AS d20_sal,
      6                    30 AS d30_sal,
      7                    40 AS d40_sal));
    
    
    Execution Plan
    ----------------------------------------------------------
    Plan hash value: 1475541029
    
    ----------------------------------------------------------------------------
    | Id  | Operation           | Name | Rows  | Bytes | Cost (%CPU)| Time     |
    ----------------------------------------------------------------------------
    |   0 | SELECT STATEMENT    |      |     5 |    75 |     4  (25)| 00:00:01 |
    |   1 |  HASH GROUP BY PIVOT|      |     5 |    75 |     4  (25)| 00:00:01 |
    |   2 |   TABLE ACCESS FULL | EMP  |    14 |   210 |     3   (0)| 00:00:01 |
    ----------------------------------------------------------------------------
    

    The plan output tells us that this query uses a HASH GROUP BY PIVOT operation. The HASH GROUP BY is a feature of 10g Release 2, but the PIVOT extension is new to 11g. Pivot queries do not automatically generate a PIVOT plan, however. In the following example, we will limit the domain of values in our pivot_in_clause and use Autotrace to explain the query again.

    SQL> SELECT *
      2  FROM   pivot_data
      3  PIVOT (SUM(sal)   AS sum
      4  ,      COUNT(sal) AS cnt
      5  FOR   (deptno,job) IN ((30, 'SALESMAN') AS d30_sls,
      6                         (30, 'MANAGER')  AS d30_mgr,
      7                         (30, 'CLERK')    AS d30_clk));
    
    
    Execution Plan
    ----------------------------------------------------------
    Plan hash value: 1190005124
    
    ----------------------------------------------------------------------------
    | Id  | Operation           | Name | Rows  | Bytes | Cost (%CPU)| Time     |
    ----------------------------------------------------------------------------
    |   0 | SELECT STATEMENT    |      |     1 |    78 |     3   (0)| 00:00:01 |
    |   1 |  VIEW               |      |     1 |    78 |     3   (0)| 00:00:01 |
    |   2 |   SORT AGGREGATE    |      |     1 |    15 |            |          |
    |   3 |    TABLE ACCESS FULL| EMP  |    14 |   210 |     3   (0)| 00:00:01 |
    ----------------------------------------------------------------------------
    

    This time the CBO has costed a simple aggregation over a group by with pivot. It has correctly identified that only one record will be returned from this query, so the GROUP BY operation is unnecessary. Finally, we will explain our first pivot example but use the extended formatting options of DBMS_XPLAN to reveal more information about the work that Oracle is doing.

    SQL> EXPLAIN PLAN SET STATEMENT_ID = 'PIVOT'
      2  FOR
      3     SELECT *
      4     FROM   pivot_data
      5     PIVOT (SUM(sal)
      6     FOR    deptno IN (10 AS d10_sal,
      7                       20 AS d20_sal,
      8                       30 AS d30_sal,
      9                       40 AS d40_sal));
    
    
    Explained.
    
    
    SQL> SELECT *
      2  FROM   TABLE(
      3            DBMS_XPLAN.DISPLAY(
      4               NULL, 'PIVOT', 'TYPICAL +PROJECTION'));
    
    
    PLAN_TABLE_OUTPUT
    ----------------------------------------------------------------------------
    Plan hash value: 1475541029
    
    ----------------------------------------------------------------------------
    | Id  | Operation           | Name | Rows  | Bytes | Cost (%CPU)| Time     |
    ----------------------------------------------------------------------------
    |   0 | SELECT STATEMENT    |      |     5 |    75 |     4  (25)| 00:00:01 |
    |   1 |  HASH GROUP BY PIVOT|      |     5 |    75 |     4  (25)| 00:00:01 |
    |   2 |   TABLE ACCESS FULL | EMP  |    14 |   210 |     3   (0)| 00:00:01 |
    ----------------------------------------------------------------------------
    
    Column Projection Information (identified by operation id):
    -----------------------------------------------------------
    
       1 - (#keys=1) "JOB"[VARCHAR2,9], SUM(CASE  WHEN ("DEPTNO"=10) THEN
           "SAL" END )[22], SUM(CASE  WHEN ("DEPTNO"=20) THEN "SAL" END )[22],
           SUM(CASE  WHEN ("DEPTNO"=30) THEN "SAL" END )[22], SUM(CASE  WHEN
           ("DEPTNO"=40) THEN "SAL" END )[22]
       2 - "JOB"[VARCHAR2,9], "SAL"[NUMBER,22], "DEPTNO"[NUMBER,22]
    
    18 rows selected.
    

    DBMS_XPLAN optionally exposes the column projection information contained in PLAN_TABLE for each step of a query. The projection for ID=2 shows the base columns that we select in the PIVOT_DATA view over EMP. The interesting information, however, is for ID=1 (this step is our pivot operation). This clearly shows how Oracle is generating the pivot columns. Many developers will be familiar with this form of SQL: it is how we write pivot queries in versions prior to 11g. Oracle has chosen a CASE expression, but we commonly use DECODE for brevity, as follows.

    SQL> SELECT job
      2  ,      SUM(DECODE(deptno,10,sal)) AS "D10_SAL"
      3  ,      SUM(DECODE(deptno,20,sal)) AS "D20_SAL"
      4  ,      SUM(DECODE(deptno,30,sal)) AS "D30_SAL"
      5  ,      SUM(DECODE(deptno,40,sal)) AS "D40_SAL"
      6  FROM   emp
      7  GROUP  BY
      8         job;
    
    
    JOB          D10_SAL    D20_SAL    D30_SAL    D40_SAL
    --------- ---------- ---------- ---------- ----------
    CLERK           1430       2090       1045
    SALESMAN                              6160
    PRESIDENT       5500
    MANAGER         2695     3272.5       3135
    ANALYST                    6600
    
    5 rows selected.
    

    pivot performance

    From the evidence we have seen, it appears as though Oracle implements the new PIVOT syntax using a recognised SQL format. It follows that we should expect the same performance for our pivot queries regardless of the technique we use (in other words the 11g PIVOT syntax will perform the same as the SUM(DECODE...) pivot technique. We will test this proposition with a larger dataset using Autotrace (for general I/O patterns) and the wall-clock (for elapsed time). First we will create a table with one million rows, as follows.

    SQL> CREATE TABLE million_rows
      2  NOLOGGING
      3  AS
      4     SELECT MOD(TRUNC(DBMS_RANDOM.VALUE(1,10000)),4) AS pivoting_col
      5     ,      MOD(ROWNUM,4)+10                         AS grouping_col
      6     ,      DBMS_RANDOM.VALUE                        AS summing_col
      7     ,      RPAD('X',70,'X')                         AS padding_col
      8     FROM   dual
      9     CONNECT BY ROWNUM <= 1000000;
    
    
    Table created.
    

    We will now compare the two pivot query techniques (after full-scanning the MILLION_ROWS table a couple of times). We will begin with the new 11g syntax, as follows.

    SQL> set timing on
    
    SQL> set autotrace on
    
    SQL> WITH pivot_data AS (
      2          SELECT pivoting_col
      3          ,      grouping_col
      4          ,      summing_col
      5          FROM   million_rows
      6          )
      7  SELECT *
      8  FROM   pivot_data
      9  PIVOT (SUM(summing_col) AS sum
     10  FOR    pivoting_col IN (0,1,2,3))
     11  ORDER  BY
     12         grouping_col;
    
    
    GROUPING_COL      0_SUM      1_SUM      2_SUM      3_SUM
    ------------ ---------- ---------- ---------- ----------
              10 31427.0128 31039.5026 31082.0382 31459.7873
              11 31385.2582 31253.2246 31030.7518 31402.1794
              12 31353.1321  31220.078 31174.0103 31140.5322
              13 31171.1977  30979.714 31486.7785 31395.6907
    
    4 rows selected.
    
    Elapsed: 00:00:04.50
    
    Execution Plan
    ----------------------------------------------------------
    Plan hash value: 1201564532
    
    ------------------------------------------------------------------------------------
    | Id  | Operation           | Name         | Rows  | Bytes | Cost (%CPU)| Time     |
    ------------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT    |              |  1155K|    42M|  3978   (2)| 00:00:48 |
    |   1 |  SORT GROUP BY PIVOT|              |  1155K|    42M|  3978   (2)| 00:00:48 |
    |   2 |   TABLE ACCESS FULL | MILLION_ROWS |  1155K|    42M|  3930   (1)| 00:00:48 |
    ------------------------------------------------------------------------------------
    
    Note
    -----
       - dynamic sampling used for this statement
    
    
    Statistics
    ----------------------------------------------------------
            170  recursive calls
              0  db block gets
          14393  consistent gets
          14286  physical reads
              0  redo size
           1049  bytes sent via SQL*Net to client
            416  bytes received via SQL*Net from client
              2  SQL*Net roundtrips to/from client
              6  sorts (memory)
              0  sorts (disk)
              4  rows processed
    

    The most important outputs are highlighted. We can see that the query completed in 4.5 seconds and generated approximately 14,000 PIOs and LIOs. Interestingly, the CBO chose a SORT GROUP BY over a HASH GROUP BY for this volume, having estimated almost 1.2 million records.

    By way of comparison, we will run the pre-11g version of pivot, as follows.

    SQL> SELECT grouping_col
      2  ,      SUM(DECODE(pivoting_col,0,summing_col)) AS "0_SUM"
      3  ,      SUM(DECODE(pivoting_col,1,summing_col)) AS "1_SUM"
      4  ,      SUM(DECODE(pivoting_col,2,summing_col)) AS "2_SUM"
      5  ,      SUM(DECODE(pivoting_col,3,summing_col)) AS "3_SUM"
      6  FROM   million_rows
      7  GROUP  BY
      8         grouping_col
      9  ORDER  BY
     10         grouping_col;
    
    
    GROUPING_COL      0_SUM      1_SUM      2_SUM      3_SUM
    ------------ ---------- ---------- ---------- ----------
              10 31427.0128 31039.5026 31082.0382 31459.7873
              11 31385.2582 31253.2246 31030.7518 31402.1794
              12 31353.1321  31220.078 31174.0103 31140.5322
              13 31171.1977  30979.714 31486.7785 31395.6907
    
    4 rows selected.
    
    Elapsed: 00:00:04.37
    
    Execution Plan
    ----------------------------------------------------------
    Plan hash value: 2855194314
    
    -----------------------------------------------------------------------------------
    | Id  | Operation          | Name         | Rows  | Bytes | Cost (%CPU)| Time     |
    -----------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT   |              |  1155K|    42M|  3978   (2)| 00:00:48 |
    |   1 |  SORT GROUP BY     |              |  1155K|    42M|  3978   (2)| 00:00:48 |
    |   2 |   TABLE ACCESS FULL| MILLION_ROWS |  1155K|    42M|  3930   (1)| 00:00:48 |
    -----------------------------------------------------------------------------------
    
    Note
    -----
       - dynamic sampling used for this statement
    
    
    Statistics
    ----------------------------------------------------------
              4  recursive calls
              0  db block gets
          14374  consistent gets
          14286  physical reads
              0  redo size
           1049  bytes sent via SQL*Net to client
            416  bytes received via SQL*Net from client
              2  SQL*Net roundtrips to/from client
              1  sorts (memory)
              0  sorts (disk)
              4  rows processed
    

    With a couple of minor exceptions, the time and resource results for this query are the same as for the new PIVOT syntax. This is as we expected given the internal query re-write we saw earlier. In fact, the new PIVOT version of this query generated more recursive SQL and more in-memory sorts, but we can conclude from this simple test that there is no performance penalty with the new technique. We will test this conclusion with a higher number of pivot columns, as follows.

    SQL> set timing on
    
    SQL> set autotrace traceonly statistics
    
    SQL> WITH pivot_data AS (
      2          SELECT pivoting_col
      3          ,      grouping_col
      4          ,      summing_col
      5          FROM   million_rows
      6          )
      7  SELECT *
      8  FROM   pivot_data
      9  PIVOT (SUM(summing_col)   AS sum
     10  ,      COUNT(summing_col) AS cnt
     11  ,      AVG(summing_col)   AS av
     12  ,      MIN(summing_col)   AS mn
     13  ,      MAX(summing_col)   AS mx
     14  FOR    pivoting_col IN (0,1,2,3))
     15  ORDER  BY
     16         grouping_col;
    
    
    4 rows selected.
    
    Elapsed: 00:00:04.29
    
    Statistics
    ----------------------------------------------------------
              0  recursive calls
              0  db block gets
          14290  consistent gets
          14286  physical reads
              0  redo size
           2991  bytes sent via SQL*Net to client
            416  bytes received via SQL*Net from client
              2  SQL*Net roundtrips to/from client
              1  sorts (memory)
              0  sorts (disk)
              4  rows processed
    

    We have generated 20 pivot columns with this example. Note that the above output is from a third or fourth run of the example to avoid skew in the results. Ultimately, the I/O patterns and elapsed time are the same as our original example, despite pivoting an additional 16 columns. We will compare this with the SUM(DECODE...) technique, as follows.

    SQL> SELECT grouping_col
      2  ,      SUM(DECODE(pivoting_col,0,summing_col))   AS "0_SUM"
      3  ,      COUNT(DECODE(pivoting_col,0,summing_col)) AS "0_CNT"
      4  ,      AVG(DECODE(pivoting_col,0,summing_col))   AS "0_AV"
      5  ,      MIN(DECODE(pivoting_col,0,summing_col))   AS "0_MN"
      6  ,      MAX(DECODE(pivoting_col,0,summing_col))   AS "0_MX"
      7         --
      8  ,      SUM(DECODE(pivoting_col,1,summing_col))   AS "1_SUM"
      9  ,      COUNT(DECODE(pivoting_col,1,summing_col)) AS "1_CNT"
     10  ,      AVG(DECODE(pivoting_col,1,summing_col))   AS "1_AV"
     11  ,      MIN(DECODE(pivoting_col,1,summing_col))   AS "1_MN"
     12  ,      MAX(DECODE(pivoting_col,1,summing_col))   AS "1_MX"
     13         --
     14  ,      SUM(DECODE(pivoting_col,2,summing_col))   AS "2_SUM"
     15  ,      COUNT(DECODE(pivoting_col,2,summing_col)) AS "2_CNT"
     16  ,      AVG(DECODE(pivoting_col,2,summing_col))   AS "2_AV"
     17  ,      MIN(DECODE(pivoting_col,2,summing_col))   AS "2_MN"
     18  ,      MAX(DECODE(pivoting_col,2,summing_col))   AS "2_MX"
     19         --
     20  ,      SUM(DECODE(pivoting_col,3,summing_col))   AS "3_SUM"
     21  ,      COUNT(DECODE(pivoting_col,3,summing_col)) AS "3_CNT"
     22  ,      AVG(DECODE(pivoting_col,3,summing_col))   AS "3_AV"
     23  ,      MIN(DECODE(pivoting_col,3,summing_col))   AS "3_MN"
     24  ,      MAX(DECODE(pivoting_col,3,summing_col))   AS "3_MX"
     25  FROM   million_rows
     26  GROUP  BY
     27         grouping_col
     28  ORDER  BY
     29         grouping_col;
    
    
    4 rows selected.
    
    Elapsed: 00:00:05.12
    
    Statistics
    ----------------------------------------------------------
              0  recursive calls
              0  db block gets
          14290  consistent gets
          14286  physical reads
              0  redo size
           2991  bytes sent via SQL*Net to client
            416  bytes received via SQL*Net from client
              2  SQL*Net roundtrips to/from client
              1  sorts (memory)
              0  sorts (disk)
              4  rows processed
    

    We can begin to see how much more convenient the new PIVOT syntax is. Furthermore, despite the workloads of the two methods being the same, the manual pivot technique is 25% slower (observable over several runs of the same examples and also a version using CASE instead of DECODE).

    pivoting an unknown domain of values

    All of our examples so far have pivoted a known domain of values (in other words, we have used a hard-coded pivot_in_clause). The pivot syntax we have been using doesn't, by default, support a dynamic list of values in the pivot_in_clause. If we use a subquery instead of a list in the pivot_in_clause, as in the following example, Oracle raises a syntax error.

    SQL> SELECT *
      2  FROM   emp
      3  PIVOT (SUM(sal) AS salaries
      4  FOR    deptno IN (SELECT deptno FROM dept));
    
    FOR    deptno IN (SELECT deptno FROM dept))
                      *
    ERROR at line 4:
    ORA-00936: missing expression
    

    Many developers will consider this to be a major restriction (despite the fact that pre-11g pivot techniques also require us to code an explicit set of values). However, it is possible to generate an unknown set of pivot values. Remember from the earlier syntax overview that PIVOT allows an optional "XML" keyword. As the keyword suggests, this enables us to generate a pivot set but have the results provided in XML format. An extension of this is that we can have an XML resultset generated for any number of pivot columns, as defined by a dynamic pivot_in_clause.

    When using the XML extension, we have three options for generating the pivot_in_clause:

    • we can use an explicit list of values (we've been doing this so far in this article);
    • we can use the ANY keyword in the pivot_in_clause. This specifies that we wish to pivot for all values for the columns in the pivot_for_clause; or
    • we can use a subquery in the pivot_in_clause to derive the list of values.

    We will concentrate on the dynamic methods. In the following example, we will use the ANY keyword to generate a pivoted resultset for any values of DEPTNO that we encounter in our dataset.

    SQL> SELECT *
      2  FROM   pivot_data
      3  PIVOT  XML
      4        (SUM(sal) FOR deptno IN (ANY));
    
    
    JOB       DEPTNO_XML
    --------- ---------------------------------------------------------------------------
    ANALYST   <PivotSet><item><column name = "DEPTNO">20</column><column name = "SUM(SAL)
              ">6600</column></item></PivotSet>
    
    CLERK     <PivotSet><item><column name = "DEPTNO">10</column><column name = "SUM(SAL)
              ">1430</column></item><item><column name = "DEPTNO">20</column><column name
               = "SUM(SAL)">2090</column></item><item><column name = "DEPTNO">30</column>
              <column name = "SUM(SAL)">1045</column></item></PivotSet>
    
    MANAGER   <PivotSet><item><column name = "DEPTNO">10</column><column name = "SUM(SAL)
              ">2695</column></item><item><column name = "DEPTNO">20</column><column name
               = "SUM(SAL)">3272.5</column></item><item><column name = "DEPTNO">30</colum
              n><column name = "SUM(SAL)">3135</column></item></PivotSet>
    
    PRESIDENT <PivotSet><item><column name = "DEPTNO">10</column><column name = "SUM(SAL)
              ">5500</column></item></PivotSet>
    
    SALESMAN  <PivotSet><item><column name = "DEPTNO">30</column><column name = "SUM(SAL)
              ">6160</column></item></PivotSet>
    
    
    5 rows selected.
    

    The XML resultset is of type XMLTYPE, which means that we can easily manipulate it with XPath or XQuery expressions. We can see that the generated pivot columns are named according to the pivot_clause and not the pivot_in_clause (remember that in the non-XML queries the pivot_in_clause values or aliases featured in all permutations of pivot column-naming). We can also see that the XML column name itself is a product of the pivot_for_clause: Oracle has appended "_XML" to "DEPTNO".

    We will repeat the previous query but add an alias to the pivot_clause, as follows. If we wish to change the column name from "DEPTNO_XML", we use standard SQL column aliasing.

    SQL> SELECT job
      2  ,      deptno_xml AS alias_for_deptno_xml
      3  FROM   pivot_data
      4  PIVOT  XML
      5        (SUM(sal) AS salaries FOR deptno IN (ANY));
    
    
    JOB        ALIAS_FOR_DEPTNO_XML
    ---------- ---------------------------------------------------------------------------
    ANALYST    <PivotSet><item><column name = "DEPTNO">20</column><column name = "SALARIES
               ">6600</column></item></PivotSet>
    
    CLERK      <PivotSet><item><column name = "DEPTNO">10</column><column name = "SALARIES
               ">1430</column></item><item><column name = "DEPTNO">20</column><column name
                = "SALARIES">2090</column></item><item><column name = "DEPTNO">30</column>
               <column name = "SALARIES">1045</column></item></PivotSet>
    
    MANAGER    <PivotSet><item><column name = "DEPTNO">10</column><column name = "SALARIES
               ">2695</column></item><item><column name = "DEPTNO">20</column><column name
                = "SALARIES">3272.5</column></item><item><column name = "DEPTNO">30</colum
               n><column name = "SALARIES">3135</column></item></PivotSet>
    
    PRESIDENT  <PivotSet><item><column name = "DEPTNO">10</column><column name = "SALARIES
               ">5500</column></item></PivotSet>
    
    SALESMAN   <PivotSet><item><column name = "DEPTNO">30</column><column name = "SALARIES
               ">6160</column></item></PivotSet>
    
    
    5 rows selected.
    

    As suggested, the pivot_clause alias defines the pivoted XML element names and the XML column name itself is defined by the projected alias.

    An alternative to the ANY keyword is a subquery. In the following example, we will replace ANY with a query against the DEPT table to derive our list of DEPTNO values.

    SQL> SELECT *
      2  FROM   pivot_data
      3  PIVOT  XML
      4        (SUM(sal) AS salaries FOR deptno IN (SELECT deptno FROM dept));
    
    
    JOB        DEPTNO_XML
    ---------- ---------------------------------------------------------------------------
    ANALYST    <PivotSet><item><column name = "DEPTNO">10</column><column name = "SALARIES
               "></column></item><item><column name = "DEPTNO">20</column><column name = "
               SALARIES">6600</column></item><item><column name = "DEPTNO">30</column><col
               umn name = "SALARIES"></column></item><item><column name = "DEPTNO">40</col
               umn><column name = "SALARIES"></column></item></PivotSet>
    
    CLERK      <PivotSet><item><column name = "DEPTNO">10</column><column name = "SALARIES
               ">1430</column></item><item><column name = "DEPTNO">20</column><column name
                = "SALARIES">2090</column></item><item><column name = "DEPTNO">30</column>
               <column name = "SALARIES">1045</column></item><item><column name = "DEPTNO"
               >40</column><column name = "SALARIES"></column></item></PivotSet>
    
    MANAGER    <PivotSet><item><column name = "DEPTNO">10</column><column name = "SALARIES
               ">2695</column></item><item><column name = "DEPTNO">20</column><column name
                = "SALARIES">3272.5</column></item><item><column name = "DEPTNO">30</colum
               n><column name = "SALARIES">3135</column></item><item><column name = "DEPTN
               O">40</column><column name = "SALARIES"></column></item></PivotSet>
    
    PRESIDENT  <PivotSet><item><column name = "DEPTNO">10</column><column name = "SALARIES
               ">5500</column></item><item><column name = "DEPTNO">20</column><column name
                = "SALARIES"></column></item><item><column name = "DEPTNO">30</column><col
               umn name = "SALARIES"></column></item><item><column name = "DEPTNO">40</col
               umn><column name = "SALARIES"></column></item></PivotSet>
    
    SALESMAN   <PivotSet><item><column name = "DEPTNO">10</column><column name = "SALARIES
               "></column></item><item><column name = "DEPTNO">20</column><column name = "
               SALARIES"></column></item><item><column name = "DEPTNO">30</column><column
               name = "SALARIES">6160</column></item><item><column name = "DEPTNO">40</col
               umn><column name = "SALARIES"></column></item></PivotSet>
    
    
    5 rows selected.
    

    We can see a key difference between this XML output and the resultset from the ANY method. When using the subquery method, Oracle will generate a pivot XML element for every value the subquery returns (one for each grouping). For example, ANALYST employees only work in DEPTNO 20, so the ANY method returns one pivot XML element for that department. The subquery method, however, generates four pivot XML elements (for DEPTNO 10,20,30,40) but only DEPTNO 20 is non-null. We can see this more clearly if we extract the salaries element from both pivot_in_clause methods, as follows.

    SQL> SELECT job
      2  ,      EXTRACT(deptno_xml, '/PivotSet/item/column') AS salary_elements
      3  FROM   pivot_data
      4  PIVOT  XML
      5        (SUM(sal) AS salaries FOR deptno IN (ANY))
      6  WHERE  job = 'ANALYST';
    
    
    JOB       SALARY_ELEMENTS
    --------- ---------------------------------------------------------------------------
    ANALYST   <column name="DEPTNO">20</column><column name="SALARIES">6600</column>
    
    1 row selected.
    

    Using the ANY method, Oracle has generated an XML element for the only DEPTNO (20). We will repeat the query but use the subquery method, as follows.

    SQL> SELECT job
      2  ,      EXTRACT(deptno_xml, '/PivotSet/item/column') AS salary_elements
      3  FROM   pivot_data
      4  PIVOT  XML
      5        (SUM(sal) AS salaries FOR deptno IN (SELECT deptno FROM dept))
      6  WHERE  job = 'ANALYST';
    
    
    JOB       SALARY_ELEMENTS
    --------- ---------------------------------------------------------------------------
    ANALYST   <column name="DEPTNO">10</column><column name="SALARIES"/><column name="DEP
              TNO">20</column><column name="SALARIES">6600</column><column name="DEPTNO">
              30</column><column name="SALARIES"/><column name="DEPTNO">40</column><colum
              n name="SALARIES"/>
    
    
    1 row selected.
    

    Despite the fact that three departments do not have salary totals, Oracle has generated an empty element for each one. Again, only department 20 has a value for salary total. Whichever method developers choose, therefore, depends on requirements, but it is important to recognise that working with XML often leads to inflated dataset or resultset volumes. In this respect, the subquery method can potentially generate a lot of additional data over and above the results themselves.

    unpivot

    We have explored the new 11g pivot capability in some detail above. We will now look at the new UNPIVOT operator. As its name suggests, an unpivot operation is the opposite of pivot (albeit without the ability to disaggregate the data). A simpler way of thinking about unpivot is that it turns pivoted columns into rows (one row of data for every column to be unpivoted). We will see examples of this below, but will start with an overview of the syntax, as follows.

    SELECT ...
    FROM   ...
    UNPIVOT [INCLUDE|EXCLUDE NULLS]
       ( unpivot_clause
         unpivot_for_clause
         unpivot_in_clause )
    WHERE  ...
    

    The syntax is similar to that of PIVOT with some slight differences, including the meaning of the various clauses. These are described as follows:

    • unpivot_clause: this clause specifies a name for a column to represent the unpivoted measure values. In our previous pivot examples, the measure column was the sum of salaries for each job and department grouping;
    • unpivot_for_clause: the unpivot_for_clause specifies the name for the column that will result from our unpivot query. The data in this column describes the measure values in the unpivot_clause column; and
    • unpivot_in_clause: this contains the list of pivoted columns (not values) to be unpivoted.

    The unpivot clauses are quite difficult to describe and are best served by some examples.

    simple unpivot examples

    Before we write an unpivot query, we will create a pivoted dataset to use in our examples. For simplicity, we will create a view using one of our previous pivot queries, as follows.

    SQL> CREATE VIEW pivoted_data
      2  AS
      3     SELECT *
      4     FROM   pivot_data
      5     PIVOT (SUM(sal)
      6     FOR    deptno IN (10 AS d10_sal,
      7                       20 AS d20_sal,
      8                       30 AS d30_sal,
      9                       40 AS d40_sal));
    
    
    View created.
    

    The PIVOTED_DATA view contains our standard sum of department salaries by job, with the four department totals pivoted as we've seen throughout this article. As a final reminder of the nature of the data, we will query this view.

    SQL> SELECT *
      2  FROM   pivoted_data;
    
    
    JOB           D10_SAL    D20_SAL    D30_SAL    D40_SAL
    ---------- ---------- ---------- ---------- ----------
    CLERK            1430       2090       1045
    SALESMAN                               6160
    PRESIDENT        5500
    MANAGER          2695     3272.5       3135
    ANALYST                     6600
    
    5 rows selected.
    

    We will now unpivot our dataset using the new 11g syntax as follows.

    SQL> SELECT *
      2  FROM   pivoted_data
      3  UNPIVOT (
      4               deptsal                              --<-- unpivot_clause
      5           FOR saldesc                              --<-- unpivot_for_clause
      6           IN  (d10_sal, d20_sal, d30_sal, d40_sal) --<-- unpivot_in_clause
      7          );
    
    
    JOB        SALDESC       DEPTSAL
    ---------- ---------- ----------
    CLERK      D10_SAL          1430
    CLERK      D20_SAL          2090
    CLERK      D30_SAL          1045
    SALESMAN   D30_SAL          6160
    PRESIDENT  D10_SAL          5500
    MANAGER    D10_SAL          2695
    MANAGER    D20_SAL        3272.5
    MANAGER    D30_SAL          3135
    ANALYST    D20_SAL          6600
    
    9 rows selected.
    

    We can see from the results that Oracle has transposed each of our pivoted columns in the unpivot_in_clause and turned them into rows of data that describes our measure (i.e. 'D10_SAL', 'D20_SAL' and so on). The unpivot_for_clause gives this new unpivoted column a name (i.e "SALDESC"). The unpivot_clause itself defines our measure data, which in this case is the sum of the department's salary by job.

    It is important to note that unpivot queries can work on any columns (i.e. not just aggregated or pivoted columns). We are using the pivoted dataset for consistency but we could just as easily unpivot the columns of any table or view we have.

    handling null data

    The maximum number of rows that can be returned by an unpivot query is the number of distinct groupings multiplied by the number of pivot columns (in our examples, 5 (jobs) * 4 (pivot columns) = 20). However, our first unpivot query has only returned nine rows. If we look at the source pivot data itself, we can see nine non-null values in the pivot columns; in other words, eleven groupings are null. The default behaviour of UNPIVOT is to exclude nulls, but we do have an option to include them, as follows.

    SQL> SELECT *
      2  FROM   pivoted_data
      3  UNPIVOT INCLUDE NULLS
      4        (deptsal
      5  FOR    saldesc IN (d10_sal,
      6                     d20_sal,
      7                     d30_sal,
      8                     d40_sal));
    
    
    JOB        SALDESC       DEPTSAL
    ---------- ---------- ----------
    CLERK      D10_SAL          1430
    CLERK      D20_SAL          2090
    CLERK      D30_SAL          1045
    CLERK      D40_SAL
    SALESMAN   D10_SAL
    SALESMAN   D20_SAL
    SALESMAN   D30_SAL          6160
    SALESMAN   D40_SAL
    PRESIDENT  D10_SAL          5500
    PRESIDENT  D20_SAL
    PRESIDENT  D30_SAL
    PRESIDENT  D40_SAL
    MANAGER    D10_SAL          2695
    MANAGER    D20_SAL        3272.5
    MANAGER    D30_SAL          3135
    MANAGER    D40_SAL
    ANALYST    D10_SAL
    ANALYST    D20_SAL          6600
    ANALYST    D30_SAL
    ANALYST    D40_SAL
    
    20 rows selected.
    

    By including the null pivot values, we return the maximum number of rows possible from our dataset. Of course, we now have eleven null values, but this might be something we require for reporting purposes or "data densification".

    unpivot aliasing options

    In the pivot section of this article, we saw a wide range of aliasing options. The UNPIVOT syntax also allows us to use aliases, but it is far more restrictive. In fact, we can only alias the columns defined in the unpivot_in_clause, as follows.

    SQL> SELECT job
      2  ,      saldesc
      3  ,      deptsal
      4  FROM   pivoted_data
      5  UNPIVOT (deptsal
      6  FOR      saldesc IN (d10_sal AS 'SAL TOTAL FOR 10',
      7                       d20_sal AS 'SAL TOTAL FOR 20',
      8                       d30_sal AS 'SAL TOTAL FOR 30',
      9                       d40_sal AS 'SAL TOTAL FOR 40'))
     10  ORDER  BY
     11         job
     12  ,      saldesc;
    
    
    JOB        SALDESC                 DEPTSAL
    ---------- -------------------- ----------
    ANALYST    SAL TOTAL FOR 20           6600
    CLERK      SAL TOTAL FOR 10           1430
    CLERK      SAL TOTAL FOR 20           2090
    CLERK      SAL TOTAL FOR 30           1045
    MANAGER    SAL TOTAL FOR 10           2695
    MANAGER    SAL TOTAL FOR 20         3272.5
    MANAGER    SAL TOTAL FOR 30           3135
    PRESIDENT  SAL TOTAL FOR 10           5500
    SALESMAN   SAL TOTAL FOR 30           6160
    
    9 rows selected.
    

    This is a useful option because it enables us to change the descriptive data to something other than its original column name. If we wish to alias the column in the unpivot_clause (in our case, DEPTSAL), we need to use standard column aliasing in the SELECT clause. Of course, aliasing the unpivot_for_clause is irrelevant because we have just defined this derived column name in the clause itself (in our case, "SALDESC").

    general restrictions

    The UNPIVOT syntax can be quite fiddly and there are some minor restrictions to how it can be used. The main restriction is that the columns in the unpivot_in_clause must all be of the same datatype. We will see this below by attempting to unpivot three columns of different datatypes from EMP. The unpivot query itself is meaningless: it is just a means to show the restriction, as follows.

    SQL> SELECT empno
      2  ,      job
      3  ,      unpivot_col_name
      4  ,      unpivot_col_value
      5  FROM   emp
      6  UNPIVOT (unpivot_col_value
      7  FOR      unpivot_col_name
      8  IN      (ename, deptno, hiredate));
    
    IN      (ename, deptno, hiredate))
                    *
    ERROR at line 8:
    ORA-01790: expression must have same datatype as corresponding expression
    

    Oracle is also quite fussy about datatype conversion. In the following example, we will attempt to convert the columns to the same VARCHAR2 datatype.

    SQL> SELECT job
      2  ,      unpivot_col_name
      3  ,      unpivot_col_value
      4  FROM   emp
      5  UNPIVOT (unpivot_col_value
      6  FOR      unpivot_col_name
      7  IN      (ename, TO_CHAR(deptno), TO_CHAR(hiredate)));
    
    IN      (ename, TO_CHAR(deptno), TO_CHAR(hiredate)))
                           *
    ERROR at line 7:
    ORA-00917: missing comma
    

    It appears that using datatype conversions within the unpivot_in_clause is not even valid syntax and Oracle raises an exception accordingly. The workaround is, therefore, to convert the columns up-front, using an in-line view, subquery or a stored view. We will use subquery factoring, as follows.

    SQL> WITH emp_data AS (
      2          SELECT empno
      3          ,      job
      4          ,      ename
      5          ,      TO_CHAR(deptno)   AS deptno
      6          ,      TO_CHAR(hiredate) AS hiredate
      7          FROM   emp
      8          )
      9  SELECT empno
     10  ,      job
     11  ,      unpivot_col_name
     12  ,      unpivot_col_value
     13  FROM   emp_data
     14  UNPIVOT (unpivot_col_value
     15  FOR      unpivot_col_name
     16  IN      (ename, deptno, hiredate));
    
    
         EMPNO JOB        UNPIVOT_COL_NAME     UNPIVOT_COL_VALUE
    ---------- ---------- -------------------- --------------------
          7369 CLERK      ENAME                SMITH
          7369 CLERK      DEPTNO               20
          7369 CLERK      HIREDATE             17/12/1980
          7499 SALESMAN   ENAME                ALLEN
          7499 SALESMAN   DEPTNO               30
          7499 SALESMAN   HIREDATE             20/02/1981
          
          <<...snip...>>
    
          7902 ANALYST    ENAME                FORD
          7902 ANALYST    DEPTNO               20
          7902 ANALYST    HIREDATE             03/12/1981
          7934 CLERK      ENAME                MILLER
          7934 CLERK      DEPTNO               10
          7934 CLERK      HIREDATE             23/01/1982
    
    42 rows selected.
    

    The output has been reduced, but we can see the effect of unpivoting on the EMP data (i.e. we have 3 unpivot columns, 14 original rows and hence 42 output records).

    Another restriction with UNPIVOT is that the columns we include in the unpivot_in_clause are not available to us to project outside of the pivot_clause itself. In the following example, we will try to project the DEPTNO column.

    SQL> WITH emp_data AS (
      2          SELECT empno
      3          ,      job
      4          ,      ename
      5          ,      TO_CHAR(deptno)   AS deptno
      6          ,      TO_CHAR(hiredate) AS hiredate
      7          FROM   emp
      8          )
      9  SELECT empno
     10  ,      job
     11  ,      deptno
     12  ,      unpivot_col_name
     13  ,      unpivot_col_value
     14  FROM   emp_data
     15  UNPIVOT (unpivot_col_value
     16  FOR      unpivot_col_name
     17  IN      (ename, deptno, hiredate));
    
    ,      deptno
           *
    ERROR at line 11:
    ORA-00904: "DEPTNO": invalid identifier
    

    Oracle raises an invalid identifier exception. We can see why this is the case when we project all available columns from our unpivot query over EMP, as follows.

    SQL> WITH emp_data AS (
      2          SELECT empno
      3          ,      job
      4          ,      ename
      5          ,      TO_CHAR(deptno)   AS deptno
      6          ,      TO_CHAR(hiredate) AS hiredate
      7          FROM   emp
      8          )
      9  SELECT *
     10  FROM   emp_data
     11  UNPIVOT (unpivot_col_value
     12  FOR      unpivot_col_name
     13  IN      (ename, deptno, hiredate));
    
    
         EMPNO JOB        UNPIVOT_COL_NAME     UNPIVOT_COL_VALUE
    ---------- ---------- -------------------- --------------------
          7369 CLERK      ENAME                SMITH
          7369 CLERK      DEPTNO               20
          7369 CLERK      HIREDATE             17/12/1980
          
          <<...snip...>>
    
          7934 CLERK      ENAME                MILLER
          7934 CLERK      DEPTNO               10
          7934 CLERK      HIREDATE             23/01/1982
    
    42 rows selected.
    

    We can see that the unpivot columns are not available as part of the projection.

    execution plans for unpivot operations

    Earlier we saw the GROUP BY PIVOT operation in the execution plans for our pivot queries. In the following example, we will use Autotrace to generate an explain plan for our last unpivot query.

    SQL> set autotrace traceonly explain
    
    SQL> SELECT job
      2  ,      saldesc
      3  ,      deptsal
      4  FROM   pivoted_data
      5  UNPIVOT (deptsal
      6  FOR      saldesc IN (d10_sal AS 'SAL TOTAL FOR 10',
      7                       d20_sal AS 'SAL TOTAL FOR 20',
      8                       d30_sal AS 'SAL TOTAL FOR 30',
      9                       d40_sal AS 'SAL TOTAL FOR 40'))
     10  ORDER  BY
     11         job
     12  ,      saldesc;
    
    
    Execution Plan
    ----------------------------------------------------------
    Plan hash value: 1898428924
    
    ----------------------------------------------------------------------------------------
    | Id  | Operation               | Name         | Rows  | Bytes | Cost (%CPU)| Time     |
    ----------------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT        |              |    20 |   740 |    17  (30)| 00:00:01 |
    |   1 |  SORT ORDER BY          |              |    20 |   740 |    17  (30)| 00:00:01 |
    |*  2 |   VIEW                  |              |    20 |   740 |    16  (25)| 00:00:01 |
    |   3 |    UNPIVOT              |              |       |       |            |          |
    |   4 |     VIEW                | PIVOTED_DATA |     5 |   290 |     4  (25)| 00:00:01 |
    |   5 |      HASH GROUP BY PIVOT|              |     5 |    75 |     4  (25)| 00:00:01 |
    |   6 |       TABLE ACCESS FULL | EMP          |    14 |   210 |     3   (0)| 00:00:01 |
    ----------------------------------------------------------------------------------------
    
    Predicate Information (identified by operation id):
    ---------------------------------------------------
    
       2 - filter("unpivot_view"."DEPTSAL" IS NOT NULL)
    

    The points of interest are highlighted. First, we can see a new UNPIVOT step (ID=3). Second, we can see a filter predicate to remove all NULL values for DEPTSAL. This is a result of the default EXCLUDING NULLS clause. If we use the INCLUDING NULLS option, this filter is removed. Note that the GROUP BY PIVOT operation at ID=5 is generated by the pivot query that underlies the PIVOTED_DATA view.

    We will extract some more detailed information about this execution plan by using DBMS_XPLAN's format options, as follows. In particular, we will examine the alias and projection details, to see if it provides any clues about Oracle's implementation of UNPIVOT.

    SQL> EXPLAIN PLAN SET STATEMENT_ID = 'UNPIVOT'
      2  FOR
      3     SELECT job
      4     ,      saldesc
      5     ,      deptsal
      6     FROM   pivoted_data
      7     UNPIVOT (deptsal
      8     FOR      saldesc IN (d10_sal AS 'SAL TOTAL FOR 10',
      9                          d20_sal AS 'SAL TOTAL FOR 20',
     10                          d30_sal AS 'SAL TOTAL FOR 30',
     11                          d40_sal AS 'SAL TOTAL FOR 40'))
     12     ORDER  BY
     13            job
     14     ,      saldesc;
    
    
    Explained.
    
    
    SQL> SELECT *
      2  FROM   TABLE(
      3             DBMS_XPLAN.DISPLAY(
      4                NULL, 'UNPIVOT', 'TYPICAL +PROJECTION +ALIAS'));
    
    
    PLAN_TABLE_OUTPUT
    ----------------------------------------------------------------------------------------
    Plan hash value: 1898428924
    
    ----------------------------------------------------------------------------------------
    | Id  | Operation               | Name         | Rows  | Bytes | Cost (%CPU)| Time     |
    ----------------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT        |              |    20 |   740 |    17  (30)| 00:00:01 |
    |   1 |  SORT ORDER BY          |              |    20 |   740 |    17  (30)| 00:00:01 |
    |*  2 |   VIEW                  |              |    20 |   740 |    16  (25)| 00:00:01 |
    |   3 |    UNPIVOT              |              |       |       |            |          |
    |   4 |     VIEW                | PIVOTED_DATA |     5 |   290 |     4  (25)| 00:00:01 |
    |   5 |      HASH GROUP BY PIVOT|              |     5 |    75 |     4  (25)| 00:00:01 |
    |   6 |       TABLE ACCESS FULL | EMP          |    14 |   210 |     3   (0)| 00:00:01 |
    ----------------------------------------------------------------------------------------
    
    Query Block Name / Object Alias (identified by operation id):
    -------------------------------------------------------------
    
       1 - SEL$D50F4D64
       2 - SET$1        / unpivot_view@SEL$17
       3 - SET$1
       4 - SEL$CB31B938 / PIVOTED_DATA@SEL$4
       5 - SEL$CB31B938
       6 - SEL$CB31B938 / EMP@SEL$15
    
    Predicate Information (identified by operation id):
    ---------------------------------------------------
    
       2 - filter("unpivot_view"."DEPTSAL" IS NOT NULL)
    
    Column Projection Information (identified by operation id):
    -----------------------------------------------------------
    
      1 - (#keys=2) "unpivot_view"."JOB"[VARCHAR2,9],
           "unpivot_view"."SALDESC"[CHARACTER,16], "unpivot_view"."DEPTSAL"[NUMBER,22]
       2 - "unpivot_view"."JOB"[VARCHAR2,9],
           "unpivot_view"."SALDESC"[CHARACTER,16], "unpivot_view"."DEPTSAL"[NUMBER,22]
       3 - STRDEF[9], STRDEF[16], STRDEF[22]
       4 - "PIVOTED_DATA"."JOB"[VARCHAR2,9], "D10_SAL"[NUMBER,22],
           "PIVOTED_DATA"."D20_SAL"[NUMBER,22], "PIVOTED_DATA"."D30_SAL"[NUMBER,22],
           "PIVOTED_DATA"."D40_SAL"[NUMBER,22]
       5 - (#keys=1) "JOB"[VARCHAR2,9], SUM(CASE  WHEN ("DEPTNO"=10) THEN "SAL" END
           )[22], SUM(CASE  WHEN ("DEPTNO"=20) THEN "SAL" END )[22], SUM(CASE  WHEN
           ("DEPTNO"=30) THEN "SAL" END )[22], SUM(CASE  WHEN ("DEPTNO"=40) THEN "SAL" END
           )[22]
       6 - "JOB"[VARCHAR2,9], "SAL"[NUMBER,22], "DEPTNO"[NUMBER,22]
    
    45 rows selected.
    

    The projection of the unpivoted columns is highlighted between operations 1 and 3 above. This does not really provide any clues to how Oracle implements UNPIVOT. Note that a 10046 trace (SQL trace) provides no clues either, so has been omitted from this article.

    The alias information is slightly more interesting, but still tells us little about UNPIVOT. It might be a red herring, but when Oracle transforms a simple query, the generated alias names for query blocks usually follow a pattern such as "SEL$1", "SEL$2" and so on. In our unpivot query, the aliases are as high as SEL$17, yet this is a relatively simple query with few components. This could suggest that a lot of query re-write is happening before optimisation, but we can't be certain from the details we have.

    other uses for unpivot

    Unpivot queries are not restricted to transposing previously pivoted data. We can pivot any set of columns from a table (within the datatype restriction described earlier). A good example is Tom Kyte's print_table procedure. This utility unpivots wide records to enable us to read the data down the page instead of across. The new UNPIVOT can be used for the same purpose. In the following example, we will write a static unpivot query similar to those that the print_table utility is used for.

    SQL> WITH all_objects_data AS (
      2          SELECT owner
      3          ,      object_name
      4          ,      subobject_name
      5          ,      TO_CHAR(object_id)      AS object_id
      6          ,      TO_CHAR(data_object_id) AS data_object_id
      7          ,      object_type
      8          ,      TO_CHAR(created)        AS created
      9          ,      TO_CHAR(last_ddl_time)  AS last_ddl_time
     10          ,      timestamp
     11          ,      status
     12          ,      temporary
     13          ,      generated
     14          ,      secondary
     15          ,      TO_CHAR(namespace)      AS namespace
     16          ,      edition_name
     17          FROM   all_objects
     18          WHERE  ROWNUM = 1
     19          )
     20  SELECT column_name
     21  ,      column_value
     22  FROM   all_objects_data
     23  UNPIVOT (column_value
     24  FOR      column_name
     25  IN      (owner, object_name, subobject_name, object_id,
     26           data_object_id, object_type, created, last_ddl_time,
     27           timestamp, status, temporary, generated,
     28           secondary, namespace, edition_name));
    
    
    COLUMN_NAME    COLUMN_VALUE
    -------------- ---------------------
    OWNER          SYS
    OBJECT_NAME    ICOL$
    OBJECT_ID      20
    DATA_OBJECT_ID 2
    OBJECT_TYPE    TABLE
    CREATED        15/10/2007 10:09:08
    LAST_DDL_TIME  15/10/2007 10:56:08
    TIMESTAMP      2007-10-15:10:09:08
    STATUS         VALID
    TEMPORARY      N
    GENERATED      N
    SECONDARY      N
    NAMESPACE      1
    
    13 rows selected.
    

    Turning this into a dynamic SQL solution is simple and can be an exercise for the reader.

    unpivot queries prior to 11g

    To complete this article, we will include a couple of techniques for unpivot queries in versions prior to 11g and compare their performance. The first method uses a Cartesian Product with a generated dummy rowsource. This rowsource has the same number of rows as the number of columns we wish to unpivot. Using the same dataset as our UNPIVOT examples, we will demonstrate this below.

    SQL> WITH row_source AS (
      2          SELECT ROWNUM AS rn
      3          FROM   all_objects
      4          WHERE  ROWNUM <= 4
      5          )
      6  SELECT p.job
      7  ,      CASE r.rn
      8            WHEN 1
      9            THEN 'D10_SAL'
     10            WHEN 2
     11            THEN 'D20_SAL'
     12            WHEN 3
     13            THEN 'D30_SAL'
     14            WHEN 4
     15            THEN 'D40_SAL'
     16         END AS saldesc
     17  ,      CASE r.rn
     18            WHEN 1
     19            THEN d10_sal
     20            WHEN 2
     21            THEN d20_sal
     22            WHEN 3
     23            THEN d30_sal
     24            WHEN 4
     25            THEN d40_sal
     26         END AS deptsal
     27  FROM   pivoted_data p
     28  ,      row_source   r
     29  ORDER  BY
     30         p.job
     31  ,      saldesc;
    
    
    JOB        SALDESC       DEPTSAL
    ---------- ---------- ----------
    ANALYST    D10_SAL
    ANALYST    D20_SAL          6600
    ANALYST    D30_SAL
    ANALYST    D40_SAL
    CLERK      D10_SAL          1430
    CLERK      D20_SAL          2090
    CLERK      D30_SAL          1045
    CLERK      D40_SAL
    MANAGER    D10_SAL          2695
    MANAGER    D20_SAL        3272.5
    MANAGER    D30_SAL          3135
    MANAGER    D40_SAL
    PRESIDENT  D10_SAL          5500
    PRESIDENT  D20_SAL
    PRESIDENT  D30_SAL
    PRESIDENT  D40_SAL
    SALESMAN   D10_SAL
    SALESMAN   D20_SAL
    SALESMAN   D30_SAL          6160
    SALESMAN   D40_SAL
    
    20 rows selected.
    

    The resultset is the equivalent of using the new UNPIVOT with the INCLUDING NULLS option. The second technique we can use to unpivot data joins the pivoted dataset to a collection of the columns we wish to transpose. The following example uses a generic NUMBER_NTT nested table type to hold the pivoted department salary columns. We can use a numeric type because all the pivoted columns are of NUMBER. We will create the type as follows.

    SQL> CREATE OR REPLACE TYPE number_ntt AS TABLE OF NUMBER;
      2  /
    
    
    Type created.
    

    Using this collection type for the pivoted department salaries, we will now unpivot the data, as follows.

    SQL> SELECT p.job
      2  ,      s.column_value AS deptsal
      3  FROM   pivoted_data p
      4  ,      TABLE(number_ntt(d10_sal,d20_sal,d30_sal,d40_sal)) s
      5  ORDER  BY
      6         p.job;
    
    
    JOB           DEPTSAL
    ---------- ----------
    ANALYST
    ANALYST          6600
    ANALYST
    ANALYST
    CLERK
    CLERK            1045
    CLERK            1430
    CLERK            2090
    MANAGER        3272.5
    MANAGER
    MANAGER          3135
    MANAGER          2695
    PRESIDENT
    PRESIDENT
    PRESIDENT
    PRESIDENT        5500
    SALESMAN         6160
    SALESMAN
    SALESMAN
    SALESMAN
    
    20 rows selected.
    

    While we have unpivoted the department salaries, we have lost our descriptive labels for each of the values. There is no simple way with this technique to decode a row number (like we did in the Cartesian Product example). We can, however, change the collection type we use to include a descriptor. For this purpose, we will first create a generic object type to define a single row of numeric unpivot data, as follows.

    SQL> CREATE TYPE name_value_ot AS OBJECT
      2  ( name  VARCHAR2(30)
      3  , value NUMBER
      4  );
      5  /
    
    
    Type created.
    

    We will now create a collection type based on this object, as follows.

    SQL> CREATE TYPE name_value_ntt
      2     AS TABLE OF name_value_ot;
      3  /
    
    
    Type created.
    

    We will now repeat our previous unpivot query, but provide descriptions using our new collection type.

    SQL> SELECT p.job
      2  ,      s.name  AS saldesc
      3  ,      s.value AS deptsal
      4  FROM   pivoted_data p
      5  ,      TABLE(
      6            name_value_ntt(
      7               name_value_ot('D10_SAL', d10_sal),
      8               name_value_ot('D20_SAL', d20_sal),
      9               name_value_ot('D30_SAL', d30_sal),
     10               name_value_ot('D40_SAL', d40_sal) )) s
     11  ORDER  BY
     12         p.job
     13  ,      s.name;
    
    
    JOB        SALDESC       DEPTSAL
    ---------- ---------- ----------
    ANALYST    D10_SAL
    ANALYST    D20_SAL          6600
    ANALYST    D30_SAL
    ANALYST    D40_SAL
    CLERK      D10_SAL          1430
    CLERK      D20_SAL          2090
    CLERK      D30_SAL          1045
    CLERK      D40_SAL
    MANAGER    D10_SAL          2695
    MANAGER    D20_SAL        3272.5
    MANAGER    D30_SAL          3135
    MANAGER    D40_SAL
    PRESIDENT  D10_SAL          5500
    PRESIDENT  D20_SAL
    PRESIDENT  D30_SAL
    PRESIDENT  D40_SAL
    SALESMAN   D10_SAL
    SALESMAN   D20_SAL
    SALESMAN   D30_SAL          6160
    SALESMAN   D40_SAL
    
    20 rows selected.
    

    We can see that the new 11g UNPIVOT syntax is easier to use than the pre-11g alternatives. We will also compare the performance of each of these techniques, using Autotrace, the wall-clock and our MILLION_ROWS test table. We will start with the new 11g syntax and unpivot the three numeric columns of our test table, as follows.

    SQL> set autotrace traceonly statistics
    
    SQL> set timing on
    
    SQL> SELECT *
      2  FROM   million_rows
      3  UNPIVOT (column_value
      4  FOR      column_name
      5  IN      (pivoting_col, summing_col, grouping_col));
    
    
    3000000 rows selected.
    
    Elapsed: 00:00:09.51
    
    Statistics
    ----------------------------------------------------------
              0  recursive calls
              0  db block gets
          20290  consistent gets
          14286  physical reads
              0  redo size
       80492071  bytes sent via SQL*Net to client
          66405  bytes received via SQL*Net from client
           6001  SQL*Net roundtrips to/from client
              0  sorts (memory)
              0  sorts (disk)
        3000000  rows processed
    

    The 11g UNPIVOT method generated 3 million rows in under 10 seconds with only slightly more logical I/O than in our PIVOT tests. We will compare this with the Cartesian Product method, but using a rowsource technique that generates no additional I/O (instead of the ALL_OBJECTS view that we used previously).

    SQL> WITH row_source AS (
      2          SELECT ROWNUM AS rn
      3          FROM   dual
      4          CONNECT BY ROWNUM <= 3
      5          )
      6  SELECT m.padding_col
      7  ,      CASE r.rn
      8            WHEN 0
      9            THEN 'PIVOTING_COL'
     10            WHEN 1
     11            THEN 'SUMMING_COL'
     12            ELSE 'GROUPING_COL'
     13         END AS column_name
     14  ,      CASE r.rn
     15            WHEN 0
     16            THEN m.pivoting_col
     17            WHEN 1
     18            THEN m.summing_col
     19            ELSE m.grouping_col
     20         END AS column_value
     21  FROM   million_rows m
     22  ,      row_source   r;
     
    
    3000000 rows selected.
    
    Elapsed: 00:00:24.95
    
    Statistics
    ----------------------------------------------------------
            105  recursive calls
              2  db block gets
          14290  consistent gets
          54288  physical reads
              0  redo size
       42742181  bytes sent via SQL*Net to client
          66405  bytes received via SQL*Net from client
           6001  SQL*Net roundtrips to/from client
              1  sorts (memory)
              1  sorts (disk)
        3000000  rows processed
    

    The Cartesian Product method is considerably slower than the new 11g UNPIVOT syntax. It generates considerably more I/O and takes over twice as long (note that these results are repeatable across multiple re-runs). However, investigations with SQL trace indicate that this additional I/O is a result of direct path reads and writes to the temporary tablespace, to support a large buffer sort (i.e. the sort that accompanies a MERGE JOIN CARTESIAN operation). On most commercial systems, this buffer sort will probably be performed entirely in memory or the temporary tablespace access will be quicker. For a small system with slow disk access (such as the 11g database used for this article), it has a large impact on performance. We can tune this to a degree by forcing a nested loop join and/or avoiding the disk sort altogether, as follows.

    SQL> WITH row_source AS (
      2          SELECT ROWNUM AS rn
      3          FROM   dual
      4          CONNECT BY ROWNUM <= 3
      5          )
      6  SELECT /*+ ORDERED USE_NL(r) */
      7         m.padding_col
      8  ,      CASE r.rn
      9            WHEN 0
     10            THEN 'PIVOTING_COL'
     11            WHEN 1
     12            THEN 'SUMMING_COL'
     13            ELSE 'GROUPING_COL'
     14         END AS column_name
     15  ,      CASE r.rn
     16            WHEN 0
     17            THEN m.pivoting_col
     18            WHEN 1
     19            THEN m.summing_col
     20            ELSE m.grouping_col
     21         END AS column_value
     22  FROM   million_rows m
     23  ,      row_source   r;
    
    
    3000000 rows selected.
    
    Elapsed: 00:00:14.17
    
    Statistics
    ----------------------------------------------------------
              0  recursive calls
              0  db block gets
          20290  consistent gets
          14286  physical reads
              0  redo size
       64742156  bytes sent via SQL*Net to client
          66405  bytes received via SQL*Net from client
           6001  SQL*Net roundtrips to/from client
        1000000  sorts (memory)
              0  sorts (disk)
        3000000  rows processed
    

    We have significantly reduced the elapsed time and I/O for this method on this database, but have introduced one million tiny sorts. We can easily reverse the nested loops order or use the NO_USE_MERGE hint (which also reverses the NL order), but this doubles the I/O and adds 10% to the elapsed time.

    Moving on, we will finally compare our collection method, as follows.

    SQL> SELECT m.padding_col
      2  ,      t.name  AS column_name
      3  ,      t.value AS column_value
      4  FROM   million_rows m
      5  ,      TABLE(
      6            name_value_ntt(
      7               name_value_ot('PIVOTING_COL', pivoting_col),
      8               name_value_ot('SUMMING_COL',  summing_col),
      9               name_value_ot('GROUPING_COL', grouping_col ))) t;
    
    
    3000000 rows selected.
    
    Elapsed: 00:00:12.84
    
    Statistics
    ----------------------------------------------------------
              0  recursive calls
              0  db block gets
          20290  consistent gets
          14286  physical reads
              0  redo size
       80492071  bytes sent via SQL*Net to client
          66405  bytes received via SQL*Net from client
           6001  SQL*Net roundtrips to/from client
              0  sorts (memory)
              0  sorts (disk)
        3000000  rows processed
    

    This method is comparable in I/O to the new UNPIVOT operation but is approximately 35-40% slower. Further investigation using SQL trace suggests that this is due to additional CPU time spent in the collection iterator fetches. Therefore, the new UNPIVOT operation is both easier to code and quicker to run than its SQL alternatives.

    further reading

    For more information on the new PIVOT and UNPIVOT syntax, see the SQL Reference documentation. For some more examples of the use of pivot and unpivot queries, see the Data Warehousing Guide here and here.

    source code

    The source code for the examples in this article can be downloaded from here.

    Adrian Billington, April 2008

    출처 : http://www.oracle-developer.net/display.php?id=506

    Posted by 1010
    02.Oracle/DataBase2012. 9. 21. 05:23
    반응형

    WITH TEST AS
    (
    select 'A' grade, 10 cnt from dual union all
    select 'A' grade, 20 cnt from dual union all
    select 'A' grade, 15 cnt from dual union all
    select 'B' grade, 20 from dual union all
    select 'B' grade, 30 from dual union all
    select 'D' grade, 15 from dual union all
    select 'F' grade, 10 from dual
    )
    SELECT
    grade 등급,
    cnt 학생수,
    sum(cnt) over () 갯수,
    row_number() over(partition by grade order by cnt) 로넘,
    rank() over(partition by grade order by cnt) 랭크,
    round((cnt / sum(cnt) over ())*100,2) 구성비,
    sum(cnt) over (partition by grade order by grade) 누적학생수,
    sum(cnt) over (partition by grade,cnt order by grade) 그레카운,
    sum(cnt) over (order by grade) 누적,
    round((sum(cnt) over (order by grade)/sum(cnt) over ())*100,2) 누적구성비
    FROM TEST;

    /*

    rank() over(partition by grade order by cnt) 랭크,

    표현식 over (partition by 컬럼1 order by 컬럼2)

    이 의미는

    "(컬럼1값이 같은놈들로 묶은것을 컬럼2로 정렬한) 각 파티션별로 표현식을 수행해준다."

    */

    복잡하군... :(

    [출처] Oracle over() 구문|작성자 18061975

     

    Posted by 1010
    02.Oracle/DataBase2012. 9. 21. 03:19
    반응형

    오랔믈 pivot 기능

    SELECT TO_CHAR(rgs_dt,'YYYYMMDD'),
                  'TA_IPT_ICG_MNFT_MST' AS title,
                  COUNT(mrn)            AS cnt
             FROM TA_IPT_ICG_MNFT_MST
            WHERE USE_FG = 'S'
            GROUP BY TO_CHAR(rgs_dt,'YYYYMMDD')
               UNION
           SELECT TO_CHAR(rgs_dt,'YYYYMMDD'),
                  'TA_ICG_MNFT_MST' AS title,
                  COUNT(mrn)        AS cnt
             FROM TA_ICG_MNFT_MST
            WHERE USE_FG = 'S'
            GROUP BY TO_CHAR(rgs_dt,'YYYYMMDD')

     

     

     

     

    SELECT *
      FROM
           (SELECT TO_CHAR(rgs_dt,'YYYYMMDD'),
                  'TA_IPT_ICG_MNFT_MST' AS title,
                  COUNT(mrn)            AS cnt
             FROM TA_IPT_ICG_MNFT_MST
            WHERE USE_FG = 'S'
            GROUP BY TO_CHAR(rgs_dt,'YYYYMMDD')
               UNION
           SELECT TO_CHAR(rgs_dt,'YYYYMMDD'),
                  'TA_ICG_MNFT_MST' AS title,
                  COUNT(mrn)        AS cnt
             FROM TA_ICG_MNFT_MST
            WHERE USE_FG = 'S'
            GROUP BY TO_CHAR(rgs_dt,'YYYYMMDD')
           ) pivot (SUM(cnt) FOR title IN('TA_IPT_ICG_MNFT_MST','TA_ICG_MNFT_MST'))
    ORDER BY 1

     

     

     

    Posted by 1010
    02.Oracle/DataBase2012. 9. 20. 04:09
    반응형


    --1. Buffer Cache Hit Ratio

    SELECT ROUND(((1-(SUM(DECODE(name, 'physical reads', value,0))/

    (SUM(DECODE(name, 'db block gets', value,0))+

    (SUM(DECODE(name, 'consistent gets', value, 0))))))*100),2) || '%' "Buffer Cache Hit Ratio"

    FROM V$SYSSTAT;

    --2. Library Cache Hit Ratio

    SELECT (1-SUM (reloads)/SUM(pins))*100 "Library Cache Hit Ratio"

    From V$LIBRARYCACHE;

    --3. Data Dictionary Cache Hit Ratio

    SELECT (1-SUM(getmisses)/SUM(gets))*100 "Data Dictionary Hit Ratio"

    FROM V$ROWCACHE;

    -- 테이블 스페이스 사용량

    SELECT a.tablespace_name,

    a.total "Total(Mb)",

    a.total - b.free "Used(Mb)",

    nvl(b.free,0) "Free(Mb)",

    round((a.total - nvl(b.free,0))*100/total,0) "Used(%)"

    from ( select tablespace_name,

    round((sum(bytes)/1024/1024),0) as total

    from dba_data_files

    group by tablespace_name) a,

    ( select tablespace_name,

    round((sum(bytes)/1024/1024),0) as free

    from dba_free_space

    group by tablespace_name) b

    where a.tablespace_name = b.tablespace_name(+)

    order by a.tablespace_name;

    --오라클서버의 메모리

    select * from v$sgastat

    select pool, sum(bytes) "SIZE"

    from v$sgastat

    where pool = 'shared pool'

    group by pool

    --cpu를 많이 사용하는 쿼리문과 프로세스아이디,시리얼번호,머신 알아내기

    select c.sql_text

    ,b.SID

    , b.SERIAL#

    ,b.machine

    ,b.OSUSER

    ,b.logon_time --이 쿼리를 호출한 시간

    from v$process a, v$session b, v$sqltext c

    where a.addr = b.paddr

    and b.sql_hash_value = c.hash_value

    --and a.spid = '675958'

    order by c.PIECE

    --cpu를 많이 사용하는 쿼리문과 프로세스아이디,시리얼번호,머신 알아내기

    select c.sql_text

    from v$process a, v$session b, v$sqltext c

    where a.addr = b.paddr

    and b.sql_hash_value = c.hash_value

    and a.spid = '171'

    order by c.PIECE

    --프로세스 아이디를 이용하여 쿼리문 알아내기

    select c.sql_text

    ,b.SID

    , b.SERIAL#

    ,b.machine

    ,b.OSUSER

    ,b.logon_time --이 쿼리를 호출한 시간

    from v$process a, v$session b, v$sqltext c

    where a.addr = b.paddr

    and b.sql_hash_value = c.hash_value

    and a.spid = '1708032' --1912870/

    order by c.PIECE

    --세션 죽이기(SID,SERAIL#)

    --ALTER SYSTEM KILL SESSION '8,4093'

    --오라클 세션과 관련된 테이블*/

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

    --현재 커서 수 확인

    SELECT sid, count(sid) cursor

    FROM V$OPEN_CURSOR

    WHERE user_name = 'ilips'

    GROUP BY sid

    ORDER BY cursor DESC

    SELECT sql_text, count(sid) cnt

    FROM v$OPEN_CURSOR

    GROUP BY sql_text

    ORDER BY cnt DESC

    select * from v$session_wait

    select sid, serial#, username, taddr, used_ublk, used_urec

    from v$transaction t, v$session s

    where t.addr = s.taddr;

    select * from sys.v_$open_cursor

    --V$LOCK 을 사용한 잠금 경합 모니터링

    SELECT s.username, s.sid, s.serial#, s.logon_time,

    DECODE(l.type, 'TM', 'TABLE LOCK',

    'TX', 'ROW LOCK',

    NULL) "LOCK LEVEL",

    o.owner, o.object_name, o.object_type

    FROM v$session s, v$lock l, dba_objects o

    WHERE s.sid = l.sid

    AND o.object_id = l.id1

    AND s.username IS NOT NULL

    --락이 걸린 세션 자세히 알아보기

    select a.sid, a.serial#,a.username,a.process,b.object_name,

    decode(c.lmode,2,'RS',3,'RX',4,'S',5,'SRX',8,'X','NO') "TABLE LOCK",

    decode (a.command,2,'INSERT',3,'SELECT',6,'UPDATE',7,'DELETE',12,'DROP TABLE',26,'LOCK TABLE','UNknown') "SQL",

    decode(a.lockwait, NULL,'NO wait','Wait') "STATUS"

    from v$session a,dba_objects b, v$lock c

    where a.sid=c.sid and b.object_id=c.id1

    and c.type='TM'

    --락이 걸린 세션 간단히 알아보기

    select a.sid, a.serial#, b.type, c.object_name, a.program, a.lockwait,

    a.logon_time, a.process, a.osuser, a.terminal

    from v$session a, v$lock b, dba_objects c

    where a.sid = b.sid

    and b.id1 = c.object_id

    and b.type = 'TM';

    select a.sid, a.serial#, a.username, a.process, b.object_name

    from v$session a , dba_objects b, v$lock c

    where a.sid=c.sid and b.object_id = c.id1

    and c.type = 'TM'

    --락이 걸린 세션을 찾아 내어 세션을 죽이려고 해도 죽지 않는 경우

    --아래 쿼리문으로 OS단의 PROCESS ID를 찾아내어 OS에서 죽인다

    --kill -9 프로세스아이디

    select substr(s.username,1,11) "ORACLE USER", p.pid "PROCESS ID",

    s.sid "SESSION ID", s.serial#, osuser "OS USER",

    p.spid "PROC SPID",s.process "SESS SPID", s.lockwait "LOCK WAIT"

    from v$process p, v$session s, v$access a

    where a.sid=s.sid and

    p.addr=s.paddr and

    s.username != 'SYS'

    --위 쿼리문의 결과가 있다면 락이 걸린 세션이 있다는것이므로 아래의 쿼리문으로 세션을 죽인다

    ALTER SYSTEM KILL SESSION '11,39061'

    alter session으로 죽지않는 프로세스 죽이기

    1.oracle이 설치된 서버에 텔넷으로 root로 접속한다

    2.su -오라클계정

    3.sqlplus '/as sysdba''

    4.connect system/sys

    5.ALTER SYSTEM KILL SESSION '137,1723'

    출처 : 파란 블로그 DINO 님.

    Posted by 1010
    02.Oracle/DataBase2012. 9. 18. 05:21
    반응형
    instr(object_name,'abcd')>0

    where 절 밑에 object_name like '%abcd%' 로 검색하는 것보다

    instr(object_name,'abcd') > 0 로 검색하면 더 빠르다..

     

     

     

    Full Text Indexing using Oracle Text

    Oracle Text, previously know as interMedia Text and ConText, is an extensive full text indexing technology allowing you to efficiently query free text and produce document classification applications. In this article I'll only scratch the surface of this very complex feature.

    The examples in this article require access to the CTX_DDL package, which is granted as follows.

    GRANT EXECUTE ON CTX_DDL TO <username>;

    CONTEXT Indexes

    The CONTEXT index type is used to index large amounts of text such as Word, PDF, XML, HTML or plain text documents. In this example we will store the data in a BLOB column, which allows us to store binary documents like Word and PDF as well as plain text. Using a CLOB is preferable if only plain text documents are being used.

    First we build a sample schema to hold our data.

    DROP TABLE my_docs;
    DROP SEQUENCE my_docs_seq;
    DROP PROCEDURE load_file_to_my_docs;
    
    CREATE TABLE my_docs (
      id    NUMBER(10)     NOT NULL,
      name  VARCHAR2(200)  NOT NULL,
      doc   BLOB           NOT NULL
    );
    
    ALTER TABLE my_docs ADD (
      CONSTRAINT my_docs_pk PRIMARY KEY (id)
    );
    
    CREATE SEQUENCE my_docs_seq;
    
    CREATE OR REPLACE DIRECTORY documents AS 'C:\work';

    Next we load several files as follows.

    CREATE OR REPLACE PROCEDURE load_file_to_my_docs (p_file_name  IN  my_docs.name%TYPE) AS
      v_bfile      BFILE;
      v_blob       BLOB;
    BEGIN
      INSERT INTO my_docs (id, name, doc)
      VALUES (my_docs_seq.NEXTVAL, p_file_name, empty_blob())
      RETURN doc INTO v_blob;
    
      v_bfile := BFILENAME('DOCUMENTS', p_file_name);
      Dbms_Lob.Fileopen(v_bfile, Dbms_Lob.File_Readonly);
      Dbms_Lob.Loadfromfile(v_blob, v_bfile, Dbms_Lob.Getlength(v_bfile));
      Dbms_Lob.Fileclose(v_bfile);
    
      COMMIT;
    END;
    /
    
    EXEC load_file_to_my_docs('FullTextIndexingUsingOracleText9i.doc');
    EXEC load_file_to_my_docs('FullTextIndexingUsingOracleText9i.asp');
    EXEC load_file_to_my_docs('XMLOverHTTP9i.asp');
    EXEC load_file_to_my_docs('UNIXForDBAs.asp');
    EXEC load_file_to_my_docs('emp_ws_access.sql');
    EXEC load_file_to_my_docs('emp_ws_test.html');
    EXEC load_file_to_my_docs('9ivsSS2000forPerformanceV22.pdf');

    Next we create a CONTEXT type index on the doc column and gather table statistics.

    CREATE INDEX my_docs_doc_idx ON my_docs(doc) INDEXTYPE IS CTXSYS.CONTEXT;
    
    EXEC DBMS_STATS.GATHER_TABLE_STATS(USER, 'MY_DOCS', cascade=>TRUE);

    Finally we query table looking for documents with specific content.

    SELECT SCORE(1) score, id, name
    FROM   my_docs
    WHERE  CONTAINS(doc, 'SQL Server', 1) > 0
    ORDER BY SCORE(1) DESC;
    
         SCORE         ID NAME
    ---------- ---------- ------------------------------------------------
           100        127 9ivsSS2000forPerformanceV22.pdf
    
    1 row selected.
    
    Execution Plan
    ----------------------------------------------------------
       0      SELECT STATEMENT Optimizer=CHOOSE (Cost=4 Card=2 Bytes=58)
       1    0   SORT (ORDER BY) (Cost=4 Card=2 Bytes=58)
       2    1     TABLE ACCESS (BY INDEX ROWID) OF 'MY_DOCS' (Cost=2 Card=2 Bytes=58)
       3    2       DOMAIN INDEX OF 'MY_DOCS_DOC_IDX' (Cost=0)
    
    
    SELECT SCORE(1) score, id, name
    FROM   my_docs
    WHERE  CONTAINS(doc, 'XML', 1) > 0
    ORDER BY SCORE(1) DESC;
    
         SCORE         ID NAME
    ---------- ---------- ------------------------------------------------
            74        123 XMLOverHTTP9i.asp
             9        125 emp_ws_access.sql
    
    2 rows selected.
    
    Execution Plan
    ----------------------------------------------------------
       0      SELECT STATEMENT Optimizer=CHOOSE (Cost=4 Card=2 Bytes=58)
       1    0   SORT (ORDER BY) (Cost=4 Card=2 Bytes=58)
       2    1     TABLE ACCESS (BY INDEX ROWID) OF 'MY_DOCS' (Cost=2 Card=2 Bytes=58)
       3    2       DOMAIN INDEX OF 'MY_DOCS_DOC_IDX' (Cost=0)

    CTXCAT Indexes

    The CTXCAT index type is best suited to smaller text fragments that must be indexed along with other relational data. In this example the data will be stored in a VARCHAR2 column.

    First we create a schema to hold the data.

    DROP TABLE my_items;
    DROP SEQUENCE my_items_seq;
    EXEC CTX_DDL.DROP_INDEX_SET('my_items_iset');
    
    CREATE TABLE my_items (
      id           NUMBER(10)      NOT NULL,
      name         VARCHAR2(200)   NOT NULL,
      description  VARCHAR2(4000)  NOT NULL,
      price        NUMBER(7,2)     NOT NULL
    );
    
    ALTER TABLE my_items ADD (
      CONSTRAINT my_items_pk PRIMARY KEY (id)
    );
    
    CREATE SEQUENCE my_items_seq;

    Next we populate the schema with some dummy data.

    BEGIN
      FOR i IN 1 .. 1000 LOOP
        INSERT INTO my_items (id, name, description, price)
        VALUES (my_items_seq.NEXTVAL, 'Bike: '||i, 'Bike Description ('||i||')', i);
      END LOOP;
    
      FOR i IN 1 .. 1000 LOOP
        INSERT INTO my_items (id, name, description, price)
        VALUES (my_items_seq.NEXTVAL, 'Car: '||i, 'Car Description ('||i||')', i);
      END LOOP;
    
      FOR i IN 1 .. 1000 LOOP
        INSERT INTO my_items (id, name, description, price)
        VALUES (my_items_seq.NEXTVAL, 'House: '||i, 'House Description ('||i||')', i);
      END LOOP;
    
      COMMIT;
    END;
    /

    Next we create a CTXCAT index on the DESCRIPTION and PRICE columns and gather table statistics. In order to create the index we must create an index-set with a sub-index for each column referenced by the CATSEARCH function.

    EXEC CTX_DDL.CREATE_INDEX_SET('my_items_iset');
    EXEC CTX_DDL.ADD_INDEX('my_items_iset','price');
    
    CREATE INDEX my_items_name_idx ON my_items(description) INDEXTYPE IS CTXSYS.CTXCAT
    PARAMETERS ('index set my_items_iset');
    
    EXEC DBMS_STATS.GATHER_TABLE_STATS(USER, 'MY_ITEMS', cascade=>TRUE);

    Finally we query table looking for items with a description that contains our specified words and an appropriate price.

    SELECT id, price, name
    FROM   my_items
    WHERE  CATSEARCH(description, 'Bike', 'price BETWEEN 1 AND 5')> 0;
    
            ID      PRICE NAME
    ---------- ---------- ------------------------------------------------
             1          1 Bike: 1
             2          2 Bike: 2
             3          3 Bike: 3
             4          4 Bike: 4
             5          5 Bike: 5
    
    5 rows selected.
    
    Execution Plan
    ----------------------------------------------------------
       0      SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=150 Bytes=6000)
       1    0   TABLE ACCESS (BY INDEX ROWID) OF 'MY_ITEMS' (Cost=2 Card=150 Bytes=6000)
       2    1     DOMAIN INDEX OF 'MY_ITEMS_NAME_IDX'
    
    
    SELECT id, price, name
    FROM   my_items
    WHERE  CATSEARCH(description, 'Car', 'price BETWEEN 101 AND 105 ORDER BY price DESC')> 0;
    
            ID      PRICE NAME
    ---------- ---------- ------------------------------------------------
          1105        105 Car: 105
          1104        104 Car: 104
          1103        103 Car: 103
          1102        102 Car: 102
          1101        101 Car: 101
    
    5 rows selected.
    
    Execution Plan
    ----------------------------------------------------------
       0      SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=150 Bytes=6000)
       1    0   TABLE ACCESS (BY INDEX ROWID) OF 'MY_ITEMS' (Cost=2 Card=150 Bytes=6000)
       2    1     DOMAIN INDEX OF 'MY_ITEMS_NAME_IDX'

    Every column used to restrict the selection or order the output in the CATSEARCH function should have a sub-index within the index-set. The CTXCAT index type is transactional so there is no need to synchronize the index.

    CTXRULE Indexes

    The CTXRULE index type can be used to build document classification applications.

    First we must define our document categories and store them, along with a suitable query for the MATCHES function.

    DROP TABLE my_doc_categories;
    DROP TABLE my_categories;
    DROP SEQUENCE my_categories_seq;
    DROP TABLE my_docs;
    DROP SEQUENCE my_docs_seq;
    
    CREATE TABLE my_categories (
      id        NUMBER(10)      NOT NULL,
      category  VARCHAR2(30)    NOT NULL,
      query     VARCHAR2(2000)  NOT NULL
    );
    
    ALTER TABLE my_categories ADD (
      CONSTRAINT my_categories_pk PRIMARY KEY (id)
    );
    
    CREATE SEQUENCE my_categories_seq;
    
    INSERT INTO my_categories VALUES(my_categories_seq.NEXTVAL, 'Oracle', 'ABOUT(Oracle)');
    INSERT INTO my_categories VALUES(my_categories_seq.NEXTVAL, 'SQL Server', 'ABOUT(SQL Server)');
    INSERT INTO my_categories VALUES(my_categories_seq.NEXTVAL, 'UNIX', 'ABOUT(UNIX)');

    Next we create a table to hold our documents.

    CREATE TABLE my_docs (
      id    NUMBER(10)     NOT NULL,
      name  VARCHAR2(200)  NOT NULL,
      doc   CLOB           NOT NULL
    );
    
    ALTER TABLE my_docs ADD (
      CONSTRAINT my_docs_pk PRIMARY KEY (id)
    );
    
    CREATE SEQUENCE my_docs_seq;

    Then we create an intersection table to resolve the many-to-many relationship between documents and categories.

    CREATE TABLE my_doc_categories (
      my_doc_id       NUMBER(10)  NOT NULL,
      my_category_id  NUMBER(10)  NOT NULL
    );
    
    ALTER TABLE my_doc_categories ADD (
      CONSTRAINT my_doc_categories_pk PRIMARY KEY (my_doc_id, my_category_id)
    );

    Next we create a BEFORE INSERT trigger on the MY_DOCS table to automatically assign the documents to the relevant categories as they are being inserted. The MATCHES function is used to decide if the document matches any of our gategory queries. The resulting cursor is used to insert the matches into the intersect table.

    CREATE OR REPLACE TRIGGER my_docs_trg
      BEFORE INSERT ON my_docs
      FOR EACH ROW
    BEGIN
      FOR c1 IN (SELECT id
                 FROM   my_categories
                 WHERE  MATCHES(query, :new.doc)>0)
      LOOP
        BEGIN
          INSERT INTO my_doc_categories(my_doc_id, my_category_id)
          VALUES (:new.id, c1.id);
        EXCEPTION
          WHEN OTHERS THEN
            NULL;
        END;
      END LOOP;
    END;
    /

    Next we create the CTXRULE index to support the trigger. For completeness we also create a CONTEXT index on the document itself, although this is not involved in the category assignment process.

    CREATE INDEX my_categories_query_idx ON my_categories(query) INDEXTYPE IS CTXSYS.CTXRULE;
    CREATE INDEX my_docs_doc_idx ON my_docs(doc) INDEXTYPE IS CTXSYS.CONTEXT;
    
    EXEC DBMS_STATS.GATHER_TABLE_STATS(USER, 'MY_CATEGORIES', cascade=>TRUE);
    EXEC DBMS_STATS.GATHER_TABLE_STATS(USER, 'MY_DOCS', cascade=>TRUE);
    EXEC DBMS_STATS.GATHER_TABLE_STATS(USER, 'MY_DOC_CATEGORIES', cascade=>TRUE);

    Finally we test the mechanism by inserting some rows and checking the classification.

    INSERT INTO my_docs (id, name, doc)
    VALUES (my_docs_seq.NEXTVAL, 'Oracle Document', 'This document constains the word Oracle!');
    
    INSERT INTO my_docs (id, name, doc)
    VALUES (my_docs_seq.NEXTVAL, 'SQL Server Document', 'This document constains the words SQL Server!');
    
    INSERT INTO my_docs (id, name, doc)
    VALUES (my_docs_seq.NEXTVAL, 'UNIX Document', 'This document constains the word UNIX!');
    
    INSERT INTO my_docs (id, name, doc)
    VALUES (my_docs_seq.NEXTVAL, 'Oracle UNIX Document', 'This document constains the word UNIX and the word Oracle!');
    
    
    COLUMN name FORMAT A30;
    SELECT a.name, b.category
    FROM   my_docs a,
           my_categories b,
           my_doc_categories c
    WHERE  c.my_doc_id      = a.id
    AND    c.my_category_id = b.id;
    
    NAME                           CATEGORY
    ------------------------------ ------------------------------
    Oracle Document                Oracle
    SQL Server Document            SQL Server
    UNIX Document                  UNIX
    Oracle UNIX Document           UNIX
    Oracle UNIX Document           Oracle
    
    5 rows selected.

    The output shows that the documents have been assigned to the correct categories. Note, the "Oracle UNIX Document" document has been assigned to both the "Oracle" and "UNIX" categories.

    Index Maintenance

    Not all Oracle Text indexes are automatically updated as records are added or deleted. To synchronize the index with the table you must call.

    SQL> EXEC CTX_DDL.SYNC_INDEX('my_docs_doc_idx');

    Regular synchronizations of the index can be automated using the DBMS_JOB package. The following script is provided to make this task easier.

    $ORACLE_HOME/ctx/sample/script/drjobdml.sql

    It can be called from SQL*Plus whilst logged on as the index owner as follows.

    SQL> @drjobdml.sql index-name interval-mins
    SQL> @drjobdml.sql my_docs_doc_idx 60

    Regular synchronization of text indexes can cause fragmentation which affects query performance. To correct this situation the index can be rebuilt or optimized. Index optimization can be performed in three basic modes (FAST, FULL or TOKEN). The FAST mode compacts fragmented rows but does not remove old data.

    BEGIN
      CTX_DDL.OPTIMIZE_INDEX('my_docs_doc_idx','FAST');
    END;
    /

    The FULL mode optimizes either the entire index or a portion of it, with old data removed.

    BEGIN
      CTX_DDL.OPTIMIZE_INDEX('my_docs_doc_idx','FULL');
    END;
    /

    The TOKEN mode perfoms a full optimization for a specific token.

    BEGIN
      CTX_DDL.OPTIMIZE_INDEX('my_docs_doc_idx','TOKEN', token=>'Oracle');
    END;
    /

    For more information see:

    Hope this helps. Regards Tim...

    Back to the Top.

    Posted by 1010
    02.Oracle/DataBase2012. 9. 18. 03:26
    반응형

    출처 : http://ryu1hwan.tistory.com/27

    머릿말

    오늘은 CASE문에 강의해보도록 하겠습니다.
    이전에 DECODE에 대해서 설명드렸는데, DECODE와 동일한 기능을 하는 문장입니다.
    DECODE보다 이해하기 쉽고, 사용하기 편한 방법입니다. 단, DECODE보다 코딩양은 약간 길어집니다.
    그러므로, 만드는 SQL에서 필요한 상황에 따라 DECODE와 CASE를 섞어 쓰시는게 현명하다고 생각됩니다.


    Lesson 7: CASE문

    작성방법
    SELECT T1.STORE_ID
    ,T1.STORE_ADDR
    ,T1.REGION_CD
    ,T2.REGION_GD
    ,CASE WHEN T2.REGION_GD = 'S' THEN 'High Grade'
    WHEN T2.REGION_GD = 'A' THEN 'High Grade'
    ELSE 'Low Grade' END NEW_REGION_GD
    FROM SQL_TEST.MA_STORE T1
    ,SQL_TEST.CD_REGION T2
    WHERE T2.REGION_CD = T1.REGION_CD
    - STORE의 지역에 대한 등급을 High Grade와 Low Grade로 변경해서 출력한다.
    - CASE WHEN을 기술 한 후 조건을 기술하고, THEN 다음에 조건을 만족할 경우의 결과를 적는다.
    - CASE WHEN조건을 만족하지 않을 경우 처리한 내용을 ELSE절에 적는다.


    중첩된 CASE문
    - 여러개의 CASE문을 중첩해서 사용할 수 있다.
    SELECT T1.STORE_ID
    ,T1.STORE_ADDR
    ,CASE WHEN T1.STORE_SIZE >= 100 THEN
    CASE WHEN T2.REGION_GD IN ('S') THEN 'High grade'
    WHEN T2.REGION_GD IN ('A','B') THEN 'Mid Grade'
    ELSE 'Low Grade'
    END
    WHEN T1.STORE_SIZE >= 50 THEN
    CASE WHEN T2.REGION_GD IN ('S', 'A') THEN 'High Grade'
    WHEN T2.REGION_GD IN ('B') THEN 'Mid Grade'
    ELSE 'Low Grade'
    END
    ELSE
    CASE WHEN T2.REGION_GD IN ('S', 'A', 'B') THEN 'High Grade'
    ELSE 'Low Grade'
    END
    END STORE_SIZE_GD
    FROM SQL_TEST.MA_STORE T1
    ,SQL_TEST.CD_REGION T2
    WHERE T1.REGION_CD = T2.REGION_CD
    - STORE의 SIZE에 대한 등급을 STORE의 지역(REGION), STORE_SIZE별로 STORE SIZE등급을 구한다.
    - 이러한 중첩된 CASE는 사용자가 원하는 다양한 결과를 얻어 내는데 큰 도움이 된다.

    GROUP BY와 CASE/DECODE : GROUP BY컬럼에 CASE/DECODE사용
    - GROUP BY를 정의하는 컬럼에 CASE나 DECODE를 사용하는 방법이다.
    SELECT CASE WHEN T1.REGION_GD = 'S' THEN 'High Grade'
    WHEN T1.REGION_GD = 'A' THEN 'High Grade'
    ELSE 'Low Grade' END GRADE
    ,COUNT(*) REGION_CNT
    FROM SQL_TEST.CD_REGION T1
    GROUP BY CASE WHEN T1.REGION_GD = 'S' THEN 'High Grade'
    WHEN T1.REGION_GD = 'A' THEN 'High Grade'
    ELSE 'Low Grade' END;

    SELECT
    DECODE(T1.REGION_GD,'S','High Grade','A','High Grade','Low Grade') GRADE
    ,COUNT(*) REGION_CNT
    FROM SQL_TEST.CD_REGION T1
    GROUP BY DECODE(T1.REGION_GD,'S','High Grade','A','High Grade','Low Grade');
    - CASE/DECODE를 통해 REGION_GD가 S나 A인 경우는 High Grade로 표시하고, 나머지는 Low Grade로 집계해서 Region(지역)별로 카운트를 한다.
    - 주의 할 점은 GROUP BY에 명시한 내용 그대로 SELECT절에 적어야 한다는 것이다.
    - 추가로 예제를 하나 더 보도록 하자.
    SELECT CASE WHEN T1.STORE_SIZE >= 100 AND T2.REGION_GD IN ('S') THEN 'High'
    WHEN T1.STORE_SIZE >= 100 AND T2.REGION_GD IN ('A','B','C') THEN 'Normal'
    WHEN T1.STORE_SIZE < 100 AND T2.REGION_GD IN ('S','A') THEN 'High'
    WHEN T1.STORE_SIZE < 100 AND T2.REGION_GD IN ('B','C') THEN 'Low'
    END STORE_SIZE_GD
    ,COUNT(*) STORE_CNT
    FROM SQL_TEST.MA_STORE T1
    ,SQL_TEST.CD_REGION T2
    WHERE T1.REGION_CD = T2.REGION_CD
    GROUP BY CASE WHEN T1.STORE_SIZE >= 100 AND T2.REGION_GD IN ('S') THEN 'High'
    WHEN T1.STORE_SIZE >= 100 AND T2.REGION_GD IN ('A','B','C') THEN 'Normal'
    WHEN T1.STORE_SIZE < 100 AND T2.REGION_GD IN ('S','A') THEN 'High'
    WHEN T1.STORE_SIZE < 100 AND T2.REGION_GD IN ('B','C') THEN 'Low'
    END


    GROUP BY + CASE/DECODE : 집계함수 내에 CASE/DECODE사용
    - GROUP BY를 사용해서 값을 집계 할 때, CASE/DECODE를 사용해서, 특정 경우에만 값이 집계되도록 하는 방법이다.
    SELECT T1.STORE_ID
    ,SUM(CASE WHEN TO_CHAR(TO_DATE(T1.ORDER_YMD,'YYYYMMDD'),'D')='1' THEN 1 END) SUN_ORD
    ,SUM(CASE WHEN TO_CHAR(TO_DATE(T1.ORDER_YMD,'YYYYMMDD'),'D')='2' THEN 1 END) MON_ORD
    ,SUM(CASE WHEN TO_CHAR(TO_DATE(T1.ORDER_YMD,'YYYYMMDD'),'D')='3' THEN 1 END) TUE_ORD
    ,SUM(CASE WHEN TO_CHAR(TO_DATE(T1.ORDER_YMD,'YYYYMMDD'),'D')='4' THEN 1 END) WED_ORD
    ,SUM(CASE WHEN TO_CHAR(TO_DATE(T1.ORDER_YMD,'YYYYMMDD'),'D')='5' THEN 1 END) THU_ORD
    ,SUM(CASE WHEN TO_CHAR(TO_DATE(T1.ORDER_YMD,'YYYYMMDD'),'D')='6' THEN 1 END) FRI_ORD
    ,SUM(CASE WHEN TO_CHAR(TO_DATE(T1.ORDER_YMD,'YYYYMMDD'),'D')='7' THEN 1 END) SAT_ORD
    FROM SQL_TEST.HI_ORDER T1
    WHERE T1.ORDER_YMD LIKE '200901%'
    GROUP BY T1.STORE_ID
    ORDER BY T1.STORE_ID;


    SELECT
    T1.STORE_ID
    ,SUM(DECODE(TO_CHAR(TO_DATE(T1.ORDER_YMD,'YYYYMMDD'),'D'),'1',1,0)) SUN_ORD
    ,SUM(DECODE(TO_CHAR(TO_DATE(T1.ORDER_YMD,'YYYYMMDD'),'D'),'2',1,0)) MON_ORD
    ,SUM(DECODE(TO_CHAR(TO_DATE(T1.ORDER_YMD,'YYYYMMDD'),'D'),'3',1,0)) TUE_ORD
    ,SUM(DECODE(TO_CHAR(TO_DATE(T1.ORDER_YMD,'YYYYMMDD'),'D'),'4',1,0)) WED_ORD
    ,SUM(DECODE(TO_CHAR(TO_DATE(T1.ORDER_YMD,'YYYYMMDD'),'D'),'5',1,0)) THU_ORD
    ,SUM(DECODE(TO_CHAR(TO_DATE(T1.ORDER_YMD,'YYYYMMDD'),'D'),'6',1,0)) FRI_ORD
    ,SUM(DECODE(TO_CHAR(TO_DATE(T1.ORDER_YMD,'YYYYMMDD'),'D'),'7',1,0)) SAT_ORD
    FROM SQL_TEST.HI_ORDER T1
    WHERE T1.ORDER_YMD LIKE '200901%'
    GROUP BY T1.STORE_ID
    ORDER BY T1.STORE_ID;

    - 데이터를 STORE_ID별로 GROUP BY한다.
    - CASE/DECODE를 사용해서 ORDER_DT의 요일값(1(일요일)~7(토요일))에 따라 주문 건수를 집계
    - 예를 들어 ORDER_DT가 요일 값ㅣ 1(일요일)일 때는 숫자 1을 아닌 경우는 0으로 변경해서 합계를 구해 SUN_ORD를 만든다.
    - 이와 같은 유형은 데이터 분석 화면을 만들때 많이 사용되는 유형입니다.
    - 추가로 하나의 예제를 보도록 하자.
    SELECT T1.ORDER_YMD
    ,SUM(CASE WHEN T2.PROD_SIZE_CD = 'L' THEN 1 END) LARGE_ORD_CNT
    ,SUM(CASE WHEN T2.PROD_SIZE_CD = 'L' THEN T2.ITEM_SALE_PRC END) LARGE_ORD_AMT
    ,SUM(CASE WHEN T2.PROD_SIZE_CD = 'M' THEN 1 END) MIDDLE_ORD_CNT
    ,SUM(CASE WHEN T2.PROD_SIZE_CD = 'M' THEN T2.ITEM_SALE_PRC END) MIDDLE_ORD_AMT
    ,SUM(CASE WHEN T2.PROD_SIZE_CD = 'S' THEN 1 END) SMALL_ORD_CNT
    ,SUM(CASE WHEN T2.PROD_SIZE_CD = 'S' THEN T2.ITEM_SALE_PRC END) SMALL_ORD_AMT
    FROM SQL_TEST.HI_ORDER T1
    ,SQL_TEST.HI_ORDER_ITEM T2
    WHERE T1.ORDER_YMD LIKE '200901%'
    AND T1.ORDER_NO = T2.ORDER_NO
    GROUP BY T1.ORDER_YMD
    ORDER BY T1.ORDER_YMD
    - 주문일자별로 데이터를 GROUP BY한다.
    - 주문된 제품의 SIZE별로 주문 건수를 카운트 한다.

    GROUP BY + CASE/DECODE : 집계 함수 바깥에 CASE/DECODE를 사용
    - GROUP BY와 집계함수를 먼저 사용하고, 집계 함수의 결과에 대해 CASE/DECODE를 사용한다.
    SELECT T1.STORE_ID
    ,SUM(T2.ORDER_AMT) ORDER_AMT
    ,CASE WHEN SUM(T2.ORDER_AMT) > 15 THEN 'High'
    WHEN SUM(T2.ORDER_AMT) > 10 THEN 'Mid'
    WHEN SUM(T2.ORDER_AMT) > 0 THEN 'Low'
    ELSE 'Bad' END SALE_GD
    FROM SQL_TEST.MA_STORE T1
    ,SQL_TEST.HI_ORDER T2
    WHERE T2.STORE_ID = T1.STORE_ID(+)
    AND T2.ORDER_YMD(+) = '20090101'
    GROUP BY T1.STORE_ID
    - STORE별 판매 금액 합계에 따라 판매 등급을 구한다.
    - 집계뙨 금액 합계에 따라 15보다 크면 High, 10~15사이이면 Mid, 나머지는 Low로 판매등급을 구한다.
    SELECT T3.REGION_GD
    ,T1.STORE_ID
    ,SUM(T2.ORDER_AMT) ORDER_AMT
    ,CASE WHEN T3.REGION_GD = 'S' THEN
    CASE WHEN SUM(T2.ORDER_AMT) > 15 THEN 'High'
    WHEN SUM(T2.ORDER_AMT) > 10 THEN 'Mid'
    ELSE 'Low' END
    WHEN T3.REGION_GD = 'A' THEN
    CASE WHEN SUM(T2.ORDER_AMT) > 12 THEN 'High'
    WHEN SUM(T2.ORDER_AMT) > 9 THEN 'Mid'
    ELSE 'Low' END
    WHEN T3.REGION_GD = 'B' THEN
    CASE WHEN SUM(T2.ORDER_AMT) > 9 THEN 'High'
    WHEN SUM(T2.ORDER_AMT) > 5 THEN 'Mid'
    ELSE 'Low' END
    WHEN T3.REGION_GD = 'C' THEN
    CASE WHEN SUM(T2.ORDER_AMT) > 5 THEN 'High'
    WHEN SUM(T2.ORDER_AMT) > 3 THEN 'Mid'
    ELSE 'Low' END
    END SALE_GD
    FROM SQL_TEST.MA_STORE T1
    ,SQL_TEST.HI_ORDER T2
    ,SQL_TEST.CD_REGION T3
    WHERE T2.STORE_ID = T1.STORE_ID(+)
    AND T2.ORDER_YMD(+) = '20090101'
    AND T3.REGION_CD = T1.REGION_CD
    GROUP BY T3.REGION_GD, T1.STORE_ID
    - 중첩된 CASE를 이용해서 REGION_GD에 따라 판매등급의 판매금액 기준을 다르게 적용


    원래 컬럼을 변경하는 CASE, DECODE문이 자주 나오는 것은 성능상 문제가 있을 수 있다.
    - 수작업으로 작성하는 1회성 리포트라면 크게 문제 없다.
    - CASE, DECODE를 사용하지 않고 SQL을 작성할 수 있는 가를 고려한다.
    - CASE, DECODE를 제거할 수 있도록 테이블을 변경 할 수 있는 가를 고려한다.
    - 위의 상황이 불가피 할 경우 상급개발자나 DBAㅘ 함께 성능점검을 하도록 한다.

    CASE를 사용할 것인가? DECODE를 사용할 것인가?
    - 기본적인 구문은 DECODE가 간단하지만, 복잡한 조건에서는 표현하기가 어렵다.
    - DECODE를 이용해 간단히 표현이 가능하면 DECODE를,
    - 조건식이 너무 복잡할 경우는 CASE를 사용하도록 하자.


    맺음말.
    오늘도 저의 지루한 글 읽으시느라고 고생들 하셨습니다.^^
    누가 보실지는 모르겠지만, 아무튼, 지금까지 따라 오셨다면,
    이젠 SQL문법 자체는 거의 모두 익히신거네요.^^
    Posted by 1010
    02.Oracle/DataBase2012. 9. 2. 08:01
    반응형

    출처 : http://scidb.tistory.com/entry/SQL-Tuning-Advisor

    SQL Tuning Advisor

    개념 :
    - Oracle 10g 의 새기능인 Automatic Workload Repository(AWR) 의 튜닝 솔루션인
    Server-Based Advisors의 콤포넌트 중의 하나이다.
    - Server-Based Advisors 는 다음과 같이구성된다.
    Automatic Database Diagnostic Monitor (ADDM)
    SQL Tuning Advisor
    SQL Access Advisor
    Shared Pool Advisor
    MTTR Advisor
    - SQL Tuning Advisor 는 SQL 구문들을 분석하여 튜닝방법을 제안한다.
    - 튜닝방법을 제안하는 것에서 그치지 않고 쉽게적용할수 있도록 도와주기도 한다.


    사용방법:
    -엔터프라이져 매니져를 통해 관리할수도 있지만 여기서는 DBMS_SQLTUNE 패키지를
    사용하기로 한다.

    1) 튜닝 Task 생성

    Declare
    ret_val varchar2(2000);
    Begin
    ret_val:=dbms_sqltune.create_tuning_task(sql_text=>
    'SELECT *FROM EMP WHERE EMPNO=7934');

    dbms_output.put_line('Output: 'ret_val);

    end;/

    OUTPUT: TASK_00004

    2) 튜닝가이드 생성

    Exec Dbms_sqltune.execute_tuning_task('TASK_00004');


    3) 튜닝 리포트 생성
    set serveroutput on size 999999
    set long 999999
    select dbms_sqltune.report_tuning_task ('TASK_00004') from dual;

    4)결과분석

    GENERAL INFORMATION SECTION
    ----------------------------------------------------
    Tuning Task Name : TASK_00004
    Scope : COMPREHENSIVE
    Time Limit(seconds): 1800
    Completion Status : COMPLETED
    Started at : 11/06/2003 01:47:38

    사용자 삽입 이미지

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

    위 결과를 보면 recommendation 항목에서 튜닝제안을 했으며 구체적인 스크립트까지
    제시하고 있다.
    Rationale 항목에서는 튜닝방법대로 했을경우 옵티마이져가 어떻게 반응하는지를 보여준다.
    위의 예제에서는 통계정보를 생성하면 실행계획이 바뀐다는점을 알려주고 있다.
    신기하지 않은가?

     

    Posted by 1010
    02.Oracle/DataBase2012. 9. 2. 07:59
    반응형

    출처: http://scidb.tistory.com/entry/다양한-검색조건의-튜닝방법

     

    다양한 검색조건의 튜닝방법

    업무적으로 볼때 조회화면의 검색조건들의 조합은 참으로 다양하다.
    아래의 SQL 을 보면 WHERE 절의 모든 변수(:v_grade , :v_loc , :v_hiredate )에 값이 생략이 가능하다.
    즉 모든 변수에 값이 들어올수도 있고 일부만 들어올수도 있고 전체가 안들어 올수도 있다.
    where 절의 대부분이 그런조건이라고 가정하면 그런 SQL 들은 튜닝하기가 참 난감하다.
    이럴때 당신이라면 어떻게 할것인가?
    전통적인 튜닝 방법인 UNION ALL 로 모두 쪼개서 분리 할것인가?
    아래의 인덱스 구조와 SQL 을 보자.

    EMP 인덱스:
    1) PK_EMP ( EMPNO )
    2) EMP_IDX1 ( SAL )
    3) EMP_IDX2 ( HIREDATE )
    4) EMP_IDX3 ( DEPTNO )

    DEPT 인덱스 :
    1) PK_DEPT ( DEPTNO )
    2) DEPT_IDX1 ( LOC )

    SALGRADE 인덱스:
    1) PK_SALGRADE( GRADE )
    2) SALGRADE( HISAL, LOSAL)

    1. 다양한 조건검색을 OR 로 처리할경우(원본 SQL)

    SELECT a.empno, a.ename, a.job, b.dname, a.sal
    FROM EMP a,
    DEPT b,
    SALGRADE c
    WHERE a.deptno = b.deptno
    and a.sal between c.losal and c.hisal
    and (c.grade = :v_grade or :v_grade is null) --> 변수에 NULL 대입
    and (b.loc = :v_loc or :v_loc is null) --> 변수에 NULL 대입
    and (a.hiredate = :v_hiredate or :v_hiredate is null); --> 변수 :v_hiredate 에 '1980-12-17' 값을 대입한다.


     

    물론 위의 SQL 을 아래처럼 나타태도 PLAN 상으로는 같다.

    SELECT a.empno, a.ename, a.job, b.dname, a.sal
    FROM EMP a,
    DEPT b,
    SALGRADE c
    WHERE a.deptno = b.deptno
    and a.sal between c.losal and c.hisal
    and c.grade LIKE :v_grade||'%' --> 변수에 NULL 대입
    and b.loc LIKE :v_loc||'%' --> 변수에 NULL 대입
    and a.hiredate LIKE :v_hiredate||'%'; --> 변수 :v_hiredate 에 '1980-12-17' 값을 대입한다.



    -------------------------------------------------------------------------------------------
    | Id | Operation | Name | Starts | A-Rows | A-Time | Buffers |
    -------------------------------------------------------------------------------------------
    | 1 | NESTED LOOPS | | 1 | 1 |00:00:00.01 | 21 |
    | 2 | NESTED LOOPS | | 1 | 1 |00:00:00.01 | 19 |
    |* 3 | TABLE ACCESS FULL | SALGRADE | 1 | 5 |00:00:00.01 | 8 |
    |* 4 | TABLE ACCESS BY INDEX ROWID| EMP | 5 | 1 |00:00:00.01 | 11 |
    |* 5 | INDEX RANGE SCAN | EMP_IDX1 | 5 | 14 |00:00:00.01 | 3 |
    |* 6 | TABLE ACCESS BY INDEX ROWID | DEPT | 1 | 1 |00:00:00.01 | 2 |
    |* 7 | INDEX UNIQUE SCAN | PK_DEPT | 1 | 1 |00:00:00.01 | 1 |
    -------------------------------------------------------------------------------------------

    Predicate Information (identified by operation id):
    ---------------------------------------------------

    3 - filter((:V_GRADE IS NULL OR "C"."GRADE"=TO_NUMBER(:V_GRADE)))
    4 - filter((:V_HIREDATE IS NULL OR "A"."HIREDATE"=TO_DATE(:V_HIREDATE,'YYYY-MM-DD')))
    5 - access("A"."SAL">="C"."LOSAL" AND "A"."SAL"<="C"."HISAL")
    6 - filter(("B"."LOC"=:V_LOC OR :V_LOC IS NULL))
    7 - access("A"."DEPTNO"="B"."DEPTNO")


    해석 : 위 PLAN 을 보면 :v_hiredate 에 값이 들어 왔으므로 당연히 EMP_IDX2 인덱스를 먼저
    ACCESS 해야 하지만 엉뚱한 테이블 부터 ACCESS 하여서 비효율이 발생 하였다.
    즉 동적으로 변수값이 들어옴에 따라 PLAN 을 최적화 하지 못한다는 의미이다.
    물론 버젼이 11g 라면 동적으로 최적화 할수 있는 기능(Adaptive Cursor sharing)이 있지만
    항상 그렇게 되는건 아니다.
    그러면 이런 문제를 해결하기위해 어떻게 해야 할까?
    아래의 2~4 번에 해답이 있다.

    2.엑세스 형태별로 UNION ALL 로 분리함

    먼저 UNION ALL 로 분리하는 기준은 똑똑한 조건에 먼저 우선순위를 주었다.
    다시말하면 :v_hiredate 는 굉장히 똑똑한 조건이므로 값이 들어오면 :v_grade 나 :v_loc 에 값이
    들어오던 들어오지 않던 대세에 지장이 없다는 의미이다.
    마찬가지 방법으로 :v_hiredate 가 들어오지 않는 상황에서는 두번째로 똑똑한 조건인 :v_grade 에
    값이 들어오면 :v_loc 이 들어오던 들어오지 않던 중요하지 않다는 의미이다.
    따라서 순서는 :v_hiredate --> :v_grade --> :v_loc 로 하였다.
    실행시에 다른변수에는 값을 넣지않고 :v_hiredate 만 '1980-12-17' 값을 대입한다.


    SELECT .... --> :v_hiredate 가 들어 왔을때
    WHERE a.deptno = b.deptno
    and a.sal between c.losal and c.hisal
    and (c.grade = :v_grade or :v_grade is null)
    and (b.loc = :v_loc or :v_loc is null)
    and a.hiredate = :v_hiredate and :v_hiredate is not null
    UNION ALL
    SELECT .... --> :v_hiredate 가 안들어 오고 :v_grade 가 들어올때
    WHERE a.deptno = b.deptno
    and a.sal between c.losal and c.hisal
    and c.grade = :v_grade
    and (b.loc = :v_loc or :v_loc is null)
    and :v_hiredate is null and :v_grade is not null
    UNION ALL
    SELECT .... --> :v_hiredate 가 안들어 오고 :v_grade 가 안들어오고 :v_loc 가 들어올때
    WHERE a.deptno = b.deptno
    and a.sal between c.losal and c.hisal때
    and c.grade = :v_grade
    and b.loc =:v_loc
    and :v_hiredate is null and :v_grade is null and :v_loc is not null
    UNION ALL
    SELECT .... --> 변수에 아무것도 안들어 왔을때
    WHERE a.deptno = b.deptno
    and a.sal between c.losal and c.hisal
    and :v_hiredate is null
    and :v_grade is null
    and :v_loc is null ;


    ---------------------------------------------------------------------------------------------------
    | Id | Operation | Name | Starts | A-Rows | A-Time | Buffers |
    ---------------------------------------------------------------------------------------------------
    | 1 | UNION-ALL | | 1 | 1 |00:00:00.05 | 8 |
    |* 2 | FILTER | | 1 | 1 |00:00:00.05 | 8 |
    |* 3 | TABLE ACCESS BY INDEX ROWID | SALGRADE | 1 | 1 |00:00:00.05 | 8 |
    | 4 | NESTED LOOPS | | 1 | 3 |00:00:00.08 | 7 |
    | 5 | NESTED LOOPS | | 1 | 1 |00:00:00.04 | 5 |
    | 6 | TABLE ACCESS BY INDEX ROWID| EMP | 1 | 1 |00:00:00.02 | 3 |
    |* 7 | INDEX RANGE SCAN | EMP_IDX2 | 1 | 1 |00:00:00.01 | 2 |
    |* 8 | TABLE ACCESS BY INDEX ROWID| DEPT | 1 | 1 |00:00:00.02 | 2 |
    |* 9 | INDEX UNIQUE SCAN | PK_DEPT | 1 | 1 |00:00:00.01 | 1 |
    |* 10 | INDEX RANGE SCAN | SALGRADE_IDX1 | 1 | 1 |00:00:00.01 | 2 |
    |* 11 | FILTER | | 1 | 0 |00:00:00.01 | 0 |
    | 12 | NESTED LOOPS | | 0 | 0 |00:00:00.01 | 0 |
    | 13 | NESTED LOOPS | | 0 | 0 |00:00:00.01 | 0 |
    | 14 | TABLE ACCESS BY INDEX ROWID | SALGRADE | 0 | 0 |00:00:00.01 | 0 |
    |* 15 | INDEX RANGE SCAN | PK_SALGRADE | 0 | 0 |00:00:00.01 | 0 |
    | 16 | TABLE ACCESS BY INDEX ROWID | EMP | 0 | 0 |00:00:00.01 | 0 |
    |* 17 | INDEX RANGE SCAN | EMP_IDX1 | 0 | 0 |00:00:00.01 | 0 |
    |* 18 | TABLE ACCESS BY INDEX ROWID | DEPT | 0 | 0 |00:00:00.01 | 0 |
    |* 19 | INDEX UNIQUE SCAN | PK_DEPT | 0 | 0 |00:00:00.01 | 0 |
    |* 20 | FILTER | | 1 | 0 |00:00:00.01 | 0 |
    |* 21 | TABLE ACCESS BY INDEX ROWID | SALGRADE | 0 | 0 |00:00:00.01 | 0 |
    | 22 | NESTED LOOPS | | 0 | 0 |00:00:00.01 | 0 |
    | 23 | NESTED LOOPS | | 0 | 0 |00:00:00.01 | 0 |
    | 24 | TABLE ACCESS BY INDEX ROWID| DEPT | 0 | 0 |00:00:00.01 | 0 |
    |* 25 | INDEX RANGE SCAN | DEPT_IDX1 | 0 | 0 |00:00:00.01 | 0 |
    | 26 | TABLE ACCESS BY INDEX ROWID| EMP | 0 | 0 |00:00:00.01 | 0 |
    |* 27 | INDEX RANGE SCAN | EMP_IDX3 | 0 | 0 |00:00:00.01 | 0 |
    |* 28 | INDEX RANGE SCAN | PK_SALGRADE | 0 | 0 |00:00:00.01 | 0 |
    |* 29 | FILTER | | 1 | 0 |00:00:00.01 | 0 |
    | 30 | MERGE JOIN | | 0 | 0 |00:00:00.01 | 0 |
    | 31 | SORT JOIN | | 0 | 0 |00:00:00.01 | 0 |
    |* 32 | HASH JOIN | | 0 | 0 |00:00:00.01 | 0 |
    | 33 | TABLE ACCESS FULL | DEPT | 0 | 0 |00:00:00.01 | 0 |
    | 34 | TABLE ACCESS FULL | EMP | 0 | 0 |00:00:00.01 | 0 |
    |* 35 | FILTER | | 0 | 0 |00:00:00.01 | 0 |
    |* 36 | SORT JOIN | | 0 | 0 |00:00:00.01 | 0 |
    | 37 | INDEX FULL SCAN | SALGRADE_IDX1 | 0 | 0 |00:00:00.01 | 0 |
    ---------------------------------------------------------------------------------------------------

    Predicate Information (지면관계상 생략)

    해석 : PLAN 이 개발자가 의도한대로 분리되었고 A-Rows 와 Buffers 를 보면 분리된 SQL 중에서 첫번째
    SQL 만 값이 있다.
    하지만 최적의 SQL 이 되려면 아직도 멀었다.

    3.UNION ALL 로 분리된 각각의 SQL 최적화

    :v_grade 에 값이 들어오지 않는다면 더이상 SALGRADE 테이블은 필요가 없다.
    과감히 FROM 절에서 삭제하자.
    물론 a.sal 컬럼의 값에 NULL 이 있다면 답이 달라지므로 주의해야 한다.

    SELECT ....
    FROM EMP a,
    DEPT b,
    SALGRADE c
    WHERE a.deptno = b.deptno
    and a.sal between c.losal and c.hisal
    and (c.grade = :v_grade or :v_grade is null)
    and (b.loc = :v_loc or :v_loc is null)
    and a.hiredate = :v_hiredate
    and :v_hiredate is not null
    UNION ALL
    SELECT ....
    FROM EMP a,
    DEPT b,
    SALGRADE c
    WHERE a.deptno = b.deptno
    and a.sal between c.losal and c.hisal
    and c.grade = :v_grade
    and (b.loc = :v_loc or :v_loc is null)
    and :v_hiredate is null
    and :v_grade is not null
    UNION ALL
    SELECT ....
    FROM EMP a,
    DEPT b -->
    SALGRADE 테이블은 필요가 없음
    WHERE a.deptno = b.deptno
    and b.loc =:v_loc
    and :v_hiredate is null
    and :v_grade is null
    and :v_loc is not null
    UNION ALL
    SELECT ....
    FROM EMP a,
    DEPT b -->
    SALGRADE 테이블은 필요가 없음
    WHERE a.deptno = b.deptno
    and :v_hiredate is null
    and :v_grade is null
    and :v_loc is null ;


    PLAN 정보 및 Predicate Information (지면관계상 생략)


    4.NVL 혹은 DECODE 함수의 활용

    UNION ALL 로 분리하면 옵티마이져 입장에서는 환영할 일이지만 개발자 입장에서 보면 반복적인 코딩이 증가하고 유지보수시 일량이 늘어나는 단점이 있다.
    그렇다면 코딩량을 줄일수 있는 최적의 방법은 없는것일까?

    물론 방법이 있다.
    아래의 SQL 을 보자.
    아래의 SQL 은 UNION ALL로 분리된 SQL 중에서 마지막 2개의 SQL 을 합친 것이다.

    SELECT a.empno, a.ename, a.job, b.dname, a.sal
    FROM EMP a,
    DEPT b
    WHERE a.deptno = b.deptno
    and b.loc = decode(:v_loc, null, b.loc, :v_loc) --:V_LOC 에 'CHICAGO' 대입
    and :v_hiredate is null
    and :v_grade is null
    and :v_loc is not null


    ----------------------------------------------------------------------------------------------
    | Id | Operation | Name | Starts | A-Rows | A-Time | Buffers |
    ----------------------------------------------------------------------------------------------
    | 1 | CONCATENATION | | 1 | 6 |00:00:00.03 | 7 |
    |* 2 | FILTER | | 1 | 0 |00:00:00.01 | 0 |
    | 3 | TABLE ACCESS BY INDEX ROWID | EMP | 0 | 0 |00:00:00.01 | 0 |
    | 4 | NESTED LOOPS | | 0 | 0 |00:00:00.01 | 0 |
    | 5 | TABLE ACCESS BY INDEX ROWID| DEPT | 0 | 0 |00:00:00.01 | 0 |
    |* 6 | INDEX FULL SCAN | DEPT_IDX1 | 0 | 0 |00:00:00.01 | 0 |
    |* 7 | INDEX RANGE SCAN | EMP_IDX3 | 0 | 0 |00:00:00.01 | 0 |
    |* 8 | FILTER | | 1 | 6 |00:00:00.03 | 7 |
    | 9 | TABLE ACCESS BY INDEX ROWID | EMP | 1 | 6 |00:00:00.03 | 7 |
    | 10 | NESTED LOOPS | | 1 | 8 |00:00:00.15 | 5 |
    | 11 | TABLE ACCESS BY INDEX ROWID| DEPT | 1 | 1 |00:00:00.01 | 3 |
    |* 12 | INDEX RANGE SCAN | DEPT_IDX1 | 1 | 1 |00:00:00.01 | 2 |
    |* 13 | INDEX RANGE SCAN | EMP_IDX3 | 1 | 6 |00:00:00.01 | 2 |
    ----------------------------------------------------------------------------------------------

    Predicate Information (identified by operation id):
    ---------------------------------------------------

    2 - filter((:V_LOC IS NOT NULL AND :V_GRADE IS NULL AND :V_HIREDATE IS NULL AND :V_LOC IS NULL))
    6 - filter("B"."LOC" IS NOT NULL)
    7 - access("A"."DEPTNO"="B"."DEPTNO")
    8 - filter((:V_LOC IS NOT NULL AND :V_GRADE IS NULL AND :V_HIREDATE IS NULL AND :V_LOC IS NOT NULL))
    12 - access("B"."LOC"=:V_LOC)
    13 - access("A"."DEPTNO"="B"."DEPTNO")


    해석 : DECODE 함수를 사용함으로써 맨마지막 2개의 SQL 을 합쳤으나 옵티마이져가 조건이 들어오는 경우와
    들어오지 않는경우를 옵티마이져는 자동으로 UNION ALL 로 분리하였다.
    그러나 항상 이렇게 분리되는것은 아니므로 주의를 요한다.

    5.SQL 의 최종모습

    SELECT a.empno, a.ename, a.job, b.dname, a.sal
    FROM EMP a,
    DEPT b,
    SALGRADE c
    WHERE a.deptno = b.deptno
    and a.sal between c.losal and c.hisal
    and (c.grade = :v_grade or :v_grade is null)
    and (b.loc = :v_loc or :v_loc is null)
    and a.hiredate = :v_hiredate
    and :v_hiredate is not null
    UNION ALL
    SELECT a.empno, a.ename, a.job, b.dname, a.sal
    FROM EMP a,
    DEPT b,
    SALGRADE c
    WHERE a.deptno = b.deptno
    and a.sal between c.losal and c.hisal
    and c.grade = :v_grade
    and (b.loc = :v_loc or :v_loc is null)
    and :v_hiredate is null
    and :v_grade is not null

    UNION ALL
    SELECT a.empno, a.ename, a.job, b.dname, a.sal
    FROM EMP a,
    DEPT b
    WHERE a.deptno = b.deptno
    and b.loc = nvl(:v_loc, b.loc)
    and :v_hiredate is null
    and :v_grade is null ;


    결론 : 검색화면의 경우 다양한 검색조건들이 들어올수 있다.
    기본적인 전략은 아래와 같이 순서대로 3가지 이다.
    1.똑똑한 조건을 기준으로 UNION ALL 로 분리한다.(2번에 해당)
    2.UNION ALL 로 분리된 각각의 SQL 을 최적화 한다.(3번에 해당) --> FROM 절의 테이블 갯수가 달라진다.
    3.DECODE 나 NVL 을 사용함으로서 과도한 UNION ALL 로 분리되어 거대해지고
    Shared Pool 에 무리를 줄수도 있는 SQL 을 통합하여 하나로 만든다.(4번에 해당)

    Posted by 1010
    02.Oracle/DataBase2012. 9. 2. 07:50
    반응형

    출처 : http://scidb.tistory.com/entry/SQL%ED%8A%9C%EB%8B%9D-%EB%B0%A9%EB%B2%95%EB%A1%A0

     

    SQL튜닝 방법론

     

    SQL 튜닝책을 세 권정도 읽은 신입사원이 SQL 튜닝방법론을 요청하였다. 이유는 튜닝책에 방법론이 없다는 것이다. 튜닝 방법론이란 “SQL을 튜닝 해달라고 요청 받았을 때 내가 무엇 무엇을 해야 하나?” 이다. SQL 튜닝시의 To-Do 리스트(체크리스트)를 요구한 것이다.

    SQL 튜닝을 자주 하면서도, 그 안에 몇 가지 작업이 있는지 생각하지 못했다. 누가 그랬던가? 일상을 낯설게 느껴보라고… SQL 튜닝요청을 받았을 때 내가 어떤 일을 하는지 가르쳐 주면 되겠구나 하는 생각이 들었다. 그 결과 7가지 방법이 결론으로 도출되었다. 만약 7가지 방법을 모두 적용할 수 있는 경우임에도 불구하고 하나라도 빠진다면 최적화된 SQL을 만들 수 없다.

    아래는 필자와 신입사원의 대화이다.

    신입사원 : SQL 튜닝의 원칙 몇 가지를 저에게 일러 주실 수 있나요? 튜닝책도 몇 가지 보았고, 강의도 많이 들었지만 이 원칙만 지키면 100점 만점에 90점은 맞는다.” 는 원칙 같은 것은 없더군요. 저는 이제 입문하는 단계이므로 모든 경우에 100점을 맞을 필요는 없습니다.

    필자 : 온라인 SQL이냐 대용량 배치 SQL이냐에 따라 튜닝방법이 달라지므로 설명하기가 힘들군요.

    신입사원 : 걱정 하실 것 없습니다. 대용량 배치는 프로그램이 많지 않으므로 제외하고, 온라인 SQL 튜닝 원칙을 몇 가지 일러주세요.

    필자 : 온라인 SQL이라 하더라도 관점에 따라 튜닝방법이 다릅니다. 예를 들어 Peak Time Insert 문이나 Update , Select문이 집중적으로 몰릴 때의 튜닝방법이 있고, 단순히 SQL 하나에 에 집중해서 응답시간을 최소화 하는 튜닝방법이 있습니다.

    신입사원 : 그런 것을 지금 모두 알아야 할 필요는 없습니다. 제가 튜닝 프로젝트에 투입되었다고 가정하고, 성능이 느린 Select문 하나를 받았을 때 튜닝을 어떻게 해야 하는지에 대해서만 설명해주시면 됩니다.

    고단수 신입사원

    이렇게 해서 신입사원에게 말려들게 되었다. , 초보라도 몇 가지 원칙만 지키면 온라인 Select문에 대한 튜닝을 100점 만점에 90점을 맞을 수 있는 방법을 요구하는 것이다. 사실 이런 질문에 가장 적합한 답변은 “SQL 튜닝책을 읽어보라는 것이다. 그런데 신입사원이 필자와 대화과정(튜닝책도 몇 가지 보았고 ~)에서 이런 답변을 못하도록 교묘히 막고 있다. 고단수이다. 몇 가지 방법만 알게 된다면 90점을 받는다고? 처음부터 그런 방법은 없다고 할 걸 그랬나? 후회가 된다. 어찌되었든 약속처럼 되어버렸으므로 이 글을 쓰게 되었다. …..머리가 아파온다.

    온라인 Select문 튜닝 방법론

    온라인 SQL의 튜닝방법은 여러 가지가 있을 수 있다. 하지만 그 중에서 가장 기초적이고, 기본적인 방법을 공개한다. 아래의 7가지 항목을 점검하고 약한 곳을 보강하면 된다. 이 글은 SQL 튜닝책을 두 권 정도 본 사람들을 위한 것이다. 튜닝에 자신있는 사람들은 볼 필요가 없다.

    1. 적절한 인덱스를 사용하여 Block I/O를 최소화 하라

    조인이 없는 경우는 적절한 인덱스를 사용하는 것 만으로도 상당한 효과를 볼 수 있다. 조인이 있는 경우는 특히 Driving(선행) 집합에 신경을 써야 한다. 왜냐하면 Nested Loop 조인을 사용했고, 선행집합의 건수가 많다면, 후행집합의 조인의 시도횟수가 증가하므로 성능이 느려진다. 따라서 적절한 인덱스를 이용하여 선행집합의 건수를 줄인다면, 혹은 가장 적은 집합을 선행으로 놓는다면, 후행집합으로의 조인건수는 줄어든다. 물론 이때에도 후행집합의 적절한 인덱스는 필수 조건이다. Driving 집합의 Block I/O를 줄이기 위하여 최적화된 인덱스가 없다면 생성하고, 있다면 그것을 사용하라. 다시 말해 최적의 Access Path를 만들어라.

    운영중인 시스템이라면 최적의 Access Path를 위해 인덱스를 변경하거나 생성할 때는 주의해야 한다. 현재 튜닝하고 있는 SQL에 최적화된 인덱스를 생성하더라도 다른 SQL에 악영향을 줄 수 있기 때문이다. 인덱스를 생성하거나 변경할 때는 그 테이블을 사용하는 다른 SQL의 실행계획이 변경되지 않는지 각별히 신경을 써야 한다. 이런 이유 때문에 개발과정에서 효율적인 인덱스 설계가 중요시 된다.

    2. 조인방법과 조인순서를 최적화 하라

    온라인에서 사용하는 Select문은 좁은 범위를 검색하는 경우가 많다. 이럴 때는 대부분 Nested Loop Join이 유리하다. 그러므로 조인건수가 소량인 SQL Hash Join이나 Sort Merge Join이 발견되면 Nested Loop Join으로 변경하는 것이 더 유리한지 검토해야 한다. 물론 여기서도 Nested Loop 조인에 관해서만 다룬다.

    Nested Loop 조인에서 가장 중요한 것은 조인순서이다. From절에 테이블(집합)이 두 개라면 후행집합의 관점에서는 적절한 인덱스만 존재한다면 그것으로 족하다. 만약 From절에 테이블(집합)이 세 개 이상이라면 조인순서를 변경할 수 있는지에 대한 두 가지 원리를 사용하라. 두 가지 원리는 아래의 단락에서 소개된다. 아무리 조인할 집합이 많다고 하더라도 이 두 가지의 원리는 동일하게 적용될 수 있다. 두 가지 원리를 이용할 때 필요하다면 Leading 힌트를 사용해야 한다.

    첫 번째, 후행집합에 적절한 인덱스가 없는 경우에 조인순서를 바꾸면, 최적의 인덱스를 사용할 수 있는 경우가 많다. 예컨대, 튜닝전의 조인순서가 Aà B à C 라고 하면, 중간집합인 B에 적절한 인덱스가 없고 오히려 C에 적절한 인덱스가 존재하는 경우가 있다. 이럴 때는 B에 인덱스를 무작정 생성하지 말고, 조인순서를 A à C à B로 바꿀 수 있는지, 바꾸는 것이 더 효율적인지 검증하라. 조인순서만 바꾸어 주어도 일량이 획기적으로 줄어드는 경우가 많다. 만약 조인순서를 바꿀 수 없거나, C를 중간집합으로 하는 것이 비효율적이라면, B를 중간집합으로 유지하고 적절한 인덱스를 사용해야 한다.

    두 번째, 조인되는 집합 중 특정 인덱스에서 Block I/O가 증가하는 경우에 조인순서의 변경을 검토하라. 이때 10046 Trace DBMS_XPLAN.Display_Corsor를 이용하면 조인집합들의 Block I/O량을 관찰할 수 있다. 예를 들어, 튜닝전의 조인순서가 Aà B à C 라고 하고, 집합 B에서 Block I/O량이 증가하면 A à C à B로 바꾸면 일량이 줄어드는 경우가 많다. C를 먼저 조인(Filter)하여 선행집합(B의 입장에서는 C가 선행이다)의 건수를 줄이고 B에 조인하면 성능이 향상된다.

    3. Table Access(Random Access)를 최소화 하라

    Random Access rowid로 테이블을 엑세스하는 것을 말한다. 1번과 2번을 최적화 했다면 Random Access도 자동으로 많이 줄어들었을 것이다. 하지만 그것이 끝은 아니다. 여전히 성능이 만족스럽지 못하다면 Random Access 횟수를 줄이는 것을 간과해서는 안 된다.

    인덱스를 사용하면 rowid가 자동으로 획득된다. 만약 인덱스에 없는 컬럼을 Select 해야 한다면 rowid로 테이블을 엑세스 해야 한다. 이때 테이블로 엑세스 해야 할 건수가 많고, 인덱스의 컬럼순으로 테이블이 sort되어있지 않다면 성능이 매우 저하된다. 왜냐하면 테이블이 인덱스 기준으로 sort되어 있지 않기 때문에 테이블을 방문할 때마다 서로 다른 블럭을 읽어야 하기 때문이다.

    비유적으로 설명해보자. 우리가 심부름을 할 때 세 군대의 상점(A,B,C)을 들러야 한다고 치자. 그 상점들이 모두 한 건물 내부에 존재한다면 얼마나 좋겠는가? 그 심부름은 매우 빠른 시간에 끝날 것이다. 하지만 반대로 상점 A는 부산에 있고 상점 B는 대구에 있고, 상점 C는 서울에 있다면? 만약 당신의 성격이 매우 좋아서 그 심부름을 한다고 해도 시간이 많이 걸릴 것이다. Random Access도 마찬가지이다. 인덱스의 rowid로 테이블을 방문할 때, 테이블이 인덱스기준으로 sort되어 상점처럼 다닥다닥 붙어있다면 성능은 매우 빠르고, 흩어져 있을수록 성능이 느려진다. (오라클에서는 테이블이 인덱스 기준으로 sort 되어 있는 정도를 Clustering Factor라고 한다.) 바로 이런 이유 때문에 index scan보다는 Table Scan이 느린 것이다. 따라서 우리는 Random Access의 부하를 최소화 해야 한다.

    Random Access의 부하를 줄이는 방법은 네 가지이다. 첫 번째, 테이블의 종류를 변경하는 방법이다. IOT나 클러스터를 이용하면 Clustering Factor가 극단적으로 좋아진다. 또한 파티션을 이용하면 같은 범위의 데이터를 밀집시킬 수 있다. 두 번째, 효율적인 인덱스를 사용하거나 조인방법과 순서를 조정하여 Table Access를 최소화 하는 방법이다. 이 방법은 1번과 2번에서 이미 설명 되었다. 세 번째, 인덱스에 컬럼을 추가하여 Table Access를 방지하는 방법이다. 예를 들어 Select절의 특정 컬럼 때문에 테이블이 엑세스 된다면, 인덱스의 마지막에 그 컬럼을 추가하면 된다. 네 번째, 인덱스만 엑세스 하고 테이블로의 엑세스는 모든 조인을 끝내고 마지막에 시도하여 Random Access의 횟수를 줄이는 방법이다. 해당 을 참조하라.

    4. Sort Hash 작업을 최소화 하라

    1,2,3번을 통하여 최적의 Access Path Join을 사용했다면, Block I/O의 관점에서는 튜닝이 끝난 것이다. 하지만 1,2,3번이 모두 해결되었다 해도 Order by Group By 때문에 성능이 저하 될 수 있다. 특히 결과가 많은 경우, sort는 치명적이다.

    인덱스가 sort 되어있다는 특성을 이용하면 order by 작업을 대신할 수 있다. Group By sort 가 발생하는데 group by 단위와 인덱스의 컬럼이 동일 하다면 sort는 발생하지 않는다. 최적의 인덱스를 사용하면 Access Path를 개선하는 효과뿐만 아니라 Sort의 부하도 없어진다.

    Union All
    을 제외한 집합연산(Union, Minus, Intersect)를 사용하면 Sort Unique 혹은 Hash Unique가 발생한다. Union Union All로 바꿀 수 없는지 검토해야 하고, Minus Not Exists 서브쿼리를 이용하여 Anti Join으로 바꿀 수 없는지 고려해야 한다. Intersect는 교집합이므로 조인으로 바꿀 수 있는지 검토해야 한다. 아주 가끔 Distinct를 사용한 SQL이 눈에 뛰는데 이 또한 Sort Unique 혹은 Hash Unique를 발생시킨다. 모델러나 설계자에게 문의하여 Distinct를 제거할 방법이 없는지 문의해야 한다.

    Oracle 10g부터는 Hash Group By가 발생할 수 있는데, 이미 적절한 인덱스를 사용하는 경우라면 Hash Group By를 사용할 필요는 없다. 이런 경우 NO_USE_HASH_AGGREGATION 힌트를 사용하면 Sort Group By로 바꿀 수 있다. 이렇게 해주면 실행계획에 “SORT GROUP BY NOSORT” Operation이 발생하며, Sort Hashing 작업이 전혀 발생하지 않는다. Group By의 부하를 해결하는 또 하나의 방법은 스칼라 서브쿼리를 사용하는 것이다. 조인을 사용하면 Sum 값을 구하기 위해 Group By가 필수적이다. 하지만 스칼라 서브쿼리를 사용하면 Group By를 사용하지 않고도 sum 이나 Min/Max 값을 구할 수 있다. 또한 분석함수의 Ranking Family(rank, dens_rank, row_number)를 최적화된 인덱스와 같이 사용하면 Group By Sort를 하지 않고도 Min/Max 값을 구할 수 있다. 이때는 실행계획에 “WINDOW NOSORT” Operation이 발생한다. 관련 글을 참조하기 바란다.

    5. 한 블록은 한번만 Scan하고 끝내라

    같은 데이터를 반복적으로 Scan하는 SQL이 의외로 많다. 대표적인 경우가 Union All로 분리되었지만 실제로는 그럴 필요가 없는 경우이다. 예를 들어 Where 절에 구분코드가 1일 때 , 2일 때, 3일 때 별로 SQL이 나누어져 있는 경우이다. Where 절을 구분코드 in (1,2,3) 으로 처리하고, Select절에서 Decode Case 문을 사용하여 구분코드별로 처리해준다면 Union All은 필요 없다. Union All을 사용하는 또 한가지의 경우는 Sub Total(소계) Grand Total(총계)를 구해야 하는 경우이다. 이 경우도 Rollup/Cube Grouping Sets Group By절에 사용한다면 소계나 총계를 위한 별도의 Select문을 실행 시킬 필요는 없다. 1~4번의 과정은 SQL문의 변경이 없거나 최소화 된다. 하지만 5번의 경우는 SQL을 통합시켜야 하기 때문에 시간이 많이 소모되며, 많은 사고가 요구되는 창조적인 과정이다. 여기까지 했다면 진행되었다면 원본 SQL 자체의 튜닝은 완료 된 셈이다.

    6. 온라인의 조회화면이라면 페이징처리는 필수이다

    부분범위 처리를 해야 한다. 물론 전체 건을 처리해야 하는 경우는 있을 것이다. 하지만 조회화면이라면 몇 십만 건 혹은 몇 만 건이나 되는 결과를 모두 볼 수 없다. 따라서 볼 수 있는 단위로 끊어서 출력해야 한다. 예를 들어 결과 건수가 10만 건이라고 해도 최초의 50건을 화면에 먼저 뿌린다면 1,2,3,4 번에서 설명했던 모든 부하(Block I/O의 부하, 조인의 부하, Random Access의 부하, Sort의 부하)를 한꺼번에 감소시킬 수 있다. 따라서 가능하면 개발자를 설득하거나 책임자를 설득하여 페이징 처리를 하는 것이 바람직하다.

    페이징 처리를 해도 효과를 볼 수 없는 몇 가지 예외가 있다. 분석함수를 사용하거나, Connect By + Start With를 사용한다면 페이징 처리의 효과는 없다. 분석함수의 경우 인라인뷰의 외부로 뺄 수 있다면 부분범위 처리가 가능하다. 이에 관해서는 해당 을 참조하기 바란다. Connect By + Start With를 사용한 경우는 부분범위처리가 불가능하다. 하지만 11g R2의 신기능인 Recursive With절을 사용한다면 페이징 처리의 효과를 볼 수 있다. 이때, Recursive With절에 Search(Order By절과 같은 기능)을 사용한다면 Connect By와 마찬가지로 페이징 처리의 효과가 없으니 주의해야 한다. 즉 인덱스의 구성을 적절히 하여 Sort를 대신해야 한다. Recursive With가 무엇인지 궁금한 사람은 관련 을 참조하기 바란다.

    7. 답이 틀리면 안 된다. SQL을 검증하라

    7번은 SQL 자체를 튜닝하는 것은 아니다. 하지만 7번을 튜닝 방법에 추가한 이유는 있다. 튜닝을 하였음에도 답이 틀린다면, 튜닝을 하지 않은 것 보다 못하다. 그러므로 튜닝 후에 답이 옳은지 항상 검증해야 한다. 1~ 7번 중에 가장 중요한 것이 7번이다.

    방법론 정리

    1. 적절한 인덱스를 사용하여 Block I/O를 최소화 하라.

    2. 조인방법과 조인순서를 최적화 하라.

    3. Table Access(Random Access)를 최소화 하라

    4. Sort Hash 작업을 최소화 하라

    5. 한 블록은 한번만 Scan하고 끝내라

    6. 온라인의 조회화면이라면 페이징처리는 필수이다

    7. 답이 틀리면 안 된다. SQL을 검증하라

    방법론의 의미

    만약 1~7번을 모두 적용할 수 있는 경우임에도 불구하고 하나라도 빠진다면 그것은 최적화된 SQL이 아니다. 물론 튜닝을 할 때 위의 1~6번을 항상 적용할 수 있는 것은 아니다. 경우에 따라서는 하나만 적용될 수도 있고, 두 개만 적용할 수 있는 SQL도 있다. 하지만 1~6번을 모두 적용할 수 있는지 꼼꼼히 살펴야 한다.

    이 글은 튜닝 입문하여 관련 책들을 몇 권 본 사람들을 위한 기본적인 튜닝방법에 관한 것이다. 1번부터 7번까지의 방법은 기본 중에 기본이다. 이것들만 알아도 온라인 조회화면에서 사용하는 SQL을 튜닝하는데 어려움이 없을 것이다. 다시 말해 90%는 해결 할 수 있다. 그렇다면 나머지 10%? 그것들은 그때 그때 마다 다르게(On the fly 모드) 처리된다. 또한 그것들은 책이나 매뉴얼에 나와있지 않기 때문에 경험치 이거나 실험과 연구의 결과로 알아내는 것들이다.

    일상을 낯설게 느껴보니 좋은 점이 많다. 언제 필자의 다른 일상(모델링, 시스템분석/진단)에 대한 방법론도 만들어 보려고 한다.


     

    Posted by 1010
    02.Oracle/DataBase2012. 5. 16. 02:02
    반응형

    ORA-00000 성공적인 정상 종료입니다. 
    ORA-00001 유일성 제약조건(%s.%s)에 위배됩니다. 
    ORA-00017 트레이스 이벤트 설정이 세션에 요구되었습니다. 
    ORA-00018 최대 세션 수를 초과했습니다. 
    ORA-00019 최대 세션 라이선스 수를 초과했습니다. 
    ORA-00020 최대 프로세스 수(%s)를 초과했습니다. 
    ORA-00021 세션이 다른 프로세스에 첨부되어 있음; 세션을 변경할 수 없습니다. 
    ORA-00022 부적절한 세션 번호; 액세스가 거절되었습니다. 
    ORA-00023 세션이 프로세스 고유의 메모리를 참조함; 세션을 분리할 수 없습니다. 
    ORA-00024 단일 프로세스 모드에서는 하나 이상의 프로세스가 로그인할 수 없습니다. 
    ORA-00025 %s에 메모리를 할당하는데 실패했습니다. 
    ORA-00026 누락 혹은 부적합한 세션 번호 
    ORA-00027 현 세션을 제거할 수 없습니다. 
    ORA-00028 세션이 제거되었습니다. 
    ORA-00029 사용자 세션이 아닙니다. 
    ORA-00030 사용자 세션 ID가 존재하지 않습니다. 
    ORA-00031 세션이 중단될 것입니다. 
    ORA-00032 부적합한 세션 MIGRATION PASSWORD 
    ORA-00033 현세션이 MIGRATION PASSWORD를 갖고있지 않습니다. 
    ORA-00034 PL/SQL 세션에서 %s를 할 수 없습니다. 
    ORA-00035 LICENSE_MAX_USERS가 현재의 사용자 수보다 적을 수 없습니다. 
    ORA-00050 엔큐를 하는 동안 O/S 오류가 발생했음. o/s 오류를 확인하십시오 
    ORA-00051 자원 대기 중 시간 초과입니다. 
    ORA-00052 최대 엔큐 자원 수(%s)를 초과했습니다. 
    ORA-00053 최대 엔큐 수를 초과했습니다. 
    ORA-00054 자원이 사용중이고, NOWAIT가 지정되어 있습니다. 
    ORA-00055 최대 DML 잠금 수를 초과했습니다. 
    ORA-00056 개체 %s.%s에 대한 DDL 잠금이 비호환 모드로 되어 있습니다. 
    ORA-00057 최대 임시 테이블 잠금 수가 초과했습니다. 
    ORA-00058 이 데이타베이스를 마운트하기 위해서 DB_BLOCK_SIZE가 %s이어야 함(%s 아님). 
    ORA-00059 최대 DB_FILES 수를 초과했습니다. 
    ORA-00060 자원 대기중 데드록이 검출되었습니다. 
    ORA-00061 다른 하나의 인스턴스가 다른 DML_LOCKS을 설정하고 있습니다. 
    ORA-00062 DML 전(full) 테이블 잠금을 취할 수 없습니다. DML_LOCKS은 0 입니다. 
    ORA-00063 최대 LOG_FILES 수를 초과했습니다. 
    ORA-00064 현 O/S (%s,%s)에 할당하기에는 개체가 너무 큽니다. 
    ORA-00065 FIXED_DATE의 초기화에 실패했습니다. 
    ORA-00066 LOG_FILES는 %s이지만 호환성을 위해 %s 이어야합니다. 
    ORA-00067 값 %s은 파라미터 %s에 대해 부적당하며, 최소한 %s 이어야 합니다. 
    ORA-00068 값 %s은 파라미터 %s에 대해 부적당하며, %s와 %s 사이의 값이어야 합니다. 
    ORA-00069 잠글 수 없습니다 -- %s에 대해 테이블 잠금을 할 수 없습니다. 
    ORA-00070 명령어 %s 은 적당하지 않습니다. 
    ORA-00071 프로세스 번호은 1 과 %s 사이어야 합니다. 
    ORA-00072 프로세스 %s 은 활동적인 것이 아닙니다. 
    ORA-00073 명령어 %s은 %s 와 %s 인수를 가지고 옵니다. 
    ORA-00074 지정된 프로세스가 없습니다. 
    ORA-00075 프로세스 %s 은 이 인스턴스에서 찾을 수 없습니다. 
    ORA-00076 덤프 %s 을 찾을 수 없습니다. 
    ORA-00077 덤프 %s 은 적당하지 않습니다. 
    ORA-00078 이 이름으로 변수를 덤프 할 수 없습니다. 
    ORA-00079 변수 %s 가 없습니다. 
    ORA-00080 레벨 %s 로 지정된 글로벌 영역이 부적당합니다. 
    ORA-00081 주소 범위 [%s, %s)은 읽기가능한 것이 아닙니다. 
    ORA-00082 %s의 메모리 크기는 적당한 [1], [2], [4]%s%s%s%s%s의 설정으로 되어 있지 않습니다. 
    ORA-00083 경고: 맵된 SGA가 손상한것 같습니다. 
    ORA-00084 글로벌 영역이 PGA, SGA, 또는 UGA 이어야만 합니다. 
    ORA-00085 현재 호출이 존재하지 않습니다. 
    ORA-00086 사용자 호출이 존재하지 않습니다. 
    ORA-00097 Oracle SQL 기능에서 사용하고 있는것이 SQL92 %s 레벨서 존재하고 있지 않습니다. 
    ORA-00100 데이터가 없습니다. 
    ORA-00101 시스템 파라미터 mts_dispatchers에 대한 사용 문법이 부적합합니다. 
    ORA-00102 %s 네트워크 프로토콜이 디스패쳐에 의해 사용될 수 없습니다. 
    ORA-00103 부적합한 네트워크 프로토콜; 디스패쳐에 의해 사용되도록 예약되었음 
    ORA-00104 데드록이 검출되었음; 모든 공유서버가 자원을 기다리고 있습니다. 
    ORA-00105 디스패칭 기법이 %s 네트워크 프로토콜을 지원하도록 되어있지 않습니다. 
    ORA-00106 디스패쳐에 연결되었을때는 데이타베이스를 기동/중지시킬 수 없습니다. 
    ORA-00107 ORACLE의 리스너 프로세스에 연결하지 못했습니다. 
    ORA-00108 비동기 연결이 가능하도록 디스패쳐를 설정하지 못했습니다. 
    ORA-00111 최대 서버수는 %s입니다; %s개의 서버 추가중 
    ORA-00112 경고: %s (지정 최대치) 디스패쳐만으로 생성되었습니다. 
    ORA-00113 프로토콜명 %s가 너무 깁니다. 
    ORA-00114 시스템 파라미터 mts_service에 대한 값이 없습니다. 
    ORA-00115 연결이 거절됨; 디스패쳐 연결 레이블이 FULL 상태입니다. 
    ORA-00116 mts_service명이 너무 깁니다. 
    ORA-00117 시스템 파라미터 mts_servers의 범위를 벗어납니다. 
    ORA-00118 시스템 파라미터 mts_dispatchers의 범위를 벗어납니다. 
    ORA-00119 mts_listener_address 시스템 파라미터에 지정이 부적합합니다. 
    ORA-00120 디스패칭 기법이 사용불가 혹은 설치되어있지 않습니다. 
    ORA-00121 mts_dispatchers를 제외하고 mts_servers가 지정되었습니다. 
    ORA-00122 네트워크 구성을 초기화할 수 없습니다. 
    ORA-00123 비작업중인 공유 서버를 종료합니다. 
    ORA-00124 mts_dispatchers가 mts_max_servers 없이 지정되었습니다. 
    ORA-00150 중복된 트랜잭션 ID 
    ORA-00151 부적합한 트랜잭션 ID 
    ORA-00152 현 세션이 요구된 세션과 일치하지 않습니다. 
    ORA-00200 제어 화일 %s을 생성할 수 없습니다. 
    ORA-00201 제어 화일 버전 %s은 ORACLE 버전 %s과 호환되지 않습니다. 
    ORA-00202 제어화일: %s 
    ORA-00203 잘못된 제어화일을 사용하였습니다. 
    ORA-00204 제어 화일 %s (블록 %s, 블록 수 %s) 읽기 오류입니다. 
    ORA-00205 제어 화일 %s 식별 오류입니다. 
    ORA-00206 제어 화일 %s (블록 %s, 블록 수 %s) 쓰기 오류입니다. 
    ORA-00207 제어화일이 현재 사용중인 데이타베이스용이 아닙니다. 
    ORA-00208 제어 화일명이 최대수 %s 를 초과했습니다. 
    ORA-00209 블록 크기 %s 가 최대 %s 바이트를 초과했습니다. 
    ORA-00210 제어 화일 %s 를 열 수 없습니다. 
    ORA-00211 제어 화일 %s 가 앞의 제어 화일과 일치하지 않습니다. 
    ORA-00212 블록 크기 %s가 최소한 필요한 크기 %s 바이트 미만입니다. 
    ORA-00213 제어 화일 %s 재사용 불가; 구 화일 크기 %s, %s가 필요합니다. 
    ORA-00214 제어 화일 %s의 버전 %s는 화일 %s 버전 %s와 일치하지 않습니다. 
    ORA-00215 적어도 한 개의 제어 화일이 필요합니다. 
    ORA-00216 제어 화일 %s 에 대한 물리 블록 크기를 확정할 수 없습니다. 
    ORA-00217 제어 화일 %s의 물리적 블록 크기 %s가 %s와 일치하지 않습니다. 
    ORA-00218 제어 화일 %s는 블록 크기를 %s로 작성되었지만 현재는 %s 입니다. 
    ORA-00219 필요한 제어 화일 크기 %s 가 최대치 %s 보다 큽니다. 
    ORA-00220 제어화일 %s가 첫 인스턴스에 의해 사용한 것과 일치하지 않습니다. 
    ORA-00221 제어화일에의 쓰기오류 
    ORA-00222 디스패쳐로 제어화일을 조회할 수 없습니다. 
    ORA-00223 변환 데이타화일이 부적합하거나 틀린 버전입니다. 
    ORA-00224 명시된 화일이 제어 화일이 아닙니다. 
    ORA-00225 기대된 크기 %s 은( 제어화일 %s 관한) 실제 크기 %s 와 다릅니다. 
    ORA-00250 아카이버가 작동되지 않았습니다. 
    ORA-00251 사용되지 않는 오류 
    ORA-00252 로그 %s (쓰레드 %s의)는 비었습니다. 아카이브할 수 없습니다. 
    ORA-00253 제한치 %s가 길이 %s로 초과되었습니다 (아카이브 스트링 %s의) 
    ORA-00254 아카이브 제어 스트링 %s 오류입니다. 
    ORA-00255 로그 %s(쓰레드 %s, 시퀀스 번호 %s)의 아카이브 오류 
    ORA-00256 아카이브 텍스트 스트링 %s의 변환시 오류가 발생했습니다. 
    ORA-00257 아카이버 오류. 해제되기 전에는 내부 연결만 가능 
    ORA-00258 NOARCHIVELOG 모드에서의 수동 아카이브는 로그를 지정해야합니다. 
    ORA-00259 로그 %s(개방 쓰레드 %s의)가 현재 로그이므로 아카이브할 수 없습니다. 
    ORA-00260 온라인 로그 시퀀스 %s(쓰레드 %s의)를 발견할 수 없습니다. 
    ORA-00261 로그 %s(쓰레드 %s의)가 아카이브중이거나 수정중입니다. 
    ORA-00262 현재 로그 %s(닫힌 쓰레드 %s의)를 스위치할 수 없습니다. 
    ORA-00263 쓰레드 %s를 위해 아카이빙이 필요한 로그가 없습니다. 
    ORA-00264 복구가 필요하지 않습니다. 
    ORA-00265 인스턴스 복구가 요구됩니다. ARCHIVELOG모드를 지정할 수 없습니다. 
    ORA-00266 아카이브된 로그 화일의 이름을 필요로 합니다. 
    ORA-00267 아카이브된 로그 화일의 이름을 필요로 하지 않습니다. 
    ORA-00268 지정된 로그화일이 존재하지 않습니다 %s 
    ORA-00269 지정된 로그화일은 쓰레드 %s의 (%s가 아닌) 부분임 
    ORA-00270 아카이브 로그 생성시 오류 
    ORA-00271 아카이브를 필요로 하는 로그가 없습니다. 
    ORA-00272 아카이브 로그 기록시 오류 
    ORA-00273 로그되지 않은 직접 로드 데이타의 매체 복구 
    ORA-00274 부적절한 복구 옵션 %s 
    ORA-00275 매체 복구가 이미 시작되었습니다. 
    ORA-00276 키워드 CHANGE가 지정되었으나 변환 번호가 주어지지 않았습니다. 
    ORA-00277 UNTIL 복구 플래그 %s에 부적절한 옵션 
    ORA-00278 현 복구를 위해 로그화일 %s는 더이상 필요하지 않습니다. 
    ORA-00279 변환 %s가 (%s에서 생성된) 쓰레드 %s에 필요합니다. 
    ORA-00280 변환 %s(쓰레드 %s를 위한)가 시퀀스번호 %s에 있습니다. 
    ORA-00281 매체 복구는 디스패쳐를 사용하여 수행되지 않습니다. 
    ORA-00282 UPI %s 호출이 지원되지 않으니, ALTER DATABASE RECOVER를 사용하십시요 
    ORA-00283 복구 세션이 오류로 인하여 취소되었습니다. 
    ORA-00284 복구 세션이 진행중입니다. 
    ORA-00285 TIME 키워드가 지정되었으나 시간이 주어지지 않았습니다. 
    ORA-00286 이용가능한 멤버가 없거나, 적합한 데이타를 포함하고 있지 않습니다. 
    ORA-00287 지정된 변환 번호 %s가 쓰레드 %s에 없습니다. 
    ORA-00288 복구를 계속하려면 ALTER DATABASE RECOVER CONTINUE를 입력하십시요 
    ORA-00289 제안 : %s 
    ORA-00290 로그화일을 아카이브 하려고 할때, O/S 오류가 발생했습니다. 
    ORA-00291 PARALLEL 옵션에 숫자값이 필요로합니다. 
    ORA-00292 병렬 복구 기능이 설치되지 않았습니다. 
    ORA-00293 제어 화일과 리두로그가 동기화 상태에서 벗어나 있습니다. 
    ORA-00300 부적합한 리두 로그 블록 크기 %s가 지정됨 - 한계 %s 초과 
    ORA-00301 로그 화일 %s를 추가 작성할 수 없습니다. 
    ORA-00302 로그의 최대수 %s 를 초과했습니다. 
    ORA-00304 요구된 인스턴스 번호는 사용중입니다. 
    ORA-00305 로그 %s(쓰레드 %s의)는 일관되지 않습니다. 이것은 다른 데이타베이스에 속합니다. 
    ORA-00306 이 데이타베이스에서는 %s 인스턴스가 한계입니다. 
    ORA-00307 요구된 인스턴스 번호가 범위를 벗어납니다(최대치는 %s) 
    ORA-00308 아카이브된 로그 %s를 열 수 없습니다. 
    ORA-00309 로그가 잘못된 데이타베이스에 속해 있습니다. 
    ORA-00310 아카이브된 로그는 시퀀스 %s를 포함하고 있습니다 시퀀스 %s가 필요합니다. 
    ORA-00311 아카이브 로그로부터 헤더 정보를 읽을 수 없습니다. 
    ORA-00312 온라인 로그 %s 쓰레드 %s: %s 
    ORA-00313 로그 그룹 %s (쓰레드 %s의)의 멤버를 여는데 실패했습니다. 
    ORA-00314 로그 %s(쓰레드 %s의, 시퀀스번호가 %s일)는 %s와 일치하지 않습니다. 
    ORA-00315 로그 %s (쓰레드 %s의) 헤더의 쓰레드 번호 %s가 틀립니다. 
    ORA-00316 로그 %s (쓰레드 %s의) 헤더내의 유형 %s는 로그화일이 아닙니다. 
    ORA-00317 헤더에 있는 화일형 %s가 로그화일이 아닙니다. 
    ORA-00318 로그 %s (쓰레드 %s의, 화일 크기가 %s인)가 %s와 맞지 않습니다. 
    ORA-00319 로그 %s(쓰레드 %s의)가 틀린 로그 재설정 상태를 가지고 있습니다. 
    ORA-00320 로그 %s(쓰레드 %s의)로부터 화일 헤더를 읽을 수 없습니다. 
    ORA-00321 로그 %s(쓰레드 %s의)에서 로그화일 헤더를 수정할 수 없습니다. 
    ORA-00322 로그 %s(쓰레드 %s의)는 현시점의 것이 아닙니다. 
    ORA-00323 쓰레드 %s의 현 로그는 사용불가하며, 나머지 전부도 아카이브하여야 합니다. 
    ORA-00324 로그 화일 %s의 변환명 %s가 너무 깁니다, 문자수 %s가 %s를 초과했습니다. 
    ORA-00325 쓰레드 %s으로 아카이브된 로그가 헤더내에 틀린 쓰레드 번호 %s를 가지고 있습니다. 
    ORA-00326 변환 %s에서 시작된 아카이브 로그, 이전의 변환 %s를 필요로 합니다. 
    ORA-00327 로그 %s(쓰레드 %s의), 물리적인 크기 %s가 필요한 %s보다 작습니다. 
    ORA-00328 변환 %s에서 끝난 아카이브 로그, 이후의 변환 %s를 필요로 합니다. 
    ORA-00329 변환 %s에서 시작된 아카이브 로그, 변환 %s를 필요로 합니다. 
    ORA-00330 변환 %s에서 끝난 아카이브 로그, 변환 %s를 필요로 합니다. 
    ORA-00331 로그 버전 %s가 ORACLE 버전 %s와 호환성이 없습니다. 
    ORA-00332 아카이브된 로그가 너무 작음 - 완전하게 아카이브되지 않았습니다. 
    ORA-00333 재실행 로그 읽기 오류(블록 %s 카운트 %s) 
    ORA-00334 아카이브된 로그: %s 
    ORA-00335 온라인 로그 %s: 이 번호의 로그가 존재하지 않습니다. 
    ORA-00336 로그 화일의 크기 %s가 최소 블록 수 %s 보다 작습니다. 
    ORA-00337 로그 화일 %s가 존재하지 않고 크기가 지정되어 있지 않습니다. 
    ORA-00338 로그 %s(쓰레드 %s의)가 제어화일보다 최근의 것입니다. 
    ORA-00339 아카이브 로그가 REDO 로그를 포함하고 있지 않습니다. 
    ORA-00340 온라인 로그 %s(쓰레드 %s의) 처리시 IO 오류입니다. 
    ORA-00341 로그 %s(쓰레드 %s의)에 대한 헤더내에 로그 번호 %s가 틀립니다. 
    ORA-00342 아카이브된 로그가 마지막 RESETLOGS 전에 생성되었습니다. 
    ORA-00343 너무 많은 오류 발생, 로그 멤버가 클로즈됐습니다. 
    ORA-00344 온라인 로그 %s를 재생성할 수 없습니다. 
    ORA-00345 REDO 로그 쓰기(write) 오류, 블록 %s 카운트 %s 
    ORA-00346 로그 멤버가 STALE로 표시되었습니다. 
    ORA-00347 로그 %s(쓰레드 %s의)의 예상 블록크기 %s는 %s와 일치하지 않습니다. 
    ORA-00348 단일 프로세스 REDO 실패입니다 인스턴스를 중지해야 합니다. 
    ORA-00349 %s 의 블록 크기 확보 실패입니다. 
    ORA-00350 로그 %s(쓰레드 %s의)를 아카이브해야 합니다. 
    ORA-00351 지정된 시간으로의 복구가 불가능합니다. 
    ORA-00352 쓰레드 %s에 대한 모든 로그가 아카이브되어야 함 - 가용화할 수 없습니다. 
    ORA-00353 블록 %s 변경 %s 시간 %s 부근에서 로그가 깨졌습니다. 
    ORA-00354 REDO 로그의 블록헤더가 깨짐 
    ORA-00355 변환 번호가 잘못됨 
    ORA-00356 변환 설명내에 일치하지 않는 길이 
    ORA-00357 로그화일에 너무 많은 수의 멤버가 지정됨 (최대치는 %s) 
    ORA-00358 너무 많은 화일 멤버가 지정됨 (최대치는 %s) 
    ORA-00359 로그화일 그룹 %s가 존재하지 않습니다. 
    ORA-00360 로그화일 멤버가 아닙니다 %s 
    ORA-00361 마지막 로그 멤버 %s는 그룹 %s를 옮길수 없습니다. 
    ORA-00362 그룹 %s내에 정당한 로그화일을 형성하기 위해 멤버를 필요로 합니다. 
    ORA-00363 로그가 아카이브 버전이 아닙니다. 
    ORA-00364 새로운 로그 멤버에 헤더를 기록할 수 없습니다. 
    ORA-00365 지정한 로그가 다음 로그가 아닙니다. 
    ORA-00366 로그 %s, 쓰레드 %s의, 화일 헤더에 체크섬 오류가 있습니다. 
    ORA-00367 로그 화일 헤더에 체크섬 오류가 있습니다. 
    ORA-00368 리두 로그 블록에 체크섬 오류가 있습니다. 
    ORA-00369 쓰레드 %s의 현재 로그는 사용불가이며 다른 로그가 지워지고 있습니다. 
    ORA-00370 kcbchange 작업수행시 데드록의 가능성이 있습니다. 
    ORA-00371 빈 버퍼의 사용이 불가합니다. 
    ORA-00372 화일 %s는 지금 수정될 수 없습니다. 
    ORA-00373 온라인 로그 버전 %s가 ORACLE 버전 %s와 호환되지 않습니다. 
    ORA-00374 지정된 파라미터 db_block_size = %s 가 부적절함 - 가능한 범위[%s..%s] 
    ORA-00375 디폴트 db_block_size의 값을 얻을수 없습니다. 
    ORA-00376 현재 화일 %s를 읽을 수 없습니다. 
    ORA-00390 로그 %s(쓰레드 %s의)는 지워질것이므로 현재 로그가 될 수 없습니다. 
    ORA-00391 전체 쓰레드는 동시에 새로운 로그 포맷으로 전환해야 합니다. 
    ORA-00392 로그 %s(쓰레드 %s의)는 지워질것이므로 작업이 허용되지 않습니다. 
    ORA-00393 오프라인 데이타화일 복구에 로그 %s(쓰레드 %s의)가 필요합니다. 
    ORA-00400 RELEASE 값 %s는 파라미터 %s에 부적절합니다. 
    ORA-00401 이번 RELEASE에서 지원되지 않은 파라미터 %s에 대한 값입니다. 
    ORA-00402 %s RELEASE에 변경된 데이타베이스는 %s RELEASE에 사용될 수 없습니다. 
    ORA-00403 %s (%s) 는 다른 인스턴스(%s)와 같지 않습니다. 
    ORA-00404 변환 데이타 화일이 없습니다 %s 
    ORA-00405 호환 가능한 유형 %s 
    ORA-00406 COMPATIBLE 파라미터는 %s 이상이어야 합니다. 
    ORA-00407 릴리즈 %s.%s 에서 %s.%s로 향상이 허용되지 않습니다. 
    ORA-00408 파라미터 %s는 TRUE로 설정되었습니다. 
    ORA-00436 ORACLE이 라이센스되어 있지 않습니다 ORACLE사에 연락해 주십시오. 
    ORA-00437 ORACLE의 기능이 라이센스되어 있지 않습니다. ORACLE사에 연락해 주십시오 
    ORA-00443 백그라운 프로세스 %s가 시작되지 않았습니다. 
    ORA-00444 백그라운드 프로세스 %s 기동중 장애가 발생했습니다. 
    ORA-00445 백그라운드 프로세스 %s가 %s초 후 기동되지 않았습니다. 
    ORA-00446 백그라운드 프로세스가 부적절하게 기동되었습니다. 
    ORA-00447 백그라운드 프로세스에 치명적인 오류가 발생했습니다. 
    ORA-00448 백그라운드 프로세스가 정상 종료했습니다. 
    ORA-00449 백그라운드 프로세스 %s 가 오류 %s 와 함께 종료되었습니다. 
    ORA-00470 LGWR 프로세스가 오류로 종료되었습니다. 
    ORA-00471 DBWR 프로세스가 오류로 종료되었습니다. 
    ORA-00472 PMON 프로세스가 오류로 종료되었습니다. 
    ORA-00473 ARCH 프로세스가 오류로 종료되었습니다. 
    ORA-00474 SMON 프로세스가 오류로 종료되었습니다. 
    ORA-00475 TRWR 프로세스가 오류로 종료되었습니다. 
    ORA-00476 RECO 프로세스가 오류로 종료되었습니다. 
    ORA-00477 SNP* 프로세스가 오류로 종료되었습니다. 
    ORA-00480 LCK* 프로세스가 오류로 종료되었습니다. 
    ORA-00483 정지 처리중 프로세스가 오류로 종료되었습니다. 
    ORA-00568 인터럽트 처리기의 최대수를 초과했습니다. 
    ORA-00574 osndnt: $CANCEL 실패 (break) 
    ORA-00575 osndnt: $QIO 실패 (send out-of-band break) 
    ORA-00576 인-밴드 브레이크 프로토콜 오류 
    ORA-00577 아웃-밴드 브레이크 프로토콜 오류 
    ORA-00578 재설정 프로토콜 오류 
    ORA-00579 osndnt: 서버가 잘못된 연결요구를 받았습니다. 
    ORA-00580 프로토콜 버전이 일치하지 않습니다. 
    ORA-00581 osndnt: 문맥 영역을 할당할 수 없습니다. 
    ORA-00582 osndnt: 문맥 영역을 해제할 수 없습니다. 
    ORA-00583 osndnt: $TRNLOG 실패 
    ORA-00584 연결을 끊을 수 없습니다. 
    ORA-00585 잘못된 유형의 호스트명입니다. 
    ORA-00586 osndnt: LIB$ASN_WTH_MBX 실패 
    ORA-00587 원격 호스트에 연결할 수 없습니다. 
    ORA-00588 호스트로부터의 메시지가 너무 짧습니다. 
    ORA-00589 호스트로부터의 메시지가 잘못된 데이타 길이를 갖습니다. 
    ORA-00590 호스트로부터의 메시지가 잘못된 데이타 유형을 갖습니다. 
    ORA-00591 틀린 바이트 수가 기록되었습니다. 
    ORA-00592 osndnt: $QIO 실패 (mailbox queue) 
    ORA-00593 osndnt: $DASSGN 실패 (network device) 
    ORA-00594 osndnt: $DASSGN 실패 (mailbox) 
    ORA-00595 osndnt: $QIO 실패 (receive) 
    ORA-00596 osndnt: $QIO 실패 (send) 
    ORA-00597 osndnt: $QIO 실패 (mailbox requeue) 
    ORA-00598 osndnt: $QIO 실패 (mailbox read) 
    ORA-00600 내부 오류 코드, 인수 : [%s], [%s], [%s], [%s], [%s], [%s], [%s], [%s] 
    ORA-00601 크린업 잠금이 충돌했습니다. 
    ORA-00602 내부 프로그래밍 오류입니다 - BUG로 등록하세요 
    ORA-00603 ORACLE 서버 세션이 치명적인 오류로 종료되었습니다. 
    ORA-00604 순환 SQL 레벨 %s 에 오류가 발생했습니다. 
    ORA-00606 내부 오류코드 
    ORA-00701 데이타베이스의 기동에 필요한 개체를 변경할 수 없습니다. 
    ORA-00702 부트스트랩 버전 %s가 버전 %s와 일치하지 않습니다. 
    ORA-00703 행 캐쉬 인스턴스 잠금의 최대 수를 초과했습니다. 
    ORA-00704 부트스트랩 프로세스 실패 
    ORA-00816 오류 메세지 해석 오류입니다. 
    ORA-00900 SQL 문이 부적합합니다. 
    ORA-00901 CREATE 명령어가 부적합합니다. 
    ORA-00902 데이타유형이 부적합합니다. 
    ORA-00903 테이블명이 부적합합니다. 
    ORA-00904 열명이 부적합합니다. 
    ORA-00905 키워드가 없습니다. 
    ORA-00906 좌괄호가 없습니다. 
    ORA-00907 우괄호가 없습니다. 
    ORA-00908 NULL 키워드가 없습니다. 
    ORA-00909 인수의 개수가 부적합합니다. 
    ORA-00910 데이타형에 지정된 길이가 너무 깁니다. 
    ORA-00911 문자가 부적합합니다. 
    ORA-00913 값의 수가 너무 많습니다. 
    ORA-00914 ADD 키워드가 없습니다. 
    ORA-00915 네트워크을 통한 DICTIONARY TABLE 액세스는 허가되지 않습니다. 
    ORA-00917 코머가 누락되었습니다. 
    ORA-00918 열의 정의가 애매합니다. 
    ORA-00919 함수가 부적합합니다. 
    ORA-00920 관계 연산자가 부적합합니다. 
    ORA-00921 SQL 명령어가 불완전합니다. 
    ORA-00922 옵션이 부적합하거나 없습니다. 
    ORA-00923 FROM 키워드가 있어야할 곳에 없습니다. 
    ORA-00924 BY 키워드가 없습니다. 
    ORA-00925 INTO 키워드가 없습니다. 
    ORA-00926 VALUES 키워드가 없습니다. 
    ORA-00927 등호가 없습니다. 
    ORA-00928 SELECT 키워드가 없습니다. 
    ORA-00929 마침표(.)가 없습니다. 
    ORA-00930 
    ORA-00931 식별자가 없습니다. 
    ORA-00932 데이타 유형이 일치하지 않습니다. 
    ORA-00933 SQL 명령어가 올바르게 종료되지 않았습니다. 
    ORA-00934 그룹 함수는 허가되지 않습니다. 
    ORA-00935 그룹 함수의 내포 레벨이 너무 깊습니다. 
    ORA-00936 식이 없습니다. 
    ORA-00937 단일 그룹의 그룹 함수가 아닙니다. 
    ORA-00938 함수의 인수가 충분하지 않습니다. 
    ORA-00939 함수의 인수가 너무 많습니다. 
    ORA-00940 ALTER 명령어가 부적합합니다. 
    ORA-00941 클러스터 명이 없습니다. 
    ORA-00942 테이블 또는 뷰가 존재하지 않습니다. 
    ORA-00943 클러스터가 존재하지 않습니다. 
    ORA-00944 클러스터 열의 수가 충분하지 않습니다. 
    ORA-00945 지정한 클러스터 열이 존재하지 않습니다. 
    ORA-00946 TO 키워드가 없습니다. 
    ORA-00947 값의 수가 충분하지 않습니다. 
    ORA-00948 ALTER CLUSTER 문은 제공되어 있지 않습니다. 
    ORA-00949 원격 데이타베이스는 참조할 수 없습니다. 
    ORA-00950 DROP 옵션이 부적합합니다. 
    ORA-00951 클러스터가 비어 있지 않습니다. 
    ORA-00952 GROUP 키워드가 없습니다. 
    ORA-00953 색인명이 부적합합니다. 
    ORA-00954 IDENTIFIED 키워드가 없습니다. 
    ORA-00955 이미 사용된 개체명입니다. 
    ORA-00956 감사 옵션이 부적합하거나 없습니다. 
    ORA-00957 열명이 중복되었습니다. 
    ORA-00958 CHECK 키워드가 없습니다. 
    ORA-00959 테이블 영역 %s 가 존재하지 않습니다. 
    ORA-00960 선택 리스트에 애매한 열명이 있습니다. 
    ORA-00962 너무 많은 group-by / order-by 식이 있습니다. 
    ORA-00964 FROM 리스트에 테이블명이 없습니다. 
    ORA-00965 
    ORA-00966 TABLE 키워드가 없습니다. 
    ORA-00967 WHERE 키워드가 없습니다. 
    ORA-00968 INDEX 키워드가 없습니다. 
    ORA-00969 ON 키워드가 없습니다. 
    ORA-00970 WITH 키워드가 없습니다. 
    ORA-00971 SET 키워드가 없습니다. 
    ORA-00972 식별자의 길이가 너무 깁니다. 
    ORA-00973 행수의 추정이 잘못되었습니다. 
    ORA-00974 PCTFREE 값(백분율)이 부적합합니다. 
    ORA-00975 날짜와 날짜의 가산은 할 수 없습니다. 
    ORA-00976 LEVEL, PRIOR, ROWNUM 은 사용 할 수 없습니다. 
    ORA-00977 감사 옵션이 중복되었습니다. 
    ORA-00978 GROUP BY 구 없이 그룹 함수가 내포되었습니다. 
    ORA-00979 GROUP BY 의 식이 없습니다. 
    ORA-00980 동의어의 해석이 불가능합니다. 
    ORA-00981 테이블 및 시스템 감사 옵션은 함께 지정될 수 없습니다. 
    ORA-00982 
    ORA-00984 열을 사용할 수 없습니다. 
    ORA-00985 프로그램명이 부적합합니다. 
    ORA-00986 그룹명이 부적합하거나 없습니다. 
    ORA-00987 사용자명이 부적합하거나 없습니다. 
    ORA-00988 암호가 틀립니다. 
    ORA-00989 사용자명에 대한 암호가 너무 많습니다. 
    ORA-00990 권한이 부적합합니다. 
    ORA-00991 MAC 권한만이 프로시저에게 권한부여해 줍니다. 
    ORA-00992 REVOKE 명령어의 형식이 부적합합니다. 
    ORA-00993 GRANT 키워드가 없습니다. 
    ORA-00994 OPTION 키워드가 없습니다. 
    ORA-00995 동의어의 식별자가 부적합합니다. 
    ORA-00996 연접 연산자는 | 이 아니고 || 입니다. 
    ORA-00997 LONG 데이타 유형은 사용할 수 없습니다. 
    ORA-00998 이 식은 열의 별명과 함께 지정해야 합니다. 
    ORA-00999 뷰명이 부적합합니다. 
    ORA-01000 최대 열기 커서 수를 초과했습니다. 
    ORA-01001 커서가 부적합합니다. 
    ORA-01002 인출 시퀀스가 틀립니다. 
    ORA-01003 해석된 문이 없습니다. 
    ORA-01004 디폴트 사용자명 사용 불가. 로그온이 허락되지 않습니다. 
    ORA-01005 널 암호가 입력되었습니다 로그온이 허락되지 않습니다. 
    ORA-01006 바인드 변수가 없습니다. 
    ORA-01007 변수가 선택 리스트에 없습니다. 
    ORA-01008 모든 한계변수가 아닙니다. 
    ORA-01009 필수 파라미터가 없습니다. 
    ORA-01010 OCI 조작이 부적합합니다. 
    ORA-01011 v6 서버와 교신할때 v7 호환성 모드를 사용할 수 없습니다. 
    ORA-01012 로그온되어 있지 않습니다. 
    ORA-01013 현 조작의 취소가 요구되었습니다. 
    ORA-01014 ORACLE의 정지 처리가 진행중입니다. 
    ORA-01015 로그온이 순환적으로 호출되었습니다. 
    ORA-01016 이함수는 인출 이후에만 호출될 수 있습니다. 
    ORA-01017 사용자명/암호가 부적합, 로그온할 수 없습니다. 
    ORA-01018 LONG 데이타 유형의 열이 아닙니다. 
    ORA-01019 사용자쪽의 기억영역을 할당할 수 없습니다. 
    ORA-01020 문맥의 상태가 불명확합니다. 
    ORA-01021 지정한 문맥 크기가 부적합합니다. 
    ORA-01022 이 구성에 데이타베이스 작업이 지원되지 않습니다. 
    ORA-01023 커서 문맥가 없습니다부당한 커서번호) 
    ORA-01024 OCI 콜의 데이타 유형은 부적합합니다. 
    ORA-01025 UPI 파라미터가 부적합합니다. 
    ORA-01026 바인드 목록에 크기가 2000이상인 다중 버퍼 
    ORA-01027 데이타 정의에서는 바인드 변수를 사용할 수 없습니다. 
    ORA-01028 내부 투 태스크(two task) 오류 
    ORA-01029 내부 투 태스크(two task) 오류 
    ORA-01030 SELECT ... INTO 변수가 없습니다. 
    ORA-01031 권한이 불충분합니다. 
    ORA-01032 사용자 번호가 존재하지 않습니다. 
    ORA-01033 ORACLE의 초기화 또는 정지 처리가 진행중입니다. 
    ORA-01034 ORACLE을 사용할 수 없습니다. 
    ORA-01035 ORACLE은 RESTRICTED SESSION 권한을 갖는 사용자만 사용 가능합니다. 
    ORA-01036 잘못된 변수명/번호 
    ORA-01037 최대 커서 메모리가 초과되었습니다. 
    ORA-01038 데이타베이스 화일 버전 %s에 ORACLE 버전 %s으로 기록할 수 없습니다. 
    ORA-01039 사용되지 않는 오류 
    ORA-01040 암호에 잘못된 문자가 있습니다 로그온을 할 수 없습니다. 
    ORA-01041 내부오류. hostdef 확장이 존재하지 않습니다. 
    ORA-01042 개방된 커서와 함께 세션을 분리하는 것은 허용되지 않습니다. 
    ORA-01043 사용자쪽의 기억영역 파괴 [%s], [%s], [%s], [%s] 
    ORA-01044 버퍼의 크기 %s (한계가 변수 %s)가 최대의 %s를 초과했습니다. 
    ORA-01045 사용자 %s는 CREATE SESSION 권한을 가지고있지 않음; 로그온이 거절되었습니다. 
    ORA-01046 확장할 문맥 영역을 획득할 수 없습니다. 
    ORA-01047 위에 오류는 스키마=%s, 패키지=%s, 프로시저=%s에서 발생된 것입니다. 
    ORA-01048 주어진 컨텍스트에서 지정된 프로시저를 찾을 수 없습니다. 
    ORA-01049 스트림된 RPC에서 이름으로 바인드한것은 지원되지 않습니다. 
    ORA-01050 문맥 영역을 개방하기 위한 영역을 획득할 수 없습니다. 
    ORA-01051 잘못된 지연 rpc 버퍼 포맷 
    ORA-01053 사용자 기억 영역 주소를 읽을 수 없습니다. 
    ORA-01054 사용자 기억 영역 주소에 기록할 수 없습니다. 
    ORA-01057 내부의 New Upi 인터페이스 오류 
    ORA-01058 internal New Upi interface error 
    ORA-01059 바인드 또는 실행전에 구문분석이 필요합니다. 
    ORA-01060 배열 바인드 또는 실행이 허용되지 않습니다. 
    ORA-01070 서버용으로 구버전의 오라클을 사용 
    ORA-01071 ORACLE을 기동하지 않으면 조작 실행이 불가 합니다. 
    ORA-01072 ORACLE은 기동중이 아닙니다 정지할 수 없습니다. 
    ORA-01073 연결 오류. 콜(call)의 유형을 인식할 수 없습니다. 
    ORA-01074 ORACLE은 정지되지 않습니다 먼저 로그오프해 주십시오 
    ORA-01075 이미 로그온되어 있습니다. 
    ORA-01076 단일 프로세스에 대한 복수 로그온은 제공되지 않습니다. 
    ORA-01077 백그라운드 프로세스 초기화 오류입니다. 
    ORA-01078 시스템 파라미터 처리 오류입니다. 
    ORA-01079 ORACLE 데이타베이스가 작성되지 않았음 - 작업이 비정상 종료되었습니다. 
    ORA-01080 ORACLE 정지중 오류가 발생했습니다. 
    ORA-01081 이미 기동중인 ORACLE을 기동하려 했습니다. 
    ORA-01082 row_locking = always 기능은 TPS 옵션이 없는 ORACLE에서는 지원되지않습니다. 
    ORA-01083 파라미터 값 %s는 다른 서버들의 값과 불일치합니다. 
    ORA-01084 OCI 호출에 부적당한 인수가 있습니다. 
    ORA-01085 %S에 대한 지연 원격 프로시저 호출(rpc)에서 오류 발생 
    ORA-01086 세이브포인트 %s 는 설정되어 있지 않습니다. 
    ORA-01087 현재 ORACLE에 로그온되어 있습니다 기동할 수 없습니다. 
    ORA-01088 액티브 프로세스가 있기 때문에 ORACLE을 정지할 수 없습니다. 
    ORA-01089 정지 처리(즉시)중입니다 조작은 허가되지 않습니다. 
    ORA-01090 정지 처리중입니다 연결할 수 없습니다. 
    ORA-01091 기동중에 오류가 발생했습니다. 
    ORA-01092 오라클 인스턴스 종료 분리가 되었습니다. 
    ORA-01093 ALTER DATABASE CLOSE 문은 연결된 세션이 없는 경우에만 가능합니다. 
    ORA-01094 ALTER DATABASE CLOSE 문이 수행중 입니다 연결은 허용되지 않습니다. 
    ORA-01095 DML 문이 0개의 행을 처리 했습니다. 
    ORA-01096 프로그램 버전 (%s)과 인스턴스 (%s)가 호환성이 없습니다. 
    ORA-01097 트랜잭션 도중에 SHUTDOWN할 수 없습니다- 먼저 커밋 혹은 롤백하십시오 
    ORA-01098 Long Insert중에 프로그램 인터페이스 오류 
    ORA-01099 단일 프로세스 모드로 기동된 데이타베이스는 SHARES 모드로 마운트할 수 없습니다. 
    ORA-01100 데이타베이스가 이미 마운트 되었습니다. 
    ORA-01101 다른 인스턴스로 부터 생성된 데이타베이스가 현재 마운트 되었습니다. 
    ORA-01102 데이타베이스가 EXCLUSIVE 모드로 마운트할 수 없습니다. 
    ORA-01103 제어 화일의 데이타베이스명 %s는 %s가 아닙니다. 
    ORA-01104 제어 화일의 수(%s)가 %s 와 일치하지 않습니다. 
    ORA-01105 올리기는 다른 인스턴스에 의해 마운트하는 것과 호환성이 없습니다. 
    ORA-01106 내리기를 하기전에 데이타베이스를 디스마운트 합니다. 
    ORA-01107 매체 복구를 위해 데이타베이스를 마운트해야 합니다. 
    ORA-01108 화일 %s가 매체 복구 중에 있습니다. 
    ORA-01109 데이타베이스가 개방되지 않습니다. 
    ORA-01110 데이타 화일 %s: %s 
    ORA-01111 데이타 화일 %s의 이름을 모릅니다- 올바른 화일로 재명명 하십시오. 
    ORA-01112 매체 복구 처리가 개시되지 않았습니다. 
    ORA-01113 화일 %s가 매체 복구되어야 합니다. 
    ORA-01114 화일 %s의 블록쓰기 IO 오류입니다블록 번호 %s). 
    ORA-01115 화일 %s의 블록(블록 번호 %s) 읽기 IO 오류입니다. 
    ORA-01116 데이타베이스 화일 %s의 개방 오류입니다. 
    ORA-01117 추가하는 화일 %s 의 블록 크기 %s 는 부적합합니다 제한은 %s 입니다. 
    ORA-01118 데이타베이스 화일을 더 이상 등록할 수 없습니다 제한 %s 를 초과했습니다. 
    ORA-01119 데이타베이스 화일 %s 의 작성 오류입니다. 
    ORA-01120 온라인 데이타베이스 화일 %s은 삭제할 수 없습니다. 
    ORA-01121 데이타 화일 %s를 재명명할 수 없습니다- 화일이 사용중이거나 복구중입니다. 
    ORA-01122 데이타 화일 %s의 검증 체크에 실패 했습니다. 
    ORA-01123 온라인 백업을 개시할 수 없습니다 매체 복구가 사용 불가로 되어 있습니다. 
    ORA-01124 데이타 화일 %s을 복구할 수 없음 - 화일이 사용중이거나 복구중입니다. 
    ORA-01125 매체 복구를 사용불가할 수 없음. 화일 %s 가 온라인 백업으로 설정됨. 
    ORA-01126 데이타베이스는 EXCLUSIVE로 마운트하고 개방하지 말아야 합니다. 
    ORA-01127 데이타베이스명 %s가 최대 문자수 %s를 초과했습니다. 
    ORA-01128 온라인 백업을 시작할 수 없음 - 화일 %s가 오프라인입니다. 
    ORA-01129 디폴트 또는 임시 테이블 영역이 존재하지 않습니다. 
    ORA-01130 데이타베이스 화일 버전 %s 는 ORACLE 버전 %s 와 호환되지 않습니다. 
    ORA-01131 DB_FILES 파라미터의 값 %s 가 최대수 %s 를 초과했습니다. 
    ORA-01132 데이타베이스 화일명 %s 의 길이가 최대 문자수 %s 를 초과했습니다. 
    ORA-01133 로그 화일명 %s 의 길이가 최대 문자수 %s 를 초과했습니다. 
    ORA-01134 데이타베이스가 다른 인스턴스에 의해 배타 모드로 마운트했습니다. 
    ORA-01135 DML/질의로 액세스된 화일 %s 는 오프 라인입니다. 
    ORA-01136 화일 %s의 명시된 크기(%s 블록)가 원래 크기 %s 블록보다 작습니다. 
    ORA-01137 데이타 화일 %s가 오프라인으로 되고 있는 중입니다. 
    ORA-01138 데이타베이스가 이 인스턴스로 열거나 다른 인스턴스에 대해 닫아야 합니다. 
    ORA-01139 RESETLOGS 옵션은 불완전한 데이타베이스의 복구 후에만 유효합니다. 
    ORA-01140 온라인 백업을 종료할 수 없음 - 모든 화일이 오프라인입니다. 
    ORA-01141 데이타 화일 %s의 재명명 오류 - 새로운 화일 %s 가 없습니다. 
    ORA-01142 온라인 백업을 종료할 수 없음 - 백업할 수 있는 상태의 화일이 없습니다. 
    ORA-01143 매체 복구를 사용불가하게할 수 없습니다 화일 %s가 매체복구를 필요로 합니다. 
    ORA-01144 화일크기(%s 블록)가 최대치 %s 블록을 초과합니다. 
    ORA-01145 매체 복구가 사용 가능하지 않으면 즉시 오프라인으로 할 수 없습니다. 
    ORA-01146 온라인 백업을 시작할 수 없습니다 - 화일 %s가 이미 백업중에 있습니다. 
    ORA-01147 SYSTEM 테이블 영역 화일 %s가 오프 라인입니다. 
    ORA-01148 이 작업을 하려면 데이타베이스가 EXCLUSIVE 모드로 마운트해야 합니다. 
    ORA-01149 정지처리 불가 - 화일 %s를 온라인 백업중 입니다. 
    ORA-01150 쓰기 방지를 할수 없음 - 화일 %s를 온라인 백업중 입니다. 
    ORA-01151 블록을 복구하려면 미디어 복구를 사용하고 필요하면 백업을 사용하십시오 
    ORA-01152 화일 %s가 충분한 이전 백업으로 복구되지 않았습니다 
    ORA-01153 비호환 매체 복구가 동작 상태입니다. 
    ORA-01154 데이타베이스는 사용중 - 개방, 클로즈, 마운트, 디스마운트 할 수 없습니다. 
    ORA-01155 데이타베이스는 개방, 클로즈, 마운트 혹은 디스마운트 중 입니다. 
    ORA-01156 진행중인 복구 작업이 화일 액세스를 필요로 할 수 있습니다. 
    ORA-01157 데이타 화일 %s를 식별할 수 없습니다- 화일이 발견되지 않음 
    ORA-01158 데이타베이스 %s 가 이미 마운트했습니다. 
    ORA-01159 화일이 동일한 데이타베이스의 화일이 아닙니다- 데이타베이스 ID가 잘못됨. 
    ORA-01160 화일이 %s가 아닙니다. 
    ORA-01161 화일헤더에 있는 데이타베이스명 %s가 주어진 이름 %s 와 일치하지 않습니다. 
    ORA-01162 화일 헤더에 블록 크기 %s가 DB_BLOCK_SIZE(%s)와 일치하지 않습니다. 
    ORA-01163 SIZE 절에 %s (블록)이 지정되었으나 헤더 %s와 일치해야 합니다. 
    ORA-01164 MAXLOGFILES는 %s 를 초과할 수 없습니다. 
    ORA-01165 MAXDATAFILES는 %s 를 초과할 수 없습니다. 
    ORA-01166 화일번호 %s가 %s (%s)보다 큽니다. 
    ORA-01167 두개의 화일들이 같은 화일 그룹번호 이거나 같은 화일입니다. 
    ORA-01168 물리 블록 크기 %s가 다른 멤버들의 크기 %s와 일치하지 않습니다. 
    ORA-01169 DATAFILE 번호 1번이 없습니다. 
    ORA-01170 화일이 존재하지 않습니다 %s 
    ORA-01171 체크포인트 오류 때문에 데이타 화일 %s이 오프라인됩니다. 
    ORA-01172 쓰레드 %s의 복구가 블록 %s(화일 %s의)에서 더이상 진행되지 못합니다. 
    ORA-01173 데이타 DICTIONARY 
    ORA-01174 DB_FILE %s는 호환성을 위해서 %s가 되어야 합니다. 
    ORA-01175 데이타 DICTIONARY가 인스턴스에서 허용하는 %s 보다 많은 수의 화일을 포함합니다. 
    ORA-01176 데이타 DICTIONARY가 제어 화일에서 허용하는 %s 보다 많은 수의 화일을 포함합니다. 
    ORA-01177 데이타 화일이 DICTIONARY와 일치하지 않습니다- 아마도 오래된 것입니다. 
    ORA-01178 화일 %s가 마지막 CREATE CONTROLFILE 이전에 생성됐음. 재 생성할 수 없습니다. 
    ORA-01179 화일 %s 가 존재하지 않습니다. 
    ORA-01180 데이타 화일 1을 생성할 수 없습니다. 
    ORA-01181 최후의 RESETLOGS 이전에 생성된 화일 %s를 재생성할 수 없습니다. 
    ORA-01182 데이타베이스 화일 %s를 생성할 수 없음 - 사용중이거나 복구중입니다. 
    ORA-01183 SHARED모드로 데이타베이스를 마운트할 수 없습니다. 
    ORA-01184 로그화일 그룹 %s는 이미 존재합니다. 
    ORA-01185 로그화일 그룹 %s는 부적절합니다. 
    ORA-01186 화일 %s의 검증 테스트에 실패했습니다. 
    ORA-01187 검증 테스트에 실패했기 때문에 화일 %s를 읽을 수 없습니다. 
    ORA-01188 헤더내의 블록 크기 %s가 실제 물리블록 크기 %s와 맞지 않습니다. 
    ORA-01189 이전 화일과 다른 RESETLOGS가 사용되었습니다. 
    ORA-01190 제어 화일 혹은 데이타 화일 %s는 마지막 RESETLOGS 이전의 것입니다. 
    ORA-01191 화일 %s는 이미 오프라인임 - 정상적인 오프라인을 할 수 없습니다. 
    ORA-01192 최소한 하나의 이용 가능한 쓰레드를 가져야합니다. 
    ORA-01193 화일 %s는 복구 시작시 인식된 화일이 아닙니다. 
    ORA-01194 화일 %s가 일관성을 갖기 위해서는 더 많은 복구가 필요로 합니다. 
    ORA-01195 화일 %s의 온라인 백업은 일관성을 갖기위해 더 많은 복구가 필요로 합니다. 
    ORA-01196 매체복구 세션의 실패로 인하여 화일 %s의 일관성이 결여되어 있습니다. 
    ORA-01197 쓰레드 %s는 하나의 로그만을 포함하고 있습니다. 
    ORA-01198 RESETLOGS인 경우 로그화일에 대한 크기를 지정하여야 합니다. 
    ORA-01199 화일 %s는 온라인 백업 모드가 아닙니다. 
    ORA-01200 실제 화일크기 %s는 맞는 크기인 %s 블록보다 작습니다. 
    ORA-01201 헤더내의 화일 크기 %s가 제어화일내의 크기 %s와 일치하지 않습니다. 
    ORA-01202 화일의 구현이 잘못됨 - 작성 시각이 틀립니다. 
    ORA-01203 화일의 구현이 잘못됨 - 작성 SCN이 틀립니다. 
    ORA-01204 화일 번호가 %s (%s가 아님) - 틀린 화일입니다. 
    ORA-01205 데이타 화일이 아님 - 헤더내의 유형 번호가 %s입니다. 
    ORA-01206 화일은 이 데이타베이스의 일부가 아님 - 데이타베이스 ID가 틀립니다. 
    ORA-01207 화일이 제어화일보다 최근의 것임 - 오래된 제어화일입니다. 
    ORA-01208 데이타 화일이 구버전임 - 현 버전을 액세스하지 않았습니다. 
    ORA-01209 데이타 화일이 마지막 RESETLOGS 이전의 것입니다. 
    ORA-01210 데이타 화일의 헤더가 매체 붕괴되었습니다. 
    ORA-01211 버전 6의 데이타 화일이 버전7으로의 변환 화일이 아닙니다. 
    ORA-01212 MAXLOGMEMBERS는 %s를 초과할 수 없습니다. 
    ORA-01213 MAXINSTANCE는 %s를 초과할 수 없습니다. 
    ORA-01214 MAXLOGHISTORY는 %s를 초과할 수 없습니다. 
    ORA-01215 CREATE CONTROLFILE이후의 가용 쓰레드 %s가 빠졌습니다. 
    ORA-01216 CREATE CONTROLFILE이후 쓰레드 %s는 사용불가되어야합니다. 
    ORA-01217 로그화일 멤버가 다른 로그화일 그룹에 속해있습니다. 
    ORA-01218 로그화일 멤버는 동일한 시간때에 만든것이 아닙니다. 
    ORA-01219 데이타베이스가 열지 않았음: 고정 테이블/뷰에 대해서만 조회가 가능합니다. 
    ORA-01220 데이테베이스가 개방 되기전에는, 화일을 기본으로하는 소트가 부적합합니다. 
    ORA-01221 데이타 화일 %s는 백그라운드 프로세스에 대해 동일 화일이 아닙니다. 
    ORA-01222 %s의 MAXINSTANCES는 MAXLOGFILES가 최소 %s이어야함(%s가 아님) 
    ORA-01223 새로운 데이타베이스명을 부여하기 위해서는 RESETLOGS를 지정하여야 합니다. 
    ORA-01224 헤더 %s내의 그룹번호가 GROUP %s와 맞지 않습니다. 
    ORA-01225 쓰레드 번호 %s가 MAXINSTANCES %s 보다 큽니다. 
    ORA-01226 로그 멤버의 화일헤더가 다른 멤버와 일치하지 않습니다. 
    ORA-01227 로그 %s는 다른 로그와 일치하지 않습니다. 
    ORA-01228 기초 데이테베이스를 설치하려면 SET DATABASE 옵션이 필요합니다. 
    ORA-01229 데이타 화일 %s가 로그와 일치하지 않습니다. 
    ORA-01230 읽기 전용으로 만들수 없습니다- %s 화일이 오프라인입니다. 
    ORA-01231 쓰기 전용으로 만들수 없습니다- %s 화일이 오프라인입니다. 
    ORA-01232 온라인 백업을 수행할 수 없습니다- %s 화일은 읽기 전용입니다. 
    ORA-01233 %s 화일은 읽기 전용입니다- 컨트롤화일 백업을 사용해서 복구할 수 없습니다. 
    ORA-01234 화일 %s의 백업을 종료할 수 없습니다 - 화일을 사용중이거나 복구중입니다. 
    ORA-01235 %s 화일에 대한 END BACKUP은 실패하고 %s에 대해서는 성공했습니다. 
    ORA-01237 데이타화일 %s를 확장할 수 없습니다. 
    ORA-01238 데이타화일 %s를 축소할 수 없습니다. 
    ORA-01239 데이터베이스는 외부 캐시를 사용하기 위해서 ARCHIVELOG 모드로 되어 있어야 합니다. 
    ORA-01240 하나의 명령어에 너무 많은 데이터 화일을 추가합니다. 
    ORA-01241 외부 캐시가 죽었습니다. 
    ORA-01242 데이터 화일이 메디아 실패를 받았습니다: 데이터베이스는 NOARCHIVELOG 모드입니다. 
    ORA-01243 시스템 테이블스페이스 화일이 메디아 실패를 받았습니다. 
    ORA-01244 메디아 복구에 의해서 제어화일에 이름 없는 데이터화일이 추가되었습니다. 
    ORA-01245 오프라인 화일 %s 은 RESETLOGS이 끝나면 없어집니다. 
    ORA-01400 행의 입력으로 필수 열(NOT NULL)에 값이 지정되지 않았습니다. 
    ORA-01401 열에 입력한 값이 너무 큽니다. 
    ORA-01402 뷰의 WITH CHECK OPTION의 조건에 위배 됩니다. 
    ORA-01403 데이타가 없습니다. 
    ORA-01404 ALTER COLUMN은 색인을 너무 크게 만들 수 있습니다. 
    ORA-01405 인출된 열의 값은 NULL입니다. 
    ORA-01406 인출된 열의 값이 절사되었습니다. 
    ORA-01407 입력 필수 열(NOT NULL)은 NULL로 갱신할 수 없습니다. 
    ORA-01408 열 리스트에는 이미 색인이 작성되어 있습니다. 
    ORA-01409 NOSORT 옵션은 사용할 수 없습니다 행이 오름차순으로 되어 있지 않습니다. 
    ORA-01410 ROWID가 부적합합니다. 
    ORA-01411 표시기내에 열의 길이를 저장할 수 없습니다. 
    ORA-01412 이 데이타 유형에 대해서는 0길이가 허용되지 않습니다. 
    ORA-01413 팩형 십진수 버퍼안의 값이 부적합합니다. 
    ORA-01414 배열을 바인드 할때 배열 길이가 부적합합니다. 
    ORA-01416 두 개의 테이블을 outer-join할 수 없습니다. 
    ORA-01417 하나의 테이블은 하나의 다른 테이블과 outer-join할 수 있습니다. 
    ORA-01418 지정한 색인는 존재하지 않습니다. 
    ORA-01419 datdts: 형식 코드 오류입니다. 
    ORA-01420 datstd: 형식 코드 오류입니다. 
    ORA-01421 datrnd/dattrn: 정도 지정자 오류입니다. 
    ORA-01422 실제 인출은 요구된 것보다 많은 수의 행을 추출합니다. 
    ORA-01423 실제 인출에서 여분의 행을 검사하는 중에 오류가 검출되었습니다. 
    ORA-01424 에스케이프 문자 뒤에 누락 혹은 부당한 문자가 있습니다. 
    ORA-01425 에스케이프 문자는 1자리 문자 스트링이어야 합니다. 
    ORA-01426 수치 오버플로우 
    ORA-01427 단일 행 부속 질의에 의해 2개 이상의 행이 리턴되었습니다. 
    ORA-01428 인수 %s가 범위를 벗어났습니다. 
    ORA-01430 추가하려는 열이 이미 테이블에 존재합니다. 
    ORA-01431 GRANT 명령어 내부 불일치 오류입니다. 
    ORA-01432 삭제할 공개 동의어가 존재하지 않습니다. 
    ORA-01433 작성한 동의어가 이미 정의되어 있습니다. 
    ORA-01434 삭제할 비공개 동의어가 존재하지 않습니다. 
    ORA-01435 사용자가 존재하지 않습니다. 
    ORA-01436 CONNECT BY의 루프가 발생되었습니다. 
    ORA-01437 결합은 CONNECT BY와 함께 지정할 수 없습니다. 
    ORA-01438 지정한 정도를 초과한 값이 열에 지정되었습니다. 
    ORA-01439 데이타 유형을 변경할 열은 비어 있어야 합니다. 
    ORA-01440 정도 또는 자리수를 축소할 열은 비어 있어야 합니다. 
    ORA-01441 길이를 짧게 변경할 열의 값은 NULL이어야 합니다. 
    ORA-01442 변경하고자 하는 열이 이미 NOT NULL입니다. 
    ORA-01443 내부 오류 : 뷰 열의 데이타 유형이 부적합합니다. 
    ORA-01444 내부 오류 : 내부 데이타 유형와 외부 데이타 유형은 부적합합니다. 
    ORA-01445 키-보전 테이블 없이 결합 뷰으로 부터 ROWID를 선택할 수 없습니다. 
    ORA-01446 DISTINCT, GROUP BY 등을 포함하는 뷰로부터 ROWID를 선택할 수 없습니다. 
    ORA-01447 클러스터 열에 ALTER TABLE 문을 사용할 수 없습니다. 
    ORA-01448 데이타 유형을 변경하기 전에 색인을 삭제해야 합니다. 
    ORA-01449 열이 NULL값을 포함하고 있습니다 NOT NULL로 변경할 수 없습니다. 
    ORA-01450 키의 최대 길이(%s)를 초과했습니다. 
    ORA-01451 열이 이미 NULL로 되어 있습니다. 
    ORA-01452 중복 키가 있습니다. 유일한 색인을 작성할 수 없습니다. 
    ORA-01453 SET TRANSACTION 사용시에는 트랜잭션의 최초문장 이어야 합니다. 
    ORA-01454 수치 데이타 유형으로 변환할 수 없습니다. 
    ORA-01455 열의 변환에 의해 정수 데이타 유형이 오버플로우되었습니다. 
    ORA-01456 READ ONLY 트랜잭션은 삽입/삭제/갱신할 수 없습니다. 
    ORA-01457 열의 변환에 의해 DECIMAL 데이타 유형이 오버플로우되었습니다. 
    ORA-01458 가변장 스트링의 지정된 길이가 부적합합니다. 
    ORA-01459 가변장 스트링의 길이가 부적합합니다. 
    ORA-01460 요구된 변환은 실행될 수 없습니다. 
    ORA-01461 LONG 값은 LONG 열에만 입력할 수 있습니다. 
    ORA-01462 2000 문자 이상은 입력할 수 없습니다. 
    ORA-01463 자신에 대한 권한의 허가나 취소는 불가능합니다. 
    ORA-01464 테이블 또는 뷰의 GRANT 오류입니다. 
    ORA-01465 16진수의 지정이 부적합합니다. 
    ORA-01466 테이블 정의가 변경되었습니다 데이타를 읽을 수 없습니다. 
    ORA-01467 정렬 키가 너무 깁니다. 
    ORA-01468 outer-join된 테이블은 1개만 지정할 수 있습니다. 
    ORA-01469 PRIOR의 뒤에는 열 명을 지정해 주십시오 
    ORA-01471 개체와 같은 이름의 동의어는 작성할 수 없습니다. 
    ORA-01472 CONNECT BY는 DISTINCT, GROUP BY 를 동반한 뷰에 사용할 수 없습니다. 
    ORA-01473 CONNECT BY 구에 부속 질의를 지정할 수 없습니다. 
    ORA-01474 CONNECT BY 없이 START WITH 나 PRIOR 는 지정할 수 없습니다. 
    ORA-01475 바인드 변수의 데이타 유형 변경을 위해서는 커서를 재구문분석을 해야 합니다. 
    ORA-01476 제수가 0 입니다. 
    ORA-01477 사용자 데이타 영역 기술자가 너무 큽니다. 
    ORA-01478 LONG 열은 배열 바인드에 사용할 수 없습니다. 
    ORA-01479 버퍼내의 마지막 문자가 널(Null)이 아닙니다. 
    ORA-01480 STR 바인드 값에 종료의 널이 없습니다. 
    ORA-01481 숫자 형식 모델이 부적합합니다. 
    ORA-01482 지정된 문자세트는 제공하지 않습니다. 
    ORA-01483 DATE 또는 NUMBER 바인드 변수의 길이가 부적합합니다. 
    ORA-01484 배열은 PL/SQL문 범위에서만 해야 합니다. 
    ORA-01485 실행 바인드 길이가 컴파일 바인드 길이와 다릅니다. 
    ORA-01486 배열요소 크기가 너무 큽니다. 
    ORA-01487 팩형 십진수가 제공된 버퍼에 비해 너무 큽니다. 
    ORA-01488 부적절한 팩형 십진수 입니다. 
    ORA-01489 스트링 연결의 결과가 너무 깁니다. 
    ORA-01490 부적합한 ANALYZE 명령입니다. 
    ORA-01491 CASCADE 옵션이 부적합합니다. 
    ORA-01492 현 트랜잭션이 이미 롤백 세그먼트에 연결되어 있습니다. 
    ORA-01493 명시된 SAMPLE 길이가 부적합합니다. 
    ORA-01494 지정된 SIZE가 부적당합니다. 
    ORA-01495 지정된 연결행 테이블이 없습니다. 
    ORA-01496 지정된 연결행 테이블 형식이 틀립니다. 
    ORA-01497 ANALYZE CLUSTER에 대한 옵션이 잘못되었습니다. 
    ORA-01498 블록 체크 실패 - 트래스 화일을 보십시오 
    ORA-01499 테이블/색인의 교차 참조 실패 - 트래스 화일을 보십시오 
    ORA-01500 날짜/시간의 획득 오류입니다. 
    ORA-01501 CREATE DATABASE 문 오류입니다. 
    ORA-01502 색인 %S는 직접 로드 상태입니다.

    less..

    ORA-01503 CREATE CONTROLFILE이 실패했습니다. 
    ORA-01504 데이타베이스명 %s가 db_name 파라미터 %s와 맞지않습니다. 
    ORA-01505 로그 화일 등록 오류입니다. 
    ORA-01506 데이타베이스 명을 올바르게 지정해 주십시오. 
    ORA-01507 데이타베이스가 마운트하지 않았습니다. 
    ORA-01508 화일 %s 의 줄 %s 에 오류. 데이타베이스를 생성할 수 없습니다. 
    ORA-01509 지정한 이름 %s 가 실제의 이름 %s 와 일치하지 않습니다. 
    ORA-01510 로그 화일 삭제 오류입니다. 
    ORA-01511 로그/데이타 화일의 재명명 오류입니다. 
    ORA-01512 로드 화일 %s의 재명명 오류 - 새로운 화일 %s가 없습니다. 
    ORA-01513 운영 시스템으로 부터 부정확한 현시각이 보내졌습니다. 
    ORA-01514 로그 명세에 오류: 그런 로그가 없습니다. 
    ORA-01515 로그 그룹 %s의 삭제시 오류. 그런 로그가 없습니다. 
    ORA-01516 로그/데이타 화일 %s 는 존재하지 않습니다. 
    ORA-01517 로그 멤버: %s 
    ORA-01518 2개 이상의 로그 화일을 CREATE DATABASE 에 지정해 주십시오. 
    ORA-01519 오류 발생(화일 %s 의 줄 %s 부근) 
    ORA-01520 추가할 데이타 화일의 수(%s)가 최대수 %s 를 초과했습니다. 
    ORA-01521 데이타 화일의 등록중 오류가 발생했습니다. 
    ORA-01522 재명명할 화일 %s 가 없습니다. 
    ORA-01523 데이타 화일 %s 는 이미 데이타베이스의 일부입니다. 재명명할 수 없습니다. 
    ORA-01524 %s로 데이타 화일을 생성할 수 없음 - 화일이 이미 데이타베이스의 부분입니다. 
    ORA-01525 데이타 화일의 재명명중 오류가 발생했습니다. 
    ORA-01526 화일 %s 의 열기 오류가 발생했습니다. 
    ORA-01527 화일을 읽는 도중 오류가 발생했습니다. 
    ORA-01528 SQL 문의 처리중 EOF 오류입니다. 
    ORA-01529 화일 %s 의 클로즈중 오류가 발생했습니다. 
    ORA-01530 이 인스턴스는 이미 데이타베이스를 마운트했습니다. 
    ORA-01531 이 인스턴스는 이미 데이타베이스를 개방했습니다. 
    ORA-01532 인스턴스가 기동되어 있습니다. 데이타베이스를 생성할 수 없습니다. 
    ORA-01533 화일 %s 는 테이블 영역에 속해 있지 않습니다. 재명명할 수 없습니다. 
    ORA-01534 롤백 세그먼트 %s 가 존재하지 않습니다. 
    ORA-01535 롤백 세그먼트 %s 는 이미 존재합니다. 
    ORA-01536 테이블 영역 %s 에 대한 영역 할당량이 초과됐습니다. 
    ORA-01537 데이타 화일 %s 는 이미 데이타베이스의 일부입니다 등록할 수 없습니다. 
    ORA-01538 롤백 세그먼트를 획득할 수 없습니다. 
    ORA-01539 테이블 영역 %s 가 온라인이 아닙니다. 
    ORA-01540 테이블 영역 %s 가 오프라인이 아닙니다. 
    ORA-01541 SYSTEM 테이블 영역은 오프라인될 수 없습니다 필요하면 중지 하십시오 
    ORA-01542 테이블 영역 %s 가 오프라인입니다. 영역을 할당할 수 없습니다. 
    ORA-01543 테이블 영역 %s 는 이미 존재하고 있습니다. 
    ORA-01544 시스템 롤백 세그먼트는 삭제할 수 없습니다. 
    ORA-01545 롤백 세그먼트 %s 는 사용할 수 없습니다. 
    ORA-01546 테이블 영역에 액티브 롤백 세그먼트 %s 가 있습니다. 
    ORA-01548 액티브 롤백 세그먼트 %s 가 존재함, 테이블 영역의 삭제를 종료하십시오. 
    ORA-01549 테이블 영역이 비어있지 않으므로 INCLUDING CONTENTS를 사용해 주십시오. 
    ORA-01550 시스템 테이블 영역은 삭제할 수 없습니다. 
    ORA-01551 롤백 세그먼트 확장 오류입니다. 
    ORA-01552 시스템 테이블 영역이 아닌 %s 에 시스템 롤백 세그먼트를 사용할 수 없습니다. 
    ORA-01553 MAXEXTENTS는 현재 할당된 %s 엑스텐트 수 이상이어야 합니다. 
    ORA-01554 트랜잭션 슬롯이 없습니다. 
    ORA-01555 스냅샷이 너무 오래 되었습니다(롤백 세그먼트가 너무 작습니다) 
    ORA-01556 롤백 세그먼트를 위한 MINEXTENTS는 1보다 커야만 합니다. 
    ORA-01557 롤백 세그먼트 엑스텐트는 최저 %s 블록이 필요합니다. 
    ORA-01558 롤백 세그먼트 %s 에 트랜잭션 번호가 없습니다. 
    ORA-01559 롤백 세그먼트의 MAXEXTENTS 는 2 이상입니다. 
    ORA-01560 글로벌 해쉬 테이블의 크기가 %s와 일치하지 않습니다 (%s !=%s) 
    ORA-01561 지정된 테이블 영역중의 개체가 삭제되지 않았습니다. 
    ORA-01562 롤백 세그먼트 확장 실패입니다 (id = %s) 
    ORA-01563 키워드 PUBLIC 을 사용해 주십시오 
    ORA-01564 롤백 세그먼트는 PUBLIC 이 아닙니다. 
    ORA-01565 화일 %s 의 식별 오류가 발생했습니다. 
    ORA-01566 DROP LOGFILE에 화일이 2회 이상 지정되었습니다. 
    ORA-01567 로그 %s를 삭제하면 쓰레드 %s에 남는 로그 화일이 2개 미만으로 됩니다. 
    ORA-01568 PUBLIC에 영역 할당량을 설정할 수 없습니다. 
    ORA-01569 시스템 DICTIONARY 테이블에 대한 데이타 화일이 너무 작습니다. 
    ORA-01570 MINEXTENTS는 현재 할당된 %s보다 클 수 없습니다. 
    ORA-01571 로그 레코드 버전 %s 가 ORACLE의 버전 %s 과 호환되지 않습니다. 
    ORA-01572 롤백 세그먼트용 글로벌 해쉬 테이블의 크기 %s가 롤백 세그먼트 번호 %s 에 대해 너무 작음 
    ORA-01573 인스턴스의 정지 처리가 진행중. 더 이상의 변경은 허용되지 않습니다. 
    ORA-01574 최대 동시 실행 트랜잭션 수를 초과했습니다. 
    ORA-01575 영역 관리 자원의 대기중 시간이 초과되었습니다. 
    ORA-01576 인스턴스 잠금 프로토콜 버전 %s는 ORACLE의 버전 %s 와 호환되지 않습니다. 
    ORA-01577 로그 화일 %s는 이미 데이타베이스의 일부입니다 등록이 불가능합니다. 
    ORA-01578 ORACLE 데이타 블록이 파손되었습니다 (화일 번호 %s, 블록 번호 %s) 
    ORA-01579 복구중 기록(write) 오류가 발생했습니다. 
    ORA-01580 제어 화일의 백업 화일 %s 를 작성하는 중에 오류가 발생했습니다. 
    ORA-01581 이미 할당된 롤백 세그먼트(%s) 새로운 익스텐트(%s)를 사용하려 시도했습니다. 
    ORA-01582 백업을 하기위해 제어 화일을 열 수 없습니다. 
    ORA-01583 백업될 제어 화일의 블록 크기를 획득할 수 없습니다. 
    ORA-01584 백업될 제어 화일의 화일 크기를 획득할 수 없습니다. 
    ORA-01585 백업 화일 %s 를 인식할 수 없습니다. 
    ORA-01586 백업을 하기위한 수신 화일 %s을 열 수 없습니다. 
    ORA-01587 제어 화일의 백업 화일 복제중 오류가 발생했습니다. 
    ORA-01588 데이타베이스를 열기 위해서는 RESETLOGS 옵션을 사용해야 합니다. 
    ORA-01589 데이타베이스를 열기 위해서는 RESETLOGS/NORESETLOGS 옵션을 사용해야 함 
    ORA-01590 가용 세그멘트 수(%s)가 최대치인 %s 를 초과합니다. 
    ORA-01591 잠금이 in-doubt 분산 트랜잭션 %s에 주어졌습니다. 
    ORA-01592 버전 6의 롤백 세그먼트(%s)를 Oracle7 포맷으로 변환시 오류 발생 
    ORA-01593 롤백 세그먼트의 최적크기(%s 블록)가 초기크기 계산(%s 블록)보다 작습니다. 
    ORA-01594 해제될 롤백 세그먼트(%s) 익스텐트(%s)를 연결하려함 
    ORA-01595 익스텐스(%s)(롤백 세그먼트 (%s)의) 해제시 오류 
    ORA-01596 %s 파라미터에 시스템을 지정할 수 없습니다. 
    ORA-01597 시스템 롤백 세그먼트를 온라인 혹은 오프라인시킬 수 없습니다. 
    ORA-01598 롤백 세그먼트 %s가 온라인이 아닙니다. 
    ORA-01599 롤백 세그먼트(%s)를 획득하는데 실패, 캐쉬 영역이 꽉찼습니다현재(%s)엔트리를 가짐) 
    ORA-01600 많아야 하나의 %s (gc_files_to_locks의 %s절에) 
    ORA-01601 gc_files_to_locks의 %s절에 부당한 버켓(bucket) 크기 
    ORA-01602 gc_files_to_locks에 예정된 것보다 gc_db_locks에 더 많은 잠금임 
    ORA-01603 gc_files_to_locks의 %s절에 부당한 그룹크기 
    ORA-01604 gc_files_to_locks의 %s절에 부당한 화일 번호 범위 
    ORA-01605 gc_files_to_locks의 %s절에 화일 번호 누락 
    ORA-01606 gc_files_to_lock가 마운트한 다른 인스턴스의 그것과 동일하지 않습니다. 
    ORA-01607 gc_lck_procs (%s)가 다른 인스턴스 (%s)와 같지 않습니다. 
    ORA-01608 롤백 세그먼트 %s를 온라인화할 수 없음. 상태는 (%s) 
    ORA-01609 로그 %s는 쓰레드 %s에 대한 현 로그 - 멤버를 삭제할 수 없습니다. 
    ORA-01610 BACKUP CONTROLFILE 옵션을 이용해서 복구가 끝나야만 합니다. 
    ORA-01611 쓰레드번호 %s는 부적절함 - %s보다 커서는 안됩니다. 
    ORA-01612 쓰레드 %s는 이미 가용되었습니다. 
    ORA-01613 쓰레드 %s는 %s 로그만을 가짐 - 가용화를 위해서는 최소 2개의 로그를 필요로 함 
    ORA-01614 쓰레드 %s는 사용중임 - 사용가능하게할 수 없습니다. 
    ORA-01615 쓰레드 %s는 마운트됨 - 사용불가하게할 수 없습니다. 
    ORA-01616 쓰레드 %s는 열려 있음 - 사용불가하게할 수 없습니다. 
    ORA-01617 마운트할 수 없음: %s는 정당한 쓰레드 번호가 아님 
    ORA-01618 쓰레드 %s는 사용가능하지 않았음 - 마운트할 수 없습니다. 
    ORA-01619 쓰레드 %s는 다른 인스턴스에 의해 마운트했습니다. 
    ORA-01620 마운트에 필요한 공용 쓰레드가 없습니다. 
    ORA-01621 데이타베이스가 열려 있으면 현 로그의 멤버를 개명할 수 없습니다. 
    ORA-01622 쓰레드 번호가 지정되어야함 - 디폴트는 없습니다. 
    ORA-01623 로그 %s는 쓰레드 %s에 대한 현 로그임 - 삭제할 수 없습니다. 
    ORA-01624 로그 %s가 쓰레드 %s 복구시 필요합니다. 
    ORA-01625 롤백 세그먼트 %s는 이 인스턴스에 속해있지 않습니다. 
    ORA-01626 롤백 세그먼트 번호 %s는 더 이상의 트랜잭션을 처리할 수 없습니다. 
    ORA-01627 롤백 세그먼트 번호 %s는 온라인이 아닙니다. 
    ORA-01628 롤백 세그먼트 %s에 대한 최대 익스텐스 수 (%s)에 도달했습니다. 
    ORA-01629 테이블 영역 %s에 대한 실행취소의 저장시 최대 익스텐트 수(%s)에 도달했음 
    ORA-01630 테이블 영역 %s의 임시 세그먼트에 최대 익스텐트 수(%s)가 되었습니다. 
    ORA-01631 최대 익스텐트 수(%s)에 도달 (테이블 %s.%s) 
    ORA-01632 최대 익스텐트 수(%s)에 도달 (색인 %s.%s) 
    ORA-01633 이 조작에는 병렬 서버 옵션이 필요합니다. 
    ORA-01634 롤백 세그먼트 번호 %s가 오프라인 되려합니다. 
    ORA-01635 지정된 롤백 세그먼트 번호 %s가 가용하지 않습니다. 
    ORA-01636 롤백 세그먼트 %s가 이미 온라인 상태입니다. 
    ORA-01637 롤백 세그먼트 %s가 다른 인스턴스(수 %s)에 의해 사용됩니다. 
    ORA-01638 %s 파라미터는 ORACLE 버전 %s에서 병렬 마운트를 허용하지 않습니다. 
    ORA-01639 데이타베이스는 잠금 프로세스 없이 병렬로 마운트할 수 없습니다. 
    ORA-01640 활성 트랙잰션으로 테이블 공간을 읽기 전용으로 만들수 없습니다. 
    ORA-01641 테이블스페이스 %s은 온라인이 아닙니다 - 데이타 화일을 추가할 수 없습니다. 
    ORA-01642 읽기 전용 %s 테이블 공간에 초기 백업이 필요하지 않습니다. 
    ORA-01643 시스템 테이블 공간를 읽기 전용으로 만들 수 없습니다. 
    ORA-01644 %s 테이블 공간은 이미 읽기 전용입니다. 
    ORA-01645 읽기 쓰기를 하기위해서 이전에 시도한것이 반만 완성되었습니다. 
    ORA-01646 %s 테이블 공간은 읽기 전용입니다- 읽기 쓰기를 할 수 없습니다. 
    ORA-01647 %s 테이블 공간은 읽기 전용이어서, 거기에 공간을 할당할 수 없습니다. 
    ORA-01648 로그 %s는 사용불가인 쓰레드 %s의 현재 로그입니다. 
    ORA-01649 백업 컨트롤 화일에 대한 작업이 허용되지 않습니다. 
    ORA-01650 롤백 세그먼트 %s를 %s에 의해 %s 테이블 공간에서 확장할 수 없습니다. 
    ORA-01651 %s로 테이블 공간 %s에 저장 취소 세그먼트를 확장할 수 없습니다. 
    ORA-01652 %s로 테이블 공간 %s에서 임시 세그먼트를 확장할 수 없습니다. 
    ORA-01653 테이블 %s.%s를 %s에 의해 %s 테이블 공간에서 확장할 수 없습니다. 
    ORA-01654 색인 %s.%s를 %s에 의해 %s 테이블 공간에서 확장할 수 없습니다. 
    ORA-01655 크러스터 %s.%s를 %s에 의해 %s 테이블 공간에서 확장할 수 없습니다. 
    ORA-01656 최대 번호 확장 (%s)가 %s.%s 크러스터에 도달했습니다. 
    ORA-01657 부적당한 SHRINK 옵션 값 
    ORA-01658 테이블스페이스 %s에 세그먼트에 대한 INITIAL 익스텐트를 작성할 수 없습니다. 
    ORA-01659 테이블스페이스 %s에 %s이상의 MINEXTENTS를 할당할 수 없습니다. 
    ORA-01660 테이블스페이스 %s 은 이미 영구적인 것입니다. 
    ORA-01661 테이블스페이스 %s 은 이미 임시적인 것입니다. 
    ORA-01662 테이블스페이스 %s 은 비어 있지 않아 임시로 만들 수가 없습니다. 
    ORA-01663 테이블스페이스 %s 의 내용은 항상 변경합니다. 
    ORA-01664 정렬 세그먼트로 확장된 트랜잭션은 중지 되었습니다. 
    ORA-01665 제어화일은 대기 제어화일이 아닙니다. 
    ORA-01666 제어화일은 대기 제어화일을 위한 것입니다. 
    ORA-01667 리두 로그는 대기 데이터베이스와 상반됩니다. 
    ORA-01668 데이터 화일의 오프라인을 위해서 대기 데이터베이스가 DROP 옵션을 요구합니다. 
    ORA-01669 대기 데이터베이스 제어화일은 데이터화일과 일치하지 않습니다. 
    ORA-01670 대기 데이터베이스 복구에 새로운 데이터화일 %s 가 필요합니다. 
    ORA-01671 제어화일은 백업합니다, 대기 제어화일을 만들 수 없습니다. 
    ORA-01672 제어화일에 화일이 빠졌거나 하나 더 가지고 있습니다. 
    ORA-01673 데이터 화일 %s 은 식별된것이 아닙니다. 
    ORA-01674 데이터 화일 %s 은 현재 화일 대신 오래된 것을 가지고 있습니다. 
    ORA-01676 대기 화일 이름은 %s의 변환을 하는데 최대 %s의 길이를 초과했습니다. 
    ORA-01677 대기 화일 이름이 파라미터 변환을 다른 인스턴스와 다르게 했습니다. 
    ORA-01678 파라미터 %s 은 패턴과 교체로 된 두가지 스트링을 가지고 있어야 합니다. 
    ORA-01679 데이터베이스는 EXCLUSIVE로 마운트 되어야 하고 열려 있지 않아야 합니다. 
    ORA-01680 만약 gc_files_to_locks이 사용하고 있으면 gc_db_locks가 영일 수 없습니다. 
    ORA-01700 리스트 내의 사용자명이 중복되었습니다. 
    ORA-01701 클러스터가 부적합합니다. 
    ORA-01702 뷰는 부적합합니다. 
    ORA-01703 키워드 SYNONYM이 없습니다. 
    ORA-01704 스트링이 너무 깁니다. 
    ORA-01705 상관 열에는 외부 결합을 지정할 수 없습니다. 
    ORA-01706 사용자 함수의 결과가 너무 큽니다. 
    ORA-01707 키워드 LIST가 없습니다. 
    ORA-01708 ACCESS 또는 SESSION을 지정해 주십시오 
    ORA-01709 프로그램이 존재하지 않습니다. 
    ORA-01710 키워드 OF가 없습니다. 
    ORA-01711 중복된 권한이 리스트되어 있습니다. 
    ORA-01712 자신이 소유하지 않은 권한을 허가할 수 없습니다. 
    ORA-01713 그 권한에 대해서는 GRANT OPTION 이 존재하지 않습니다. 
    ORA-01714 사용자 함수의 실행중 오류가 발생했습니다. 
    ORA-01715 클러스터 색인에는 UNIQUE를 사용할 수 없습니다. 
    ORA-01716 클러스터 색인에는 NOSORT를 사용할 수 없습니다. 
    ORA-01717 secta : 액세스 모드 토큰이 부적합합니다. 
    ORA-01718 BY ACCESS | SESSION절은 NOAUDIT에 대해서는 허용되지 않습니다. 
    ORA-01719 외부 결합 운영 (+)는 OR 또는 IN의 연산수를 허용하지 않습니다. 
    ORA-01720 %s에 대한 허가(grant) 옵션은 존재하지 않습니다. 
    ORA-01721 트랜잭션에서 USERENV(COMMITSCN)을 2회 이상 불렀습니다. 
    ORA-01722 수치가 부적합합니다. 
    ORA-01723 길이가 0인 열은 지정할 수 없습니다. 
    ORA-01724 부동 소숫점 수치의 정도를 벗어났습니다 (1 to 126) 
    ORA-01725 USERENV(COMMITSCN)는 여기에서 허용되지 않습니다. 
    ORA-01726 테이블의 지정이 부적합합니다. 
    ORA-01727 수치의 정도 범위(38 자리 이내)를 초과했습니다. 
    ORA-01728 수치의 스케일 범위(-84 에서 127)를 초과했습니다. 
    ORA-01729 데이타베이스 링크명을 지정해 주십시오 
    ORA-01730 지정한 열명의 수가 부적합합니다. 
    ORA-01731 뷰 정의가 부적합(순환)합니다. 
    ORA-01732 뷰에 대한 데이타 조작이 부적합합니다. 
    ORA-01733 가상 열은 사용할 수 없습니다. 
    ORA-01734 잘못된 파라미터 - EXTENT MIN 값이 EXTENT MAX 보다 큽니다. 
    ORA-01735 부적합한 ALTER TABLE 옵션입니다. 
    ORA-01736 [NOT] SUCCESSFUL 을 지정해 주십시오. 
    ORA-01737 공유, 배타 모드에서만 테이블을 잠금할 수 있습니다. 
    ORA-01738 키워드 IN 을 지정해 주십시오 
    ORA-01739 키워드 MODE 를 지정해 주십시오 
    ORA-01740 이중 인용부를 지정해 주십시오 
    ORA-01741 길이가 0인 식별자는 부적합합니다. 
    ORA-01742 주석이 정확하게 종료되지 않았습니다. 
    ORA-01743 내부적 불일치 : 사용자 함수 색인이 부적합합니다. 
    ORA-01744 INTO구의 지정이 부적합합니다. 
    ORA-01745 호스트/바인드 변수명이 부적합합니다. 
    ORA-01746 인디케이터 변수는 사용할 수 없습니다. 
    ORA-01747 열명을 올바르게 지정해 주십시오. 
    ORA-01748 열명 그 자체만 사용할 수 있습니다. 
    ORA-01749 자신의 권한으로는 GRANT/REVOKE 할 수 없습니다. 
    ORA-01750 UPDATE/REFERENCE 는 열에 의해서가 아닌 테이블 전체로부터 REVOKE 될 수 있습니다. 
    ORA-01751 부적당한 덤프 취소 옵션입니다. 
    ORA-01752 뷰으로 부터 정확하게 하나의 키-보전된 테이블 없이 삭제할 수 없습니다. 
    ORA-01753 열 정의가 클러스터 열의 정의와 일치하지 않습니다. 
    ORA-01754 LONG 유형의 열은 테이블에 1 개만 포함될 수 있습니다. 
    ORA-01755 영역 수나 블록 수를 지정해야만 합니다. 
    ORA-01756 단일 인용부를 지정해 주십시오 
    ORA-01757 개체 수를 지정해야 합니다. 
    ORA-01758 NOT NULL 열을 추가하기 위해서는 테이블이 비어 있어야 합니다. 
    ORA-01759 사용자 함수가 올바르게 정의되지 않았습니다. 
    ORA-01760 함수의 인수가 부적합합니다. 
    ORA-01761 결합문는 유일 테이블에 DML 작업으로 맵 할 수 없습니다. 
    ORA-01762 vopdrv: 뷰의 질의 블록이 FROM 구에 없습니다. 
    ORA-01763 갱신 또는 삭제가 외부 결합 테이블을 포함하고 있습니다. 
    ORA-01764 결합의 새로운 갱신 값은 유일한것을 보증할 수 없습니다. 
    ORA-01765 테이블의 소유자명을 지정할 수 없습니다. 
    ORA-01766 데이타 사전 개체명을 사용할 수 없습니다. 
    ORA-01767 UPDATE ... SET 식은 부속 질의이어야 합니다. 
    ORA-01768 수치 열이 너무 깁니다. 
    ORA-01769 CLUSTER 옵션 지정이 중복되었습니다. 
    ORA-01770 CLUSTER 옵션은 사용할 수 없습니다. 
    ORA-01771 클러스터 테이블에 대한 옵션이 부적합합니다. 
    ORA-01772 LEVEL에 대한 값을 지정해야 합니다. 
    ORA-01773 지정한 CREATE TABLE 문에는 열 데이타 유형을 지정할 수 없습니다. 
    ORA-01774 한번 이상 덤프 취소 옵션이 지정되었습니다. 
    ORA-01775 동의어가 순환 고리 유형으로 정의되어 있습니다. 
    ORA-01776 결합 뷰에 의하여 하나 이상의 기본 테이블을 수정할 수 없습니다. 
    ORA-01777 WITH GRANT 옵션은 사용할 수 없습니다. 
    ORA-01778 부속 질의의 내포 레벨의 제한을 초과했습니다. 
    ORA-01779 키-보존된것이 아닌 테이블로 맵한 열을 수정할 수 없습니다. 
    ORA-01780 스트링 상수가 필요합니다. 
    ORA-01781 UNRECOVERABLE은 AS SELECT와 함께 지정해야 합니다. 
    ORA-01782 클러스터 또는 클러스터 테이블에 대해서는 UNRECOVERABLE을 지정할 수 없습니다. 
    ORA-01783 RECOVERABLE 또는 UNRECOVERABLE 중 하나만을 지정할 수 있습니다. 
    ORA-01784 데이타베이스 미디어 복구가 사용불가이면 RECOVERABLE을 지정할 수 없습니다. 
    ORA-01785 ORDER BY 항목은 SELECT 리스트 식의 수라야 합니다. 
    ORA-01786 FOR UPDATE 구는 사용할 수 없습니다. 
    ORA-01787 질의 블록당 1개의 구만 허용됩니다. 
    ORA-01788 CONNECT BY 구를 지정해 주십시오. 
    ORA-01789 질의의 결과 열의 수가 틀립니다. 
    ORA-01790 대응하는 식과 같은 데이타 유형이어야 합니다. 
    ORA-01791 SELECT 식이 부적합합니다. 
    ORA-01792 테이블, 뷰에 지정 가능한 열의 최대수는 254 입니다. 
    ORA-01793 지정 가능한 색인 열의 최대수는 16 입니다. 
    ORA-01794 지정 가능한 클러스터 열의 최대수는 16 입니다. 
    ORA-01795 리스트에 지정 가능한 식의 최대수는 254 입니다. 
    ORA-01796 연산자의 지정이 부적합합니다. 
    ORA-01797 연산자의 뒤에 ANY 또는 ALL을 지정해 주십시오. 
    ORA-01798 EXCEPTION 키워드가 누락되었습니다. 
    ORA-01799 열은 부속 질의에 외부결합될 수 없습니다. 
    ORA-01800 날짜 형식 내의 리터럴이 너무 길어서 처리할 수 없습니다. 
    ORA-01801 날짜 형식이 내부 버퍼에 비해 너무 깁니다. 
    ORA-01802 율리우스일의 지정이 범위를 초과했습니다. 
    ORA-01803 날짜/시각의 획득 실패 
    ORA-01810 형식 코드가 2 번 나타났습니다. 
    ORA-01811 율리우스일에서 년간 통산일의 사용은 금지되어 있습니다. 
    ORA-01812 년은 1 번만 지정할 수 있습니다. 
    ORA-01813 시간은 1 번만 지정할 수 있습니다. 
    ORA-01814 AM/PM 과 A.M./P.M.은 혼재할 수 없습니다. 
    ORA-01815 BC/AD 와 B.C./A.D.는 혼재할 수 없습니다. 
    ORA-01816 월은 1 번만 지정할 수 있습니다. 
    ORA-01817 요일은 1 번만 지정할 수 있습니다. 
    ORA-01818 HH24와 AM/PM은 혼재할 수 없습니다. 
    ORA-01819 부호가 붙은 년과 BC/AD는 혼재할 수 없습니다. 
    ORA-01820 날짜 지정에 포함된 형식 코드가 부적합합니다. 
    ORA-01821 날짜 형식이 부적합합니다. 
    ORA-01830 날짜 형식의 지정에 불필요한 데이타가 포함되어 있습니다. 
    ORA-01831 년과 율리우스일은 혼재할 수 없습니다. 
    ORA-01832 년의 일과 율리우스일은 혼재할 수 없습니다. 
    ORA-01833 월과 율리우스일은 혼재할 수 없습니다. 
    ORA-01834 월의 일과 율리우스일은 혼재할 수 없습니다. 
    ORA-01835 요일과 율리우스일은 혼재할 수 없습니다. 
    ORA-01836 시와 일의 초는 혼재할 수 없습니다. 
    ORA-01837 시의 분과 일의 초는 혼재할 수 없습니다. 
    ORA-01838 분의 초와 일의 초는 혼재할 수 없습니다. 
    ORA-01839 지정된 월에 대한 날짜가 부적합합니다. 
    ORA-01840 입력된 값의 길이가 날짜 형식에 비해 부족합니다. 
    ORA-01841 년은 -4713 과 +4713 사이의 값으로 지정해 주십시오. 
    ORA-01842 분기는 1 부터 4 사이의 값을 지정해 주십시오. 
    ORA-01843 지정한 월이 부적합합니다. 
    ORA-01844 주를 올바르게 지정해 주십시오 ( 1 에서 52 사이 ) 
    ORA-01845 주를 올바르게 지정해 주십시오 ( 1 에서 5 사이 ) 
    ORA-01846 지정한 요일이 부적합합니다. 
    ORA-01847 날짜를 올바르게 지정해 주십시오 ( 1 에서 말일까지 ) 
    ORA-01848 날짜를 올바르게 지정해 주십시오 ( 1 에서 365 사이 ) 
    ORA-01849 시간을 올바르게 지정해 주십시오 ( 1 에서 12 사이 ) 
    ORA-01850 시간을 올바르게 지정해 주십시오 ( 0 에서 23 사이 ) 
    ORA-01851 분을 올바르게 지정해 주십시오 ( 0 에서 59 사이 ) 
    ORA-01852 초를 올바르게 지정해 주십시오 ( 0 에서 59 사이 ) 
    ORA-01853 초를 올바르게 지정해 주십시오 ( 0 에서 86399 사이 ) 
    ORA-01854 율리우스 날짜는 1에서 5373484 사이여야 합니다. 
    ORA-01855 AM/A.M. 또는 PM/P.M.이 필요합니다. 
    ORA-01856 BC/B.C. 또는 AD/A.D.이 필요합니다. 
    ORA-01857 시간대가 부적합합니다. 
    ORA-01858 수치를 지정해야할 곳에 비수치 문자가 지정되었습니다. 
    ORA-01859 문자를 지정해야할 곳에 비문자가 지정되었습니다. 
    ORA-01860 년의 주는 1 에서 53 사이이어야 합니다. 
    ORA-01861 스트링이 형식 스트링에 맞지 않습니다. 
    ORA-01862 이 형식의 항목에 대한 잘못된 자리수 
    ORA-01898 Precision 지정자가 너무 많습니다. 
    ORA-01899 잘못된 Precision 지정자입니다. 
    ORA-01900 키워드 LOGFILE을 지정해 주십시오 
    ORA-01901 키워드 ROLLBACK을 지정해 주십시오 
    ORA-01902 키워드 SEGMENT를 지정해 주십시오 
    ORA-01903 키워드 EVENTS를 지정해 주십시오 
    ORA-01904 키워드 DATAFILE을 지정해 주십시오 
    ORA-01905 키워드 STORAGE를 지정해 주십시오 
    ORA-01906 키워드 BACKUP을 지정해 주십시오 
    ORA-01907 키워드 TABLESPACE를 지정해 주십시오 
    ORA-01908 키워드 EXISTS를 지정해 주십시오 
    ORA-01909 키워드 REUSE를 지정해 주십시오 
    ORA-01910 키워드 TABLES을 지정해 주십시오 
    ORA-01911 키워드 CONTENTS를 지정해 주십시오 
    ORA-01912 키워드 ROW를 지정해 주십시오 
    ORA-01913 키워드 EXCLUSIVE를 지정해 주십시오 
    ORA-01914 시퀀스 번호에 대한 감사 옵션이 부적합합니다. 
    ORA-01915 뷰에 대한 감사 옵션이 부적합합니다. 
    ORA-01916 키워드 ONLINE, OFFLINE, RESIZE, AUTOEXTEND 또는 END를 지정하십시오 
    ORA-01917 사용자 또는 롤 %s가 존재하지 않습니다. 
    ORA-01918 사용자 %s가 존재하지 않습니다. 
    ORA-01919 롤 %s가 존재하지 않습니다. 
    ORA-01920 사용자명 %s가 다른 사용자나 롤명과 상충됩니다. 
    ORA-01921 롤명 %s가 다른 사용자나 롤명과 상충됩니다. 
    ORA-01922 %s를 삭제하려면 CASCADE를 지정하여야 합니다. 
    ORA-01923 개체가 다른 사용자에 의해서 잠금 되어 CASCADE가 비정상 종료되었습니다. 
    ORA-01924 롤 %s가 허가되지 않았거나 존재하지 않습니다. 
    ORA-01925 가용 롤의 최대치 %s를 초과했습니다. 
    ORA-01926 WITH GRANT OPTION으로 롤을 GRANT할 수 없습니다. 
    ORA-01927 허가하지 않은 권한을 REVOKE할 수 없습니다. 
    ORA-01928 모든 권한에 대하여 GRANT 옵션이 허가되지는 않았습니다. 
    ORA-01929 GRANT할 권한이 없습니다. 
    ORA-01931 %s를 롤에게 허가할 수 없습니다. 
    ORA-01932 롤 %s에 대한 ADMIN 옵션이 허가되지 않았습니다. 
    ORA-01933 롤에 대한 권한으로 저장 개체를 생성할 수 없습니다. 
    ORA-01934 순환되는 롤 권한 부여가 감지되었습니다. 
    ORA-01935 누락된 사용자 혹은 롤명 
    ORA-01936 사용자나 롤을 생성시 소유자를 지정할 수 없습니다. 
    ORA-01937 부적절한 롤명 
    ORA-01938 CREATE USER에 대한 IDENTIFIED BY가 지정되어야 합니다. 
    ORA-01939 ADMIN OPTION만이 지정될 수 있습니다. 
    ORA-01940 현재 연결되어 있는 사용자를 삭제할 수 없습니다. 
    ORA-01941 키워드 SEQUENCE가 요구됩니다. 
    ORA-01942 IDENTIFIED BY 와 EXTERNALLY는 모두 지정될 수 없습니다. 
    ORA-01943 IDENTIFIED BY가 이미 지정되었습니다. 
    ORA-01944 IDENTIFIED EXTERNALLY가 이미 지정되었습니다. 
    ORA-01945 DEFAULT ROLE[S]가 이미 지정되었습니다. 
    ORA-01946 DEFAULT TABLESPACE가 이미 지정되었습니다. 
    ORA-01947 TEMPORARY TABLESPACE가 이미 지정되었습니다. 
    ORA-01949 ROLE 키워드가 요구합니다. 
    ORA-01950 테이블 영역 %s에 대한 권한이 없읍 
    ORA-01951 ROLE %s가 %s에 허가되지 않았습니다. 
    ORA-01952 시스템 권한이 %s에 허가되지 않았습니다. 
    ORA-01953 명령어가 더 이상 유효하지 않음,ALTER USER를 보내십시오 
    ORA-01954 CREATE USER에 DEFAULT ROLE절이 유효하지 않습니다. 
    ORA-01955 DEFAULT ROLE %s가 사용자에게 허가되지 않았습니다. 
    ORA-01956 OS_ROLES이 사용될시 부적절한 명령어 
    ORA-01957 키워드 MIN 혹은 MAX 를 지정해 주십시오 
    ORA-01958 LAYER 옵션을 위한 정수가 필요합니다. 
    ORA-01959 OPCODE 옵션을 위한 정수가 필요합니다. 
    ORA-01960 부적절한 덤프 로그 화일 옵션입니다. 
    ORA-01961 부적절한 덤프 옵션입니다. 
    ORA-01962 화일 번호 혹은 시퀀스 번호를 지정해야 합니다. 
    ORA-01963 블록 번호를 지정해야 합니다. 
    ORA-01964 TIME 옵션을 위한 시간을 지정해야 합니다. 
    ORA-01965 PERIOD 를 지정해야 합니다. 
    ORA-01967 CREATE CONTROLFILE 의 부적절한 옵션입니다. 
    ORA-01968 RESETLOGS 혹은 NORESETLOGS 를 한번만 지정하십시오 
    ORA-01969 RESETLOGS 혹은 NORESETLOGS 를 지정해야 합니다. 
    ORA-01970 CREATE CONTROLFILE에 대한 데이타베이스 명을 지정해야 합니다. 
    ORA-01971 부적절한 ALTER TRACING 옵션 
    ORA-01972 ALTER TRACING ENABLE 혹은 DISABLE에 대한 스트링을 지정해야 합니다. 
    ORA-01973 변경 번호 누락 
    ORA-01974 부적절한 아카이브옵션 
    ORA-01975 변환 번호 %s에 부적절한 문자 
    ORA-01976 변경 번호 누락 
    ORA-01977 쓰레드 번호 누락 
    ORA-01978 시퀀스 번호 누락 
    ORA-01979 롤 %s에 대한 암호가 틀리거나 누락되었습니다. 
    ORA-01980 OS ROLE 초기화시 오류 
    ORA-01981 현 권한취소를 수행하려면 CASCADE CONSTRAINTS가 지정되어야 합니다. 
    ORA-01982 테이블에 대한 부적절한 감사 옵션 
    ORA-01983 DEFAULT에 대한 부적절한 감사 옵션 
    ORA-01984 프로시저/패캐지/함수에 대한 부적절한 감사 옵션 
    ORA-01985 LICENSE_MAX_USERS 파라미터가 초과되어 사용자를 생성할 수 없습니다. 
    ORA-01986 OPTIMIZER_GOAL에 대한 옵션 부적합 
    ORA-01987 클라이언트 OS 사용자명이 너무 깁니다. 
    ORA-01988 원격 OS 로그온이 허용되지 않습니다. 
    ORA-01989 롤 %s는 운영 시스템에 의해 권한되지 않았습니다. 
    ORA-01990 암호 %s 화일을 여는데 오류가 발생했습니다. 
    ORA-01991 %s 암호 화일이 부적합합니다. 
    ORA-01992 %s 암호 화일을 닫는데 오류가 발생했습니다. 
    ORA-01993 %s 암호 화일을 쓰는 중에 오류가 발생했습니다. 
    ORA-01994 GRANT 실패: 공용 암호 화일에다 사용자를 추가할 수 없습니다. 
    ORA-01995 %s 암호 화일을 읽는 중에 오류가 발생했습니다. 
    ORA-01996 GRANT 실패: %s 암호 화일이 꽉 찼습니다. 
    ORA-01997 GRANT 실패: %s 사용자는 여기에 없습니다. 
    ORA-01998 REVOKE 실패: SYS 사용자는 항상 SYSOPER 와 SYSDBA를 가지고 있습니다. 
    ORA-01999 암호 화일 모드는 %s 에서 %s로 바꾸었습니다. 
    ORA-02000 누락된 %s 키워드 
    ORA-02001 사용자 SYS는 빈리스트 그룹와 함께 색인을 생성하는것을 허락하지 않습니다. 
    ORA-02002 감사 추적 테이블에 기록 중 오류가 발생했습니다. 
    ORA-02003 USERENV 파라미터가 부적합합니다. 
    ORA-02004 보안 위반 
    ORA-02005 길이(-1)가 부적합합니다. 
    ORA-02006 팩형 10진 형식 스트링이 부적합합니다. 
    ORA-02007 ALLOCATE 또는 DEALLOCATE 옵션을 REBUILD와 같이 사용할 수 없습니다. 
    ORA-02008 숫자가 아닌 열에 대하여 0 이외의 스케일이 지정되었습니다. 
    ORA-02009 화일에 지정된 크기는 0이 아니어야 합니다. 
    ORA-02010 호스트 연결 스트링을 지정해 주십시오 
    ORA-02011 데이타베이스 링크명이 중복되었습니다. 
    ORA-02012 키워드 USING 을 지정해 주십시오 
    ORA-02013 키워드 CONNECT 를 지정해 주십시오 
    ORA-02014 FOR UPDATE 구를 사용해서 선택할 수 없습니다. 
    ORA-02015 원격 테이블에 대하여 FOR UPDATE 구는 사용할 수 없습니다. 
    ORA-02016 원격 데이타베이스에서는 START WITH 로 부속 질의를 사용할 수 없습니다. 
    ORA-02017 정수 값을 지정해 주십시오 
    ORA-02018 같은 이름의 데이타베이스 링크가 개방, 연결되어 있습니다. 
    ORA-02019 원격 데이타베이스를 찾을 수 없을때 기술적으로 연결하십시오 
    ORA-02020 너무 많은 데이타베이스 링크들이 사용되고 있습니다. 
    ORA-02021 원격 데이타베이스에 DDL 조작들이 허용되지 않습니다. 
    ORA-02022 원격 문장이 원격 개체를 갖는 최적화 되지않을 뷰를 사용합니다. 
    ORA-02023 원격 데이타베이스는 START WITH, CONNECT BY 술어를 평가할 수 없습니다. 
    ORA-02024 데이타 링크를 찾을 수 없습니다. 
    ORA-02025 SQL 문장에 있는 모든 테이블은 원격 데이타베이스에 있어야만 합니다. 
    ORA-02026 키워드 LINK 를 지정해 주십시오 
    ORA-02027 LONG 열은 복수 행의 갱신이 불가능합니다. 
    ORA-02028 정확한 행의 번호를 인출 하는것이 지원되지 않습니다. 
    ORA-02029 키워드 FILE 을 지정해 주십시오 
    ORA-02030 고정 테이블/고정 뷰에서는 선택만 가능합니다. 
    ORA-02031 고정 테이블에 대하여 ROWID 를 지정할 수 없습니다. 
    ORA-02032 클러스터 색인의 작성 이전에 클러스터 테이블을 사용할 수 없습니다. 
    ORA-02033 이미 클러스터 색인이 존재하고 있습니다. 
    ORA-02034 스피드 바인드가 허용되지 않습니다. 
    ORA-02035 부당한 작업묶음의 조합입니다. 
    ORA-02036 자동커서 개방시 묘사할 변수가 너무 많습니다. 
    ORA-02037 초기화되지 않은 스피드 바인드 영역 
    ORA-02038 배열 유형에 정의가 허용되지 않습니다 
    ORA-02039 배열 유형에 값으로 바인드는 허용되지 않습니다 
    ORA-02040 원격 데이타베이스는 %s는 두단계 커밋을 지원하지 않습니다. 
    ORA-02041 클라이언트 데이타베이스는 트랜잭션을 시작하지 않습니다. 
    ORA-02042 너무 많은 분산 트랜잭션들 
    ORA-02043 %s를 실행하기 전에 현재 트랜잭션을 끝내야 합니다. 
    ORA-02044 트랜잭션 관리자 로그인이 거부되었음: 트랜잭션이 진행중입니다. 
    ORA-02045 글로벌 트랜잭션에 관여한 로컬 세션이 너무 많습니다. 
    ORA-02046 분산 트랜잭션이 이미 시작되었습니다. 
    ORA-02047 진행 중에 분산 트랜잭션을 결합할 수 없습니다. 
    ORA-02048 로그잉하지 않고 분산 트랜잭션을 시작하려 했습니다. 
    ORA-02049 시간초과: 분산 트랜잭션이 잠금으로 대기중 입니다. 
    ORA-02050 트랜잭션 %s가 롤백되고, 다른 원격 DB는 불명료한 상태입니다. 
    ORA-02051 동일 트랜잭션내에 다른 세션이 실패했습다. 
    ORA-02052 원격 트랜잭션이 %s에서 실패했습니다. 
    ORA-02053 트랜잭션 %s가 커밋되고, 다른 원격 DB는 불명료한 상태입니다. 
    ORA-02054 트랜잭션 %s이 불명료한 상태입니다. 
    ORA-02055 분산 수정 작업이 실패했음; 롤백이 요구됩니다. 
    ORA-02056 2PC: %s: 잘못된 두 단계 명령어 번호 %s(%s로 부터의) 
    ORA-02057 2PC: %s: 잘못된 두 단계 복구상태 번호 %s(%s로 부터의) 
    ORA-02058 ID %s를 가지는 준비된 트랜잭션이 없습니다. 
    ORA-02059 커밋 코맨트의 ORA-2PC-CRASH-TEST-%s 
    ORA-02060 select for update문에 분산 테이블에 대한 결합이 지정되었습니다. 
    ORA-02061 select for update에 분산 테이블 목록이 지정되었습니다. 
    ORA-02062 분산 복구가 DBID %s를 받았습니다(%s가 기대되었으나) 
    ORA-02063 %s%s가 선행됨 (%s%s로 부터) 
    ORA-02064 분산 작업이 지원되지 않습니다. 
    ORA-02065 ALTER SYSTEM에 대한 부당한 옵션 
    ORA-02066 누락 혹은 부당한 MTS_DISPATCHERS 텍스트 
    ORA-02067 트랜잭션 혹은 세이브포인트 롤백이 요구됩니다. 
    ORA-02068 %s%s로 부터의 다음의 치명적인 오류가 있습니다. 
    ORA-02069 global_names 파라미터는 이 작업에 TRUE라고 설정해야만 합니다. 
    ORA-02070 데이타베이스 %s%s는 이문맥에서 %s를 지원하지 않습니다. 
    ORA-02071 원격 데이타베이스 %s에 대한 능력을 초기화시 오류 
    ORA-02072 분산 데이타베이스의 네트워크 프로토콜이서로 맞지 않습니다. 
    ORA-02073 원격 수정에서는 시퀀스번호가 지원되지 않습니다. 
    ORA-02074 분산 트랜잭션에 %s을 할 수 없습니다. 
    ORA-02075 사용되지 않는 오류입니다. 
    ORA-02076 수정된 테이블이나 long 열의 시퀀스가 동일한 노드에 있어야 합니다. 
    ORA-02077 SELECT문에서 long 열의 값을 가지고 올때는 동일한 노드에 있어야 합니다. 
    ORA-02078 ALTER SYSTEM FIXED_DATE에 대한 지정이 잘못됐습니다. 
    ORA-02079 새로운 세션이 분산 트랜잭션의 커밋에 동참할 수 있습니다. 
    ORA-02080 데이타베이스 링크가 사용중입니다. 
    ORA-02081 데이타베이스 링크가 열려있지 않았습니다. 
    ORA-02082 루프백(loopback) 데이타베이스 링크는 연결 수식어를 가져야합니다. 
    ORA-02083 데이타베이스명에 부적절한 문자 %s가 있습니다. 
    ORA-02084 데이타베이스명에 요소가 누락되었습니다. 
    ORA-02085 데이타베이스 링크 %s가 %s에 연결됩니다. 
    ORA-02086 데이타베이스 (링크)명이 너무깁니다. 
    ORA-02087 동일 트랜잭션내의 다른 프로세스에 의해 개체가 잠금 되었습니다. 
    ORA-02088 분산 데이타베이스 옵션이 설치되지 않았습니다. 
    ORA-02089 종속 세션에서는 COMMIT이 허용되지 않습니다. 
    ORA-02090 네트워크 오류: callback+passthru 
    ORA-02091 트랜잭션이 롤백되었습니다. 
    ORA-02092 분산 트랜잭션에 대한 트랜잭션 테이블 슬롯이 부족합니다. 
    ORA-02093 TRANSACTIONS_PER_ROLLBACK_SEGMENT(%s)가 가능한 최대치(%s) 보다 많습니다. 
    ORA-02094 중복 옵션이 설치되지 않았습니다. 
    ORA-02095 지정된 초기화 파라미터를 수정할 수 없습니다. 
    ORA-02096 지정된 초기화 파라미터는 이 옵션으로 수정가능하지 않습니다. 
    ORA-02098 색인-테이블 참조 (:I)를 파싱하는데 오류 
    ORA-02099 내부 목적으로 사용됨, 출력되지 않아야 합니다. 
    ORA-02100 PCC: 메모리 부족 (할당할 수 없습니다. 
    ORA-02101 PCC: 일치하지 않는 커서 캐쉬(uce/cuc 불일치) 
    ORA-02102 PCC: 일치하지 않는 커서 캐쉬(이 uce에 대한 cuc 엔트리가 없습니다. 
    ORA-02103 PCC: 일치하지 않는 커서 캐쉬(cuc 참조가 범위를 벗어남) 
    ORA-02104 PCC: 일치하지 않는 호스트 캐쉬(사용가능한 cuc가 없습니다) 
    ORA-02105 PCC: 일치하지 않는 커서 캐쉬(캐쉬내에 cuc 엔트리가 없습니다) 
    ORA-02106 PCC: 일치하지 않는 커서 캐쉬(OraCursor nr이 잘못됐습니다) 
    ORA-02107 PCC: 프로그램이 수행시 라이브러리에 대해 너무 오래됨: 다시 PCC하십시오 
    ORA-02108 PCC: 수행시 라이브러리에 유효하지않은 디스크립터가 넘겨졌습니다. 
    ORA-02109 PCC: 일치하지 않는 호스트 캐쉬(sit 참조가 범위를 벗어남) 
    ORA-02110 PCC: 일치하지 않는 호스트 캐쉬(유효하지 않은 sqi 유형) 
    ORA-02111 PCC: 힙 일관성 오류 
    ORA-02112 PCC: SELECT..INTO가 너무 많은 행을 리턴합니다. 
    ORA-02140 테이블스페이스 이름이 부적합합니다. 
    ORA-02141 OFFLINE 옵션이 부적합합니다. 
    ORA-02142 적절한 ALTER TABLESPACE 옵션을 지정해 주십시오 
    ORA-02143 STORAGE 옵션이 부적합합니다. 
    ORA-02144 적절한 ALTER CLUSTER 옵션을 지정해 주십시오 
    ORA-02145 STORAGE 옵션을 지정해 주십시오 
    ORA-02146 SHARED 옵션이 복수 회 지정되었습니다. 
    ORA-02147 SHARED 와 EXCLUSIVE 는 혼용할 수 없습니다. 
    ORA-02148 EXCLUSIVE 옵션이 복수 회 지정되었습니다. 
    ORA-02155 DEFAULT 테이블 영역 식별자가 부적합합니다. 
    ORA-02156 TEMPORARY의 테이블 영역 식별자가 부적합합니다. 
    ORA-02157 ALTER USER 옵션을 지정해 주십시오 
    ORA-02158 CREATE INDEX 옵션이 부적합합니다. 
    ORA-02159 설치된 DLM은 릴리즈가능한 잠금 모드를 지원하지 않습니다. 
    ORA-02161 MAXLOGFILES에 대한 값이 부적합합니다. 
    ORA-02162 MAXDATAFILES에 대한 값이 부적합합니다. 
    ORA-02163 FREELIST GROUPS에 대한 값이 부적합합니다. 
    ORA-02164 DATAFILE 구가 2개 이상 지정되었습니다. 
    ORA-02165 CREATE DATABASE 옵션의 지정이 부적합합니다. 
    ORA-02166 ARCHIVELOG 와 NOARCHIVELOG 가 함께 지정되었습니다. 
    ORA-02167 LOGFILE 구가 2 회 이상 지정되었습니다. 
    ORA-02168 FREELISTS에 대한 부당한 값 
    ORA-02169 FREELISTS 저장영역 옵션은 허용되지 않습니다. 
    ORA-02170 FREELIST GROUPS 저장영역 옵션은 허용되지 않습니다. 
    ORA-02171 MAXLOGHISTORY에 대한 부당한 값 
    ORA-02172 사용불가 쓰레드에 대한 PUBLIC 키워드는 적합하지 않습니다. 
    ORA-02173 DROP TABLESPACE 옵션이 부적합합니다. 
    ORA-02174 요구되는 쓰레드 번호의 누락 
    ORA-02175 롤백 세그먼트 명이 부적합합니다. 
    ORA-02176 CREATE ROLLBACK SEGMENT 옵션이 부적합합니다. 
    ORA-02177 요구되는 그룹 번호의 누락 
    ORA-02178 올바른 구문 : SET TRANSACTION READ { ONLY | WRITE } 
    ORA-02179 적당한 옵션: ISOLATION LEVEL { SERIALIZABLE | READ COMMITTED } 
    ORA-02180 CREATE TABLESPACE 옵션이 부적합합니다. 
    ORA-02181 ROLLBACK WORK 옵션이 부적합합니다. 
    ORA-02182 세이브포인트명을 지정해 주십시오 
    ORA-02183 적당한 옵션: ISOLATION_LEVEL { SERIALIZABLE | READ COMMITTED } 
    ORA-02184 REVOKE 에서는 자원의 할당량을 지정할 수 없습니다. 
    ORA-02185 COMMIT 뒤에 WORK 이외의 토큰이 지정되었습니다. 
    ORA-02186 테이블 영역의 자원 권한은 다른 권한과 동시에 지정할 수 없습니다. 
    ORA-02187 할당량의 지정이 부적합합니다. 
    ORA-02189 ON 가 필요합니다. 
    ORA-02190 키워드 TABLES를 지정해 주십시오 
    ORA-02191 올바른 구문: SET TRANSACTION USE ROLLBACK SEGMENT 
    ORA-02192 PCTINCREASE는 롤백 세그먼트 영역절에서는 허용되지 않습니다. 
    ORA-02194 이벤트 지정 구문 오류 %s (중요치 않은 오류 %s), %s 부근에 
    ORA-02195 %s 개체를 %s 테이블스페이스에서 만들도록 시도합니다. 
    ORA-02196 PERMANENT/TEMPORARY 옵션이 이미 지정되었습니다. 
    ORA-02197 화일 리스트가 이미 지정되어 있습니다. 
    ORA-02198 ONLINE/OFFLINE 옵션이 이미 지정되어 있습니다. 
    ORA-02199 DATAFILE 구를 지정해 주십시오 
    ORA-02200 WITH GRANT OPTION 은 PUBLIC 에 대하여 사용할 수 없습니다. 
    ORA-02201 시퀀스를 사용할 수 없습니다. 
    ORA-02202 클러스터에서는 더이상의 테이블을 작성할 수 없습니다. 
    ORA-02203 INITIAL 영역 옵션은 허가되지 않습니다. 
    ORA-02204 ALTER, INDEX, REFERENCES 그리고 EXECUTE는 뷰에서 사용할 수 없습니다. 
    ORA-02205 SELECT 와 ALTER 권한만이 시퀀스에 대하여 사용할 수 있습니다. 
    ORA-02206 INITRANS 옵션 지정이 중복되었습니다. 
    ORA-02207 INITRANS 옵션의 값이 부적합합니다. 
    ORA-02208 MAXTRANS 옵션 지정이 중복되었습니다. 
    ORA-02209 MAXTRANS 옵션의 값이 부적합합니다. 
    ORA-02210 ALTER TABLE 옵션을 지정해 주십시오 
    ORA-02211 PCTFREE 또는 PCTUSED 에 대한 값이 부적합합니다. 
    ORA-02212 PCTFREE 옵션 지정이 중복되었습니다. 
    ORA-02213 PCTUSED 옵션 지정이 중복되었습니다. 
    ORA-02214 BACKUP 옵션 지정이 중복되었습니다. 
    ORA-02215 TABLESPACE 구가 중복되었습니다. 
    ORA-02216 테이블 영역명을 지정해 주십시오 
    ORA-02217 기억 영역(storage) 옵션 지정이 중복되었습니다. 
    ORA-02218 INITIAL 옵션의 값이 부적합합니다. 
    ORA-02219 NEXT 옵션의 값이 부적합합니다. 
    ORA-02220 MINEXTENTS 옵션의 값이 부적합합니다. 
    ORA-02221 MAXEXTENTS 옵션의 값이 부적합합니다. 
    ORA-02222 PCTINCREASE 옵션의 값이 부적합합니다. 
    ORA-02223 부당한 OPTIMAL 저장 영역 옵션값 
    ORA-02224 EXECUTE 권한은 테이블에 대해서는 허용되지 않습니다. 
    ORA-02225 프로시저에 대해서는 EXECUTE 권한만이 유효합니다. 
    ORA-02226 부당한 MAXEXTENTS값 (허용 최대치: %s) 
    ORA-02227 클러스터명이 부적합합니다. 
    ORA-02228 SIZE 지정이 중복되었습니다. 
    ORA-02229 SIZE 옵션의 값이 부적합합니다. 
    ORA-02230 ALTER CLUSTER 옵션이 부적합합니다. 
    ORA-02231 적절한 ALTER DATABASE 옵션을 지정해 주십시오 
    ORA-02232 MOUNT 모드가 부적합합니다. 
    ORA-02233 CLOSE 모드가 부적합합니다. 
    ORA-02234 이 테이블에 대한 변경은 이미 로그되어 있습니다. 
    ORA-02235 이 테이블은 다른 테이블에 이미 변경을 기록했습니다. 
    ORA-02236 화일명이 부적합합니다. 
    ORA-02237 화일 크기가 부적합합니다. 
    ORA-02238 화일명 리스트의 화일 수가 다릅니다. 
    ORA-02239 이 시퀀스를 참조하는 개체가 있습니다. 
    ORA-02240 OBJNO 혹은 TABNO에 대한 부당한 값 
    ORA-02241 EXTENTS (FILE BLOCK SIZE , ...)유형이어야 합니다. 
    ORA-02242 ALTER INDEX 옵션을 지정해 주십시오 
    ORA-02243 ALTER INDEX 또는 ALTER SNAPSHOT 옵션이 부적합합니다. 
    ORA-02244 ALTER ROLLBACK SEGMENT 옵션이 부적합합니다. 
    ORA-02245 롤백 세그먼트 명이 부적합합니다. 
    ORA-02246 EVENTS 의 텍스트를 지정해 주십시오 
    ORA-02247 ALTER SESSION 옵션을 지정해 주십시오 
    ORA-02248 ALTER SESSION 옵션이 부적합합니다. 
    ORA-02249 MAXLOGMEMBERS에 값이 빠졌거나 부당한 값입니다. 
    ORA-02250 적절한 제약명을 지정해 주십시오 
    ORA-02251 부속 질의는 사용할 수 없습니다. 
    ORA-02252 검사 제약 조건이 올바르지 않습니다. 
    ORA-02253 제약을 지정할 수 없습니다. 
    ORA-02254 DEFAULT 은 사용할 수 없습니다. 
    ORA-02255 못쓰게된 7.1.5 
    ORA-02256 참조하고 있는 열의 숫자, 유형 그리고 크기는 참조 열의 수와 일치해야 합니다. 
    ORA-02257 열의 최대수를 초과했습니다. 
    ORA-02258 NULL, NOT NULL 지정이 중복 또는 혼재되었습니다. 
    ORA-02259 UNIQUE/PRIMARY KEY의 지정이 중복되었습니다. 
    ORA-02260 테이블에는 기본 키를 1 개만 포함시킬 수 있습니다. 
    ORA-02261 유일 키 또는 기본 키가 이미 존재하고 있습니다. 
    ORA-02262 ORA-%05d 발생. 열의 디폴트 값 식의 유형 검사 오류. 
    ORA-02263 열의 데이타 유형을 지정해 주십시오 
    ORA-02264 기존의 제약에 사용된 이름입니다. 
    ORA-02265 참조 열의 데이타 유형이 정의되지 않았습니다. 
    ORA-02266 외래 키에 의해 참조되는 유일/기본 키가 테이블에 있습니다. 
    ORA-02267 열의 데이타 유형이 참조 열의 데이타 유형와 일치하지 않습니다. 
    ORA-02268 참조 테이블에 기본 키가 없습니다. 
    ORA-02269 키 열은 LONG 데이타 유형을 취할 수 없습니다. 
    ORA-02270 이 열목록에 대한 유일 혹은 일차 키가 일치하지 않습니다. 
    ORA-02271 제약명이 없습니다. 
    ORA-02272 제약 열은 LONG 데이타 유형을 취할 수 없습니다. 
    ORA-02273 유일/기본 키가 외부 키에 의해 참조되었습니다. 
    ORA-02274 중복된 참조 제약 지정입니다. 
    ORA-02275 참조 제약이 이미 테이블에 존재합니다. 
    ORA-02276 디폴트 유형이 열의 유형과 일치하지 않습니다. 
    ORA-02277 시퀀스명이 부적합합니다. 
    ORA-02278 MAXVALUE/NOMAXVALUE 지정이 중복 또는 혼재되어 있습니다. 
    ORA-02279 MINVALUE/NOMINVALUE 지정이 중복 또는 혼재되어 있습니다. 
    ORA-02280 CYCLE/NOCYCLE 지정이 중복 또는 혼재되어 있습니다. 
    ORA-02281 CACHE/NOCACHE 지정이 중복 또는 혼재되어 있습니다. 
    ORA-02282 ORDER/NOORDER 지정이 중복 또는 혼재되어 있습니다. 
    ORA-02283 개시 시퀀스 번호는 변경할 수 없습니다. 
    ORA-02284 INCREMENT BY 지정이 중복되었습니다. 
    ORA-02285 START WITH 지정이 중복되었습니다. 
    ORA-02286 ALTER SEQUENCE 옵션을 지정해 주십시오 
    ORA-02287 시퀀스 번호는 이 위치에 사용할 수 없습니다. 
    ORA-02288 OPEN 모드가 부적합합니다. 
    ORA-02289 시퀀스가 존재하지 않습니다. 
    ORA-02290 체크 제약조건(%s.%s)이 위배되었습니다. 
    ORA-02291 무결성 제약조건(%s.%s)이 위배되었습니다- 부모 키가 없습니다. 
    ORA-02292 무결성 제약조건(%s.%s)이 위배되었습니다- 자식 레코드가 발견되었습니다. 
    ORA-02293 (%s.%s)를 사용가능하게 할 수 없습니다 - 잘못된 제약을 점검 
    ORA-02294 참조 제약을 추가할 수 없음 - 부모 키가 없습니다. 
    ORA-02295 제약에 대한 하나 이상의 사용가능/사용불가 절이 있습니다. 
    ORA-02296 제약 (%s.%s)을 사용가능하게 할 수 없음 - 부합하는 값이 없습니다. 
    ORA-02297 제약 (%s.%s)을 사용불가하게 할 수 없음 - 종속관계가 있습니다. 
    ORA-02298 제약 (%s.%s)을 사용가능하게 할 수 없음 - 부모 키가 없습니다. 
    ORA-02299 제약 (%s.%s)을 사용가능하게 할 수 없음 - 중복 키가 있습니다. 
    ORA-02351 레코드 %s: 거부되었습니다- 테이블 %s, 열 %s에서 오류 
    ORA-02352 직접 패스 연결은 동기종 간에만 가능합니다. 
    ORA-02353 복수 자리의 문자 오류 
    ORA-02354 필드 %s에 대한 초기치를 위한 변환 오류가 발생했습니다. 
    ORA-02355 CONSTANT 필드 %s에 변환 오류가 발생했습니다. 
    ORA-02356 데이타베이스에 더 이상 영역이 없음 - 로드를 계속할 수 없습니다. 
    ORA-02357 팩형 십진수 변환 오류 
    ORA-02358 존 십진수 변환 오류 
    ORA-02359 데이타 화일의 필드가 지정된 길이를 초과합니다. 
    ORA-02360 논리 레코드의 끝 이전에 열을 찾을 수 없습니다 (TRAILING NULLCOLS사용) 
    ORA-02361 최초 인클로징 문자를 찾을 수 없습니다. 
    ORA-02362 논리 레코드의 끝 - 두번째 인클로징 문자가 없습니다. 
    ORA-02363 TERMINATED 와 ENCLOSED 가 지정된 필드에 종료 문자가 없습니다. 
    ORA-02364 %s 레코드가 디스카드됨 - 모든 when 구의 조건을 만족하지 않습니다. 
    ORA-02365 %s 색인이 로드되지 못함 
    ORA-02366 %s 테이블의 다음 색인이 처리되었습니다. 
    ORA-02367 %s 색인이 로드되었습니다. 
    ORA-02368 %s 레코드가 디스카드됨 - 모든 열이 널입니다. 
    ORA-02369 경고 : 가변길이 필드가 잘렸습니다. 
    ORA-02370 %s 레코드 - %s 테이블의 %s 열에 경고 발생 
    ORA-02371 직접 패스를 위해서는 로더가 %s.%s.%s.%s.%s 버전 이상 이어야 합니다. 
    ORA-02372 상대시작 위치 > 절대필드 마감 위치 
    ORA-02373 테이블 %s에 대한 입력 문의 구문분석시 오류 
    ORA-02374 읽기 버퍼 큐에 대한 더 이상의 슬롯이 없습니다. 
    ORA-02376 부당한 혹은 중복된 자원 
    ORA-02377 자원의 부당한 한계치 
    ORA-02378 중복된 자원명 %s 
    ORA-02379 프로화일 %s이 이미 존재합니다. 
    ORA-02380 프로화일 %s이 존재하지 않습니다. 
    ORA-02381 PUBLIC_DEFAULT 프로화일을 삭제할 수 없습니다. 
    ORA-02382 프로화일 %s에 사용자가 할당되어 있어, CASCADE 없이 삭제할 수 없습니다. 
    ORA-02383 부당한 비용요소 
    ORA-02390 COMPOSITE_LIMIT을 초과했음, 로그오프될 것입니다. 
    ORA-02391 동시 SESSIONS_PER_USER 한계치를 초과했습니다. 
    ORA-02392 CPU 사용에 대한 세션 한계치를 초과했음. 로그오프될 것입니다. 
    ORA-02393 CPU 사용에 대한 호출 한계치를 초과했습니다. 
    ORA-02394 IO 사용에 대한 세션 한계치를 초과했음. 로그오프될 것입니다. 
    ORA-02395 IO 사용에 대한 호출 한계치를 초과했습니다. 
    ORA-02396 최대 유휴(idle) 시간을 초과했음. 다시 연결하십시오 
    ORA-02397 PRIVATE_SGA 한계치 초과, 로그오프될 것입니다. 
    ORA-02398 프로시저 영역 사용을 초과했습니다. 
    ORA-02399 최대 연결시간을 초과했음. 로그오프될 것입니다. 
    ORA-02401 다른 사용자의 뷰를 EXPLAIN 할 수 없습니다. 
    ORA-02402 PLAN_TABLE이 없습니다. 
    ORA-02403 플랜 테이블이 정확한 유형이 아닙니다. 
    ORA-02404 지정된 플랜 테이블이 없습니다. 
    ORA-02420 스키마에 대한 권한부여 절의 누락 
    ORA-02421 누락 혹은 부당한 스키마 권한 식별자 
    ORA-02422 누락 혹은 부당한 스키마 요소 
    ORA-02423 스키마명이 스키마 권한 식별자와 맞지 않습니다. 
    ORA-02424 잠재적인 순환 뷰 참조 혹은 불명의 참조 테이블 
    ORA-02425 테이블의 생성실패 
    ORA-02426 권한 부여 실패 
    ORA-02427 뷰의 생성실패 
    ORA-02428 외래키 참조를 추가할 수 없습니다. 
    ORA-02429 유일/일차 키 적용을 위한 색인을 삭제할 수 없습니다. 
    ORA-02430 제약(%s)을 가용화할 수 없음 - 그런 제약이 없습니다. 
    ORA-02431 제약(%s)을 사용불가하게 할 수 없음 - 그런 제약이 없습니다. 
    ORA-02432 일차키를 사용가능하게 할 수 없음 - 테이블에 일차키가 정의되지 않았습니다. 
    ORA-02433 일차키를 사용불가하게 수 없음 - 테이블에 일차키가 정의되지 않았습니다. 
    ORA-02434 유일성(%s)을 사용가능하게 할 수 없음 - 테이블에 일차키가 정의되지 않았습니다. 
    ORA-02435 유일성(%s)을 사용불가하게 수 없음 - 테이블에 일차키가 정의되지 않았습니다. 
    ORA-02436 CHECK 제약에 날짜 또는 시스템 변수가 잘못 지정되었습니다. 
    ORA-02437 (%s.%s)를 사용가능하게 할 수 없습니다 - 잘못된 기본 키입니다. 
    ORA-02438 열 검사제약은 다른 열을 참조할 수 없습니다. 
    ORA-02439 유일/일차 키 제약상에 유일하지 않은 색인이 있습니다. 
    ORA-02440 참조 제약과 함께 create as select는 허용되지 않습니다. 
    ORA-02441 존재하지 않는 일차 키를 삭제할 수 없습니다. 
    ORA-02442 존재하지 않는 유일 키를 삭제할 수 없습니다. 
    ORA-02443 존재하지 않는 제약 - 삭제할 수 없습니다. 
    ORA-02444 참조 제약에서만 기본 테이블을 참조할 수 없습니다. 
    ORA-02445 예외 테이블이 없습니다. 
    ORA-02446 CREATE TABLE ... AS SELECT 실패 - 제약 위반 점검 
    ORA-02450 부당한 해쉬 옵션 - 키워드 IS 누락 
    ORA-02451 HASHKEYS의 중복지정 
    ORA-02452 부당한 HASHKEYS 옵션값 
    ORA-02453 HASH IS의 중복 지정 
    ORA-02454 블록(%s)당 해쉬 키의 수가 최대치 %s를 초과했습니다. 
    ORA-02455 클러스터키 열의 수는 1 이어야 합니다. 
    ORA-02456 열 지정 HASH IS는 NUMBER(*,0)이어야 합니다. 
    ORA-02457 HASH IS 옵션에 정당한 열을 지정하여야 합니다. 
    ORA-02458 HASH CLUSTER에 대하여 HASHKEYS가 지정되어야 합니다. 
    ORA-02459 해쉬 키 값은 양의 정수이어야 합니다. 
    ORA-02460 해쉬 클러스터에 대한 부적절한 색인 작업입니다. 
    ORA-02461 INDEX 옵션의 부적절한 사용입니다. 
    ORA-02462 INDEX 옵션의 중복지정 
    ORA-02463 HASH IS 옵션의 중복지정 
    ORA-02464 클러스터 정의는 HASH와 INDEX 양쪽 다 일수는 없습니다. 
    ORA-02465 HASH IS 옵션의 부적절한 사용 
    ORA-02466 HASH CLUSTERS를 위해 SIZE 옵션의 변경은 허용되지 않습니다. 
    ORA-02467 식에 참조된 열을 클러스터 정의에서 찾을 수 없습니다. 
    ORA-02468 식에서 상수 또는 시스템 변수가 잘못 지정되었습니다. 
    ORA-02469 해쉬 식은 Oracle 번호를 리턴하지 않습니다. 
    ORA-02470 TO_DATE, USERENV, 또는 SYSDATE가 해쉬 식에서 잘못 사용되었습니다. 
    ORA-02471 SYSDATE, UID, USER, ROWNUM, 또는 LEVEL이 해쉬 식에서 잘못 사용되었습니다. 
    ORA-02472 해쉬 식에 PL/SQL 함수를 사용할 수 없습니다. 
    ORA-02473 클러스터 해쉬 식의 값을 구하는 동안 오류 발생 
    ORA-02474 고정된 해쉬 영역이 (%s) 범위를 사용했는데 허용된 (%s) 최대값을 초과했습니다. 
    ORA-02476 테이블에서 병렬 직접 로드에 의해 색인을 만들수 없습니다. 
    ORA-02477 개체 %s에 병렬 직접 로드를 실행할 수 없습니다. 
    ORA-02478 기초 세그먼트에 합병하는것은 MAXEXTENTS 한계을 초과하는 것입니다. 
    ORA-02479 병렬 로드에다 화일명을 바꾸는 중에 오류가 발생했습니다. 
    ORA-02480 이벤트에 대한 너무 많은 이벤트 클래스가 지정되었습니다. 
    ORA-02481 이벤트에 대한 너무 많은 id 범위가 지정되었습니다. 
    ORA-02482 이벤트 클래스를 지정했으나 이벤트를 주지 않았습니다. 
    ORA-02483 이벤트에 대한 부당한 ID 값을 지정했습니다. 
    ORA-02485 ID 값의 하한치가 상한치보다 큽니다. 
    ORA-02486 화일 %s에서 오류. init.ora 파라미터인 trace_dest를 확인하십시오 
    ORA-02487 화일명 %s을 기록시 오류. init.ora 파라미터인 trace_dest를 검사하십시오 
    ORA-02489 trace_block_size (%s)가 %s로 나누어져야 합니다. 
    ORA-02490 RESIZE 절에 필요한 화일 크기가 빠졌습니다. 
    ORA-02491 AUTOEXTEND 절에 필요한 ON 또는 OFF 키워드가 빠졌습니다. 
    ORA-02492 NEXT 절에 필요한 화일 블록 증가 크기가 빠졌습니다. 
    ORA-02493 NEXT 절의 화일 증가 크기가 부적당합니다. 
    ORA-02494 MAXSIZE 절의 최대 화일 크기가 부적당하거나 빠졌습니다. 
    ORA-02495 화일 %s의 크기를 조정할 수 없는데, 테이블스페이스 %s가 읽기전용이기 때문입니다. 
    ORA-02700 osnoraenv: ORACLE_SID의 변환시 오류입니다. 
    ORA-02701 osnoraenv: 오라클 이미지명의 변환시 오류입니다. 
    ORA-02702 osnoraenv: orapop 이미지명의 변환시 오류입니다. 
    ORA-02703 osnpopipe: 파이프 생성에 실패했습니다. 
    ORA-02704 osndopop: 포크에 실패했습니다. 
    ORA-02705 osnpol: 통신 채널의 폴링에 실패했습니다. 
    ORA-02706 osnshs: 호스트명이 너무 깁니다. 
    ORA-02707 osnacx: 문맥 영역을 할당할 수 없습니다. 
    ORA-02708 osnrntab: 호스트로의 연결에 실패, ORACLE_SID가 불명입니다. 
    ORA-02709 osnpop: 파이프 생성에 실패했습니다. 
    ORA-02710 osnpop: 포크(fork)에 실패했습니다. 
    ORA-02711 osnpvalid: 검증 채널로의 연결에 실패했습니다. 
    ORA-02712 osnpop: malloc 실패 
    ORA-02713 osnprd: 메세지 수신에 실패했습니다. 
    ORA-02714 osnpwr: 메세지 송신에 실패했습니다. 
    ORA-02715 osnpgetbrkmsg: 호스트로부터의 메시지가 부정확한 메시지 유형을 갖습니다. 
    ORA-02716 osnpgetdatmsg: 호스트로부터의 메시지가 부정확한 메시지 유형을 갖습니다. 
    ORA-02717 osnpfs: 기록된 바이트 수가 잘못되었습니다. 
    ORA-02718 osnprs: 프로토콜 재설정 오류 
    ORA-02719 osnfop: 포크(fork)에 실패했습니다. 
    ORA-02720 osnfop: shmat 실패 
    ORA-02721 osnseminit: 세마포 세트를 생성할 수 없습니다. 
    ORA-02722 osnpui: orapop에 중지메시지를 송신할 수 없습니다. 
    ORA-02723 osnpui: 중지메시지를 송신할 수 없습니다. 
    ORA-02724 osnpbr: orapop에 중지메시지를 송신할 수 없습니다. 
    ORA-02725 osnpbr: 중지메시지를 송신할 수 없습니다. 
    ORA-02726 osnpop: 오라클 수행모듈의 액세스 오류입니다. 
    ORA-02727 osnpop: orapop 수행모듈의 액세스 오류입니다. 
    ORA-02728 osnfop: 오라클 수행모듈의 액세스 오류입니다. 
    ORA-02729 osncon: 드라이버가 osntab내에 없습니다. 
    ORA-02730 osnrnf: 사용자 로그온 디렉토리가 없습니다. 
    ORA-02731 osnrnf: 버퍼의 malloc에 실패했습니다. 
    ORA-02732 osnrnf: 일치하는 데이타베이스 별명을 발견할 수 없습니다. 
    ORA-02733 osnsnf: 데이테베이스 스트링이 너무 깁니다. 
    ORA-02734 osnftt: 공유 메모리의 사용허가를 재설정할 수 없습니다. 
    ORA-02735 osnfpm: 공유 메모리 세그먼트를 생성할 수 없습니다. 
    ORA-02736 osnfpm: 부적절한 공유메모리 번지의 디폴트치입니다. 
    ORA-02737 osnpcl: orapop의 종료를 명령할 수 없습니다. 
    ORA-02738 osnpwrtbrkmsg: 기록된 바이트 수가 잘못되었습니다. 
    ORA-02739 osncon: 호스트 별명이 너무 깁니다. 
    ORA-02750 osnfsmmap: 공유메모리 화일(?/dbs/ftt_.dbf)을 열 수 없습니다. 
    ORA-02751 osnfsmmap: 공유메모리 화일을 배치할 수 없습니다. 
    ORA-02752 osnfsmmap: 부당한 공유메모리 번지입니다. 
    ORA-02753 osnfsmmap: 공유메모리 화일을 닫을 수 없습니다. 
    ORA-02754 osnfsmmap: 공유메모리의 형질을 변경할 수 없습니다. 
    ORA-02755 osnfsmcre: 공유메모리 화일(?/dbs/ftt_.dbf)을 생성할 수 없습니다. 
    ORA-02756 osnfsmnam: 이름 변환에 실패했습니다. 
    ORA-02757 osnfop: fork_and_bind 실패 
    ORA-02758 내부배열의 할당에 실패했습니다. 
    ORA-02759 요구 디스크립터가 충분하지 않습니다. 
    ORA-02760 클라이언트의 화일 닫기 실패 
    ORA-02761 취소될 화일 번호가 음수입니다. 
    ORA-02762 취소될 화일 번호가 최대치보다 큽니다. 
    ORA-02763 최소 한건의 요구도 취소할 수 없습니다. 
    ORA-02764 부당한 패키지 모드입니다. 
    ORA-02765 부당한 최대 서버수입니다. 
    ORA-02766 요구 디스크립터의 부당한 최대치입니다. 
    ORA-02767 서버당 하나 이하의 요구 디스크립터가 할당되었습니다. 
    ORA-02768 최대 화일수가 부적절합니다. 
    ORA-02769 SIGTERM에 대한 처리기 지정이 실패했습니다. 
    ORA-02770 전체 블록수가 부적절합니다. 
    ORA-02771 요구 타임아웃 값이 부적절합니다. 
    ORA-02772 서버의 최대 유휴 시간이 부적절합니다. 
    ORA-02773 클라이언트의 최대 대기시간이 부적절합니다. 
    ORA-02774 요구 목록 래치의 타임아웃값이 부적절합니다. 
    ORA-02775 요구 수행 신호가 부적절합니다. 
    ORA-02776 요구 수행 신호값이 최대치를 초과합니다. 
    ORA-02777 로그 디렉토리에 대한 stat실패 
    ORA-02778 로그 디렉토리에 주어진 이름이 부적합합니다. 
    ORA-02779 코아덤프 디렉토리에 대한 stat실패 
    ORA-02780 코아덤프 디렉토리에 주어진 이름이 부적합합니다. 
    ORA-02781 시간이 주어지는 플래그에 대한 값이 부적합합니다. 
    ORA-02782 읽기/쓰기 기능이 모두 지정되지 않았습니다. 
    ORA-02783 포스트/대기 기능이 모두 지정되지 않았습니다. 
    ORA-02784 부적절한 공유 메모리 ID가 지정되었습니다. 
    ORA-02785 부적절한 공유 메모리 버퍼크기입니다. 
    ORA-02786 공유 영역에 필요한 크기가 세그먼트 크기보다 큽니다. 
    ORA-02787 세그먼트 목록에 대한 메모리를 할당할 수 없습니다. 
    ORA-02788 async 프로세스 배열내에 커널 프로세스 포인터를 찾을 수 없습니다. 
    ORA-02789 최대 화일 수에 도달했습니다. 
    ORA-02790 화일명이 너무 깁니다. 
    ORA-02791 비동기 I/O에 사용될 화일을 열 수 없습니다. 
    ORA-02792 비동기 I/O에 사용될 화일을 fstat()할 수 없습니다. 
    ORA-02793 비동기 I/O의 닫기 실패 
    ORA-02794 클라이언트가 공유메모리에 대한 키를 얻을 수 없습니다. 
    ORA-02795 요구 목록이 비었습니다. 
    ORA-02796 수행된 요구가 정확한 상태에 있지 않습니다. 
    ORA-02797 모든 요구에 응답할 수 없습니다. 
    ORA-02798 요구 수가 부적절합니다. 
    ORA-02799 신호 처리기를 대비할 수 없습니다. 
    ORA-02800 요구가 시간 경과되었습니다. 
    ORA-02801 작업이 시간 경과되었습니다. 
    ORA-02802 모든 유휴 서버를 병렬모드에서 사용할 수 없습니다. 
    ORA-02803 현재 시간의 추출에 실패했습니다. 
    ORA-02804 로그 화일명에 대한 메모리 할당에 실패했습니다. 
    ORA-02805 SIGTPA에 대한 처리기를 지정할 수 없습니다. 
    ORA-02806 SIGALRM에 대한 처리기를 지정할 수 없습니다. 
    ORA-02807 I/O 벡터에 대한 메모리 할당에 실패했습니다. 
    ORA-02808 서버가 사용하는 flag array를 위한 메모리 할당에 실패했습니다. 
    ORA-02809 Jump 버퍼가 적절하지 않습니다. 
    ORA-02810 메모리 맵화일에 대한 임시 화일명을 만들수 없습니다. 
    ORA-02811 공유메모리 세그먼트를 첨부할 수 없습니다. 
    ORA-02812 잘못된 첨부 번지입니다. 
    ORA-02813 키를 얻기위한 임시화일명을 만들수 없습니다. 
    ORA-02814 공유 메모리를 얻을 수 없습니다. 
    ORA-02815 공유 메모리를 첨부할 수 없습니다. 
    ORA-02816 프로세스를 죽일 수 없습니다. 
    ORA-02817 읽기실패 
    ORA-02818 요구된 것보다 적은 수의 블록이 읽혀졌습니다. 
    ORA-02819 쓰기실패 
    ORA-02820 요구된 수의 블록을 기록할 수 없습니다. 
    ORA-02821 요구된 수의 블록을 읽을 수 없습니다. 
    ORA-02822 부적절한 블록 오프셋 
    ORA-02823 버퍼가 정열되지 않았습니다. 
    ORA-02824 가용 요구 목록이 비었습니다. 
    ORA-02825 자유롭게 선택할 수 있는 목록에 대한 요구가 해제되지 않았습니다. 
    ORA-02826 부적절한 블록크기 입니다. 
    ORA-02827 부당한 화일번호입니다. 
    ORA-02828 가용 세그먼트 목록이 비었습니다. 
    ORA-02829 적절한 크기의 세그먼트가 없습니다. 
    ORA-02830 세그먼트는 파티션될 수 없음 - 가용 세그먼트가 없습니다. 
    ORA-02831 세그먼트 할당해제 실패 - 세그먼트 목록이 비었습니다. 
    ORA-02832 세그먼트 할당해제 실패 - 세그먼트가 목록에 없습니다. 
    ORA-02833 서버가 화일을 닫을 수 없습니다. 
    ORA-02834 서버가 화일을 열 수 없습니다. 
    ORA-02835 서버가 클라이언트에 신호을 송신할 수 없습니다. 
    ORA-02836 임시 키 화일을 생성할 수 없습니다. 
    ORA-02837 임시 화일을 링크 해제할 수 없습니다. 
    ORA-02838 알람 신호를 위한 신호처리기를 대비할 수 없습니다. 
    ORA-02839 디스크로 블록을 sync하는데 실패했습니다. 
    ORA-02840 클라이언트가 로그 화일을 여는데 실패했습니다. 
    ORA-02841 기동시 서버가 죽었습니다. 
    ORA-02842 클라이언트가 서버를 포크할 수 없습니다. 
    ORA-02843 커널 플래그에 대한 부적절한 값입니다. 
    ORA-02844 열기 허가 플래그에 대한 부적절한 값입니다. 
    ORA-02845 시각 요구 플래그에 대한 부적절한 값입니다. 
    ORA-02846 중지시킬 수 없는 서버입니다. 
    ORA-02847 포스트시 서버가 종료되지 않았습니다. 
    ORA-02848 비동기 I/O 패키지가 가동중이 아닙니다. 
    ORA-02849 오류로 인한 읽기 실패 
    ORA-02850 화일이 닫혔습니다. 
    ORA-02851 비어있지 않아야할 요구 목록이 비었습니다. 
    ORA-02852 위험 부분에 대한 부적절한 타임아웃 값입니다. 
    ORA-02853 서버 목록 래치 타임아웃 값이 부적절합니다. 
    ORA-02854 요구 버퍼의 수가 부적절합니다. 
    ORA-02855 요구건수가 slaves수 보다 작습니다. 
    ORA-03001 현재에는 구현되어 있지 않은 기능입니다. 
    ORA-03002 이 연산자는 구현되어 있지 않습니다. 
    ORA-03007 이 기능은 폐지되었습니다. 
    ORA-03008 파라미터 COMPATIBLE >= %s 가 %s에 필요합니다. 
    ORA-03100 통신 영역이 할당되지 않음. 메모리가 충분하지 않습니다. 
    ORA-03105 내부 프로토콜 오류 
    ORA-03106 두 태스크 간의 통신 프로토콜 오류입니다. 
    ORA-03107 oranet 버퍼 언더플로우입니다. 
    ORA-03108 oranet: ORACLE은 이 인터페이스 버전을 지원하지 않습니다. 
    ORA-03109 oranet 버퍼 오버플로우입니다. 
    ORA-03110 oranet: ORACLE은 이 SQL 버전을 지원하지 않습니다. 
    ORA-03111 통신 채널에서 브레이크를 수신했습니다. 
    ORA-03112 단일-태스크로 링크된 서버는 SQL*Net을 사용할 수 없습니다. 
    ORA-03113 통신 채널에 EOF 가 있습니다. 
    ORA-03114 ORACLE에 연결되어 있지 않습니다. 
    ORA-03115 지원되지 않은 네트워크 데이타 유형 또는 표현이 있습니다. 
    ORA-03116 부적당한 버퍼 길이가 변환 루틴으로 전달되었습니다. 
    ORA-03117 2-타스크 보존 영역 오버플로우 
    ORA-03118 2-타스크 코루틴의 상태가 부적당합니다. 
    ORA-03120 2-타스크 변환 루틴: 정수 오버플로우 
    ORA-03121 인터페이스 드라이버가 연결되어 있지 않습니다 함수는 실행되지 않습니다. 
    ORA-03122 사용자측에서 ORACLE측의 윈도우를 클로즈하려 했습니다. 
    ORA-03123 작업이 막힘 
    ORA-03124 2-타스크 내부 오류 
    ORA-03125 클라이언트-서버 프로토콜에 위배됩니다. 
    ORA-03126 네트워크 드라이버가 비-블로킹 작업을 지원하지 않습니다. 
    ORA-03127 실행 작업이 종료되기 전에는 새로운 작업을 할 수 없습니다. 
    ORA-03128 연결은 블로킹 모드입니다. 
    ORA-03129 다음 구분이 삽입되도록 요청했습니다. 
    ORA-03130 다음 구분이 인출 되도록 요청한 버퍼입니다. 
    ORA-03131 다음 구분을 위한 버퍼가 잘못 제공되었습니다. 
    ORA-03200 세그먼트 유형 명세가 부적당합니다. 
    ORA-03201 그룹 번호 명세가 부적당합니다. 
    ORA-03202 스캔 한계 명세가 부적당합니다. 
    ORA-03203 동시 갱신은 영역 분석을 불가능하게 합니다. 
    ORA-03230 세그먼트는 %s 블록만을 포함하고 있습니다. 
    ORA-03231 INITIAL 영역이 할당 해제되지 않았습니다. 
    ORA-03274 ALLOCATE EXTENT와 DEALLOCATE UNUSED 옵션들이 지정되었습니다. 
    ORA-03275 이중 DEALLOCATE 옵션으로 명세 
    ORA-03276 ALLOCATE EXTENT의 중복지정 
    ORA-03277 부적절한 SIZE의 지정 
    ORA-03278 ALLOCATE EXTENT 옵션의 중복지정 
    ORA-03279 부적절한 INSTANCE가 지정되었음 
    ORA-03280 부적절한 DATAFILE 화일명의 지정 
    ORA-03281 부적절한 ALLOCATE EXTENT 옵션 
    ORA-03282 ALLOCATE EXTENT 옵션의 누락 
    ORA-03283 지정된 데이타 화일 %s이 존재하지 않습니다. 
    ORA-03284 데이타 화일 %s는 테이블스페이스 %s의 멤버가 아닙니다. 
    ORA-03286 HASH CLUSTERS에 대해 ALLOCATE EXTENT가 정당하지 않습니다. 
    ORA-03287 부적절한 FREELIST GROUP의 지정 
    ORA-03288 FREELIST GROUP과 INSTANCE 파라미터가 함께 지정될 수 없습니다. 
    ORA-03290 부적절한 truncate 명령어 - CLUSTER 혹은 TABLE 키워드의 누락 
    ORA-03291 부적절한 truncate 옵션 - storage 키워드의 누락 
    ORA-03292 잘릴 테이블이 클러스터의 일부입니다. 
    ORA-03293 잘릴 클러스터는 HASH CLUSTER입니다. 
    ORA-03296 데이타화일의 크기를 조정할 수 없습니다 - 화일 %s 이 없습니다. 
    ORA-03297 요구된 RESIZE 값보다 큰 %s 데이타 블록이 화일에 포함되어 있습니다. 
    ORA-03298 데이타화일을 줄일 수 없습니다 - 화일 %s는 핫 백업중입니다. 
    ORA-03299 딕셔너리 테이블 %s을 생성할 수 없습니다. 
    ORA-04000 PCTUSED 와 PCTFREE 의 합이 100을 초과할 수 없습니다. 
    ORA-04001 시퀀스 파라미터 %s 는 정수라야 합니다. 
    ORA-04002 INCREMENT 는 0이 아닌 정수라야 합니다. 
    ORA-04003 시퀀스 파라미터 %s가 최대 크기 허용(%s 자리)를 초과했습니다. 
    ORA-04004 MINVALUE 는 MAXVALUE 보다 작아야 합니다. 
    ORA-04005 INCREMENT 는 ( MAXVALUE - MINVALUE ) 보다 작아야 합니다. 
    ORA-04006 START WITH 에 MINVALUE 보다 작은 값은 지정할 수 없습니다. 
    ORA-04007 MINVALUE 에 현재치보다 큰 값을 지정할 수 없습니다. 
    ORA-04008 START WITH 에 MAXVALUE 보다 큰 값을 지정할 수 없습니다. 
    ORA-04009 MAXVALUE 에 현재치보다 작은 값을 지정할 수 없습니다. 
    ORA-04010 CACHE 에는 1 보다 큰 수치를 지정해야 합니다. 
    ORA-04011 시퀀스 %s 은 %s 와 %s 범위 사이어야 합니다. 
    ORA-04012 지정된 개체는 시퀀스가 아닙니다. 
    ORA-04013 CACHE 에는 1 사이클보다 작은 값을 지정해야 합니다. 
    ORA-04014 CYCLE이 명시하는 MINVALUE가 내림차순 시퀀스입니다. 
    ORA-04015 CYCLE 을 실시하는 오름차순 시퀀스에는 MAXVALUE 를 지정해야 합니다. 
    ORA-04016 시퀀스 %s 은 더 이상 존재하지 않습니다. 
    ORA-04020 개체 %s%s%s%s%s의 잠금 시도중 데드록이 검출되었습니다. 
    ORA-04021 개체 %s%s%s%s%s의 잠금 대기중 시간이 초과됐습니다. 
    ORA-04028 개체 %s%s%s%s%s에 대한 diana를 생성할 수 없습니다. 
    ORA-04029 %s%s%s를 조회하는 중에 ORA-%s 오류가 발생했습니다. 
    ORA-04030 %s바이트 (%s,%s)의 할당 시도중 프로세스 메모리의 부족현상 발생 
    ORA-04031 %s 바이트의 공유 메모리를 할당할 수 없습니다 (%s,%s,%s) 
    ORA-04041 패키지 본체의 생성전에 패키지 지정이 먼저 생성되어야 합니다. 
    ORA-04042 프로시저,함수,패키지 혹은 패키지 본체가 존재하지 않습니다. 
    ORA-04043 개체 %s가 존재하지 않습니다. 
    ORA-04044 프로시저, 함수, 패키지는 이곳에서 허용되지 않습니다. 
    ORA-04045 %s.%s의 재 컴파일/재 검증시 오류 
    ORA-04046 컴파일 결과를 제공하기에는 너무 큽니다. 
    ORA-04050 부적절한 혹은 누락된 프로시저, 함수, 혹은 패키지명입니다. 
    ORA-04051 사용자 %s는 데이타베이스 링크 %s.%s를 사용할 수 없습니다. 
    ORA-04052 원격 개체 %s%s%s%s%s를 찾는 동안 오류발생 
    ORA-04053 원격 개체 %s%s%s%s%s의 검증시 오류발생 
    ORA-04054 데이타베이스 링크 %s가 존재하지 않습니다. 
    ORA-04060 %s를 수행하기 위한 권한이 부족합니다. 
    ORA-04061 %s의 기존상태가 무효화되었습니다. 
    ORA-04062 %s(%s의)이 변경되었습니다. 
    ORA-04063 %s가 오류를 가집니다. 
    ORA-04064 실행불가, %s가 무효화 되었습니다. 
    ORA-04065 실행불가, %s가 변경 혹은 삭제되었습니다. 
    ORA-04066 실행할수 없는 개체, %s 
    ORA-04067 실행불가, %s가 존재하지 않습니다. 
    ORA-04068 패키지%s%s%s의 기존 상태가 버려졌습니다. 
    ORA-04070 부적절한 트리거명 
    ORA-04071 BEFORE 혹은 AFTER 키워드의 누락 
    ORA-04072 부적절한 트리거유형 
    ORA-04073 이 트리거유형에 대해서 열 목록은 부당합니다. 
    ORA-04074 부적절한 REFERENCING명 
    ORA-04075 부적절한 트리거동작 
    ORA-04076 부적절한 NEW 혹은 OLD지정 
    ORA-04077 WHEN절은 레이블 레벨의 트리거와 사용될 수 없습니다. 
    ORA-04078 OLD와 NEW값이 같을 수 없습니다. 
    ORA-04079 부당한 트리거 지정 
    ORA-04080 트리거 %s가 존재하지 않습니다. 
    ORA-04081 트리거 %s가 이미 존재합나다. 
    ORA-04082 테이블 레벨 트리거에서 NEW 혹은 OLD 참조는 허용되지 않습니다. 
    ORA-04083 부적절한 트리거 변수 %s 
    ORA-04084 행 트리거후에 트리거의 NEW값을 변경할 수 없습니다. 
    ORA-04085 OLD 참조변수의 값을 변경할 수 없습니다. 
    ORA-04086 트리거 설명이 너무 깁니다 트리거 코드에 주석을 옮기십시오 
    ORA-04087 ROWID 참조 변수의 값을 변경할 수 없습니다. 
    ORA-04088 트리거 %s의 수행시 오류 
    ORA-04089 SYS 소유의 개체에 대한 트리거를 작성할 수 없습니다. 
    ORA-04090 %s는 동일 테이블, 이벤트 그리고 트리거 시간을 %s 로 지정하고 있습니다. 
    ORA-04091 테이블 %s.%s가 변화하고 있어서 트리거/함수가 이를 볼 수 없습니다. 
    ORA-04092 트리거 안에 %s를 할 수 없습니다. 
    ORA-04093 LONG유형 열 참조는 트리거에서 허용되지 않습니다. 
    ORA-04094 테이블 %s.%s은 부적합함, 트리거는 그것을 수정할 수 없습니다. 
    ORA-04095 트리거 %s가 다른 테이블에 이미 존재함, 치환할 수 없습니다. 
    ORA-04096 트리거 %s는 WHEN 절이 있은데 너무 큽니다 한계치가 2K. 
    ORA-04097 트리거 삭제 또는 수정을 시도시 DDL 대립이 생겼습니다. 
    ORA-04098 트리거 %s 은 부적당하고 재검증에 실패했습니다. 
    ORA-04099 트리거 %s 은 적당하지만 컴파일된 폼에 저장되지 않았습니다. 
    ORA-06000 NETASY: 포트 개방 실패 
    ORA-06001 NETASY: 포트 셋업 실패 
    ORA-06002 NETASY: 포트 읽기 실패 
    ORA-06003 NETASY: 포트 쓰기 실패 
    ORA-06004 NETASY: 대화 화일의 개방 실패 
    ORA-06005 NETASY: 대화 화일의 읽기 실패 
    ORA-06006 NETASY: 대화의 수행 실패 
    ORA-06007 NETASY: 잘못된 대화 유형 
    ORA-06009 NETASY: 대화 화일명이 너무 깁니다. 
    ORA-06010 NETASY: 대화 화일이 너무 깁니다. 
    ORA-06011 NETASY: 대화가 너무 깁니다. 
    ORA-06017 NETASY: 메시지 수신 실패 
    ORA-06018 NETASY: 메시지 송신 실패 
    ORA-06019 NETASY: 부적절한 로그인(연결) 스트링 
    ORA-06020 NETASY: 초기화 실패 
    ORA-06021 NETASY: 연결 실패 
    ORA-06022 NETASY: 채널 개방 실패 
    ORA-06023 NETASY: 포트 개방 실패 
    ORA-06024 NETASY: VTM 오류 
    ORA-06025 NETASY: 환경설정 오류 
    ORA-06026 NETASY: 포트 close 실패 
    ORA-06027 NETASY: 채널 close 실패 
    ORA-06028 NETASY: 로그인 하기위한 초기화를 할 수 없습니다. 
    ORA-06029 NETASY: 포트 할당 실패 
    ORA-06030 NETDNT: 연결 실패, 인식할 수 없는 노드명입니다. 
    ORA-06031 NETDNT: 연결 실패, 인식할 수 없는 개체명입니다. 
    ORA-06032 NETDNT: 연결 실패, 제어정보의 액세스가 거절되었습니다. 
    ORA-06033 NETDNT: 연결 실패, 상대편이 연결을 거절했습니다. 
    ORA-06034 NETDNT: 연결 실패, 상대편이 예기치않게 종료됐습니다. 
    ORA-06035 NETDNT: 연결 실패, 불충분한 자원입니다. 
    ORA-06036 NETDNT: 연결 실패, 개체로부터의 응답이 없습니다. 
    ORA-06037 NETDNT: 연결 실패, 노드에 도달할 수 없습니다. 
    ORA-06038 NETDNT: 연결 실패, 네트워크 드라이버가 로드되지 않았습니다. 
    ORA-06039 NETDNT: 연결 실패 
    ORA-06040 NETDNT: 부적절한 로그인 스트링입니다. 
    ORA-06041 NETDNT: 분리 실패 
    ORA-06042 NETDNT: 메시지 수신 실패 
    ORA-06043 NETDNT: 메시지 송신 실패 
    ORA-06044 NETDNT: 연결 실패, 바이트 갯수 할당량을 초과했습니다. 
    ORA-06102 NETTCP: 문맥 영역을 할당할 수 없습니다. 
    ORA-06105 NETTCP: 원격 호스트가 불명입니다. 
    ORA-06106 NETTCP: 소켓 생성 실패 
    ORA-06107 NETTCP: ORACLE 네트워크 서버가 없습니다. 
    ORA-06108 NETTCP: 호스트에 연결 실패 
    ORA-06109 NETTCP: 메시지 수신 실패 
    ORA-06110 NETTCP: 메시지 송신 실패 
    ORA-06111 NETTCP: 분리하는것이 실패 
    ORA-06112 NETTCP: 부적절한 버퍼크기입니다. 
    ORA-06113 NETTCP: 연결이 너무 많습니다. 
    ORA-06114 NETTCP: SID 찾기 실패 
    ORA-06115 NETTCP: 논리적인 ORACLE을 생성할 수 없습니다. 
    ORA-06116 NETTCP: ORASRV 프로세스를 생성할 수 없습니다. 
    ORA-06117 NETTCP: ORASRV를 생성할 수 없음: 할당량을 초과했습니다. 
    ORA-06118 NETTCP: ORASRV와의 교신을 끝낼 수 없습니다. 
    ORA-06119 NETTCP: 가짜 클라이언트의 요구 
    ORA-06120 NETTCP: 네트워크 드라이버가 로드되지 않았습니다. 
    ORA-06121 NETTCP: 액세스 실패 
    ORA-06122 NETTCP: 셋업 실패 
    ORA-06123 NETTCP: KEEPALIVE를 지정할 수 없습니다. 
    ORA-06124 NETTCP: ORASRV 대기시 시간경과 
    ORA-06125 NETTCP: ORASRV가 예기치않게 종료했습니다. 
    ORA-06126 NETTCP: ORASRV가 네트워크 연결을 열 수 없습니다. 
    ORA-06127 NETTCP: 사용자명을 변경할 수 없습니다. 
    ORA-06128 NETTCP: 우편함을 생성할 수 없습니다. 
    ORA-06129 NETTCP: 소켓의 소유권을 ORASRV로 옮길 수 없습니다. 
    ORA-06130 NETTCP: 호스트의 액세스가 거부되었습니다. 
    ORA-06131 NETTCP: 사용자의 액세스가 거부되었습니다. 
    ORA-06132 NETTCP: 비밀번호가 틀림, 액세스가 거부되었습니다. 
    ORA-06133 NETTCP: 화일이 없습니다. 
    ORA-06134 NETTCP: 화일 액세스 권한이 위반되었습니다. 
    ORA-06135 NETTCP: 연결이 거절됨; 서버가 중지되고 있습니다. 
    ORA-06136 NETTCP: 연결교신중 오류 발생 
    ORA-06137 NETTCP: 연결교신중 오류 발생 
    ORA-06138 NETTCP: 연결교신중 오류 발생 
    ORA-06140 NETTCP: 그런 사용자가 없습니다. 
    ORA-06141 NETTCP: 사용자에 대한 권한이 없습니다. 
    ORA-06142 NETTCP: 사용자 정보의 획득시 오류 
    ORA-06143 NETTCP: 최대 연결수를 초과했습니다. 
    ORA-06144 NETTCP: SID (데이타베이스)는 사용할 수 없습니다. 
    ORA-06145 NETTCP: ORASRV를 수행시킬 수 없음: 이미지가 설치되지 않았습니다. 
    ORA-06200 TWOTASK: 연결 실패, 우편함을 생성할 수 없습니다. 
    ORA-06201 TWOTASK: 연결 실패, 우편함에 연결할 수 없습니다. 
    ORA-06202 TWOTASK: 연결 실패, 서버 태스크를 만들 수 없습니다. 
    ORA-06203 TWOTASK: 연결 실패, 교신 실패 
    ORA-06204 TWOTASK: 연결 실패, ORASRV2.COM를 액세스할 수 없습니다. 
    ORA-06205 TWOTASK: 연결 실패, 논리명을 생성할 수 없습니다. 
    ORA-06206 TWOTASK: 메시지 수신 실패 
    ORA-06207 TWOTASK: 메시지 송신 실패 
    ORA-06208 TWOTASK: 부적당한 로그인(연결) 스트링 
    ORA-06209 TWOTASK: 연결 실패, 우편함이 이미 존재하고 있습니다. 
    ORA-06210 TWOTASK: 연결 실패, ORASRV가 예기치 않게 종료되었습니다. 
    ORA-06211 TWOTASK: 연결 실패, ORASRV를 기다리다가 시간 초과 되었습니다. 
    ORA-06212 TWOTASK: 연결 실패, 논리 이름 테이블이 꽉 차있습니다. 
    ORA-06213 TWOTASK: 연결 실패 
    ORA-06214 TWOTASK: 연결 실패, ORASRV를 생성하기 위해 충분치 않은 할당량 입니다. 
    ORA-06215 TWOTASK: 연결 실패, ORASRV 이미지가 설치가 않되게 보호된 것입니다. 
    ORA-06216 TWOTASK: 연결 실패, ORASRV 이미지 화일을 발견할 수 없습니다. 
    ORA-06250 NETNTT: 송수신 버퍼를 할당할 수 없습니다. 
    ORA-06251 NETNTT: 주소 화일명을 해석할 수 없습니다. 
    ORA-06252 NETNTT: 주소 화일을 열 수 없습니다. 
    ORA-06253 NETNTT: 주소화일에서 인수를 READ 할 수 없습니다. 
    ORA-06254 NETNTT: 큐브로의 연결을 공유할 수 없습니다. 
    ORA-06255 NETNTT: 원격 프로세스의 pid를 READ 할수없습니다. 
    ORA-06256 NETNTT: 원격 FORK 실패 
    ORA-06257 NETNTT: 섀도(SHADOW) 프로세스에 명령을 송신할 수 없습니다. 
    ORA-06258 NETNTT: 문맥 영역을 할당할 수 없습니다. 
    ORA-06259 NETNTT: 원격 프로세스에서 READ 할수 없습니다. 
    ORA-06260 NETNTT: 원격 프로세스로 WRITE 할수 없습니다. 
    ORA-06261 NETNTT: nrange() 실패 
    ORA-06262 NETNTT: nfconn() 실패 
    ORA-06263 NETNTT: pi_connect에 메모리 부족 
    ORA-06264 NETNTT: 데이타 프로토콜 오류 
    ORA-06265 NETNTT: break 프로토콜 오류 
    ORA-06266 NETNTT: 잘못된 쓰기 길이 
    ORA-06267 NETNTT: 오류 상태 
    ORA-06268 NETNTT: /etc/oratab을 READ 불가 
    ORA-06300 IPA: 접속분리 실패 
    ORA-06301 IPA: Driver context 를 할당할 수 없습니다. 
    ORA-06302 IPA: 원격 호스트에 연결 불가 
    ORA-06303 IPA: 메세지 전송 오류 
    ORA-06304 IPA: 메세지 수신 오류 
    ORA-06305 IPA: 부적절한 메시지 유형 
    ORA-06306 IPA: 메세지 WRITE 길이 오류 
    ORA-06307 IPA: 연결 재설정 실패 
    ORA-06308 IPA: 더 이상 연결 불가 
    ORA-06309 IPA: 이용 가능한 메세지 큐가 없음 
    ORA-06310 IPA: 환경 변수가 지정되지 않았습니다. 
    ORA-06311 IPA: 최대 서버수에 도달 했습니다. 
    ORA-06312 IPA: 지정된 서비스명이 부정확합니다. 
    ORA-06313 IPA: 공유 메모리 초기화 실패 
    ORA-06314 IPA: Event 설정 실패 
    ORA-06315 IPA: 콘넥트 스트링 오류 
    ORA-06316 IPA: 데이타베이스 SID 오류 
    ORA-06317 IPA: 로컬 최대 사용자수 초과 
    ORA-06318 IPA: 로컬 최대 콘넥션수 초과 
    ORA-06319 IPA: 원격 최대 사용자수 초과 
    ORA-06320 IPA: 원격 최대 연결 수 초과 
    ORA-06321 IPA: 원격편에 도달할 수 없습니다. 
    ORA-06322 IPA: 심각한 공유 메모리 오류 
    ORA-06323 IPA: 이벤트 오류 발생 
    ORA-06400 NETCMN: 지정된 기본 호스트 뮨자열이 없습니다. 
    ORA-06401 NETCMN: 부적절한 드라이버 지정자 
    ORA-06402 NETCMN: 브레이크 메시지 수신시 오류 
    ORA-06403 NETCMN: 문맥 영역을 할당할 수 없습니다. 
    ORA-06404 NETCMN: 부당한 로그인 (연결) 스트링 
    ORA-06405 NETCMN: 프로토콜 재설정 오류 
    ORA-06406 NETCMN: 브레이크 메시지 송신시 오류 
    ORA-06407 NETCMN: 브레이크 처리환경을 구축할 수 없습니다. 
    ORA-06408 NETCMN: 부정확한 메시지 유형 
    ORA-06413 연결이 개방되지 않았습니다. 
    ORA-06416 NETCMN: 테스트시 오류 
    ORA-06419 NETCMN: 서버가 오라클을 기동시킬 수 없습니다. 
    ORA-06420 NETCMN: SID의 찾기 실패 
    ORA-06421 NETCMN: 읽혀질 데이타에 오류가 발견되었습니다. 
    ORA-06422 NETCMN: 송신 데이타에 오류가 발견되었습니다. 
    ORA-06423 NETCMN: 수신 데이타에 오류가 발견되었습니다. 
    ORA-06430 ssaio: 함수가 잘못된 인수로 요구되었습니다. 
    ORA-06431 ssaio: 부적절한 블록번호 
    ORA-06432 ssaio: 버퍼가 정열되지 않습니다. 
    ORA-06433 ssaio: lseek 오류, 요구된 블록을 찾을 수 없습니다. 
    ORA-06434 ssaio: 읽기 오류, 데이타베이스 화일로 읽을 수 없습니다. 
    ORA-06435 ssaio: 쓰기 오류, 데이타베이스 화일에 기록할 수 없습니다. 
    ORA-06436 ssaio: 비동기 I/O가 틀린 파라미터로 인하여 실패했습니다. 
    ORA-06437 ssaio: 비동기 쓰기는 데이타베이스 화일에 기록할 수 없습니다. 
    ORA-06438 ssaio: 비동기 읽기는 데이타베이스 화일로 부터 읽을 수 없습니다. 
    ORA-06439 ssaio: 비동기 쓰기가 틀린 바이트 수를 리턴했습니다. 
    ORA-06440 ssaio: 비동기 읽기가 틀린 바이트 수를 리턴했습니다. 
    ORA-06441 ssvwatev: 함수 호출에 잘못된 파라미터가 넘겨졌습니다. 
    ORA-06442 ssvwatev: 예기치 않은 오류로 실패했습니다. 
    ORA-06443 ssvpstev: 함수 호출에 잘못된 파라미터가 넘겨졌습니다. 
    ORA-06444 ssvpstev: 예기치 않은 오류로 실패했습니다. 
    ORA-06445 ssvpstevrg: 함수 호출에 잘못된 파라미터가 넘겨졌습니다. 
    ORA-06446 ssvpstevrg: 예기치 않은 오류로 실패했습니다. 
    ORA-06447 ssvpstp: 함수 호출에 잘못된 파라미터가 넘겨졌습니다. 
    ORA-06448 ssvpstp: 예기치 않은 오류로 실패했습니다. 
    ORA-06449 리스트 IO 혹은 sysvendor가 설치되지 않았습니다. 
    ORA-06500 PL/SQL: 기억 영역 오류입니다. 
    ORA-06501 PL/SQL 프로그램 오류 
    ORA-06502 PL/SQL: 값(수치) 오류입니다. 
    ORA-06503 PL/SQL: 함수가 값을 리턴하지 못했습니다. 
    ORA-06504 PL/SQL: Result Set 변수 또는 질의의 리턴 유형이 일치하지 않습니다. 
    ORA-06508 PL/SQL: 호출되는 lib 단위를 발견할 수 없습니다. 
    ORA-06509 PL/SQL: 이 패키지(package)에 대한 ICD 벡터가 누락됐습니다. 
    ORA-06510 PL/SQL: 처리되지 않은 user-defined 예외 상황 
    ORA-06511 PL/SQL: 커서가 이미 열려있습니다. 
    ORA-06512 %s줄 %s에서 
    ORA-06513 PL/SQL: PL/SQL 테이블의 색인이 호스트 언어 배열의 범위를 벗어남 
    ORA-06514 PL/SQL: 원격 호출은 서버에 의해서 처리되지 않습니다. 
    ORA-06540 PL/SQL: 컴파일 오류 
    ORA-06541 PL/SQL: 컴파일 오류 - 컴파일 중지 
    ORA-06542 PL/SQL: 실행 오류 
    ORA-06543 PL/SQL: 실행 오류 - 실행 중지 
    ORA-06544 PL/SQL: 내부 오류, 인수: [%s], [%s], [%s], [%s], [%s], [%s], [%s], [%s] 
    ORA-06550 줄 %s, 열%s:%s 
    ORA-06551 PL/SQL: 처리되지 않은 예외상황 
    ORA-06552 PL/SQL: %s 
    ORA-06553 PLS-%s: %s 
    ORA-06554 패키지 DBMS_STANDARD는 PL/SQL을 사용하기 전에 생성되야만 합니다. 
    ORA-06555 이 이름은 현재 사용자 SYS에 의해 사용되기 위해 예약되어 있습니다. 
    ORA-06556 파이프가 비어 있어 unpack_message 요구를 이행할 수 없습니다. 
    ORA-06557 icd 파이프에 대한 파라미터로 NULL 값은 허용되지 않습니다. 
    ORA-06558 dbms_pipe 패키지에 있는 버퍼가 꽉 찼음. 더 이상의 항목이 사용될 수 없습니다. 
    ORA-06559 %s로 잘못된 데이타유형이 요구되었습니다, 실제 데이타유형은 %s 입니다. 
    ORA-06560 위치, %s 가 버퍼 크기 %s 보다 크거나 음수 입니다. 
    ORA-06561 명령문이 DBMS_SQL 패키지에 의해 지원되지 않습니다. 
    ORA-06562 Out 인수의 형이 열의 형과 일치되거나 변수와 바인드되어야 합니다. 
    ORA-06563 기술된 최상위 레벨의 프로시저/펑션이 하위레벨을 포함할 수 없습니다. 
    ORA-06564 개체 %s가 존재하지 않습니다. 
    ORA-06565 저장된 프로시저에서 %s를 실행할 수 없습니다. 
    ORA-06566 행의 수 지정이 부적합합니다. 
    ORA-06567 값의 수 지정이 부적합합니다. 
    ORA-06568 폐기된 ICD 프로시저가 호출되었습니다. 
    ORA-06570 풀 개체 공유가 존재하지 않습니다. 
    ORA-06571 %s 함수는 데이타베이스에 갱신하는것을 보증할 수 없습니다. 
    ORA-06572 %s 함수는 out 인수를 가지고 있습니다. 
    ORA-06573 %s 함수가 패키지 상태를 변경하는데, 여기서는 사용할 수 없습니다. 
    ORA-06574 %s 함수는 패키지 상태를 참조하는데, 원격적으로 실행할 수 없습니다. 
    ORA-06575 패키지 또는 함수 %s 은 부적당한 상태입니다. 
    ORA-06580 해쉬 결합이 큰 행을 메모리에 보관하는 중에 메모리 부족이 일어났습니다. 
    ORA-06600 LU6.2 Driver: SNA 소프트웨어가 로드되지 않음 
    ORA-06601 LU6.2 Driver: 부적절한 데이타베이스 id 스트링임 
    ORA-06602 LU6.2 Driver: 문맥 영역 할당시 오류 
    ORA-06603 LU6.2 Driver: 메모리 할당시 오류 
    ORA-06604 LU6.2 Driver: 원격 LU와 함께 세션을 할당할 수 없음 
    ORA-06605 LU6.2 Driver: 예기치 않은 줄 턴어라운드 
    ORA-06606 LU6.2 Driver: SNA로 부터의 예기치 않은 응답 
    ORA-06607 LU6.2 Driver: 송신상태에서 재설정됨 
    ORA-06608 LU6.2 Driver: 수신상태에서 재설정됨 
    ORA-06610 LU6.2 Driver: 해제시 실패 
    ORA-06611 LU6.2 Driver: 송신 요구오류 
    ORA-06612 LU6.2 Driver: 데이타 송신오류 
    ORA-06613 LU6.2 Driver: 수신 및 대기오류 
    ORA-06614 LU6.2 Driver: 즉시 수신오류 
    ORA-06615 LU6.2 Driver: 송신오류 
    ORA-06616 LU6.2 Driver: LU로의 첨부에 실패했음 
    ORA-06617 LU6.2 Driver: PU로의 첨부에 실패했음 
    ORA-06618 LU6.2 Driver: 서브네트워크의 활성화에 실패했음 
    ORA-06619 LU6.2 Driver: 활성적인 원격 파트너를 할 수 없습니다. 
    ORA-06620 LU6.2 Driver: 부적절한 원격 파트너 
    ORA-06621 LU6.2 Driver: 할당 오류 
    ORA-06622 LU6.2 Driver: SNA에 첨부할 수 없음 
    ORA-06700 TLI Driver: 호스트로부터의 메시지 유형이 부정확합니다. 
    ORA-06701 TLI Driver: 틀린 수의 바이트가 기록되었습니다. 
    ORA-06702 TLI Driver: 문맥 영역을 할당할 수 없습니다. 
    ORA-06703 TLI Driver: 브레이크 메시지의 송신 실패 
    ORA-06704 TLI Driver: 브레이크 메시지의 수신 실패 
    ORA-06705 TLI Driver: 원격 노드가 불명입니다. 
    ORA-06706 TLI Driver: 서비스가 발견되지 않습니다. 
    ORA-06707 TLI Driver: 연결실패 
    ORA-06708 TLI Driver: 메시지 수신실패 
    ORA-06709 TLI Driver: 메시지 송신실패 
    ORA-06710 TLI Driver: 송신 인터럽트 브레이크 메시지 실패 
    ORA-06711 TLI Driver: 바인드시 오류 
    ORA-06712 TLI Driver: 인수시 오류 
    ORA-06713 TLI Driver: 연결시 오류 
    ORA-06720 TLI Driver: SID 찾기 실패 
    ORA-06721 TLI Driver: 가 클라이언트 요구 
    ORA-06722 TLI Driver: 연결설정 실패 
    ORA-06730 TLI Driver: 크론(clone) 디바이스의 열기 실패 
    ORA-06731 TLI Driver: t_call을 할당할 수 없습니다. 
    ORA-06732 TLI Driver: t_discon을 할당할 수 없습니다. 
    ORA-06733 TLI Driver: 분리 수신에 실패했습니다. 
    ORA-06734 TLI Driver: 연결할 수 없습니다. 
    ORA-06735 TLI Driver: 잘못된 연결을 닫는데 실패했습니다. 
    ORA-06736 TLI Driver: 서버가 가동중이 아닙니다. 
    ORA-06737 TLI Driver: 연결실패 
    ORA-06741 TLI Driver: 프로토콜 디바이스를 열 수 없습니다. 
    ORA-06742 TLI Driver: t_bind를 할당할 수 없습니다. 
    ORA-06743 TLI Driver: t_bind를 할당할 수 없습니다. 
    ORA-06744 TLI Driver: 리스너(listener)를 바인드할 수 없습니다. 
    ORA-06745 TLI Driver: 리스너(listener)가 이미 가동중입니다. 
    ORA-06746 TLI Driver: t_call을 할당할 수 없습니다. 
    ORA-06747 TLI Driver: 청취(listen) 오류 
    ORA-06748 TLI Driver: t_discon을 할당할 수 없습니다. 
    ORA-06749 TLI Driver: 네트워크상에서 옵션이 허용되지 않습니다. 
    ORA-06750 TLI Driver: sync 실패 
    ORA-06751 TLI Driver: 번지 범위가 다릅니다. 
    ORA-06752 TLI: 시그널 설정시 오류 
    ORA-06753 TLI Driver: name-to-address를 맹핑하는데 실패했습니다. 
    ORA-06754 TLI Driver: 지역 호스트 번지를 얻을 수 없습니다. 
    ORA-06755 TLI Driver: 이동 마감점을 닫을 수 없습니다. 
    ORA-06756 TLI Driver: oratab을 열 수 없습니다. 
    ORA-06757 TLI Driver: 서버가 틀린 명령을 취했습니다. 
    ORA-06760 TLI Driver: 순차릴리스를 읽는 동안 타임아웃됐습니다. 
    ORA-06761 TLI Driver: 순차릴리스의 송신오류 
    ORA-06762 TLI Driver: 순차릴리스의 읽기오류 
    ORA-06763 TLI Driver: 분리 송신오류 
    ORA-06764 TLI Driver: 분리 읽기오류 
    ORA-06765 TLI Driver: 순차 릴리즈의 대기오류 
    ORA-06766 TLI Driver: 릴리스시 닫기실패 
    ORA-06767 TLI Driver: 릴리즈시 할당실패 
    ORA-06770 TLI Driver: 버전 송신오류 
    ORA-06771 TLI Driver: 버전 읽기오류 
    ORA-06772 TLI Driver: 명령 송신오류 
    ORA-06773 TLI Driver: 명령 읽기오류 
    ORA-06774 TLI Driver: 브레이크 모드 송신오류 
    ORA-06775 TLI Driver: 브레이크 모드 읽기오류 
    ORA-06776 TLI Driver: 파라미터 송신오류 
    ORA-06777 TLI Driver: 파라미터 읽기오류 
    ORA-06778 TLI Driver: ccode 송신오류 
    ORA-06779 TLI Driver: ccode 읽기오류 
    ORA-06780 TLI Driver: recv 오류코드 실패 
    ORA-06781 TLI Driver: 교섭 스트링 읽기오류 
    ORA-06790 TLI Driver: 폴 실패 
    ORA-06791 TLI Driver: 폴이 오류 상황을 리턴했습니다. 
    ORA-06792 TLI Driver: 서버가 오라클을 수행할 수 없습니다. 
    ORA-06793 TLI Driver: 서버가 새로운 프로세스를 생성할 수 없습니다. 
    ORA-06794 TLI Driver: 섀도우 프로세스가 프로토콜 정보를 추출할 수 없습니다. 
    ORA-06800 TLI Driver: SQL*Net SPX 클라이언트가 재연결하는 동안 사라졌습니다. 
    ORA-06801 TLI Driver: SPX 서버의 재연결을 위한 리슨이 실패했습니다. 
    ORA-06802 TLI Driver: /etc/netware/yellowpages 화일을 열 수 없습니다. 
    ORA-06803 TLI Driver: IPX 디바이스 화일을 열 수 없습니다. 
    ORA-06804 TLI Driver: 초기화시 IPX 번지를 바인드할 수 없습니다. 
    ORA-06805 TLI Driver: SPX를 위한 데이타그램 SAP 패킷을 송신할 수 없습니다. 
    ORA-06806 TLI Driver: SPX를 위한 프로토콜 초기화를 마감할 수 없습니다. 
    ORA-06807 TLI Driver: 이더네트 디바이스 드라이버 화일을 열 수 없습니다. 
    ORA-06808 TLI Driver: IPX와 이더네트 스트림을 연결할 수 없습니다. 
    ORA-06809 TLI Driver: 초기화시에 IPX 이더네트 SAP를 클리어할 수 없습니다. 
    ORA-06810 TLI Driver: 초기화시에 IPX 이더네트 SAP를 설정할 수 없습니다. 
    ORA-06811 TLI Driver: 초기화시에 IPX 네트워크 번호를 설정할 수 없습니다. 
    ORA-06812 TLI Driver: 이더네트 드라이버의 노드번지를 읽을 수 없습니다. 
    ORA-06813 TLI Driver: 설정된 이더네트 번지가 틀립니다. 
    ORA-06814 TLI Driver: SPX 디바이스 화일을 열 수 없습니다. 
    ORA-06815 TLI Driver: SPX 와 IPX 스트림을 연결할 수 없습니다. 
    ORA-06816 TLI Driver: SPX SAP 번지를 설정할 수 없습니다. 
    ORA-06817 TLI Driver: 노벨 네트워크 번지를 읽을 수 없습니다. 
    ORA-06900 CMX: tns 디렉토리를 읽을 수 없습니다. 
    ORA-06901 CMX: 로컬 어플리케션에 로컬명이 할당되지 않았습니다. 
    ORA-06902 CMX: cmx 서브시스템을 첨부 할 수 없습니다. 
    ORA-06903 CMX: 원격 어플리케션의 트랜스포트 번지를 읽을 수 없습니다. 
    ORA-06904 CMX: 원격 어플리케션이 이용할 수 있는 트랜스포트 번지가 없습니다. 
    ORA-06905 CMX: 연결 오류 
    ORA-06906 CMX: CMX로 부터 최대 패킷 크기를 결정할 수 없습니다. 
    ORA-06907 CMX: 연결 확인중 오류 
    ORA-06908 CMX: ORACLE_SID 전송중 오류 
    ORA-06909 CMX: ORACLE_SID의 인식중 오류 
    ORA-06910 CMX: 원격 기계에서 오라클 프로세스를 기동시킬수 없습니다. 
    ORA-06911 CMX: t_event가 오류를 리턴 
    ORA-06912 CMX: datarq에서 쓰기 오류 
    ORA-06913 CMX: 연결의 재방향 설정중 오류 
    ORA-06914 CMX: 오라클 기동중 비정상 이벤트 발생 
    ORA-06915 CMX: datarq에서 미확인 t_event 발생 
    ORA-06916 CMX: 데이타 읽기(t_datain)에서 오류 
    ORA-06917 CMX: 데이타 읽기(읽을 문자수 초과)에서 오류 
    ORA-06918 CMX: 읽기 이벤트 대기중 T_NOEVENT 발생 
    ORA-06919 CMX: 쓰기 요구(미확인 이벤트)중 오류 
    ORA-06920 CMX: getbrkmsg의 부적합한 데이타형 
    ORA-06921 CMX: getdatmsg의 부적합한 데이타형 
    ORA-06922 CMX: 쓰기 길이 오류 
    ORA-06923 CMX: 부적합한 브레이크 상태 
    ORA-06924 CMX: 브레이크 메세지 길이 오류 
    ORA-06925 CMX: 연결 요구중 단락 
    ORA-06926 CMX: 데이타 읽기중 T_ERROR 발생 
    ORA-06927 CMX: 데이타를 모두 쓰기전에 T_DATAIN을 수신 
    ORA-06928 CMX: ORACLE_SID 오류 
    ORA-06929 CMX: ORACLE_SID 송신시 오류 
    ORA-06930 CMX: ORACLE_SID 확인시 오류 
    ORA-06931 CMX: 서버를 위한 읽기-특성 지정시 오류 
    ORA-06932 CMX: 로컬 이름에서 오류 
    ORA-06933 CMX: 첨부중 오류 
    ORA-06950 오류없음 
    ORA-06951 운영 시스템 호출 오류 
    ORA-06952 통신의 상대편에서 forward-reset 패킷을 발생시켰습니다 
    ORA-06953 가상 메모리 부족 
    ORA-06954 부적합한 화일명 
    ORA-06955 데이타베이스 서버의 수가 제한치를 초과 했습니다. 
    ORA-06956 로컬 호스트 이름을 얻는데 실패 했습니다. 
    ORA-06957 현재 이용 가능한 SID가 없습니다. 
    ORA-06958 구성 화일을 액세스 하는데 실패 했습니다. 
    ORA-06959 버퍼 입출력 쿼터가 너무 적습니다. 
    ORA-06960 로그 화일을 엑세스 하는데 실패 했습니다. 
    ORA-06961 이 작업에 대한 권한이 없습니다. 
    ORA-06970 X.25 Driver: 원격 호스트명을 인지할 수 없습니다. 
    ORA-06971 X.25 Driver: 데이타 수신시 오류 
    ORA-06972 X.25 Driver: 데이타 송신시 오류 
    ORA-06973 X.25 Driver: 부적절한 버퍼 크기입니다. 
    ORA-06974 X.25 Driver: SID 찾기 실패 
    ORA-06975 X.25 Driver: 호스트로의 연결에 실패했습니다. 
    ORA-06976 X.25 Driver: 마감점 생성에 실패했습니다. 
    ORA-06977 X.25 Driver: X.25 레벨 2 실패 
    ORA-06978 X.25 Driver: 콜백 시도가 너무 많습니다. 
    ORA-06979 X.25 Driver: 서버가 오라클을 기동시킬 수 없습니다. 
    ORA-07200 slsid: oracle_sid가 설정되지 않았습니다. 
    ORA-07201 slhom: oracle_home이 환경에 설정되어있지 않습니다. 
    ORA-07202 sltln: sltln에 부적절한 파라미터입니다. 
    ORA-07203 sltln: 긴 환경변수를 변환하려 했습니다. 
    ORA-07204 sltln: 출력 버퍼영역의 부족으로 이름의 변환에 실패했습니다. 
    ORA-07205 slgtd: 시간오류 , 시간을 획득할 수 없습니다. 
    ORA-07206 slgtd: gettimeofday 오류, 시간을 획득할 수 없습니다. 
    ORA-07207 sigpidu: 프로세스 ID 스트링이 내부버퍼를 초과할 수 없습니다. 
    ORA-07208 sfwfb: 더티 버퍼를 디스크에 반영하는데 실패했습니다. 
    ORA-07209 sfofi: 화일 크기제한을 초과했습니다. 
    ORA-07210 slcpu: getrusage 오류, cpu 시간을 얻을 수 없습니다. 
    ORA-07211 slgcs: gettimeofday 오류, 벽시계를 얻을 수 없습니다. 
    ORA-07212 slcpu: times 오류, cpu 시간을 얻을 수 없습니다. 
    ORA-07213 slgcs: times 오류, cpu 시간을 얻을 수 없습니다. 
    ORA-07214 slgunm: uname 오류, 시스템 정보를 얻을 수 없습니다. 
    ORA-07215 slsget: getrusage 오류. 
    ORA-07216 slghst: gethostname 오류, 현 호스트의 이름을 얻을 수 없습니다. 
    ORA-07217 sltln: 환경 변수의 값을 구할 수 없습니다. 
    ORA-07218 slkhst: 호스트의 작업을 수행할 수 없습니다. 
    ORA-07219 slspool: 스풀러 인수 버퍼를 할당할 수 없습니다. 
    ORA-07220 slspool: 대기 오류 
    ORA-07221 slspool: exec 오류, 스풀러 프로그램을 시작할 수 없습니다. 
    ORA-07222 slspool: 줄 프린터 스풀러 명령이 오류 종료했습니다. 
    ORA-07223 slspool: fork 오류, 스풀 프로세스를 띄울 수 없습니다. 
    ORA-07224 sfnfy: 화일 크기의 제한을 알 수 없음; 오류번호 = %s 
    ORA-07225 sldext: 변환 오류, 화일명을 확장할 수 없습니다. 
    ORA-07226 rtneco: 터미널 모드를 얻을 수 없습니다. 
    ORA-07227 rtneco: 반향금지 모드를 얻을 수 없습니다. 
    ORA-07228 rtecho: 터미널을 반향 모드로 복원할 수 없습니다. 
    ORA-07229 slcpuc: CPU 갯수를 얻는데 실패했습니다. 
    ORA-07230 slemcr: fopen 오류, 오류화일을 열 수 없습니다. 
    ORA-07231 slemcc: 부적절한 화일처리, 함수가 잘못된 인수로 요구되었습니다. 
    ORA-07232 slemcc: fclose 오류. 
    ORA-07233 slemcw: 부적절한 화일처리, 함수가 잘못된 인수로 요구되었습니다. 
    ORA-07234 slemcw: fseek 오류 
    ORA-07235 slemcw: fwrite 오류 
    ORA-07236 slemop: open 오류 
    ORA-07237 slemcl: 부적절한 화일처리, 함수가 잘못된 인수로 요구되었습니다. 
    ORA-07238 slemcl: close 오류 
    ORA-07239 slemrd: 부적절한 화일처리, 함수가 잘못된 인수로 요구되었습니다. 
    ORA-07240 slemrd: seek 오류 
    ORA-07241 slemrd: read 오류 
    ORA-07242 slembfn: 변환 오류, 오류 화일명을 변환할 수 없습니다. 
    ORA-07243 sftget: 제공된 버퍼가 전체 줄을 포함하기에 충분하지 않습니다. 
    ORA-07244 ssfccf: 화일 생성실패, 화일크기 제한치에 도달했습니다. 
    ORA-07245 sfccf: 최후 블록을 lseek 및 write할 수 없습니다. 
    ORA-07246 sfofi: open 오류: 데이타베이스 화일을 열 수 없습니다. 
    ORA-07247 sfrfb: read 오류: 데이타베이스 화일로부터 요구된 블록을 읽을 수 없습니다. 
    ORA-07248 sfwfb: write 오류: 데이타베이스 블록을 기록할 수 없습니다. 
    ORA-07250 spcre: semget오류, 최초 세마포 세트를 얻을 수 없습니다. 
    ORA-07251 spcre: semget오류, 어떤 세마포도 할당할 수 없습니다. 
    ORA-07252 spcre: semget오류, 세마포를 할당할 수 없습니다. 
    ORA-07253 spdes: semctl오류, 세마포를 할당할 수 없습니다. 
    ORA-07254 spdcr: ?/bin/oracle을 확장하는 동안 변환 오류가 발생했습니다. 
    ORA-07255 spini: 신호 처리기를 구축할 수 없습니다. 
    ORA-07256 sptrap: 예외를 감지하기 위한 신호 처리기를 구축할 수 없습니다. 
    ORA-07257 spdcr: 프로그램명의 확장시 변환오류 
    ORA-07258 spdcr: 포크 오류, 프로세스를 생성할 수 없습니다. 
    ORA-07259 spdcr: 수행오류, 기동시 분리된 프로세스가 실패했습니다. 
    ORA-07260 spdcr: 대기 오류 
    ORA-07261 spdde: kill 오류, 프로세스에 신호를 보낼 수 없습니다. 
    ORA-07262 sptpa: sptpa가 부적절한 프로세스 id에서 호출되었습니다. 
    ORA-07263 sptpa: kill 오류 
    ORA-07264 spwat: semop 오류, 세마포를 줄일 수 없습니다. 
    ORA-07265 sppst: semop 오류, 세마포를 늘릴 수 없습니다. 
    ORA-07266 sppst: 부적절한 프로세스 번호가 sppst로 넘겨졌습니다. 
    ORA-07267 spwat: 부적절한 프로세스 번호 
    ORA-07268 spgun: getpwuid 오류. 
    ORA-07269 spdcr: exec후 분리된 프로세스가 죽었습니다. 
    ORA-07270 spalck: setitimer오류, 인터벌 타이머를 설정할 수 없습니다. 
    ORA-07271 spwat: 오라클 프로세스 번호가 부적절합니다. 
    ORA-07272 spwat: 부적절한 세마포 세트 id입니다. 
    ORA-07273 sppst: 부적절한 세마포 id입니다. 
    ORA-07274 spdcr: 액세스 오류, 오라클의 액세스가 거절되었습니다. 
    ORA-07275 프로세스로 시그널을 송신할 수 없습니다. 
    ORA-07276 spdba: /etc/group내에 dba 그룹이 없습니다. 
    ORA-07277 spdde: 부당한 pid가 인수로 넘겨졌습니다. 
    ORA-07278 splon: ops$username이 버퍼길이를 초과했습니다. 
    ORA-07279 spcre: semget오류, 최초의 세마포 세트를 얻을 수 없습니다. 
    ORA-07280 soarch: 화일 대 화일 복사를 위한 임시 버퍼의 malloc에 실패했습니다. 
    ORA-07281 soarch: 인터럽트가 발생했습니다. 
    ORA-07282 soaprd: 스트링 오버플로우 
    ORA-07283 soaprd: 아카이브 수신지에 대한 볼륨 크기가 부적절합니다. 
    ORA-07284 soaprd: 볼륨크기 지정이 적절하게 종료되지 않았습니다. 
    ORA-07285 soaprd: 디스크 화일에 대해서는 볼륨크기를 지정할 수 없습니다. 
    ORA-07286 soagdi: 디바이스 정보를 획득할 수 없습니다. 
    ORA-07287 soagdi: 로그 아카이브를 할 수 없는 디바이스입니다. 
    ORA-07288 soabfn: 화일명 구성시 스트링 오버플로우입니다. 
    ORA-07289 soafls: 테이프로의 기록에 실패했습니다. 
    ORA-07290 soagdi: 아카이브를 위해 지정된 디렉토리가 없습니다. 
    ORA-07292 soaotp: 로그 화일에 부합되기에는 화일이 너무 작습니다. 
    ORA-07293 soaotp: 현재의 테이프 볼륨을 열 수 없습니다. 
    ORA-07294 soaotp: 테이프 기록을 위한 버퍼를 할당할 수 없습니다. 
    ORA-07295 soaotp: 로그 화일의 상태를 발견할 수 없습니다. 
    ORA-07296 soaotp: lseek 오류, 로그 화일의 시작을 찾을 수 없습니다. 
    ORA-07297 soaotp: read 오류, 헤더 블록을 읽을 수 없습니다. 
    ORA-07298 soacls: 이미 닫힌 화일을 닫으려했습니다. 
    ORA-07299 soacls: 테이프 디바이스의 닫기 실패 
    ORA-07300 smscre: ?/dbs/sgadef.dbf 화일의 확장시 변환오류입니다. 
    ORA-07301 smscre: sga 생성시 ?/dbs/sgadef@.dbf 화일이 이미 존재합니다. 
    ORA-07302 smscre: ?/dbs/sgadef@.dbf의 생성에 실패했습니다. 
    ORA-07303 smscre: 부당한 데이타베이스 버퍼 크기입니다. 
    ORA-07304 smscre: 부당한 재실행 버퍼 크기입니다. 
    ORA-07305 sms1sg: sga 생성시 ftok 오류 
    ORA-07306 sms1sg: shmget 오류, 공유메모리 세그먼트를 획득할 수 없습니다. 
    ORA-07307 sms1sg: shmat 오류, sga를 첨부할 수 없습니다. 
    ORA-07308 smscre: ?/dbs/sgadef@.dbf 화일에 기록시 기록오류가 발생했습니다. 
    ORA-07309 smscre: close 오류, ?/dbs/sgadef@.dbf 화일을 닫을 수 없습니다. 
    ORA-07310 smscre: sga를 읽을 수 없습니다. 
    ORA-07311 smsdes: sgadef.dbf 화일명의 이름변환 오류. 
    ORA-07312 smsdes: 열기 오류, sgadef.dbf 화일을 열 수 없습니다. 
    ORA-07313 smsdes: 읽기 오류, sgadef.dbf 화일을 읽을 수 없습니다. 
    ORA-07314 smsdes: 공유메모리 파기 시도시 shmctl 오류가 발생했습니다. 
    ORA-07315 smsdes: 닫기 오류, sgadef.dbf 화일을 닫을 수 없습니다. 
    ORA-07316 smsdes: unlink 오류, sgadef.dbf 파기할 수 없습니다. 
    ORA-07317 smsget: sgadef.dbf 화일명의 확장시 변환 오류가 발생했습니다. 
    ORA-07318 smsget: sgadef.dbf 화일의 개방 오류 
    ORA-07319 smsget: sgadef.dbf 읽기 오류 
    ORA-07320 smsget: sga의 첨부 시도중 shmat 오류가 발생했습니다. 
    ORA-07321 smsget: shmat 오류, 요구된 번지로 sga를 첨부할 수 없습니다. 
    ORA-07322 smsget: 닫기 오류, sgadef.dbf 화일을 닫을 수 없습니다. 
    ORA-07323 smsfre: shmdt 오류, sga를 지울 수 없습니다. 
    ORA-07324 smpall: pga 할당시 malloc 오류가 발생했습니다. 
    ORA-07325 smsacx: 문맥 영역 할당시 malloc 오류가 발생했습니다. 
    ORA-07326 smsfre: 매핑되지 않은 SGA를 해제하려 했습니다. 
    ORA-07327 smpdal: 매핑되지 않은 PGA를 파기하려 했습니다. 
    ORA-07328 smsmax: 세그먼트에 대한 최대 크기를 추정할 수 없습니다. 
    ORA-07329 smscsg: 너무 많은 공유메모리 세그먼트입니다. 
    ORA-07330 smsnsg: SGA의 고정영역을 할당할 수 없습니다. 
    ORA-07331 smsnsg: SGA의 가변영역을 할당할 수 없습니다. 
    ORA-07332 smsnsg: 재실행 버퍼를 할당할 수 없습니다. 
    ORA-07333 smsnsg: 데이타베이스 버퍼를 할당할 수 없습니다. 
    ORA-07334 smsnsg: 너무 많은 공유메모리 세그먼트입니다. 
    ORA-07335 smsmat: sga 생성시 ftok 오류 
    ORA-07336 smsmat: shmget 오류, 공유메모리 세그먼트를 얻을 수 없습니다. 
    ORA-07337 smsmat: shmat 오류, sga를 첨부할 수 없습니다. 
    ORA-07338 smscre: sga 화일의 존재여부를 테스트할 수 없습니다. 
    ORA-07339 spcre: 세마포 세트의 최대수를 초과했습니다. 
    ORA-07340 sfccf: fstat 오류, 화일 상태를 획득할 수 없습니다. 
    ORA-07341 sfsrd: 부당한 블록 번호입니다. 
    ORA-07342 sfsrd: lseek 오류, 요구된 블록을 찾을 수 없습니다. 
    ORA-07343 sfsrd: read 오류, 요구된 블록을 찾을 수 없습니다. 
    ORA-07344 sfsrd: 함수가 잘못된 인수로 요구되었습니다. 
    ORA-07347 sfsrd: 용도를 실험에 대한 모의 오류입니다. 
    ORA-07350 sfccf: 논리 블록크기가 부당합니다. 
    ORA-07351 sfccf: malloc 오류, 기록 버퍼를 할당할 수 없습니다. 
    ORA-07352 sfccf: create 오류, 화일을 생성할 수 없습니다. 
    ORA-07353 sfccf: close 오류, 화일을 닫을 수 없습니다. 
    ORA-07354 sfccf: open 오류, 화일을 열 수 없습니다. 
    ORA-07355 sfccf: fstat 오류, 화일 상태를 획득할 수 없습니다. 
    ORA-07356 sfccf: lseek 오류, 화일의 시작위치를 찾을 수 없습니다. 
    ORA-07357 sfccf: 기록 오류, 데이타베이스 헤더블록에 기록할 수 없습니다. 
    ORA-07358 sfccf: 기록 오류, 화일에 기록할 수 없습니다. 
    ORA-07359 sfifi: 부당한 논리 블록크기 
    ORA-07360 sfifi: stat 오류, 화일에 대한 정보를 얻을 수 없습니다. 
    ORA-07361 sfifi: malloc 오류, 헤더블록에 대한 버퍼를 할당할 수 없습니다. 
    ORA-07362 sfifi: 열기 오류, 화일을 열 수 없습니다. 
    ORA-07363 sfifi: lseek 오류, 화일의 시작위치를 찾을 수 없습니다. 
    ORA-07364 sfifi: 읽기 오류, 헤더블록을 읽을 수 없습니다. 
    ORA-07365 sfifi: 닫기 오류 
    ORA-07366 sfifi: 유효하지 않은 화일, 화일이 정당한 헤더블록을 가지지 않습니다. 
    ORA-07367 sfifi: 논리블록 크기가 일치하지 않습니다. 
    ORA-07368 sfofi: 열기 오류, 화일을 열 수가 없습니다. 
    ORA-07369 sfcfi: 닫기 오류, 데이타베이스 화일을 닫을 수 없습니다. 
    ORA-07370 sfrfb: 부당한 블록 번호 
    ORA-07371 sfrfb: lseek 오류, 요구된 블록을 찾을 수 없습니다. 
    ORA-07372 sfrfb: 읽기 오류, 요구된 블록을 데이타베이스 화일에서 읽을 수 없습니다. 
    ORA-07373 sfrfb: 읽기시 잘못된 수의 바이트가 리턴되었습니다. 
    ORA-07374 sfwfb: 부당한 블록 번호 
    ORA-07375 sfwfb: lseek 오류, 요구된 블록을 찾을 수 없습니다. 
    ORA-07376 sfwfb: 기록 오류, 데이타베이스 블록에 기록할 수 없습니다. 
    ORA-07377 sfwfb: 쓰기시 잘못된 수의 바이트가 리턴되었습니다. 
    ORA-07378 sfcmf: 변환 오류, 화일명을 확장할 수 없습니다. 
    ORA-07379 sfcmf: 새로운 화일이 존재합니다. 
    ORA-07380 sfcmf: 변환 오류, 기존의 화일명을 확장할 수 없습니다. 
    ORA-07381 sfccf: 변환 오류, 화일명을 확장할 수 없습니다. 
    ORA-07382 sfifi: 변환 오류, 화일명을 확장할 수 없습니다. 
    ORA-07383 sfgfs: 함수가 잘못된 인수로 요구되었습니다. 
    ORA-07384 sfgfn: 함수가 잘못된 인수로 요구되었습니다. 
    ORA-07385 sfcfi: 함수가 잘못된 인수로 요구되었습니다. 
    ORA-07386 sfrfb: 함수가 잘못된 인수로 요구되었습니다. 
    ORA-07387 sfwfb: 함수가 잘못된 인수로 요구되었습니다. 
    ORA-07388 sfccf: 재사용이 지정되었으나 화일이 존재하지 않습니다. 
    ORA-07389 sfccf: 열기 오류, 재사용하기 위해 화일을 열 수 없습니다. 
    ORA-07390 sftopn: 변환 오류, 화일명을 변환할 수 없습니다. 
    ORA-07391 sftopn: fopen 오류, 텍스트 화일을 열 수 없습니다. 
    ORA-07392 sftcls: fclose 오류, 텍스트 화일을 닫을 수 없습니다. 
    ORA-07393 sfccf: 화일 불일치, 다른크기의 화일을 재사용하려 했습니다. 
    ORA-07394 sfccf: 화일 불일치, 다른 블록크기의 화일을 재사용하려 했습니다. 
    ORA-07395 sfccf: 부당한 옵션으로 화일이 재사용되었습니다. 
    ORA-07396 sfccf: lseek 오류, 재사용 화일의 시작위치를 찾을 수 없습니다. 
    ORA-07397 sfccf: 읽기 오류, 화일의 헤더블록을 읽을 수 없습니다. 
    ORA-07398 sfccf: 부당한 헤더 정보, 화일이 정당한 데이타베이스 화일이 아닙니다. 
    ORA-07399 sfccf: 화일이 존재합니다. 
    ORA-07400 slemtr: 메시지 화일의 변환명이 너무 깁니다. 
    ORA-07401 sptrap: 사용자의 예외 처리기를 복원할 수 없습니다. 
    ORA-07402 sprst: 사용자의 신호 처리기를 복원할 수 없습니다. 
    ORA-07403 sfanfy: db_writers 파라미터가 정당하지 않습니다. 
    ORA-07404 sfareq: 요구가 종료하기를 기다리는 동안 타임아웃 됐습니다. 
    ORA-07405 sfcfi: 데이타베이스 기록자중 하나에서 닫기실패 
    ORA-07406 slbtpd: 부당한 번호입니다. 
    ORA-07407 slbtpd: 부당한 지수입니다. 
    ORA-07408 slbtpd: 팩형 십진수로 변환시 오버플로우 
    ORA-07409 slpdtb: 잘못된 팩형 십진수 
    ORA-07410 slpdtb: 제공된 버퍼에 비해 수치가 너무 큽니다. 
    ORA-07411 slgfn: 제공된 버퍼에 비해 패스명이 너무 깁니다. 
    ORA-07412 sfaslv: 비동기 기록 배열 엔트리의 획득오류 
    ORA-07413 sfcopy: 원천과 수신 논리블록 크기가 일치하지 않습니다. 
    ORA-07414 sfcopy: 메모리 버퍼의 할당실패 
    ORA-07415 slpath: 메모리 버퍼의 할당실패 
    ORA-07416 slpath: 패스명의 구성실패; 결과 버퍼 영역이 부족합니다. 
    ORA-07417 sfareq: 하나 이상의 데이타베이스 기록자가 가동중이 아닙니다. 
    ORA-07418 sfareq: 데이타베이스 기록자가 timing 함수내에 오류를 가집니다. 
    ORA-07419 sfareq: 데이타베이스 기록자가 timing 함수내에 오류를 가집니다. 
    ORA-07420 sfccf: 부당한 화일형니다. 
    ORA-07421 sfcopy: 복제시 원본 화일의 읽기에 실패했습니다. 
    ORA-07422 sfcopy: 복제시 수신 화일의 쓰기에 실패했습니다. 
    ORA-07423 sfrfb: 버퍼가 적절하게 정렬(align)되지 않아서 읽기에 실패했습니다. 
    ORA-07424 sfwfb: 버퍼가 적절하게 정렬(align)되지 않아서 쓰기에 실패했습니다. 
    ORA-07425 sdpri: dump 화일 위치 해석시 오류 %s가 발생했습니다. 
    ORA-07426 spstp: dbs 디렉토리의 위치를 찾을 수 없습니다. 
    ORA-07427 spstp: dbs로 디렉토리를 변경할 수 없습니다. 
    ORA-07428 smsgsg: ftok()가 sga에 대한 키의 계산시 오류를 리턴했습니다. 
    ORA-07429 smsgsg: shmget()이 세그먼트를 얻는데 실패했습니다. 
    ORA-07430 smsgsg: 계산된 키와 저장된 키가 일치하지 않습니다. 
    ORA-07431 실패된 포크 
    ORA-07432 이미 자고 있는 것을 또 다시 수행할 수 없습니다. 
    ORA-07433 sfrnms: 미러쪽 상태 파라미터가 부적당합니다. 
    ORA-07434 sfgmsn: 미러쪽 상태 파라미터가 부적당합니다. 
    ORA-07435 부적당한 파라미터가 함수를 테스트하는데 보내졌습니다. 
    ORA-07440 WMON 프로세스가 오류와 함께 종료되었습니다. 
    ORA-07441 함수 주소는 %s 바이트 경계선에서 정렬되어야 합니다. 
    ORA-07442 함수 주소는 %s 에서 %s 범위에 있어야 합니다. 
    ORA-07443 함수 %s 가 없습니다. 
    ORA-07444 함수 주소 %s 은 읽기가능한 것이 아닙니다. 
    ORA-07445 예외 발견: 코아 덤프 [%s] [%s] [%s] [%s] [%s] [%s] 
    ORA-07446 sdnfy: 잘못된 %s값이 %s 파라미터에 있습니다. 
    ORA-07447 ssarena: usinit 실패 
    ORA-07448 ssarena: 공유 영역의 최대수를 초과했습니다. 
    ORA-07449 sc: usnewlock 실패 
    ORA-07450 sms1sg: vm_mapmem 오류, 공유메모리를 생성할 수 없습니다. 
    ORA-07451 sms1sg: 공유된 메모리에 틀린 번지가 첨부되었습니다. 
    ORA-07452 sms1sg: SGA 형질 변경에 실패했습니다. 
    ORA-07453 smsmat: vm_mapmem 오류, 공유메모리를 생성할 수 없습니다. 
    ORA-07454 smsmat: 공유된 메모리에 틀린 번지가 첨부되었습니다. 
    ORA-07455 smsmat: SGA 형질 변경에 실패했습니다. 
    ORA-07456 smsmax: 클러스터 크기를 얻을 수 없습니다. 
    ORA-07457 smsdes: sgadef.dbf 화일명의 해석 실패 
    ORA-07458 smsdes: 닫기 오류, sgadef.dbf를 닫을 수가 없습니다. 
    ORA-07459 smsvmfcre: sgadef.dbf 화일명의 해석 실패 
    ORA-07460 smsvmfcre: SGA 생성시 sgadef.dbf 화일이 이미 존재합니다. 
    ORA-07461 smsvmfcre: sgadef.dbf 화일의 생성 실패 
    ORA-07462 smsget: sgadef.dbf 화일명의 해석 오류 
    ORA-07463 smsget: sgadef@.dbf 화일의 열기 오류 
    ORA-07464 smsget: SGA 첨부 시도중 vm_mapmem 혹은 vm_allocate 오류. 
    ORA-07465 smsget: 공유된 메모리에 틀린 번지가 첨부되었습니다. 
    ORA-07466 smsget: SGA의 상속 세그먼트를 변경하는데 실패했습니다. 
    ORA-07467 smsget: 닫기 오류, sgadef.dbf를 닫을 수가 없습니다. 
    ORA-07468 spwat: mset 오류, 세마포를 설정할 수 없습니다. 
    ORA-07469 sppst: mclear 오류, 세마포를 소거할 수 없습니다. 
    ORA-07470 snclget: 클러스터 번호를 얻을 수 없습니다. 
    ORA-07471 snclrd: sgadef.dbf 화일명의 해석 오류 
    ORA-07472 snclrd: sgadef.dbf 화일의 열기 오류 
    ORA-07473 snclrd: sgadef.dbf 화일의 읽기 시도중 읽기 오류 
    ORA-07474 snclrd: 닫기 오류, sgadef.dbf 화일을 닫을 수가 없습니다. 
    ORA-07475 slsget: vm 통계를 얻을 수가 없습니다. 
    ORA-07476 slsget: 메모리의 맵(map) 통계를 얻을 수가 없습니다. 
    ORA-07477 scgcmn: 잠금 관리자가 초기화되지 않았습니다. 
    ORA-07478 scgcmn: 잠금 상태를 얻을 수가 없습니다. 
    ORA-07479 scgcmn: 잠금을 열거나 전환할 수 없습니다. 
    ORA-07480 snchmod: ?/dbs/sgalm.dbf에 대한 허가를 변경할 수 없습니다. 
    ORA-07481 snlmatt: 잠금 관리자 인스턴스에 첨부할 수 없습니다. 
    ORA-07482 snlmini: 잠금 관리자 인스턴스를 생성할 수 없습니다. 
    ORA-07483 snlkget: 잠금을 변환(get)할 수 없습니다. 
    ORA-07484 snlkput: 잠금을 변환(put)할 수 없습니다. 
    ORA-07485 scg_get_inst: 인스턴스 번호 잠금을 열 수 없습니다. 
    ORA-07486 scg_get_inst: 인스턴스 번호 잠금을 변환(get)할 수 없습니다. 
    ORA-07487 scg_init_lm: 잠금 관리자 인스턴스를 생성할 수 없습니다. 
    ORA-07488 scgrcl: 잠금 관리자가 초기화되지 않았습니다. 
    ORA-07489 scgrcl: 잠금 상태를 얻을 수가 없습니다. 
    ORA-07490 scgrcl: 잠금을 변환할 수 없습니다. 
    ORA-07491 scgrcl: 잠금 요구를 취소할 수 없습니다. 
    ORA-07492 scgrcl: 잠금을 닫을 수 없습니다. 
    ORA-07493 scgrcl: 잠금 매니져 오류 
    ORA-07494 scgcm: 예기치못한 오류 
    ORA-07495 spwat: lm_wait 실패 
    ORA-07496 sppst: lm_post 실패 
    ORA-07497 sdpri: 추적화일 %s를 생성할 수 없음; 오류번호 = %s 
    ORA-07498 spstp: /dev/resched를 열 수 없습니다. 
    ORA-07499 spglk: 재스케줄할 수 없습니다. 
    ORA-07500 scglaa: $cantim 예기치않은 리턴 
    ORA-07501 scgtoa: $deq 예기치 않은 리턴 
    ORA-07502 scgcmn: $enq 예기치 않은 리턴 
    ORA-07503 scgcmn: $setimr 예기치 않은 리턴 
    ORA-07504 scgcmn: $hiber 예기치 않은 리턴 
    ORA-07505 scggt: $enq 부모 잠금에 예기치 않은 리턴 
    ORA-07506 scgrl: lockid %s에 $deq라는 예기치 않은 리턴 
    ORA-07507 scgcm: 예기치 않은 잠금 상태 조건 
    ORA-07508 scgfal: $deq 모든 예기치 않은 리턴 
    ORA-07509 scgfal: $deq 부모 잠금에 예상치 못한 리턴 
    ORA-07510 scgbrm: lockid %s에 넘어온 $getlki가 잘못 되었습니다. 
    ORA-07511 sscggtl: $enq가 마스터 종료 잠금에 대해서 잘못되었습니다. 
    ORA-07512 sscggtl: $enq가 클라이언트 종료 잠금에 대해서 잘못되었습니다. 
    ORA-07513 sscgctl: $deq가 종료 잠금의 취소에서 잘못되었습니다. 
    ORA-07514 scgcan: 잠금을 취소할때 $deq가 잘못되었습니다. 
    ORA-07515 sfccf: UIC 그룹 <= MAXSYSGROUP - 화일 작업이 허용되지 않습니다. 
    ORA-07516 sfccf: $open 화일 오류 
    ORA-07517 sfccf: 존재하는 화일크기가 지정된 화일크기와 일치하지 않습니다. 
    ORA-07518 sfccf: 부적합한 화일 생성 옵션 
    ORA-07519 sfccf: 화일 소유 그룹 <= MAXSYSGROUP 이므로 REUSE가 허용되지 않습니다. 
    ORA-07520 sfccf: 부적합한 논리 블록 크기 
    ORA-07521 sfccf: $create 화일 오류 
    ORA-07522 sfccf: 새로운 화일이 존재합니다. 
    ORA-07523 sfccf: $connect 오류 
    ORA-07524 sfccf: $write (zero file) 오류 
    ORA-07525 sfccf: $close 오류 
    ORA-07526 sfifi: 부적합한 논리 블록 크기 
    ORA-07527 sfifi: UIC 그룹 <= MAXSYSGROUP - 화일 작업이 허용되지 않습니다. 
    ORA-07528 sfifi: $open 오류 
    ORA-07529 sfifi: $close 오류 
    ORA-07530 sfofi: $open 오류 
    ORA-07531 ssfccf: $DISPLAY 오류 
    ORA-07532 sfcfi: $dassgn 오류 
    ORA-07533 sfifi: 화일 소유 그룹 <= MAXSYSGROUP 이므로 화일을 열 수 없습니다. 
    ORA-07534 scginq: lockid %s에서 $getlki 예기치 않은 리턴 
    ORA-07535 sfrfb: 부적절한 논리 블록 수 
    ORA-07536 sfrfb: $qio(read) 오류 
    ORA-07537 sfccf: 화일 소유 그룹 <= MAXSYSGROUP 이므로 화일을 생성할 수 없습니다. 
    ORA-07538 sfsgrow: $qiow 실패 
    ORA-07539 sfqioini: $qio 오류 
    ORA-07540 sfqioast: 비정상적으로 비동기 디스트 I/O에 작업이 완성되었습니다. 
    ORA-07541 sfifi: 길이가 영인 화일을 식별할 수 없습니다. 
    ORA-07542 sfccf: 화일의 최상위 버전외에는 생성-재사용을 할 수 없습니다. 
    ORA-07543 sfrfb: 길이가 영인 화일을 판독할 수 없습니다. 
    ORA-07544 sfqio: 성공적으로 비동기식 I/O가 완성되지 않았습니다. 
    ORA-07545 sfcmf: $PARSE 실패 (화일명 구문) 
    ORA-07546 sfcmf: 새로운 화일이 존재합니다. 
    ORA-07547 sfcmf: $OPEN 실패 
    ORA-07548 sftopn: 최대 화일수가 이미 열려 있습니다. 
    ORA-07549 sftopn: $OPEN 실패 
    ORA-07550 sftopn: $CONNECT 실패 
    ORA-07551 sftcls: $CLOSE 실패 
    ORA-07552 sftget: $GET 실패 
    ORA-07553 sfofi: 개방할 화일이 없습니다. 
    ORA-07554 sfcopy: 원천과 수신 논리블록의 크기가 일치해야 합니다. 
    ORA-07555 sfqioast: 부적합한 미결 값 
    ORA-07556 sfotf: $create 오류 
    ORA-07557 ssfctf: 테이프 화일에 지역 블록 크기 지정이 부적합합니다. 
    ORA-07558 ssfctf: $create 오류 
    ORA-07559 sfdone: 성공적으로 비동기식 I/O가 완성되지 않았습니다. 
    ORA-07560 sltln: $trnlog 오류 
    ORA-07561 szprv: $IDTOASC 실패 
    ORA-07562 sldext: 확장자는 3자 이어야 합니다. 
    ORA-07563 sldext: $PARSE 실패 
    ORA-07564 sldext: 화일명 또는 확장자에 와일드 카드(wildcard) 
    ORA-07565 sldext: $SEARCH 실패 
    ORA-07568 slspool: $OPEN 실패 
    ORA-07569 slspool: $CLOSE 실패 
    ORA-07570 szrfc: $IDTOASC 실패 
    ORA-07571 szrfc: $FIND_HELD 실패 
    ORA-07572 szrfc: 불 충분한 롤명 버퍼 공간 
    ORA-07573 slkhst: 호스트 연산을 수행할 수 없습니다. 
    ORA-07574 szrfc: $GETUAI 실패 
    ORA-07576 sspexst: 프로세스 %s 번호에 $GETJPIW 실패 
    ORA-07577 권한 화일에 그런 사용자가 없습니다. 
    ORA-07578 szprv: $FIND_HELD 실패 
    ORA-07579 spini: $DCLEXH 실패 
    ORA-07580 spstp: $GETJPIW 실패 
    ORA-07581 spstp: 미확인 프로세스명에서 SID를 얻을 수 없습니다. 
    ORA-07582 spstp: ORA_SID 가 부적합한 값을 가집니다. 
    ORA-07584 spdcr: ORA_sid_(proc_)PQL$_item에 대한 부적절한 값입니다. 
    ORA-07585 spdcr: $PARSE 실패 
    ORA-07586 spdcr: $SEARCH 실패 
    ORA-07587 spdcr: $CREPRC 실패 
    ORA-07588 spdcr: $GETJPIW가 이미지 이름을 얻는데 실패 
    ORA-07589 spdde: 시스템 id가 설정되지 않았습니다. 
    ORA-07590 spdde: $DELPRC 실패 
    ORA-07591 spdde: $GETJPIW 실패 
    ORA-07592 sspgprv: 필요한 권한의 획득시 오류 
    ORA-07593 ssprprv: 권한의 해제시 오류 
    ORA-07594 spiip: $GETJPIW 실패 
    ORA-07595 sppid: $GETJPIW 실패 
    ORA-07596 sptpa: $GETJPIW 실패 
    ORA-07597 spguns: $GETJPIW 실패 
    ORA-07598 spwat: $SETIMR 실패 
    ORA-07599 spwat: $SCHDWK 실패 
    ORA-07600 spwat: $GETSYIW 실패 
    ORA-07601 spguno: $GETJPIW 실패 
    ORA-07602 spgto: $GETJPIW 실패 
    ORA-07605 spdba: $ASCTOID 실패 
    ORA-07606 spdba: $CHKPRO 실패 
    ORA-07607 szaud: $SNDOPR 실패 
    ORA-07608 szprv: $GETUAI 실패 
    ORA-07609 szprv: $HASH_PASSWORD 실패 
    ORA-07610 $GETJPIW가 사용자의 MAC 권한을 검색하는데 실패했습니다. 
    ORA-07612 $GETUAI가 사용자의 해제 레벨을 검색하는데 실패했습니다. 
    ORA-07613 $GETJPIW가 사용자의 프로세스 레이블을 검색하는데 실패했습니다. 
    ORA-07614 $CHANGE_CLASS가 사용자의 프로세스 레이블을 검색하는데 실패했습니다. 
    ORA-07615 $CHANGE_CLASS가 지정된 화일 레이블을 검색하는데 실패했습니다. 
    ORA-07616 $CHANGE_CLASS가 지정된 디바이스 레이블을 검색하는데 실패했습니다. 
    ORA-07617 $FORMAT_CLASS가 이진 레이블을 스트링으로 변환하는데 실패했습니다. 
    ORA-07618 $IDTOASC가 보안 레벨 변환에 실패했습니다. 
    ORA-07619 $IDTOAS가 무결성 레벨 변환에 실패했습니다. 
    ORA-07620 smscre: 부적절한 데이타베이스 블록 크기 
    ORA-07621 smscre: 부적절한 재실행 블록 크기 
    ORA-07622 smscre: $CREATE 실패 
    ORA-07623 smscre: $CRMPSC 실패 
    ORA-07624 smsdes: $DBGLSC 실패 
    ORA-07625 smsget: $MGBLSC 실패 
    ORA-07626 smsget: sga가 이미 맵(map)되었습니다. 
    ORA-07627 smsfre: $CRETVA 실패 
    ORA-07628 smsfre: sga가 맵(map)되지 않았습니다. 
    ORA-07629 smpall: $EXPREG 실패 
    ORA-07630 smpdal: $DELTVA 실패 
    ORA-07631 smcacx: $EXPREG 실패 
    ORA-07632 smsrcx: $DELTVA 실패 
    ORA-07633 smsdbp: 부적합한 프로텍션 값입니다. 
    ORA-07634 smsdbp: $CRETVA 실패 
    ORA-07635 smsdbp: $SETPRT 실패 
    ORA-07636 smsdbp: $MGBLSC 실패 
    ORA-07637 smsdbp: sga 생성시 버퍼 보호옵션이 지정되지 않았습니다. 
    ORA-07638 smsget: SGA 패드(pad) 영역이 생성된 SGA에 비해 충분히 크지않습니다. 
    ORA-07639 smscre: SGA 패드(pad) 영역이 충분히 크지않습니다(%s 바이트 필요) 
    ORA-07640 smsget: SGA가 아직 유효하지 않음. 초기화가 진행중입니다. 
    ORA-07641 smscre: SGA에 시스템 페이지화일을 사용할 수 없습니다. 
    ORA-07642 smprtset: $CMKRNL 실패 
    ORA-07643 smsalo: 부적절한 SMSVAR 
    ORA-07645 sszfsl: $CHANGE_CLASS 실패 
    ORA-07646 sszfck: $CREATE 실패 
    ORA-07647 sszfck: $OPEN 실패 
    ORA-07650 sigunc: $GETJPIW 실패 
    ORA-07655 slsprom:$TRNLOG 실패 
    ORA-07656 slsprom:$GETDVI 실패 
    ORA-07657 slsprom:$ASSIGN 실패 
    ORA-07658 slsprom:$QIOW 읽기 실패 
    ORA-07665 ssrexhd: 순환 오류가 발생했습니다%s %s %s %s %s %s 
    ORA-07670 $IDTOASC가 보안 카테고리 변환에 실패했습니다. 
    ORA-07671 $IDTOASC가 무결성 카테고리 변환에 실패했습니다. 
    ORA-07672 $PARSE_CLASS가 스트링을 이진 레이블로 변환하는데 실패했습니다. 
    ORA-07680 sou2os: 현재 ORACLE로의 다른 호출이 수행되고 있습니다. 
    ORA-07681 sou2os: Oracle을 초기화 할때 오류가 발생했습니다. 
    ORA-07682 sou2os: 커널 디스패치 설정 실패 오류 
    ORA-07683 sou2os: $SETPRV 재설정 오류 
    ORA-07684 sou2os: 슈퍼바이져 스택 재설정 오류 
    ORA-07685 sou2os: 슈퍼바이져 스택 설정 오류 
    ORA-07700 soarch: 인터럽트를 받았습니다. 
    ORA-07701 soatln: 내부적인 예외 상황: 출력 버퍼가 너무 작습니다. 
    ORA-07702 아카이브내에 인식할 수 없는 디바이스 유형입니다. 
    ORA-07703 아카이브 텍스트내에 오류: 디바이스 유형 다음에 /가 있어야 합니다. 
    ORA-07704 아카이브 텍스트내에 오류: 디바이스 이름 다음에 :가 있어야 합니다. 
    ORA-07705 sksaprs: 디바이스명 버퍼가 너무 작습니다. 
    ORA-07706 아카이브 텍스트내에 오류: 디스크 화일명을 필요로합니다. 
    ORA-07707 아카이브 텍스트내에 오류: 테이프 레이블명을 필요로합니다. 
    ORA-07708 soaprs: 테이프 레이블 이름 버퍼가 너무 작습니다. 
    ORA-07709 sksaprs: 원격 호스트에 아카이빙이 허용되지 않습니다. 
    ORA-07710 soaprs: 화일 이름 버퍼가 너무 작습니다. 
    ORA-07713 sksamtd: 아카이벌 디바이스를 마운트할 수 없습니다(SYS$MOUNT 실패) 
    ORA-07715 sksadtd: 아카이벌 디바이스를 디스마운트할 수 없습니다(SYS$DISMNT 실패) 
    ORA-07716 sksachk: ARCHIVE를 위한 잘못된 디바이스 명시 
    ORA-07717 sksaalo: 메모리 할당시 오류 
    ORA-07718 sksafre: 메모리 회수(freeing)시 오류 
    ORA-07721 scgcm: 시스템 엔큐를 얻기 위한 OS 자원이 충분하지 않습니다. 
    ORA-07740 slemop: 부정확한 처리 크기 (프로그래밍 오류) 
    ORA-07741 slemop: $OPEN 실패 
    ORA-07742 slemop: $CONNECT 실패 
    ORA-07743 slemop: 부정확한 오류 화일 크기 
    ORA-07744 slemcl: 부정확한 오류 메시지 화일 처리입니다. 
    ORA-07745 slemcl: $CLOSE 실패 
    ORA-07746 slemrd: 부정확한 오류 메시지 화일 처리입니다. 
    ORA-07747 slemrd: $READ 실패 
    ORA-07750 slemcr: fopen 실패 
    ORA-07751 slemcr: malloc 실패 
    ORA-07753 slemcf: 쓰기가 실패전에 fseek를 시도 
    ORA-07754 slemcf: fwrite 실패 
    ORA-07755 slemcf: 읽기가 실패전에 fseek 
    ORA-07756 slemcf: fread 실패 
    ORA-07757 slemcc: 부적절한 처리 
    ORA-07758 slemcw: 부적절한 처리 
    ORA-07759 slemtr: 부적절한 수신지 
    ORA-07760 slemtr: $open 실패 
    ORA-07800 slbtpd: 부적절한 수치 
    ORA-07801 slbtpd: 부적절한 지수 
    ORA-07802 slbtpd: 팩형 십진수로 변환시 오버플로우 
    ORA-07803 slpdtb: 부적절한 팩형 십진수 니블 
    ORA-07804 slpdtb: 제공된 버퍼에 비해서 수치가 너무 큽니다. 
    ORA-07820 sspscn: SYS$CRELNM 실패 
    ORA-07821 sspsdn: SYS$DELLNM 실패 
    ORA-07822 spsscm: SYS$CREMBX 실패 
    ORA-07823 spssqr: $QIO 실패 
    ORA-07824 spsain: $SETIMR 실패 
    ORA-07825 spssck: AST 레이블 에서의 $QIO 실패 
    ORA-07826 spsscm: SYS$GETDVIW 실패 
    ORA-07840 sllfop: LIB$GET_VM 실패 
    ORA-07841 sllfop: SYS$OPEN 실패 
    ORA-07842 sllfcl: SYS$CLOSE 실패 
    ORA-07843 sllfcl: LIB$FREE_VM 실패 
    ORA-07844 sllfop: LIB$GET_VM 실패 
    ORA-07845 sllfcl: LIB$FREE_VM 실패 
    ORA-07846 sllfop: %s 바이트의 레코드 버퍼가 %s 바이트의 사용자 버퍼에 비해 너무 큽니다. 
    ORA-07847 sllfop: $CONNECT 실패 
    ORA-07848 sllfrb: $GET 실패 
    ORA-07849 sllfsk: $GET 실패 
    ORA-07850 sllfop: 틀린 옵션 
    ORA-07860 osnsoi: 인터럽트 처리기를 셋업할때 오류가 발생했습니다. 
    ORA-07861 sfqio: 판독만 되는 화일에다 기록을 할수 없습니다. 
    ORA-07862 sfqio: 화일을 확장할 수 없습니다. 
    ORA-07880 sdopnf: 내부 오류 
    ORA-08000 세션 시퀀스 리스트의 최대수를 초과했습니다. 
    ORA-08001 세션당 최대 시퀀스의 수를 초과했습니다. 
    ORA-08002 시퀀스 %s.CURRVAL은 이 세션에서는 정의 되어 있지 않습니다. 
    ORA-08003 시퀀스 %s.NEXTVAL 은 내부 한계를 초과했습니다. 
    ORA-08004 시퀀스 %s.NEXTVAL %s %sVALUE 은 사례로 될 수 없습니다. 
    ORA-08005 지정된 행이 존재하지 않습니다. 
    ORA-08006 지정된 행은 더 이상 존재하지 않습니다. 
    ORA-08008 다른 인스턴스가 USE_ROW_ENQUEUES = %s 로 마운트했습니다. 
    ORA-08100 부적합한 색인입니다 진단에 대해서는 추적 화일을 참조하십시오 
    ORA-08101 색인 키가 존재하지 않습니다 루트 dba %s, dba %s(%s) 
    ORA-08102 색인 키가 없습니다 obj# %s, dba %s(%s) 
    ORA-08103 개체가 더이상 존재하지 않습니다. 
    ORA-08175 별개의 트랜잭션 제약이 위배되었습니다 (%s) 
    ORA-08176 일관된 읽기가 실패; 롤백 데이타를 사용할 수 없습니다. 
    ORA-08177 이 트랜잭션에 대한 직렬화 액세스를 할 수 없습니다. 
    ORA-08200 scggc: 잠금을 여는데 실패했습니다. 
    ORA-08201 scggc: 잠금을 변환하는데 실패했습니다. 
    ORA-08202 scggc: 잠금을 닫는데 실패했습니다. 
    ORA-08203 scgcan: 미결의 변환 요구를 취소하는데 실패했습니다. 
    ORA-08204 scgcm: 예기치 않은 잠금 관리자 리턴 코드입니다. 
    ORA-08205 ora_addr: 환경에 $ORACLE_SID가 설정되지 않았습니다. 
    ORA-08206 ora_addr: 주소 화일 이름을 변환할 수 없습니다. 
    ORA-08207 ora_addr: 주소 화일을 열 수 없습니다. 
    ORA-08208 ora_addr: 주소 화일로부터 읽을 수 없습니다. 
    ORA-08209 scngrs: SCN은 아직 초기화되지 않았습니다. 
    ORA-08210 I/O 오류가 요구되었습니다. 
    ORA-08211 sfgcwd: 현재 작업 디렉토리를 얻을 수 없습니다. 
    ORA-08212 sfphys: 화일 이름을 변환할 수 없습니다. 
    ORA-08213 sfphys: 화일이름을 stat 할 수 없습니다. 
    ORA-08214 sfccf: SID가 너무 깁니다. 
    ORA-08215 sfccf: 유효하지 않은 논리 블록 크기입니다. 
    ORA-08216 sfccf: 화일 이름을 변환할 수 없습니다. 
    ORA-08217 sfccf: 화일을 재사용할 수 없습니다. 
    ORA-08218 sfccf: 화일을 생성할 수 없습니다 화일이 존재합니다. 
    ORA-08219 sfccf: 화일을 만들 수 없습니다. 
    ORA-08220 sfccf: 재사용하기 위한 작성에 실패했습니다. 
    ORA-08221 sfccf: 내부 오류; 잘못된 사용 옵션 
    ORA-08222 sfccf: 화일을 fstat 할 수 없습니다. 
    ORA-08223 sfccf: 재사용을 위한 작성시 화일 크기가 유효하지 않습니다. 
    ORA-08224 sfccf: 논리 블록 크기가 유효하지 않습니다. 
    ORA-08225 sfccf: 화일을 ftruncate 할 수 없습니다. 
    ORA-08226 sfccf: 지움이 실패했습니다. 
    ORA-08227 sfifi: 화일 이름을 변환할 수 없습니다. 
    ORA-08228 sfifi: 화일명을 stat 할 수 없습니다. 
    ORA-08229 sfifi: 유효하지 않은 논리 블록 크기 
    ORA-08230 smscre: SGA 할당에 실패했습니다. 
    ORA-08231 smscre: SGA에 첨부할수 없습니다. 
    ORA-08232 smsdes: SGA로부터 분리할 수 없습니다. 
    ORA-08233 smsdes: SGA를 unmap 할 수 없습니다. 
    ORA-08234 smsget: 인스턴스 리스너 주소를 가지고 올 수 없습니다. 
    ORA-08235 smsget: 이 노드에 리스너가 없습니다. 
    ORA-08236 smsget: 리스너와 함께 서브큐브를 공유할 수 없습니다. 
    ORA-08237 smsget: SGA 영역이 아직 생성되지 않았습니다. 
    ORA-08238 smsfre: SGA로부터 분리 할 수 없습니다. 
    ORA-08240 snlmatt: 병렬 서버 이름이 너무 깁니다. 
    ORA-08241 snlmatt: 잠금 관리자에 첨부할 수 없습니다. 
    ORA-08242 snlmdet: 잠금 관리자로부터 분리할 수 없습니다. 
    ORA-08243 soarch: 이름서버를 열 수 없습니다. 
    ORA-08244 soarch: 온라인 로그 화일을 읽기용으로 열 수 없습니다. 
    ORA-08245 soarch: 아카이브 수신 화일을 생성할 수 없습니다. 
    ORA-08246 soarch: 아카이브 수신 화일을 읽기용으로 열 수 없습니다. 
    ORA-08247 soarch: 아카이브 서버에 연결할 수 없습니다. 
    ORA-08248 soarch: 아카이브 서버가 실패 
    ORA-08249 soarch: 일부를 서버에게 보내는데 실패했습니다. 
    ORA-08250 soarch: ORACLE_PSRV가 정의되지 않았습니다. 
    ORA-08251 soarch: 아카이벌이 중단되었습니다. 
    ORA-08260 ora_addr: 이름서버를 열 수 없습니다. 
    ORA-08261 ora_addr: 이름서버에서 이름을 찾을 수 없습니다. 
    ORA-08262 ora_addr: ORACLE_PSRV 가 정의되지 않았습니다. 
    ORA-08263 ora_addr: 리스너 주소를 해제할 수 없습니다. 
    ORA-08264 ora_addr: 이름서버를 닫을 수 없습니다. 
    ORA-08265 create_ora_addr: 이름서버를 열 수 없습니다. 
    ORA-08266 create_ora_addr: 이름서버에 이름을 등록할 수 없습니다. 
    ORA-08267 destroy_ora_addr: 이름서버를 닫을 수 없습니다. 
    ORA-08268 create_ora_addr: 이름서버를 닫을 수 없습니다. 
    ORA-08269 destroy_ora_addr: 이름을 삭제할 수 없습니다. 
    ORA-08270 soachk: 아카이벌 제어 스트링이 부적합합니다. 
    ORA-08271 soabln: 아카이브 제어 스트링에 대한 버퍼 크기가 충분하지 않습니다. 
    ORA-08272 soarch: 아카이브 제어 스트링에 대한 버퍼 크기가 충분하지 않습니다. 
    ORA-08274 환경 변수를 위한 메모리가 부족합니다. 
    ORA-08275 환경 변수가 설정되지 않았습니다. 
    ORA-08276 이름서버에 pid를 위한 공간이 없습니다. 
    ORA-08277 환경 변수를 설정할 수 없습니다. 
    ORA-08278 CPU 통계를 얻을 수 없습니다. 
    ORA-08279 sfsrd: 읽기 장소를 찾을 수 없습니다. 
    ORA-08281 sfofi: 화일을 열 수 없습니다. 
    ORA-08282 sfcfi: 화일을 닫을 수 없습니다. 
    ORA-08283 sfrfb: 블록 수가 유효하지 않습니다 내부 오류 
    ORA-08284 sfrfb: 정렬되지 않은 버퍼입니다; 내부 오류 
    ORA-08285 sfrfb: 읽기 장소를 찾을 수 없습니다. 
    ORA-08286 sfrfb: 읽기 실패 
    ORA-08287 sfcmf: 대상 화일 이름을 바꿀 수 없습니다. 
    ORA-08288 sfcmf: 소스 화일 이름을 바꿀 수 없습니다. 
    ORA-08289 sfcopy: 화일들이 서로 다른 블록 크기를 가지고 있습니다. 
    ORA-08290 sfcopy: 복사를 위한 버퍼를 malloc 할 수 없습니다. 
    ORA-08291 sfcopy: 복사중에 읽기가 실패했습니다. 
    ORA-08292 sfcopy: 복사중에 쓰기가 실패했습니다. 
    ORA-08293 sfnfy: ulimit 실패 
    ORA-08294 sfsrd: 블록 수가 잘못되었습니다; 내부 오류 
    ORA-08295 sfsrd: 읽기가 너무 큽니다. 
    ORA-08296 sfsrd: 읽기 실패 
    ORA-08297 sfsrd: 읽기가 잘못된 바이트 수를 리턴 했습니다. 
    ORA-08298 sfsync: 기가캐쉬 동기화 실패 
    ORA-08299 sfsync: 기가캐쉬 화일 동기화 실패 
    ORA-08300 sfq_clean1: 비동기 I/O 실패 
    ORA-08301 sfdone: 비동기 I/O 실패 
    ORA-08302 sfqio: 내부 오류 
    ORA-08303 sfqio: 비동기 I/O 벡터를 malloc할 수 없습니다. 
    ORA-08304 sfqio: 부적절한 블록 수; 내부 오류 
    ORA-08305 sfqio: 정렬되지 않은 버퍼; 내부 오류 
    ORA-08306 sfqio: I/O 제어 플래그를 설정할 수 없습니다. 
    ORA-08307 sfqio: 비동기 I/O 요구를 제안할 수 없습니다. 
    ORA-08308 sllfop: 화일을 열 수 없습니다. 
    ORA-08309 sllfop: 화일을 fstat할 수 없습니다. 
    ORA-08310 sllfop: recsize에 대한 값이 잘못되었습니다. 
    ORA-08311 sllfop: maxrecsize에 대한 값이 잘못되었습니다. 
    ORA-08312 sllfop: 인식할 수 없는 처리 옵션 
    ORA-08313 sllfop: 버퍼를 할당할 수 없습니다. 
    ORA-08314 sllfcf: 화일을 닫는중 오류 발생 
    ORA-08315 sllfrb: 화일을 읽는중 오류 발생 
    ORA-08316 sllfsk: 화일에서 찾는중 오류 발생 
    ORA-08317 sllfsk: 화일에서 찾는중 오류 발생 
    ORA-08318 sllfsk: 화일을 읽는중 오류 발생 
    ORA-08319 sllfsk: 화일을 읽는중 오류 발생 
    ORA-08320 scnget: scnset 또는 scnfnd 전에 scnget을 호출합니다. 
    ORA-08321 scnmin: NOT IMPLEMENTED YET 
    ORA-08322 scnmin: 바이어스 잠금을 열기/변환하는데 실패했습니다. 
    ORA-08323 scnmin: 바이어스 잠금을 닫는데 실패했습니다. 
    ORA-08330 프린트는 지원되지 않습니다. 
    ORA-08331 대기 작업이 시간 초과되었습니다. 
    ORA-08332 지정된 롤백 세그먼트 %s를 사용할 수 없습니다. 
    ORA-08340 이 명령어는 nCUBE에서 허용되지 않고 하나의 쓰레드만 사용 되었습니다. 
    ORA-08341 nCUBE에서 이 명령어는 인스턴스 1에서만 실행될 수 있습니다. 
    ORA-08342 sropen: 재실행 서버 연결을 여는데 실패했습니다. 
    ORA-08343 srclose: 재실행 서버 연결을 닫는데 실패했습니다. 
    ORA-08344 srapp: 재실행 데이타를 재실행 서버로 보내는데 실패했습니다. 
    ORA-08360 sfccf: 화일 유형이 유효하지 않습니다. 
    ORA-08361 sfccf: 원시 디바이스에 공간이 없습니다. 
    ORA-08362 scgcm: 잠금 관리자에 메모리가 부족합니다. 
    ORA-08401 부적당한 컴파일러 이름: %s 
    ORA-08412 WMSGBSIZ에서 오류 발생, WMSGBLK의 크기가 경고 메시지에 비해 작습니다. 
    ORA-08413 %s에서 FORMAT 파라미터에 부적당한 컴파일러 유형이 있습니다. 
    ORA-08414 %s에 오류가 생겼습니다. 
    ORA-08429 디스플레이 유형 데이타로는 부적당한 디지트가 raw 데이타에 있습니다. 
    ORA-08430 raw 데이타에 선행 부호가 누락되었습니다. 
    ORA-08431 픽처에 정의되어 있는 제로들이 raw 데이타에는 없습니다. 
    ORA-08432 raw 데이타에 부적당한 부동 소숫점 데이타가 있습니다. 
    ORA-08433 raw에서 숫자로 변환하는데 부적당한 픽처 유형이 있습니다. 
    ORA-08434 raw 데이타에 부적당한 종결 부호가 있습니다. 
    ORA-08435 SIGN IS LEADING가 명세될때 PICTURE MASK의 주된 신호가 빠졌습니다. 
    ORA-08436 raw 데이타에 부적당한 부호 디지트가 있습니다. 
    ORA-08437 픽처 마스크에 부적당한 픽처 유형이 있습니다. 
    ORA-08440 raw 버퍼는 변환된 데이타를 보관하기에 너무 작습니다. 
    ORA-08441 픽처 마스크에 닫기 괄호가 누락되었습니다. 
    ORA-08443 마스크 옵션의 BLANK WHEN ZERO 절에 구문 오류입니다. 
    ORA-08444 마스크 옵션의 JUSTIFIED 절에 구문 오류입니다. 
    ORA-08445 마스크 옵션의 SIGN 절에 구문 오류입니다. 
    ORA-08446 마스크 옵션의 SYNCHRONIZED 절에 구문 오류입니다. 
    ORA-08447 마스크 옵션의 USAGE 절에 구문 오류입니다. 
    ORA-08448 DECIMAL-POINT 환경 절에 구문 오류 
    ORA-08449 픽처 마스크에 부적당한 숫자 기호가 있습니다. 
    ORA-08450 픽처 마스크의 CR 지정이 부적당합니다. 
    ORA-08451 픽처 마스크의 DB 지정이 부적당합니다. 
    ORA-08452 픽처 마스크의 E 명세가 지원되지 않습니다. 
    ORA-08453 픽처 마스크에 하나 이상의 V 기호가 지정되었습니다. 
    ORA-08454 픽처 마스크에 하나 이상의 S 기호가 지정되었습니다. 
    ORA-08455 CURRENCY SIGN 환경 절에 구문 오류 
    ORA-08456 픽처 마스크에는 부호가 없지만 마스크 옵션에 SIGN 절이 있습니다. 
    ORA-08457 SIGN 절의 SEPARATE CHARACTER 옵션에 구문 오류입니다. 
    ORA-08458 부적당한 포맷 파라미터 
    ORA-08459 부적당한 포맷 파라미터 길이 
    ORA-08460 환경 파라미터에 부적당한 환경 절 
    ORA-08462 raw 버퍼에 부적당한 데이타가 있습니다. 
    ORA-08463 십진수를 Oracle 수로 변환하는데 오버플로우가 발생했습니다. 
    ORA-08464 입력 raw 데이타가 42 자리수 이상을 포함하고 있습니다. 
    ORA-08465 입력 마스크는 32 문자보다 많이 포함하고 있습니다. 
    ORA-08466 raw 버퍼 길이 %s는 %s에 대해 너무 짧습니다. 
    ORA-08467 오라클 번호 %s로 변환하는데 오류가 있습니다. 
    ORA-08468 마스크 옵션 %s는 지원되지 않습니다. 
    ORA-08498 경고:픽처 마스크 %s는 옵션 USAGE IS %s를 무시하고 USAGE IS DISPLAY로 간주합니다. 
    ORA-08499 경고: UTL_PG에 의해 픽처 마스크 옵션 %s가 무시되었습니다 
    ORA-09700 sclin: 최대 대치수에 도달했습니다. 
    ORA-09701 scnfy: 최대 프로세스수를 초과했습니다. 
    ORA-09702 sem_acquire: 래치 세마포를 확보할 수 없습니다. 
    ORA-09703 sem_release: 래치 세마포를 해제할 수 없습니다. 
    ORA-09704 sstascre: 테스트와 세트 페이지의 생성시 ftok 오류 
    ORA-09705 spcre: 래치 세마포를 초기화할 수 없습니다. 
    ORA-09706 slsget: get_process_stats 오류 
    ORA-09707 sfccf: ORACLE_SID의 최대길이를 초과했습니다. 
    ORA-09708 soacon: 소켓을 포트로 바인드하는데 실패했습니다. 
    ORA-09709 soacon: 연결을 받아들이는데 실패했습니다. 
    ORA-09710 soarcv: 버퍼 오버플로우 
    ORA-09711 orasrv: archmon이 이미 연결되었습니다. 
    ORA-09712 orasrv: 로그 아카이버가 이미 연결되었습니다. 
    ORA-09713 soadum: 테이프로 로그를 아카이브할 수 없습니다. 
    ORA-09714 Two Task interface: puname을 획득할 수 없습니다. 
    ORA-09715 orasrv: puname을 획득할 수 없습니다. 
    ORA-09716 kslcll: 인-플럭스 램포트 래치를 고정할 수 없습니다. 
    ORA-09717 osnsui: 사용자 인터럽트 처리기의 최대수를 초과했습니다. 
    ORA-09718 osnsui: 사용자 인터럽트 처리기를 설정할 수 없습니다. 
    ORA-09719 osncui: 잘못된 처리 
    ORA-09740 slsget: 가상 메모리 영역 통계를 얻을 수 없습니다. 
    ORA-09741 spwat: 포스트 대기시 오류발생 
    ORA-09742 sppst: 포스트 하는동안 오류발생 
    ORA-09743 smscre: 공유 메모리를 첨부할 수 없습니다. 
    ORA-09744 smsget: mmap이 오류를 리턴했습니다. 
    ORA-09745 smscre: vm_allocate오류, 공유 메모리를 생성할 수 없습니다. 
    ORA-09746 smscre: 공유 메모리에 틀린 번지가 첨부되었습니다. 
    ORA-09747 pw_detachPorts: pws_detach 서버콜이 실패했습니다. 
    ORA-09748 pws_look_up: fork 실패 
    ORA-09749 pws_look_up: 포트 찾기 실패 
    ORA-09750 pw_attachPorts: port_rename 실패 
    ORA-09751 pw_attachPorts: pws_attach 서버콜 실패 
    ORA-09752 pw_attachPorts: port_allocate 실패 
    ORA-09753 spwat: 유효하지 않은 프로세스 번호입니다. 
    ORA-09754 sppst: 부당한 프로세스 번호가 sppst에 넘겨졌습니다. 
    ORA-09755 osngpn: 포트 할당에 실패했습니다. 
    ORA-09756 osnpns: 이름 서버에 포트가 없습니다. 
    ORA-09757 osnipn: 포트 할당에 실패했습니다. 
    ORA-09758 osnipn: 이름 서버에서 포트를 확인할 수 없습니다. 
    ORA-09759 osnsbt: 잘못된 메시지를 수신했습니다. 
    ORA-09760 osnpui: 브레이크 메시지를 송신할 수 없습니다. 
    ORA-09761 pw_destroyPorts: pws_stop_instance 서버콜 실패 
    ORA-09762 sNeXT_instanceName: 변환실패 
    ORA-09763 osnmpx: 매치(Mach) 포트의 변경시 송신/수신 오류가 발생했습니다. 
    ORA-09764 osnmop: 오라클 수행 모듈의 액세스 오류입니다. 
    ORA-09765 osnmop: fork 실패 
    ORA-09766 osnmop: 버퍼 할당 실패 
    ORA-09767 osnmfs: msg_send로부터 잘못된 리턴코드를 받았습니다. 
    ORA-09768 osnmgetmsg: 메시지를 읽을 수 없습니다. 
    ORA-09769 osnmbr: 브레이크 메시지를 송신할 수 없습니다. 
    ORA-09770 pws_look_up: 변환실패 
    ORA-09771 osnmwrtbrkmsg: msg_send의 리턴코드가 잘못되었습니다. 
    ORA-09772 osnpmetbrkmsg: 호스트로부터의 메시지가 잘못된 메시지 유형입니다. 
    ORA-09773 osnmgetdatmsg: 호스트로부터의 메시지가 잘못된 메시지 유형입니다. 
    ORA-09774 osnmui: 브레이크 메시지를 송신할 수 없습니다. 
    ORA-09775 osnmrs: 프로토콜 재설정 오류 
    ORA-09776 pws_look_up: 수행모듈(Oracle helper)의 액세스 오류 
    ORA-09777 osnpbr: 브레이크 메시지를 보낼 수 없습니다. 
    ORA-09778 snynfyport: notify 포트의 할당에 실패했습니다. 
    ORA-09779 snyGetPort: 포트의 할당에 실패했습니다. 
    ORA-09780 sfifi: 변환오류, 인스턴스명을 확장할 수 없습니다. 
    ORA-09781 sfifi: 콘트롤 화일에 잘못된 인스턴스명이 저장되어 있습니다. 
    ORA-09782 sfifi: 다른 인스턴스가 동일한 데이타베이스로 마운트되었습니다. 
    ORA-09783 sfifi: 다른 인스턴스가 동일한 데이타베이스로 마운트되었는지 판단할 수 없습니다. 
    ORA-09784 sfifi: lseek 오류, 화일의 시작위치를 찾을 수 없습니다. 
    ORA-09785 sfifi: write 오류, 헤더블록을 기록할 수 없습니다. 
    ORA-09786 sllfop: open 오류, 화일을 열 수 없습니다. 
    ORA-09787 sllfop: 인식할 수 없는 처리 옵션, 잘못된 형식입니다. 
    ORA-09788 sllfrb: 화일을 읽을 수 없습니다. 
    ORA-09789 sllfsk: 화일을 읽을 수 없습니다. 
    ORA-09790 sllfcf: 화일을 닫을 수 없습니다. 
    ORA-09791 slembdf: 변환 오류, 오류 화일명을 변환할 수 없습니다. 
    ORA-09792 sllfop: 읽기용의 버퍼를 할당할 수 없습니다. 
    ORA-09793 szguns: 사용자명의 길이가 버퍼보다 큽니다. 
    ORA-09794 szrbuild: 롤명의 길이가 버퍼보다 큽니다. 
    ORA-09795 szrbuild: 롤 구조의 malloc에 실패했습니다. 
    ORA-09796 szrbuild: 롤명의 malloc에 실패했습니다. 
    ORA-09797 O/S MAC 권한의 확보에 실패했습니다. 
    ORA-09798 레이블 비교에 실패했습니다. 
    ORA-09799 화일 레이블의 조회에 실패했습니다. 
    ORA-09800 프로세스 민감도 레이블 검색에 실패했습니다. 
    ORA-09801 연결 상태로 부터 사용자 번호를 가지고 올 수 없습니다. 
    ORA-09802 이진 레이블을 스트링으로 변환하는것데 실패했습니다. 
    ORA-09803 스트링 버퍼의 할당에 실패. 
    ORA-09804 이진수에서 ORACLE 로의 클래스 변환은 지원하지 않습니다. 
    ORA-09805 카테고리 수에서 스트링으로의 변환은 지원하지 않습니다. 
    ORA-09806 클래스 스트링 버퍼의 할당에 실패했습니다. 
    ORA-09807 스트링에서 이진수로 레이블 변환이 실패했습니다. 
    ORA-09808 사용자 허가를 얻을 수 없습니다. 
    ORA-09809 연결 상태로부터 사용자 그룹 ID를 가지고 올 수 없습니다. 
    ORA-09810 연결 상태로 부터 프로세스 ID를 가지고 올 수 없습니다. 
    ORA-09811 패키지를 초기화할 수 없습니다. 
    ORA-09812 연결 상태로부터 사용자 해제 정보를 가져올 수 없습니다. 
    ORA-09813 디렉토리 상태를 가지고 올 수 없습니다. 
    ORA-09814 화일 이름을 확장할 수 없습니다. 
    ORA-09815 화일 이름 버퍼 오버플로우 
    ORA-09816 유효한 권한을 지정할 수 없습니다. 
    ORA-09817 감사 화일에다 기록하는것이 실패했습니다. 
    ORA-09818 수치가 너무 큽니다. 
    ORA-09819 수치가 적법한 최대치를 초과합니다. 
    ORA-09820 클래스 스트링에서 수치표현으로의 변환에 실패했습니다. 
    ORA-09821 범주 스트링의 해석에 실패했습니다. 
    ORA-09822 감사 화일 이름을 변역하는데 실패했습니다. 
    ORA-09823 디바이스명이 너무 깁니다. 
    ORA-09824 allowmacaccess 권한을 가용화할 수 없습니다. 
    ORA-09825 allowmacaccess 권한을 사용불가하게 할 수 없습니다. 
    ORA-09826 SCLIN: atomic 래치를 초기화할 수 없습니다. 
    ORA-09827 SCLGT: atomic 래치가 불명의 오류를 리턴했습니다. 
    ORA-09828 SCLFR: atomic 래치가 오류를 리턴했습니다. 
    ORA-09829 pw_createPorts: pws_start_instance 서버 콜이 실패했습니다. 
    ORA-09830 snyAddPort: 원격 프로시저 호출의 수행 실패. 
    ORA-09831 snyStartThread: 서버 포트 설정 실패. 
    ORA-09832 infoCallback: 잘못된 메시지 유형. 
    ORA-09833 addCallback: 잘못된 메시지 유형. 
    ORA-09834 snyGetPortSet: 포트에 대한 정보를 모을 수 없습니다. 
    ORA-09835 addCallback: callback 포트가 이미 세트내에 있습니다. 
    ORA-09836 addCallback: callback 세트에 포트를 추가할 수 없습니다. 
    ORA-09837 addCallback: callback 링크의 할당을 추가할 수 없습니다. 
    ORA-09838 removeCallback: callback 포트의 제거에 실패했습니다. 
    ORA-09839 removeCallback: callback 포트가 콜백 세트내에 없습니다. 
    ORA-09840 soacon: 이름 변환 실패 
    ORA-09841 soacon: 이름 변환 실패 
    ORA-09842 soacon: Archmon이 named 파이프를 생성할 수 없습니다. 
    ORA-09843 soacon: Archmon이 named 파이프를 생성할 수 없습니다. 
    ORA-09844 soacon: Archmon이 named 파이프를 열 수 없습니다. 
    ORA-09845 soacon: Archmon이 named 파이프를 열 수 없습니다. 
    ORA-09846 soacon: ARCH이 named 파이프를 열 수 없습니다. 
    ORA-09847 soacon: ARCH이 named 파이프를 열 수 없습니다. 
    ORA-09848 soawrt: named 파이프에 기록할 수 없습니다. 
    ORA-09849 soarcv: named 파이프에서 읽을 수 없습니다. 
    ORA-09850 soacon: Archmon이 named 파이프를 잠금할 수 없습니다. 
    ORA-09851 soacon: Archmon이 named 파이프를 잠금할 수 없습니다. 
    ORA-09852 sfgcwd: 현 디렉토리의 이름을 얻을 수 없습니다. 
    ORA-09853 snyRemovePort: 요구로부터 잘못된 리턴코드가 발생했습니다. 
    ORA-09854 snyPortInfo: 요구로부터 잘못된 리턴코드가 발생했습니다. 
    ORA-09855 removeCallback: 잘못된 메시지 형식 
    ORA-09856 smpalo: pga 할당중 vm_allocate 오류 
    ORA-09857 smprset: pga 프로텍트중 vm_protect 오류 
    ORA-09870 spini: 최대 개방 화일수의 초기화에 실패했습니다. 
    ORA-09871 TASDEF_NAME: ?/dbs/tasdef@.dbf의 확장시 변환오류 발생 
    ORA-09872 TASDEF_CREATE: ?/dbs/tasdef@.dbf의 생성시 실패 
    ORA-09873 TASDEF_OPEN: tasdef@.dbf 화일의 열기 오류 
    ORA-09874 TASDEF_READ: tasdef@.dbf 화일을 읽을 수 없습니다. 
    ORA-09875 TASDEF_WRITE: ?/dbs/tasdef@.dbf 화일의 기록오류 
    ORA-09876 TASDEF_CLOSE: ?/dbs/tasdef@.dbf 화일을 닫을 수 없습니다. 
    ORA-09877 sstascre: shmget 오류, 공유메모리 세그먼트를 얻을 수 없습니다. 
    ORA-09878 sstascre/sstasat: shmat오류, tas 기록 페이지를 첨부할 수 없습니다. 
    ORA-09879 sstascre/sstasat: shmat오류, tas 읽기 페이지를 첨부할 수 없습니다. 
    ORA-09880 sstasfre/sstasdel: shmat오류, tas 기록 페이지를 분리할 수 없습니다. 
    ORA-09881 sstasfre/sstasdel: shmat오류, tas 읽기 페이지를 분리할 수 없습니다. 
    ORA-09882 sstasfre/sstasdel: shmat오류, tas shm 페이지를 분리할 수 없습니다. 
    ORA-09883 Two Task interface: /etc/oratab이 존재하지 않습니다. 
    ORA-09884 Two Task interface: SID가 현재 PU와 일치하지 않습니다. 
    ORA-09885 osnTXtt: TXIPC 채널을 생성할 수 없습니다. 
    ORA-09886 osnTXtt: txipc@.trc를 확장하는데 변환오류가 발생했습니다. 
    ORA-09887 osnTXtt: 디버그 채널의 생성/열기에 실패했습니다. 
    ORA-09888 osnTXtt: txipc 채널의 생성 실패 
    ORA-09889 osnTXtt: 오라클 수행모듈의 액세스 오류 
    ORA-09890 osnTXtt: malloc실패 
    ORA-09894 sfwrt: 비동기 기록을 초기화할 수 없습니다. 
    ORA-09895 sfaswr: 함수가 잘못된 인수로 요구되었습니다. 
    ORA-09896 sfaswr: 유효하지 않은 블록번호 
    ORA-09897 sfaswr: 기록오류, 데이타베이스 블록을 기록할 수 없습니다. 
    ORA-09898 sfalck: setitimer오류, 인터벌 타이머를 지정할 수 없습니다. 
    ORA-09899 sfapol: 쓰기오류, 비동기 기록을 폴할 수 없습니다. 
    ORA-09900 sfapol: 쓰기오류, 비동기 기록을 폴할 수 없습니다. 
    ORA-09901 sfapol: 쓰기오류, 데이타베이스 블록을 기록할 수 없습니다. 
    ORA-09902 sfapol: 틀린 바이트 수로 쓰기에 리턴됐습니다. 
    ORA-09903 sfwrt: 내부 오류 
    ORA-09904 sfotf: 임시화일 디렉토리명이 너무 깁니다. 
    ORA-09905 sfotf: mktemp() 실패 
    ORA-09906 sfotf: 임시 정열 화일을 여는데 실패 
    ORA-09907 sfotf: 임시 정열 화일을 링크해제 하는데 실패 
    ORA-09908 spwat: gethostname이 오류를 리턴했습니다. 
    ORA-09909 스크래치 버퍼를 malloc하는데 실패했습니다. 
    ORA-09910 사용자에 대한 ORACLE의 암호 화일 엔트리를 찾을 수 없습니다. 
    ORA-09911 사용자 암호가 틀립니다. 
    ORA-09912 이름버퍼를 malloc 하는데 실패했습니다. 
    ORA-09913 더미이름을 malloc 하는데 실패했습니다. 
    ORA-09914 ORACLE 암호 화일을 열 수 없습니다. 
    ORA-09915 암호의 암호화에 실패했습니다. 
    ORA-09916 요구된 암호가 지정되지 않았습니다. 
    ORA-09917 시스템 그룹화일에 DBA 그룹이 존재하지 않습니다. 
    ORA-09918 SQL*Net으로부터 사용자 권한을 얻을 수 없습니다. 
    ORA-09919 전용 서버의 레이블을 지정할 수 없습니다. 
    ORA-09920 연결 상태에서 민감도 레이블을 얻을 수 없습니다. 
    ORA-09921 연결 상태에서 정보 레이블을 얻을 수 없습니다. 
    ORA-09922 프로세스를 띄울 수 없음 - 백그라운드 로그 디렉토리가 적절히 생성되지 않았습니다. 
    ORA-09923 프로세스를 띄울 수 없음 - 사용자 로그 디렉토리가 적절히 생성되지 않았습니다. 
    ORA-09924 프로세스를 띄울 수 없음 - 코아 덤프 디렉토리가 적절히 생성되지 않았습니다. 
    ORA-09925 감사 추적 화일을 생성할 수 없습니다. 
    ORA-09926 서버의 유효한 권한 세트를 설정할 수 없습니다. 
    ORA-09927 서버의 레이블을 지정할 수 없습니다. 
    ORA-09928 서버의 레이블을 복원할 수 없습니다. 
    ORA-09929 2개 레이블의 GLB는 허용되지 않습니다. 
    ORA-09930 2개 레이블의 LUB는 허용되지 않습니다. 
    ORA-09931 ORACLE 암호 화일을 읽기용으로 열 수 없습니다. 
    ORA-09932 ORACLE 암호 화일을 닫는데 실패했습니다. 
    ORA-09933 구 암호 화일의 삭제에 실패했습니다. 
    ORA-09934 현재 암호 화일을 구 암호 화일로 링크하는데 실패했습니다. 
    ORA-09935 현재 암호 화일을 링크해제하는데 실패했습니다. 
    ORA-09936 ORACLE 암호 화일을 쓰기용으로 여는데 실패했습니다. 
    ORA-09937 ORACLE 암호 화일의 모드를 바꾸는데(chmod) 실패했습니다. 
    ORA-09938 신호 처리기를 저장하는데 실패했습니다. 
    ORA-09939 신호 처리기를 재 저장하는데 실패했습니다. 
    ORA-09940 ORACLE 암호 화일 헤더가 손상되었습니다. 
    ORA-09941 화일보다 orapasswd 또는 installer가 더 오래된 버전입니다. 
    ORA-09942 ORACLE 암호 화일 헤더의 기록에 실패했습니다. 
    ORA-09943 암호 리스트 요소를 위한 메모리 할당에 실패했습니다. 
    ORA-09944 암호 항목이 손상되었습니다. 
    ORA-09945 감사 추적 화일을 초기화할 수 없습니다. 
    ORA-09946 버퍼에 비해 화일 이름이 너무 깁니다. 
    ORA-09947 연결 속성 구조에 메모리를 할당 할 수 없습니다. 
    ORA-09948 프로세스 정보 레이블 조회에 실패했습니다. 
    ORA-09949 클라이언트 운영 시스템 권한을 얻을 수 없습니다. 
    ORA-09950 서버 운영 시스템 권한을 얻을 수 없습니다. 
    ORA-09951 화일을 생성할 수 없습니다. 
    ORA-09952 scgcmn: lk_open_convert의 예상치 못한 리턴: 열기 실패 
    ORA-09953 scggc: 잠금 변환중의 예상치 못한 리턴 
    ORA-09954 scgcc: 잠금 닫기 콜백에 대한 예기치 않은 리턴 상태 
    ORA-09955 scgcan: 잠금 취소시의 예기치 않은 리턴 상태 
    ORA-09956 scgcm: 예기치 않은 잠금 상태 조건 
    ORA-09957 IMON에게 종료 요구을 보낼 수 없습니다. 
    ORA-09958 IMON: 같은 ORACLE pid를 가진 두개의 프로세스가 활동합니다. 
    ORA-09959 IMON: 프로세스 삭제에 실패했습니다. 
    ORA-09960 종료 신호를 위한 신호 처리기를 설치할 수 없습니다. 
    ORA-09961 종료 신호 처리기를 재저장할 수 없습니다. 
    ORA-09962 scggrc에 lk_group_create 오류가 있습니다. 
    ORA-09963 scggra에 lk_group_attach 오류가 있습니다. 
    ORA-09964 scggrd에 lk_group_detach 오류가 있습니다. 
    ORA-09965 sfsfs: 부적당한 화일 크기 
    ORA-09966 sfsfs: 읽기/쓰기 모드로 화일을 열 수 없습니다. 
    ORA-09967 sfsfs: 화일을 더 크게 할 수 없습니다. 
    ORA-09968 sfsfs: 화일의 시작을 찾을 수 없습니다. 
    ORA-09969 sfsfs, sfrfs: malloc 오류, 버퍼를 할당할 수 없습니다. 
    ORA-09970 sfsfs: 읽기 오류, 헤더 블록을 읽을 수 없습니다. 
    ORA-09971 sfsfs: 쓰기 오류, 헤더 블록에 쓸 수 없습니다. 
    ORA-09972 sfsfs: 화일을 더 작게 할 수 없습니다. 
    ORA-09973 sfsfs: 닫기 오류 
    ORA-09974 skxfidini: SDI 채널을 초기화 하는데 오류 
    ORA-09975 kxfspini: SDI 프로세스를 초기화 하는데 오류 
    ORA-09976 skxfqdini: 포트를 만드는데 오류 
    ORA-09977 skxfqhini: 연결 오류 
    ORA-09978 skxfqhdel: 다른 끝점에서 연결분리시 오류 
    ORA-09979 skxfqhsnd: 다른 끝점으로 메시지를 송신하는데 오류 
    ORA-09980 skxfqdrcv: 다른 끝점으로 메시지를 수신하는데 오류 
    ORA-09981 skxfqdreg: SDI 버퍼 폴에 페이지를 추가하는데 오류 
    ORA-09982 skxfqddrg: SDI 버퍼 폴로 부터 페이지를 삭제하는데 오류 
    ORA-09983 skxfidsht: SDI 채널을 기동 종료하는데 오류 
    ORA-09984 SGA 화일 $ORACLE_HOME/dbs/sgadef$ORACLE_SID.dbf가 존재하지 않습니다. 
    ORA-09985 SGA 정의 화일을 읽을 수 없습니다. 
    ORA-09986 SGA 정의 화일로 부터 잘못된 바이트의 수가 읽혔습니다. 
    ORA-09987 READ-ONLY 모드에서 SGA로 첨부할 수 없습니다. 
    ORA-09988 SGA을 분리하는데 오류 
    ORA-09989 부적당한 skgmsdef 구조 포인터를 사용할려고 시도합니다. 
    ORA-10000 control file debug event, name control_file 
    ORA-10001 control file crash event1 
    ORA-10002 control file crash event2 
    ORA-10003 control file crash event3 
    ORA-10004 control file crash event4 
    ORA-10005 trace latch operations for debugging 
    ORA-10006 testing - block recovery forced 
    ORA-10007 log switch debug crash after new log select, thread %s 
    ORA-10008 log switch debug crash after new log header write, thread %s 
    ORA-10009 log switch debug crash after old log header write, thread %s 
    ORA-10010 Begin Transaction 
    ORA-10011 End Transaction 
    ORA-10012 Abort Transaction 
    ORA-10013 Instance Recovery 
    ORA-10014 Roll Back to Save Point 
    ORA-10015 Undo Segment Recovery 
    ORA-10016 Undo Segment extend 
    ORA-10017 Undo Segment Wrap 
    ORA-10018 Data Segment Create 
    ORA-10019 Data Segment Recovery 
    ORA-10020 partial link restored to linked list (KSG) 
    ORA-10021 latch cleanup for state objects (KSS) 
    ORA-10022 trace ktsgsp 
    ORA-10023 Create Save Undo Segment 
    ORA-10024 Write to Save Undo 
    ORA-10025 Extend Save Undo Segment 
    ORA-10026 Apply Save Undo 
    ORA-10027 latch cleanup for enqueue locks (KSQ) 
    ORA-10028 latch cleanup for enqueue resources (KSQ) 
    ORA-10029 session logon (KSU) 
    ORA-10030 session logoff (KSU) 
    ORA-10031 row source debug event (R*) 
    ORA-10032 sort end (SOR*) 
    ORA-10033 sort run (SRD*/SRS*) 
    ORA-10035 parse SQL statement (OPIPRS) 
    ORA-10036 create remote row source (QKANET) 
    ORA-10037 allocate remote row source (QKARWS) 
    ORA-10038 dump row source tree (QBADRV) 
    ORA-10039 type checking (OPITCA) 
    ORA-10040 dirty cache list 
    ORA-10041 dump undo records skipped 
    ORA-10042 trap error during undo application 
    ORA-10043 check consistency of owner/waiter/converter lists in KSQ 
    ORA-10044 free list undo operations 
    ORA-10045 free list update operations - ktsrsp, ktsunl 
    ORA-10046 enable SQL statement timing 
    ORA-10047 trace switching of sessions 
    ORA-10048 Undo segment shrink 
    ORA-10049 protect library cache memory heaps 
    ORA-10050 sniper trace 
    ORA-10051 trace OPI calls 
    ORA-10052 dont clean up obj$ 
    ORA-10053 CBO Enable optimizer trace 
    ORA-10054 trace UNDO handling in MLS 
    ORA-10055 trace UNDO handing 
    ORA-10056 dump analyze stats (kdg) 
    ORA-10057 suppress file names in error messages 
    ORA-10058 use table scan cost in tab$.spare1 
    ORA-10059 simulate error in logfile create/clear 
    ORA-10060 CBO Enable predicate dump 
    ORA-10061 disable SMON from cleaning temp segment 
    ORA-10062 disable usage of OS Roles in osds 
    ORA-10063 disable usage of DBA and OPER privileges in osds 
    ORA-10064 thread enable debug crash level %s, thread %s 
    ORA-10065 limit library cache dump information for state object dump 
    ORA-10066 simulate failure to verify file 
    ORA-10067 force redo log checksum errors - block number 
    ORA-10068 force redo log checksum errors - file number 
    ORA-10069 Trusted Oracle 테스트 이벤트 
    ORA-10070 force datafile checksum errors - block number 
    ORA-10071 force datafile checksum errors - file number 
    ORA-10072 protect latch recovery memory 
    ORA-10073 have PMON dump info before latch cleanup 
    ORA-10074 default trace function mask for kst 
    ORA-10075 CBO Disable outer-join to regular join conversion 
    ORA-10076 CBO Enable cartesian product join costing 
    ORA-10077 CBO Disable view-merging optimization for outer-joins 
    ORA-10078 CBO Disable constant predicate elimination optimization 
    ORA-10079 SQL*Net을 거쳐 송신/수신된 데이터를 트래스합니다. 
    ORA-10080 dump a block on a segment list which cannot be exchanged 
    ORA-10081 segment High Water Mark has been advanced 
    ORA-10082 free list head block is the same as the last block 
    ORA-10083 a brand new block has been requested from space management 
    ORA-10084 free list becomes empty 
    ORA-10085 free lists have been merged 
    ORA-10086 oby 소트에서 kko와 qka가 다르면 사용가능한 CBO에 오류가 생깁니다. 
    ORA-10087 손상한 데이터 블록 매체를 회복할 수 없습니다. 
    ORA-10088 CBO Disable new NOT IN optimization 
    ORA-10089 CBO Disable index sorting 
    ORA-10090 복구가 충돌하기 전에 다른 이벤트를 부릅니다. 
    ORA-10091 CBO Disable constant predicate merging 
    ORA-10092 CBO Disable hash join 
    ORA-10093 CBO Enable force hash joins 
    ORA-10094 before resizing a data file 
    ORA-10095 dump debugger commands to trace file 
    ORA-10096 after the cross instance call when resizing a data file 
    ORA-10097 after generating redo when resizing a data file 
    ORA-10098 데이터 화일의 크기를 OS가 증가시킨 후에 
    ORA-10099 새로운 화일 크기로 화일 헤더가 수정 후에 
    ORA-10100 데이터 화일의 크기를 OS가 축소 후에 
    ORA-10101 atomic redo write recovery 
    ORA-10102 anti-joins을 스위치 오프합니다. 
    ORA-10103 CBO가 해쉬 결합 교체를 사용불가합니다. 
    ORA-10104 해쉬 결합 통계를 덤프한 것을 트래스 화일로 보냅니다. 
    ORA-10105 CBO가 일정한 pred trans와 MPs w WHERE-절을 사용가능하게 합니다. 
    ORA-10106 CBO가 NOT IN에 대한 나중에 서술한 상호관계을 구하는것을 사용할 수 없습니다. 
    ORA-10107 CBO은 항상 비트맵 색인을 사용합니다. 
    ORA-10108 CBO은 비트맵 색인을 사용하지 않습니다. 
    ORA-10109 CBO가 부정 술어를 옮기는데 사용불가합니다. 
    ORA-10110 CBO가 색인 행ID 범위 스캔을 시도합니다. 
    ORA-10111 비트맵 색인 생성 스위치입니다. 
    ORA-10112 비트맵 색인 생성 스위치입니다. 
    ORA-10113 비트맵 색인 생성 스위치입니다. 
    ORA-10114 비트맵 색인 생성 스위치입니다. 
    ORA-10115 CBO 비트맵 최적화는 최고 표현을 사용했습니다. 
    ORA-10116 CBO 비트맵 최적화 스위치입니다. 
    ORA-10117 CBO가 새로운 병렬 비용 모형을 사용불가합니다 
    ORA-10118 CBO가 해쉬 결합 비용을 사용가능하게 합니다 
    ORA-10145 네트워크 오류를 감사하는 것을 테스트 
    ORA-10146 오라클 TRACE 수집을 사용가능하게 합니다. 
    ORA-10200 block cleanout 
    ORA-10201 consistent read undo application 
    ORA-10202 consistent read block header 
    ORA-10203 consistent read buffer status 
    ORA-10204 signal recursive extend 
    ORA-10205 row cache debugging 
    ORA-10206 transaction table consistent read 
    ORA-10207 consistent read transactions status report 
    ORA-10208 consistent read loop check 
    ORA-10209 enable simulated error on control file 
    ORA-10210 check data block integrity 
    ORA-10211 check index block integrity 
    ORA-10212 check cluster integrity 
    ORA-10213 crash after control file write 
    ORA-10214 simulate write errors on control file 
    ORA-10215 simulate read errors on control file 
    ORA-10216 dump control file header 
    ORA-10217 debug sequence numbers 
    ORA-10218 dump uba of applied undo 
    ORA-10219 monitor multi-pass row locking 
    ORA-10220 show updates to the transaction table 
    ORA-10221 show changes done with undo 
    ORA-10222 row cache 
    ORA-10223 transaction layer - turn on verification codes 
    ORA-10224 index block split/delete trace 
    ORA-10225 free/used extent row cache 
    ORA-10226 trace CR applications of undo for data operations 
    ORA-10227 verify (multi-piece) row structure 
    ORA-10228 trace application of redo by kcocbk 
    ORA-10229 simulate I/O error against datafiles 
    ORA-10230 check redo generation by copying before applying 
    ORA-10231 skip corrupted blocks on _table_scans_ 
    ORA-10232 dump corrupted blocks symbolically when kcbgotten 
    ORA-10233 색인 작업에서 손상된 블록을 건너 뜁니다. 
    ORA-10234 trigger event after calling kcrapc to do redo N times 
    ORA-10235 check memory manager internal structures 
    ORA-10236 library cache manager 
    ORA-10237 simulate ^C (for testing purposes) 
    ORA-10238 instantiation manager 
    ORA-10239 multi-instance library cache manager 
    ORA-10240 dump dba^s of blocks that we wait for 
    ORA-10241 dump SQL generated for remote execution (OPIX) 
    ORA-10242 suppress OER 2063 (for testing distrib w/o different error log) 
    ORA-10243 simulated error for test %s of K2GTAB latch cleanup 
    ORA-10244 make tranids in error msgs print as 0.0.0 (for testing) 
    ORA-10245 simulate lock conflict error for testing PMON 
    ORA-10246 print trace of PMON actions to trace file 
    ORA-10247 Turn on scgcmn tracing. (VMS ONLY) 
    ORA-10248 turn on tracing for dispatchers 
    ORA-10249 turn on tracing for multi-stated servers 
    ORA-10250 Trace all allocate and free calls to the topmost SGA heap 
    ORA-10251 check consistency of transaction table and undo block 
    ORA-10252 simulate write error to data file header 
    ORA-10253 simulate write error to redo log 
    ORA-10254 trace cross-instance calls 
    ORA-10255 pl/sql parse checking 
    ORA-10256 turn off multi-threaded server load balancing 
    ORA-10257 trace multi-threaded server load balancing 
    ORA-10258 force shared servers to be chosen round-robin 
    ORA-10259 get error message text from remote using explicit call 
    ORA-10260 Trace calls to SMPRSET (VMS ONLY) 
    ORA-10261 Limit the size of the PGA heap 
    ORA-10262 Don^t check for memory leaks 
    ORA-10263 Don^t free empty PGA heap extents 
    ORA-10264 Collect statistics on context area usage (x$ksmcx) 
    ORA-10265 Keep random system generated output out of error messages 
    ORA-10266 Trace OSD stack usage 
    ORA-10267 Inhibit KSEDMP for testing 
    ORA-10268 Don do forward coalesce when deleting extents 
    ORA-10269 Don do coalesces of free space in SMON 
    ORA-10270 Debug shared cursors 
    ORA-10271 distributed transaction after COLLECT 
    ORA-10272 distributed transaction before PREPARE 
    ORA-10273 distributed transaction after PREPARE 
    ORA-10274 distributed transaction before COMMIT 
    ORA-10275 distributed transaction after COMMIT 
    ORA-10276 distributed transaction before FORGET 
    ORA-10277 이벤트가 커서를 공유하는지(안하는지)에 관련이 있습니다 (테스트에 사용되었습니다) 
    ORA-10281 maximum time to wait for process creation 
    ORA-10282 Inhibit signalling of other backgrounds when one dies 
    ORA-10286 Simulate control file open error 
    ORA-10287 Simulate archiver error 
    ORA-10288 Do not check block type in ktrget 
    ORA-10289 Do block dumps to trace file in hex rather than fromatted 
    ORA-10290 kdnchk - checkvalid event - not for general purpose use. 
    ORA-10291 die in dtsdrv to test controlfile undo 
    ORA-10292 dump uet entries on a 1561 from dtsdrv 
    ORA-10293 dump debugging information when doing block recovery 
    ORA-10294 사용가능한 PERSISTENT DLM 작업이 non-compliant 시스템에 있습니다. 
    ORA-10300 disable undo compatibility check at database open 
    ORA-10301 Enable LCK timeout table consistency check 
    ORA-10320 Enable data layer (kdtgrs) tracing of space management calls 
    ORA-10352 직접 패스 통계를 보고합니다. 
    ORA-10353 슬롯의 수 
    ORA-10354 병렬 질의를 위해 직접 읽기 패스를 사용가능하게 합니다. 
    ORA-10355 스캔을 위해 직접 읽기 패스를 사용가능하게 합니다. 
    ORA-10356 직접 읽기를 위해 힌트 사용법을 사용가능하게 합니다. 
    ORA-10357 직접 패스를 위해 디버그 정보를 사용가능하게 합니다. 
    ORA-10374 병렬 질의 서버가 인터럽트 (잠금 값을 확인합니다) 
    ORA-10375 감아 올린 통계를 위해 검색을 사용가능하게 합니다. 
    ORA-10376 큐 통계 테이블을 사용가능하게 합니다. 
    ORA-10377 turn off load balancing 
    ORA-10378 force hard process/range affinity 
    ORA-10379 direct read for rowid range scans (unimplemented) 
    ORA-10380 kxfp latch cleanup testing event 
    ORA-10381 kxfp latch cleanup testing event 
    ORA-10382 parallel query server interrupt (reset) 
    ORA-10383 auto parallelization testing event 
    ORA-10384 parallel dataflow scheduler tracing 
    ORA-10385 parallel table scan range sampling method 
    ORA-10386 parallel SQL hash and range statistics 
    ORA-10387 parallel query server interrupt (normal) 
    ORA-10388 parallel query server interrupt (failure) 
    ORA-10389 parallel query server interrupt (cleanup) 
    ORA-10390 Trace parallel query slave execution 
    ORA-10391 trace rowid range partitioning 
    ORA-10392 parallel query debugging bits 
    ORA-10393 print parallel query statistics 
    ORA-10394 allow parallelization of small tables 
    ORA-10395 adjust sample size for range table queues 
    ORA-10396 circumvent range table queues for queries 
    ORA-10397 suppress verbose parallel coordinator error reporting 
    ORA-10398 enable timeouts in parallel query threads 
    ORA-10399 use different internal maximum buffer size 
    ORA-10400 turn on system state dumps for shutdown debugging 
    ORA-10500 turn on traces for SMON 
    ORA-10510 turn off SMON check to offline pending offline rollback segment 
    ORA-10511 turn off SMON check to cleanup undo dictionary 
    ORA-10512 turn off SMON check to shrink rollback segments 
    ORA-10550 signal error during create as select/create index after n rows 
    ORA-10600 check cursor frame allocation 
    ORA-10602 cause an access violation (for testing purposes) 
    ORA-10603 cause an error to occur during truncate (for testing purposes) 
    ORA-10604 trace parallel create index 
    ORA-10605 enable parallel create index by default 
    ORA-10606 trace parallel create index 
    ORA-10607 색인 행ID 파티션 스캔을 트래스 합니다. 
    ORA-10608 트래스가 비트맵 색인을 만듭니다. 
    ORA-10610 트래스가 색인 pseudo 최적화를 만듭니다. 
    ORA-10666 Do not get database enqueue name 
    ORA-10667 Cause sppst to check for valid process ids 
    ORA-10690 Set shadow process core file dump type (Unix only) 
    ORA-10691 Set background process core file type (Unix only) 
    ORA-10700 Alter access violation exception handler 
    ORA-10701 Dump direct loader index keys 
    ORA-10702 Enable histogram data generation 
    ORA-10703 Simulate process death during enqueue get 
    ORA-10704 Print out information about what enqueues are being obtained 
    ORA-10705 Print Out Tracing information for every I/O done by ODSs 
    ORA-10706 인스턴스 잠금 조작에 관한 정보를 프린트합니다. 
    ORA-10707 인스턴스 등록을 위한 모의 프로세스를 죽입니다. 
    ORA-10708 skxf 다중 인스턴스 명령어에 대한 트래스 정보를 프린트 합니다. 
    ORA-10709 디폴트로 색인을 작성한 것에 병렬 인스턴스를 사용가능하게 합니다. 
    ORA-10710 비트맵 색인 액세스를 트래스 
    ORA-10711 비트맵 색인 액세스를 트래스 
    ORA-10712 비트맵 색인 액세스를 트래스 
    ORA-10713 비트맵 색인 액세스를 트래스 
    ORA-10714 비트맵 색인 마이너스를 트래스 
    ORA-10715 행ID로 비트맵 색인을 변환하는것을 트래스 
    ORA-10716 비트맵 색인 압축/압축제거를 트래스 
    ORA-10800 disable Smart Disk scan 
    ORA-10801 enable Smart Disk trace 
    ORA-10802 reserved for Smart Disk 
    ORA-10803 write timing statistics on OPS recovery scan 
    ORA-10804 ksxb을 위해 비축해 놓은 것입니다. 
    ORA-10805 행 소스 정렬을 위해 비축해 놓은 것입니다. 
    ORA-10900 관리자 범위는 삽입 이벤트 번호 %s에 결점이 있습니다. 
    ORA-10924 들어오기 저장을 구문분석 할때 이벤트 무시에 오류가 있습니다. 
    ORA-10925 이름 켄텍스트를 끊임없이 트래스합니다. 
    ORA-10926 이름 켄텍스트를 끊임없이 트래스합니다. 
    ORA-10927 이름 켄텍스트를 끊임없이 트래스합니다. 
    ORA-10928 이름 켄텍스트를 끊임없이 트래스합니다. 
    ORA-10999 do not get database enqueue name 
    ORA-12000 스냅샷 로그가 테이블 %s에 이미 존재합니다. 
    ORA-12001 로그를 생성할 수 없습니다 테이블 %s가 이미 트리거를 갖고 있습니다. 
    ORA-12002 table %s에 스냅샷 로그가 없습니다. 
    ORA-12003 스냅샷 %s가 존재하지 않습니다. 
    ORA-12004 REFRESH FAST가 사용될 수 없습니다. 
    ORA-12005 자동 refresh를 과거 시간에 대하여 행할 수 없습니다. 
    ORA-12006 같은 사용자 이름을 갖는 스냅샷이 이미 존재합니다. 
    ORA-12007 스냅샷 재 사용 파라미터들이 일치하지 않습니다. 
    ORA-12008 스냅샷 refresh 패스에 오류가 있습니다. 
    ORA-12009 스냅샷들은 긴 열들을 포함하지 않습니다. 
    ORA-12010 SYS 소유의 테이블에 대해서는 스냅샷 로그를 만들수 없습니다. 
    ORA-12011 작업 %s의 실행에 실패 
    ORA-12012 작업 %s의 자동 실행중 오류 발생 
    ORA-12013 갱신 가능한 스냅샷을 충분히 빨리 재그리기를 할 수 있게 간단해야 합니다. 
    ORA-12150 TNS:데이타베이스를 보낼 수 없습니다. 
    ORA-12151 TNS:네트워크 층으로부터 받은 패킷 유형이 틀립니다. 
    ORA-12152 TNS:break 메시지를 보낼 수 없습니다. 
    ORA-12153 TNS:연결되지 않았습니다. 
    ORA-12154 TNS:서비스명를 해석할 수 없습니다. 
    ORA-12155 TNS:NSWMARKER 패킷에 틀린 데이타형을 받았습니다. 
    ORA-12156 TNS:잘못된 상태로 부터 줄을 재 설정하기 위해 시도 했습니다. 
    ORA-12157 TNS:내부 네트워크 통신 오류 
    ORA-12158 TNS:파라미터 부시스템을 초기화할 수 없습니다. 
    ORA-12159 TNS:추적 화일은 쓸수 없습니다. 
    ORA-12160 TNS:내부오류: 잘못된 오류번호 
    ORA-12161 TNS:내부오류: 부분적인 데이타를 받았습니다. 
    ORA-12162 TNS:서비스명이 잘못 지정되었습니다. 
    ORA-12163 TNS:연결 기술어가 너무 깁니다. 
    ORA-12196 TNS:TNS로 부터 오류를 받았습니다. 
    ORA-12197 TNS:키워드-값을 분석하는데 오류가 생겼습니다. 
    ORA-12198 TNS:수신으로의 패스를 찾을 수 없습니다. 
    ORA-12200 TNS:메모리를 할당할 수 없습니다. 
    ORA-12201 TNS:연결 버퍼가 너무 작습니다. 
    ORA-12202 TNS:내부 네비게이션 오류 
    ORA-12203 TNS:수신에 연결할 수 없습니다. 
    ORA-12204 TNS:어플리케이션으로 부터 거절된 데이타를 받았습니다. 
    ORA-12205 TNS:실패한 주소를 받을 수 없습니다. 
    ORA-12206 TNS:TNS 오류를 받았습니다. 
    ORA-12207 TNS:네비게이션을 계속할 수 없습니다. 
    ORA-12208 TNS:TNSNAV.ORA 화일을 발견할 수 없습니다. 
    ORA-12209 TNS:초기화 되지않은 글로벌 변수 입니다. 
    ORA-12210 TNS:네비게이터 데이타를 찾을때 오류가 발생합니다. 
    ORA-12211 TNS:TNSNAV.ORA에 PREFERRED_CMANAGERS 엔트리가 필요함 
    ORA-12212 TNS:TNSNAV.ORA에 PREFERRED_CMANAGER 바인딩이 불완전합니다. 
    ORA-12213 TNS:TNSNAV.ORA에 PREFERRED_CMANAGERS 바인딩이 불완전 합니다. 
    ORA-12214 TNS:TNSNAV.ORA에 LOCAL_COMMUNITIES 엔트리가 빠졌습니다. 
    ORA-12215 TNS:TNSNAV.ORA에 있는 PREFERRED_NAVIGATORS 주소가 잘못되었습니다. 
    ORA-12216 TNS:TNSNAV.ORA에 있는 PREFERRED_CMANAGER 주소가 잘못되었습니다. 
    ORA-12217 TNS:TNSNAV.ORA내에 PREFERRED_CMANAGERS를 접촉할 수 없습니다. 
    ORA-12218 TNS:받아드리지 않는 네트워크 구성 데이타 
    ORA-12219 TNS:ADDRESS_LIST에서 공유명이 주소에서 빠졌습니다. 
    ORA-12221 TNS:부적합한 ADDRESS 파라미터 
    ORA-12222 TNS:그런 포로토콜 어댑터가 없습니다. 
    ORA-12223 TNS:내부 한계 한정이 초과 
    ORA-12224 TNS:리스너가 없음 
    ORA-12225 TNS:수신 호스트에 도달할 수 없습니다. 
    ORA-12226 TNS:운영 시스템 자원 할당이 초과되었습니다. 
    ORA-12227 TNS:구문 오류 
    ORA-12228 TNS:포로토콜 어댑터가 로드될 수 없습니다. 
    ORA-12229 TNS:Interchange는 더이상 여유있은 연결을 가지고 있지 않습니다. 
    ORA-12230 TNS:이 연결을 만드는데 Sever Network 오류가 발생했습니다. 
    ORA-12315 ALTER DATABASE 문장을 위한 데이타베이스 링크형이 부적합합니다. 
    ORA-12316 데이타베이스 링크의 연결 스트링에 구문오류가 있습니다. 
    ORA-12317 데이타베이스(링크명 %s)로의 로그온이 거절되었습니다. 
    ORA-12318 데이타베이스(링크명 %s)가 이미 마운트되었습니다. 
    ORA-12319 데이타베이스(링크명 %s)가 이미 개방되었습니다. 
    ORA-12321 데이타베이스(링크명 %s)가 열지 않았으며 AUTO_MOUNTING=FALSE입니다. 
    ORA-12322 데이타베이스(링크명 %s)를 마운트할 수 없습니다. 
    ORA-12323 데이타베이스(링크명 %s)를 열 수 없습니다. 
    ORA-12324 ROM을 사용할 수 없습니다: 사적소유의 데이타베이스 링크형이기 때문에 입니다. 
    ORA-12326 데이타베이스 %s가 즉시 닫기를 수행 중: 어떤 작업도 허가되지 않습니다. 
    ORA-12329 데이타베이스 %s가 닫혔음; 어떤 작업도 허가되지 않습니다. 
    ORA-12333 데이타베이스 %s가 마운트되지 않았습니다. 
    ORA-12334 데이타베이스(링크명 %s)가 아직 열려 있습니다. 
    ORA-12335 데이타베이스(링크명 %s)가 열지 않았습니다. 
    ORA-12336 데이타베이스에 로그인할 수 없습니다 (링크명 %s) 
    ORA-12341 마운트할 수 있는 최대 수가 초과했습니다. 
    ORA-12342 마운트 열기가 OPEN_MOUNTS 파라미터에 지정한 한계치를 초과했습니다. 
    ORA-12345 사용자 %s는 데이타베이스 링크(%s)에 필요한 CREATE SESSION 권한이 없습니다. 
    ORA-12350 삭제될 데이타베이스 링크가 아직도 마운트되었습니다. 
    ORA-12351 원격 개체 참조를 이용하는 원격 개체가 뷰를 만들 수 없습니다. 
    ORA-12352 %s.%s@%s 는 부적절합니다. 
    ORA-12353 2번째 저장된 개체는 원격 개체를 참조할수 없습니다. 
    ORA-12354 DROP될 2번째 개체 
    ORA-12400 DBLOW는 유효한 운영 시스템 레이블이 아닙니다. 
    ORA-12401 DBHIGH는 유효한 운영 시스템 레이블이 아닙니다. 
    ORA-12402 화일: %s 
    ORA-12403 화일 레이블이 DB_HIGH(%s)와 동일해야 합니다(%s) 
    ORA-12404 디바이스 low (%s)는 DBLOW (%s)에 의해 통제됩니다. 
    ORA-12405 디바이스 high (%s)는 DBHIGH (%s)를 통제합니다. 
    ORA-12406 화일들을 테이블스페이스에 추가하기 위해서는 OS내에 DBHIGH (%s)에 있어야 합니다. 
    ORA-12407 뷰의 ROWLABEL 열에 삽입하거나 수정할 수 없습니다. 
    ORA-12408 이전에 존재했던 테이블스페이스가 다른 레이블(%s)에 있습니다. 
    ORA-12409 DBLOW는 DBMS MAC 모드에서 널값을 가질 수 없습니다. 
    ORA-12410 DBHIGH는 DBMS MAC 모드에서 널값을 가질 수 없습니다. 
    ORA-12411 DBHIGH는 DBLOW를 통제합니다. 
    ORA-12412 DBLOW는 %s에 의해 통제됩니다. 
    ORA-12413 DBHIGH는 %s에 의해 통제됩니다. 
    ORA-12414 데이타베이스를 기동시키기 위해서는 DBHIGH (%s) 이어야 합니다. 
    ORA-12415 세션 레이블은 롤 %s의 레이블 생성을 통제해야만 합니다. 
    ORA-12416 감사 레이블은 사용자를 통제합니다. 
    ORA-12418 색인 레이블은 테이블과 동일해야 합니다. 
    ORA-12419 열의 레이블은 테이블과 동일해야 합니다. 
    ORA-12420 저장된 개체의 레이블은 참조된 객체 %s를 통제해야 합니다. 
    ORA-12421 허가 권한의 레이블은 개체를 통제해야 합니다. 
    ORA-12422 허가 권한의 레이블은 허가받는 %s를 통제해야 합니다. 
    ORA-12423 제약조건 레이블은 테이블과 같아야 합니다. 
    ORA-12424 개체의 레이블은 테이블 영역을 통제해야 합니다. 
    ORA-12425 테이블의 레이블은 클러스터를 통제해야 합니다. 
    ORA-12426 사용자의 레이블은 디폴트 또는 임시의 테이블 영역을 통제 해야만 합니다. 
    ORA-12427 개체의 레이블은 스키마를 통제해야만 합니다. 
    ORA-12428 불 충분한 MAC 권한 
    ORA-12429 주석 레이블은 테이블 또는 뷰와 동일 해야 합니다. 
    ORA-12430 트리거의 레이블은 테이블과 동일해야 합니다. 
    ORA-12431 사용자의 레이블은 디폴트 프로화일을 통치해야 합니다. 
    ORA-12432 권한부여의 레벨은 프로시저의 레벨과 같아야 합니다. 
    ORA-12433 디폴트 롤 %s의 레이블은 사용자를 통치해야 합니다. 
    ORA-12434 자식 레코드의 레이블은 부모를 통치 해야만 합니다. 
    ORA-12435 패키지 본체의 레이블은 패키지와 같아야만 합니다. 
    ORA-12436 패키지 몸체는 MAC 권한을 허가하기 위해서 존재해야 합니다. 
    ORA-12437 더낮은 레이블에서 데이타베이스에 기록할 수 없습니다. 
    ORA-12438 모든 행들에서 제약조건을 검증하기 위한 권한이 불충분합니다. 
    ORA-12439 ROWLABEL 열을 수정할 수 없습니다. 
    ORA-12440 데이타베이스는 읽기-호환 모드로 마운트되지 않습니다. 
    ORA-12441 허가는 이미 다른 레이블에서 존재합니다. 
    ORA-12442 디폴트 롤을 수정하기 위해서는 사용자와 같은 레이블에 있어야만 합니다. 
    ORA-12443 다른 레벨에 감사 옵션이 이미 존재합니다. 
    ORA-12444 화일 레이블은 인스턴스 레이블보다 낮습니다. 
    ORA-12445 색인와 행의 레이블이 틀립니다- 추적 화일 참조 
    ORA-12446 화일 레이블이 인스턴스 레이블보다 상위에 있습니다. 
    ORA-12447 안전성 없는 프로토콜이 사용되어 연결이 거부 되었습니다. 
    ORA-12448 최고 보다 낮은 범위가 부적합한 운영 시스템 레이블이 되었습니다. 
    ORA-12449 최하 보다 높은 범위가 부적합한 운영 시스템 레이블이 되었습니다. 
    ORA-12450 레이블 스트링은 이진 레이블로 변환될 수 없습니다. 
    ORA-12451 이진 OS 레이블은 스트링 레이블로 변환될 수 없습니다. 
    ORA-12452 레이블 형식 스트링은 해석될 수 없습니다 형식 코드를 검사하십시오 
    ORA-12453 문자 스트링에 인용부호가 누락됐습니다. 
    ORA-12454 제공된 구두점은 명시된 입력 형식과 일치하지 않습니다. 
    ORA-12455 OS 형식은 이 문맥에서 사용될 수 없습니다. 
    ORA-12456 제공된 문자스트링은 지정된 입력 형식과 일치하지 않습니다. 
    ORA-12457 MLSLABEL 바인드 변수에 대한 길이가 잘못됐습니다. 
    ORA-12458 입력 스트링이 이진 레이블로 변환될 수 없습니다. 
    ORA-12459 Trusted Oracle의 테이블에 대한 최대 열수는 253 입니다. 
    ORA-12460 MLS_LABEL_FORMAT 파라미터에 대한 값 %s가 부당합니다. 
    ORA-12461 부적합한 이진 레이블 
    ORA-12470 프로세스 레이블이 발견될 수 없습니다. 
    ORA-12475 DBLOW (%s) 아래로 로그인 할 수 없습니다. 
    ORA-12476 DBHIGH (%s) 위로 로그인 할 수 없습니다. 
    ORA-12477 DBLOW (%s) 아래로 MLSLABLE을 생성할 수 없습니다. 
    ORA-12478 DBHIGH (%s) 위로 MLSLABLE을 생성할 수 없습니다. 
    ORA-12480 두번째 데이타베이스가 OS MAC와 DBMS MAC 모드 사이에서 변하고 있습니다. 
    ORA-12485 %s에 대한 화일 레이블을 발견할 수 없습니다. 
    ORA-12487 DBHIGH 또는 DBLOW에로의 레이블을 설정하기 위한 권한이 불충분 합니다. 
    ORA-12488 세션 레이블이 %s와 같아야 합니다. 
    ORA-12489 세션을 수정하기 위한 MAC 권한이 불충분 합니다. 
    ORA-12490 사용자 정의(%s) 아래의 세션 레이블에 연결할 수 없습니다. 
    ORA-12491 READ_COMPATIBLE 모드로 마운트할 경우 MAC 모드로 변경할 수 없습니다. 
    ORA-12494 DBLOW 위로 레이블된 두번째 데이타베이스를 마운트할 수 없습니다. 
    ORA-12495 Trusted Oracle은 멀티-쓰레드 서버로 사용할 수 없습니다. 
    ORA-12500 TNS:리스너가 전용 서버 프로세스를 시작하는데 실패했습니다. 
    ORA-12501 TNS:리스너가 프로세스를 생성하는데 실패했습니다. 
    ORA-12502 TNS:리스너가 클라이언트로 부터 CONNECT_DATA을 받지 못했습니다. 
    ORA-12504 TNS:리스너가 CONNECT_DATA 의 SID 를 받지 못했습니다. 
    ORA-12505 TNS:리스너가 연결 설명자로 부터 받은 SID 를 분석할 수 없습니다. 
    ORA-12506 TNS:리스너가 CONNECT_DATA 의 별칭을 받지 못했습니다. 
    ORA-12507 TNS:리스너가 받은 별칭을 분석하지 못했습니다. 
    ORA-12508 TNS:리스너가 받은 명령을 분석하지 못했습니다. 
    ORA-12509 TNS:리스너가 클라이언트를 서비스 핸들러로 리다이렉트 하는데 실패했습니다. 
    ORA-12510 TNS:데이타베이스가 이 SID 의 요구를 핸들하는 데 필요한 자원이 부족합니다. 
    ORA-12511 TNS:서비스 핸들러가 발견되었지만 연결을 허용할 수 없습니다. 
    ORA-12512 TNS:서비스 핸들러가 발견되었지만 리다이렉트 주소에 등록되어 있지 않습니다. 
    ORA-12513 TNS:서비스 핸들러가 발견되었지만 다른 프로토콜이 등록되어 있습니다. 
    ORA-12531 TNS:메모리를 할당할 수 없습니다. 
    ORA-12532 TNS:사용할 수 없는 인수입니다. 
    ORA-12533 TNS:사용할 수 없는 ADDRESS 파라미터입니다. 
    ORA-12534 TNS:지원되지 않는 작동입니다. 
    ORA-12535 TNS:작동이 중단중입니다. 
    ORA-12536 TNS:작동이 블럭 되었습니다. 
    ORA-12537 TNS:연결이 종료되었습니다. 
    ORA-12538 TNS:그런 프로토콜 어댑터는 없습니다. 
    ORA-12539 TNS:버퍼가 어버플로워 혹은 언더플로워되었습니다. 
    ORA-12540 TNS:내부 한계 제한을 넘어섰습니다. 
    ORA-12541 TNS:리스너가 아닙니다. 
    ORA-12542 TNS:이미 사용중인 주소입니다. 
    ORA-12543 TNS:수신지 호스트에 도달할 수 없습니다. 
    ORA-12544 TNS:문맥에 다른 wait/test 함수가 있습니다. 
    ORA-12545 대상 호스트 또는 개체가 존재하지 않아 연결에 실패했습니다. 
    ORA-12546 TNS:허용이 거부되었습니다. 
    ORA-12547 TNS:연결이 끊어졌습니다. 
    ORA-12548 TNS:읽기나 쓰기가 완전치 못합니다. 
    ORA-12549 TNS:OS 자원 분배를 넘었습니다. 
    ORA-12550 TNS:구문 오류 
    ORA-12551 TNS:키워드가 필요합니다. 
    ORA-12552 TNS:작동이 인터럽트되었습니다. 
    ORA-12555 TNS:허용이 거부되었습니다. 
    ORA-12556 TNS:콜러가 아닙니다. 
    ORA-12557 TNS:프로토콜 어댑터를 로드할 수 없습니다. 
    ORA-12560 TNS:프로토콜 어댑터 오류 
    ORA-12561 TNS:알 수 없는 오류 
    ORA-12562 TNS:잘못된 글로벌 핸들 
    ORA-12564 TNS:연결이 거부되었습니다. 
    ORA-12566 TNS:프로토콜 오류 
    ORA-12569 TNS:패킷 체크섬 실패 
    ORA-12570 TNS:패킷 리더 실패 
    ORA-12571 TNS:패킷 라이터 실패 
    ORA-12574 TNS:리다리렉션이 무시되었습니다. 
    ORA-12582 TNS:쓸모없는 작동 
    ORA-12583 TNS:리더가 아닙니다. 
    ORA-12585 TNS:데이타 뒷부분이 짤렸습니다. 
    ORA-12589 TNS:연결을 보내지 못합니다. 
    ORA-12590 TNS:I/O 버퍼가 아닙니다. 
    ORA-12591 TNS:이벤트 신호 실패 
    ORA-12592 TNS:손상된 패킷 
    ORA-12593 TNS:등록된 연결이 아닙니다. 
    ORA-12595 TNS:확인되지 않았습니다. 
    ORA-12596 TNS:내부가 일치되지 않았습니다. 
    ORA-12597 TNS:연결 설명자는 이미 사용중입니다. 
    ORA-12598 배너 등록 실패 
    ORA-12599 TNS:크립토그라픽 체크섬이 일치하지 않습니다. 
    ORA-12616 TNS:이벤트 신호가 아닙니다. 
    ORA-12618 TNS:호환되는 버전이 아닙니다. 
    ORA-12619 TNS:요구된 서비스를 승락할 수 없습니다. 
    ORA-12620 TNS:가능하지 않은 특성을 요구했습니다. 
    ORA-12622 TNS:이벤트 인식이 동일하지 않습니다. 
    ORA-12623 TNS:이 상태에서는 작동이 적절하지 않습니다. 
    ORA-12624 TNS:연결이 이미 등록되어있습니다. 
    ORA-12625 TNS:인수가 필요합니다. 
    ORA-12626 TNS:틀린 이벤트 유형 
    ORA-12628 TNS:이벤트 콜백이 아닙니다. 
    ORA-12629 TNS:이벤트 테스트가 아닙니다. 
    ORA-12630 TNS:원시 서비스 작업이 지원되지 않습니다. 
    ORA-12631 TNS:이름 검색에 실패 
    ORA-12632 TNS:롤 인출에 실패 
    ORA-12633 TNS:공유되는 인증 서비스가 없습니다. 
    ORA-12634 TNS:메모리 할당에 실패했습니다. 
    ORA-12635 TNS:사용가능한 인증 어댑터가 없습니다. 
    ORA-12636 TNS:패킷 송신에 실패했습니다. 
    ORA-12637 TNS:패킷 수신에 실패했습니다. 
    ORA-12638 TNS:신용 검색에 실패했습니다. 
    ORA-12639 TNS:인증 서비스 니고시에이션에 실패했습니다. 
    ORA-12640 TNS:인증 서비스 초기화에 실패했습니다. 
    ORA-12641 TNS:인증 서비스가 초기화하는데 실패했습니다. 
    ORA-12642 TNS:세션 키가 없습니다. 
    ORA-12643 TNS:통신 프로세스가 실패했습니다. 
    ORA-12644 TNS:인증 서비스 초기화에 실패했습니다. 
    ORA-12645 TNS:파라미터가 존재하지 않습니다. 
    ORA-12646 TNS:부울 파라미터에 부적당한 값이 지정되었습니다. 
    ORA-12647 TNS:인증이 필요합니다. 
    ORA-12648 TNS:암호화 또는 데이타 무결성 알고리즘 리스트가 비어 있습니다. 
    ORA-12649 TNS:알 수 없는 암호화 또는 데이타 무결성 알고리즘입니다. 
    ORA-12650 TNS:공통의 암호화 또는 데이타 무결성 알고리즘이 없습니다. 
    ORA-12651 TNS:암호화 또는 데이타 무결성 알고리즘을 승인할 수 없습니다. 
    ORA-12652 TNS:스트링이 잘렸습니다. 
    ORA-12653 TNS:인증 제어 함수가 실패했습니다. 
    ORA-12654 TNS:인증 변환에 실패했습니다. 
    ORA-12655 TNS:암호 검색에 실패했습니다. 
    ORA-12656 TNS:암호 체크섬이 일치하지 않습니다. 
    ORA-12657 TNS:설치된 알고리즘이 없습니다. 
    ORA-12658 TNS:원시 서비스가 필요하지만 TNS 버전이 호환되지 않습니다. 
    ORA-12659 TNS:다른 프로세스로부터 받은 오류 
    ORA-12699 TNS:원시 서비스 내부 오류 
    ORA-12700 잘못된 NLS 파라미터 값 (%s)입니다. 
    ORA-12701 알 수 없는 CREATE DATABASE 문자 세트 
    ORA-12702 부적절한 NLS 파라미터 스트링이 SQL함수에서 사용되었습니다. 
    ORA-12703 이 문자세트 변환은 제공되지 않습니다. 
    ORA-12705 부적당하거나 알려지지 않은 NLS 파라미터가 명시되었습니다. 
    ORA-12706 CREATE DATABASE 문자세트가 허용되지 않습니다. 
    ORA-12707 데이타베이스의 생성시 NLS 파라미터 %s를 획득하는데 오류가 발생했습니다. 
    ORA-12708 데이타베이스의 생성시 NLS 파라미터 %s를 로드하는데 오류가 발생했습니다. 
    ORA-12709 데이타베이스의 생성시 문자 세트를 로드하는데 오류가 발생했습니다. 
    ORA-12800 시스템이 너무 바빠 병렬 질의 수행이 어려울 것 갑습니다. 
    ORA-12801 병렬 질의 서버 %s에 오류신호가 발생했습니다. 
    ORA-12802 파라미터 질의 서버가 연락 담당자와 접촉이 끊겼습니다. 
    ORA-12803 파라미터 질의 서버가 다른 서버와 접촉이 끊겼습니다. 
    ORA-12804 병렬 질의 서버가 죽는것 처럼 나타났습니다. 
    ORA-12805 병렬 질의 서버가 예상치 않게 죽었습니다. 
    ORA-12806 엔큐를 멈취기위해 백그라운드 프로세스를 찾을 수 없습니다. 
    ORA-12807 병렬 질의 메시지를 프로세스 큐가 받을수 없습니다. 
    ORA-12808 %s_INSTANCES를 인스턴스의 수 %s보다 크게 설정할 수 없습니다. 
    ORA-12809 배타 모드로 마운트 되어지면 %s_INSTANCES 설정을 할 수 없습니다. 
    ORA-12810 PARALLEL_MAX_SERVERS는 %s보다 적거나 동일해야 합니다. 
    ORA-12811 PARALLEL_MIN_SERVERS는 PARALLEL_MAX_SERVERS 보다 적거나 똑같아야 합니다 %s 
    ORA-12812 하나만의 PARALLEL 또는 NOPARALLEL 절이 지정되어야 합니다. 
    ORA-12813 PARALLEL 또는 DEGREE에 대한 값이 0 보다 커야합니다. 
    ORA-12814 하나만의 CACHE 또는 NOCACHE 절이 지정되어야 합니다. 
    ORA-12815 INSTANCES에 대한 값이 0 보다 커야합니다. 
    ORA-12816 병렬은 속성 경로 운영 색인을 만들었습니다. 
    ORA-12817 병렬 질의 옵션이 사용 가능해야 합니다. 
    ORA-12818 PARALLEL 절에 잘못된 옵션 
    ORA-12819 PARALLEL 절에 옵션이 빠졌습니다. 
    ORA-12820 DEGREE에 대한 값이 잘못되었습니다. 
    ORA-12821 INSTANCES에 대한 값이 잘못되었습니다. 
    ORA-12822 PARALLEL 절에 중복된 옵션 
    ORA-12823 병행성의 기본 정도가 여기에 지정되지 않았을 것입니다. 
    ORA-12824 INSTANCES DEFAULT가 여기에 지정되지 않았을 것입니다. 
    ORA-12825 여기에 명확한 병행성의 정도가 지정되어야 합니다. 
    ORA-12826 동작을 멈춘 병렬 질의 서버가 제거되었습니다. 
    ORA-12827 사용할 수 있는 병렬 질의 종속이 충분하지 않습니다. 
    ORA-13000 차원 수가 범위를 넘었습니다. 
    ORA-13001 디멘숀에 일치하지 않은 오류 
    ORA-13002 지정된 레벨이 범위를 넘었습니다. 
    ORA-13003 디멘숀에 대한 지정된 범위가 부적당합니다. 
    ORA-13004 지정된 버퍼 크기는 부적당합니다. 
    ORA-13005 순환 HHCODE 함수 오류 
    ORA-13006 지정된 셀 수가 부적당합니다. 
    ORA-13007 부적당한 HEX 문자가 발견되었습니다. 
    ORA-13008 지정된 데이터 포맷이 부적당한 구성요소를 가지고 있습니다. 
    ORA-13009 지정된 데이터 스트링이 부적당합니다. 
    ORA-13010 부적당한 인수의 수가 지정되었습니다. 
    ORA-13011 값이 범위를 넘었습니다. 
    ORA-13012 부적당한 윈도우 형태가 지정되었습니다. 
    ORA-13013 지정된 위상이 INTERIOR 또는 BOUNDARY가 아닙니다. 
    ORA-13014 위상 식별자가 1 에서 8 로 지정된 범위 밖으로 지정했습니다. 
    ORA-13015 윈도우 정의가 적당하지 않습니다. 
    ORA-13016 잘못된 파티션 정의 
    ORA-13017 알 수 없는 라인 파티션 외형입니다. 
    ORA-13018 잘못된 거리 형태 
    ORA-13100 요청한 프래임이 잘못된 폼으로 되어 있습니다. 
    ORA-13101 파티션 이름 데이터형태는 varchar2 이어야 합니다. 
    ORA-13102 회답 파이프 이름 데이터형태는 varchar2 이어야 합니다. 
    ORA-13103 시간초과로 파이프 %s에서 인식하는데 실패했습니다. 
    ORA-13104 시간초과로 파이프 %s에 회신을 송신하는데 실패했습니다. 
    ORA-13105 파이프 %s에 버퍼가 오버플로우 되었습니다. 
    ORA-13106 파이프 %s에 긍정 응답하는 것이 인터럽트되었습니다. 
    ORA-13107 파이프 %s에 회신하는 것이 인터럽트되었습니다. 
    ORA-13108 공간 테이블 %s을 찾을 수 없습니다. 
    ORA-13109 공간 테이블 %s가 존재합니다. 
    ORA-13110 공간 테이블 %s이 파티션되지 않았습니다. 
    ORA-13111 공간 테이블 %s 에 정의된 파티션 키가 없습니다. 
    ORA-13112 카운트 모드 %s 가 부적당합니다. 
    ORA-13113 오라클 테이블 %s 은 존재하지 않습니다. 
    ORA-13114 테이블스페이스 %s 을 찾을 수 없습니다. 
    ORA-13115 테이블스페이스 %s 은 이미 할당된 것입니다. 
    ORA-13116 테이블스페이스 %s 은 테이블 %s에 할당되지 않았습니다. 
    ORA-13117 파티션 %s 은 찾을 수 없습니다. 
    ORA-13118 파티션 %s 은 오프라인입니다. 
    ORA-13119 소스와 대상 테이블스페이스들은 동일한 것입니다. 
    ORA-13120 SD*POD 은 파이프 %s에 리스닝하지 않습니다. 
    ORA-13121 자식 파티션을 작성하는데 실패했습니다. 
    ORA-13122 자식 파티션 %s을 찾을 수 없습니다. 
    ORA-13123 열 %s 은 이미 정의되었습니다. 
    ORA-13124 열 %s에 대한 열 ID를 결정할 수 없습니다. 
    ORA-13125 파티션 키가 이미 설정되었습니다. 
    ORA-13126 공간 테이블 %s 에 대한 클래스를 결정할 수 없습니다. 
    ORA-13127 대상 파티션을 생성하는데 실패했습니다. 
    ORA-13128 열 %s 에 대한 디멘션을 확인하는데 실패했습니다. 
    ORA-13129 HHCODE 열 %s 이 없습니다. 
    ORA-13130 %s에서 회신이 오기를 기다리는데 시간초과되었습니다. 
    ORA-13131 파이프 %s에 있는 레코드가 너무 큽니다. 
    ORA-13132 %s에서 읽은 파이프가 인터럽트되었습니다. 
    ORA-13133 아카이브 요청이 실패되었습니다. 
    ORA-13134 요청을 복구하는데 실패되었습니다. 
    ORA-13135 오프라인 패스가 중복되었습니다. 
    ORA-13136 널 공통 코그가 생성되었습니다. 
    ORA-13138 개체 %s의 이름을 결정할 수 없습니다. 
    ORA-13139 %s에 대한 열 정의를 얻을 수 없습니다. 
    ORA-13140 부적당한 대상 형태 
    ORA-13141 부적당한 RANGE 윈도우 정의 
    ORA-13142 부적당한 PROXIMITY 윈도우 정의 
    ORA-13143 부적당한 POLYGON 윈도우 정의 
    ORA-13144 대상 테이블 %s 이 없습니다. 
    ORA-13145 범위 목록을 생성하는데 실패했습니다. 
    ORA-13146 변수 %s을 대체할 테이블을 찾을 수 없습니다. 
    ORA-13147 MBR을 생성하는데 실패했습니다. 
    ORA-13148 SQL 필터를 생성하는데 실패했습니다. 
    ORA-13149 공간 테이블 %s을 위한 다음 시퀀스 번호를 생성하는데 실패했습니다. 
    ORA-13150 예외 레코드를 삽입하는데 실패했습니다. 
    ORA-13152 부적당한 HHCODE 형태 
    ORA-13197 MDSYS만이 %s 을 수행할 수 있습니다. 
    ORA-13198 오라클 오류 ORA%s 가 있습니다. 
    ORA-19999 skip_row 프로시저가 불리워졌습니다. 
    ORA-20000 %s 
    ORA-21000 raise_application_error의 %s%s에 대한 수치인수가 범위를 벗어났음, -20000과 -20999 사이에 있어야만 합니다. 
    ORA-23300 %s 
    ORA-23301 지연 rcp 수신 모드들이 혼용되었습니다. 
    ORA-23302 지연 RPC 동안에 어플리케이션에서 통신 실패가 발생했습니다. 
    ORA-23303 지연 RPC 동안에 어플리케이션에서 일반적인 예외가 일어났습니다. 
    ORA-23304 인수 %s(%s 의, 호출 %s, tid %s)의 지연 rpc가 잘못 만들어졌습니다. 
    ORA-23305 내부 지연 RPC 오류: %s 
    ORA-23306 스키마 %s는 존재하지 않습니다. 
    ORA-23307 중복 스키마 %s는 이미 존재합니다. 
    ORA-23308 개체 %s.%s는 존재하지 않거나 부적당합니다. 
    ORA-23309 개체 %s.%s(유형 %s의)는 존재합니다. 
    ORA-23310 개체 그룹 %s 은 중지되지 않습니다. 
    ORA-23311 개체 그룹 %s 은 중지되었습니다. 
    ORA-23312 %s에 의해 불러진것이 masterdef가 아닙니다. 
    ORA-23313 개체 그룹 %s 는 %s에서 마스터된것이 아닙니다. 
    ORA-23314 데이타베이스는 %s에 대한 스냅샷이 아닙니다. 
    ORA-23315 복제목록 버전 또는 요청 %s가 버전 %s에서 지원되지 않습니다. 
    ORA-23316 masterdef는 %s입니다. 
    ORA-23317 통신 실패가 일어났습니다. 
    ORA-23318 ddl 실패가 일어났습니다. 
    ORA-23319 파라미터 값 %s이 적당하지 않습니다. 
    ORA-23320 값 %s 와 %s 때문에 요청에 실패했습니다. 
    ORA-23323 파라미터 길이가 지연 RPC 한계를 초과하였습니다. 
    ORA-23324 오류 %s, %s에서 지연 엔트리를 작성하는 동안 오류 %s가 발생했습니다. 
    ORA-23325 파라미터 유형은 %s가 아닙니다. 
    ORA-23326 시스템이 정지되었습니다. 
    ORA-23327 가져오기되는 지연 rpc 데이타가 데이타베이스의 %s와 일치하지 않습니다. 
    ORA-23328 스냅샷 기본 테이블 %s 은 마스터 테이블 %S 과 다릅니다. 
    ORA-23329 ddl에 공급된-사용자가 성공하였지만 스냅샷 %s가 없습니다. 
    ORA-23330 열 그룹 %s는 이미 존재합니다. 
    ORA-23331 열 그룹 %s는 존재하지 않습니다. 
    ORA-23332 그룹 %s를 사용하고 있습니다; 제거할 수 없습니다. 
    ORA-23333 열 %s는 이미 열 그룹의 일부입니다. 
    ORA-23334 열 %s 는 테이블 또는 열 그룹에 존재하지 않습니다. 
    ORA-23335 우선권 그룹 %s는 이미 존재합니다. 
    ORA-23336 우선권 그룹 %s는 존재하지 않습니다. 
    ORA-23337 우선권 또는 값이 우선권 그룹 %s에 있지 않습니다. 
    ORA-23338 우선권 또는 값이 이미 우선권 그룹 %s에 있습니다. 
    ORA-23339 대립 해결 정보가 중복되었습니다. 
    ORA-23340 해결 방법 %s이 잘못되었습니다. 
    ORA-23341 사용자 함수가 요구되었습니다. 
    ORA-23342 파라미터 열 %s이 부적당합니다. 
    ORA-23343 지정된 대립 해결 정보가 등록되지 않았습니다. 
    ORA-23344 제약조건 (%s.%s)는 존재하지 않습니다. 
    ORA-23345 테이블 %s 는 통계를 정리하기 위해서 등록하지 않았습니다. 
    ORA-23346 테이블 %s에 대한 기본키가 정의되지 않았습니다. 
    ORA-23347 데이타유형 %s(열 %s이 있는 테이블 %s)는 지원되지 않았습니다. 
    ORA-23348 %s 프로시저를 복제할 수 없습니다; IN 파라미터만 지원됩니다. 
    ORA-23349 함수에대한 중복 지원을 생성할 수 없습니다. 
    ORA-23350 반복 호출의 최대 수가 초과되었습니다. 
    ORA-23351 파라미터 데이타유형 %s(프로시저 %s에 대한)는 지원되지 않습니다. 
    ORA-23352 지연 트랜잭션에 수신이 중복되었습니다. 
    ORA-23353 지연 RPC 큐는 개체 그룹 %s에 대한 엔트리를 가지고 있습니다. 
    ORA-23354 지연 RPC 실행은 %s에 대해서 사용불가합니다. 
    ORA-23355 개체 %s.%s 은 존재하지 않거나 마스터 위치가 부적당한 것입니다. 
    ORA-23360 마스터 테이블 %s 에 대한 하나의 스냅샷만이 생성될 수 있습니다. 
    ORA-23361 스냅샷 %s 은 마스터 싸이트에 존재하지 않습니다. 
    ORA-23363 마스터와 스냅 싸이트에 스냅 기본 테이블 %s이 일치하지 않습니다. 
    ORA-23364 중복 옵션은 설치되지 않았습니다. 
    ORA-23365 싸이트 %s 가 존재하지 않습니다. 
    ORA-23366 정수 값 %s 은 1 보다 적습니다. 
    ORA-23367 테이블 %s 은 기본 키를 누락했습니다. 
    ORA-23368 이름 %s 은 널 또는 빈 스트링일 수 없습니다. 
    ORA-23369 %s 인수의 값이 널일 수는 없습니다. 
    ORA-23370 테이블 %s 와 테이블 %s 들은 동등한 (%s) 외형이 아닙니다. 
    ORA-23371 열 %s 이 테이블 %s에서 알 수 없습니다. 
    ORA-23372 형태 %s 가 테이블 %s 에서 제공되지 않습니다. 
    ORA-23373 개체 그룹 %s 은 존재하지 않습니다. 
    ORA-23374 개체 그룹 %s 은 이미 존재합니다. 
    ORA-23375 기능은 %s에 데이터베이스 버전과 호환되지 않습니다. 
    ORA-23376 노드 %s 은 중복 버전 %s와 호환되지 않습니다. 
    ORA-23377 missing_rows_oname1 인수에 대한 잘못된 %s 이름입니다. 
    ORA-23378 연결 수식어 %s 은 개체 그룹 %s에 대해 적당한 것이 아닙니다. 
    ORA-23379 연결 수식어 %s 은 너무 깁니다. 
    ORA-23380 전파 모드 %s 은 적당하지 않습니다. 
    ORA-23381 기본 개체 %s.%s@%s 을 위한 생성된 개체는 존재하지 않습니다. 
    ORA-23400 부적당한 스냅샷 %s 이름입니다. 
    ORA-23401 스냅샷 %s이 존재하고 있지 않습니다. 
    ORA-23402 지연 txns의해서 충돌되었기 때문에 재생이 중지되었습니다. 
    ORA-23403 재생 그룹 %s가 이미 존재합니다. 
    ORA-23404 재생 그룹 %s 가 존재하고 있지 않습니다. 
    ORA-23405 재생 그룹 수 %s가 존재하고 있지 않습니다. 
    ORA-23406 사용자 %s에 불충분한 권한을 가지고 있습니다. 
    ORA-23407 개체 %s 이름은 schema, object 또는 object 처럼 지정해야 합니다. 
    ORA-23409 사용되지 않은 그룹 수를 찾을 수 없습니다. 
    ORA-23410 스냅샷 %s 는 재생 그룹에 이미 있습니다. 
    ORA-23411 스냅샷 %s는 재생 그룹 %s에 없습니다. 
    ORA-23420 간격은 미래에 시간의 값을 구해야 합니다. 
    ORA-23421 일 번호 %s는 일 큐에 있는 일이 아닙니다. 
    ORA-23422 오라클 서버는 자주 사용되지 않는 일 번호을 생성할 수 없습니다. 
    ORA-23423 일 번호 %s는 정수가 아닙니다. 
    ORA-23430 인수 %s 은 NULL 또는 빈 스트링일 수 없습니다. 
    ORA-23431 잘못된 상태: %s 
    ORA-23432 마스터 싸이트 %s는 이미 존재합니다. 
    ORA-23433 실행을 잘못된 마스터 싸이트 %s에서 하고 있습니다. 
    ORA-23434 마스터 싸이트 %s 은 개체 그룹으로 알려 지지 않았습니다. 
    ORA-24275 함수 %s 파라미터 %s는 누락되었거나 또는 부당한 것입니다. 
    ORA-24276 함수 %s 출력 %s의 최대값이 초과되었습니다. 
    ORA-24300 모드에 잘못된 값이 있습니다. 
    ORA-24301 쓰레드-안전 로그온에 지정된 널 호스트입니다. 
    ORA-24302 다른 쓰레드에 의해 사용하고 있는 곳에 호스트 연결이 있습니다. 
    ORA-24303 호출은 비-지연 링키지를 지원하지 않습니다. 
    ORA-24304 데이터형태는 호출을 허용하지 않습니다. 
    ORA-24305 잘못된 바인드 또는 정의 켄텍스트입니다. 
    ORA-24306 구분을 위한 잘못된 버퍼 
    ORA-24307 구분을 위한 길이가 부적당합니다. 
    ORA-25000 트리거 WHEN 절에 바인드 변수의 사용이 부적당합니다. 
    ORA-25100 TABLESPACE 옵션은 ALTER INDEX REBUILD와 같이 사용해야만 합니다. 
    ORA-25101 REBUILD 옵션 지정이 중복되었습니다. 
    ORA-25102 PARALLEL 옵션은 ALTER INDEX REBUILD와 같이 사용해야만 합니다. 
    ORA-25103 NOPARALLEL 옵션은 ALTER INDEX REBUILD와 같이 사용해야만 합니다. 
    ORA-25104 UNRECOVERABLE 옵션은 ALTER INDEX REBUILD와 같이 사용해야만 합니다. 
    ORA-25105 RECOVERABLE 옵션은 ALTER INDEX REBUILD와 같이 사용해야만 합니다. 
    ORA-25106 하나의 PARALLEL 또는 NOPARALLEL절 만이 지정되어야 합니다. 
    ORA-25107 TABLESPACE 옵션 지정이 중복되었습니다. 
    ORA-25108 대기 잠금 이름 공간은 %s 문자의 한계 크기를 초과했습니다. 
    ORA-25109 대기 잠금 이름 공간은 잘못된 %s 문자를 가지고 있습니다. 
    ORA-25110 NOSORT 은 비트맵 색인과 같이 사용하면 안됩니다. 
    ORA-25111 BITMAP은 클러스터 색인과 같이 사용하면 안됩니다. 
    ORA-25112 비트맵 색인은 하나의 열을 색인합니다. 
    ORA-25113 BITMAP 색인에 대한 DML 작업은 구현되지 않습니다.

    Posted by 1010
    02.Oracle/DataBase2012. 5. 2. 16:12
    반응형


    • 역주는 항상 이러한 스타일로 표시하겠습니다. 또한, 편집자가 문서 내에 남겨둔 주석(<!-- -->내부를 말합니다) 중 읽어둘만 하다 생각되는 것을 이런 스타일로 표시했습니다. 원문과 혼동 없으시길 바랍니다.
    • 원본에서 사용하는 마크업 구조를 번역에 사용할 시간은 내기 어렵고, 번역자의 오류가 있다면 빨리 발견할 수 있어야 하므로 이 번역에서는 영문 원본과 한글을 함께 유지합니다. 영문을 숨기길 원한다면, 상단 회색 음영에 마우스를 올리면 나타나는 메뉴에서 "영문 숨김"을 사용하실 수 있습니다. 하지만 링크를 사용할 수 없게 되므로 권장하는 방법은 아닙니다.
    • introduction 에서 설명되겠지만, 이 명세는 몇가지 이유로 인해 여태까지의 명세와는 전혀 다른 수준의 상세함을 갖고 있습니다. 이러한 상세함의 상당수는 브라우저 제작자를 위해 의도된 내용으로서, 이 번역본의 주된 독자층에게는 꼭 필요한 내용은 아닐 수 있습니다. 따라서 번역에서는 이러한 상세한 내용 중 상당부분을 건너뛸 것입니다. 이렇게 건너뛰어진 내용은 이와 같이, 또는 브라우저 제작자 대상 내용입니다.와 같이 나타날 것이며, 내용은 온존되어 있지만 숨겨져 있습니다. 전자의 경우는 마우스오버로, 후자의 경우는 클릭으로 숨겨진 내용을 확인해 보실 수 있습니다.
    • 그러나 명세 내부의 하이퍼링크를 클릭하여 이동한 경우에는 모든 내용이 숨김 없이 드러나게 되어 있습니다.
    • 명세의 번역을 진행한 그룹에서 몇가지 예제를 제작하여 브라우저 호환성 등을 테스트해본 것이 있습니다. 클리어보스 데모 와 같이 나타날 것입니다. 이러한 예제들은 공식적으로 문서화 된 것이 아닌, 스터디 그룹의 주관적인 내용을 포함하므로 혼동 없으시길 바랍니다.

    초록

    이 명세는 월드 와이드 웹의 코어 언어 : 하이퍼텍스트 마크업 랭귀지(HTML) 의 5번째 주요 개정판을 정의합니다. 이 버전에서는 웹 프로그래머를 위한 새로운 기능들, 기존의 웹 저작 경향을 분석한 결과에 기초한 새로운 요소들, 그리고 상호작용성을 개선하기 위해 사용자 에이전트들이 준수해야 할 사항들을 명확하게 제시하고 있습니다.

    This specification defines the 5th major revision of the core language of the World Wide Web: the Hypertext Markup Language (HTML). In this version, new features are introduced to help Web application authors, new elements are introduced based on research into prevailing authoring practices, and special attention has been given to defining clear conformance criteria for user agents in an effort to improve interoperability.

    이 문서의 상태

    이 섹션은 명세가 발간된 시점에서의 문서의 상태를 설명합니다. 다른 문서들이 이 문서보다 우선할 수 있습니다. 현재의 W3C 발행본들과 최근의 발행본들에 대한 리스트는 http://www.w3.org/TR/, W3C 기술문서 목록에서 확인하실 수 있습니다.

    This section describes the status of this document at the time of its publication. Other documents may supersede this document. A list of current W3C publications and the most recently formally published revision of this technical report can be found in the W3C technical reports index at http://www.w3.org/TR/.

    W3C에서 관리하도록 이 문서에 관한 코멘트를 남기길 원한다면 공개된 버그 데이터베이스를 통해 주시기 바랍니다. 계정을 가지고 있지 않다면 다음 폼을 이용할 수 있습니다.

    If you wish to make comments regarding this document in a manner that is tracked by the W3C, please submit them via using our public bug database. If you do not have an account then you can enter feedback using this form:

    Feedback Comments

    피드백을 입력하실 때는 해당 섹션의 제목을 주의깊게 입력하고, 잘못된 텍스트를 따옴표로 감싸 주십시오. 새로운 기능을 제안하려 하는 것이라면, 그러한 것을 통해서 무엇을 개선하려 하는지 정확히 밝히는 것이 중요합니다. 사실, 해결책보다 그것이 더 중요합니다.

    섹션 번호는 생략해주시기 바랍니다. 번호는 자주 바뀌므로, 피드백을 이해하기가 더 어려워집니다.

    Please don't use section numbers as these tend to change rapidly and make your feedback harder to understand.

    (Note: 스팸을 방지할 목적으로 IP 주소를 기록할 것입니다.)

    이 폼을 이용할 수 없을 경우, public-html-comments@w3.org로 피드백을 보낼 수 있습니다. (구독목록) 이렇게 전달된 피드백은 공개된 버그 데이터베이스에 기록될 것입니다. 또는 whatwg@whatwg.org로 메일을 보내도 됩니다. (구독목록). 편집자는 이 목록으로 전달된 모든 실질적인 피드백에 응답할 것을 보장합니다만, 그러한 피드백은 공식적인 것으로 간주되지는 않습니다. 모든 피드백을 환영합니다.

    If you cannot do this then you can also e-mail feedback to public-html-comments@w3.org (subscribearchives), and arrangements will be made to transpose the comments to our public bug database. Alternatively, you can e-mail feedback to whatwg@whatwg.org (subscribe,archives). The editor guarantees that all substantive feedback sent to this list will receive a reply. However, such feedback is not considered formal feedback for the W3C process. All feedback is welcome.

    워킹 그룹에서는 아직 편집자가 교정을 시도하지 않은 버그 리포트와, 아직 대응방안이 결정되지 않은 이슈들의 목록을 유지하고 있습니다. 편집자는 아직 검토하지 못한 이메일 목록 역시 관리하고 있습니다. 이러한 버그, 이슈, 이메일들은 단순히 이 명세뿐만이 아니라, HTML에 관련된 다양한 명세들에 적용됩니다.

    The working groups maintains a list of all bug reports that the editor has not yet tried to address and a list of issues for which the chairs have not yet declared a decision. The editor also maintains a list of all e-mails that he has not yet tried to address. These bugs, issues, and e-mails apply to multiple HTML-related specifications, not just this one.

    구현자implementor들은 이 명세가 아직 안정된 상태가 아님을 명심해야 합니다. 토론에 참여하지 않은 구현자들은 명세가 비호환적인 방향으로 변경되는 것을 발견할 것입니다. 이 명세를 구현하고자 하는 제작자들은 명세가 권고 후보 단계에 도달하기 전에 상기 메일링 리스트에 가입하고 토론에 참여해야 합니다.

    Implementors should be aware that this specification is not stable. Implementors who are not taking part in the discussions are likely to find the specification changing out from under them in incompatible ways. Vendors interested in implementing this specification before it eventually reaches the Candidate Recommendation stage should join the aforementioned mailing lists and take part in the discussions.

    이것은 진행중인 명세입니다! HTML 워킹 그룹의 최신 업데이트 - 중요한 버그 픽스를 포함하고 있을 수 있습니다 - 를 보려면 편집자 초안을 보기 바랍니다.

    This is a work in progress! For the latest updates from the HTML WG, possibly including important bug fixes, please look at the editor's draft instead.

    이 문서를 W3C 워킹 드래프트로 발행한다고 해서, W3C HTML 워킹 그룹의 참여자들 모두가 이 명세의 내용을 존중한다는 것을 암시하지는 않습니다. 물론, 이 명세의 모든 섹션에 대해 워킹 그룹 혹은 W3C 멤버들 중 많은 사람이 현재의 텍스트를 충실히 따르고 섹션 전체를 존중하거나, 최소한 섹션의 컨셉을 토의하는데 시간을 투자해야 한다는 점에 의견을 같이하고 있습니다.

    The publication of this document by the W3C as a W3C Working Draft does not imply that all of the participants in the W3C HTML working group endorse the contents of the specification. Indeed, for any section of the specification, one can usually find many members of the working group or of the W3C as a whole who object strongly to the current text, the existence of the section at all, or the idea that the working group should even spend time discussing the concept of that section.

    이 명세의 안정화된 최근 편집자 초안은 the W3C CVS serverWHATWG Subversion repository에서 이용할 수 있습니다. 최근의 편집자 카피 (완결되지 않은 문장이 들어 있을 수 있습니다)에는 이 명세와 관련된 최근의 초안 텍스트들이 포함되어 있습니다. 더 자세한 내용은 WHATWG FAQ을 참고하기 바랍니다.

    The latest stable version of the editor's draft of this specification is always available on the W3C CVS server and in the WHATWG Subversion repository. The latest editor's working copy (which may contain unfinished text in the process of being prepared) contains the latest draft text of this specification (amongst others). For more details, please see the WHATWG FAQ.

    HTML 명세의 변경 이력은 다음과 같은 방법으로 열람할 수 있습니다.

    There are various ways to follow the change history for the HTML specifications:

    E-mail notifications of changes
    HTML-Diffs mailing list (diff-marked HTML versions for each change): http://lists.w3.org/Archives/Public/public-html-diffs/latest

    Commit-Watchers mailing list (complete source diffs): http://lists.whatwg.org/listinfo.cgi/commit-watchers-whatwg.org

    Real-time notifications of changes:
    Generated diff-marked HTML versions for each change: http://twitter.com/HTML5

    Browsable version-control record of all changes:
    CVSWeb interface with side-by-side diffs: http://dev.w3.org/cvsweb/html5/

    Annotated summary with unified diffs: http://html5.org/tools/web-apps-tracker

    Raw Subversion interface: svn checkout http://svn.whatwg.org/webapps/

    W3C의 HTML 워킹 그룹에서 W3C 권고안 트랙에 관련하여 이 명세의 진행을 책임지고 있습니다. 이 명세는 2011년 1월 13일자 초안입니다.

    The W3C HTML Working Group is the W3C working group responsible for this specification's progress along the W3C Recommendation track. This specification is the 13 January 2011 Working Draft.

    WHATWG에서도 이 명세에 관한 작업을 진행하고 있습니다. W3C HTML 워킹그룹은 WHATWG와 협력하고 있으며, 이에 관한 상세는 W3C HTML working group charter에 있습니다.

    Work on this specification is also done at the WHATWG. The W3C HTML working group actively pursues convergence with the WHATWG, as required by the W3C HTML working group charter.

    이 문서는 2004년 2월 5일 W3C 특허 정책을 준용합니다. W3C는 그룹의 운영과 관련하여 공적인 특허 목록을 관리합니다. 이 페이지에는 특허를 발표하는 것에 관한 지침 역시 포함되어 있습니다.

    This document was produced by a group operating under the 5 February 2004 W3C Patent Policy. W3C maintains a public list of any patent disclosures made in connection with the deliverables of the group; that page also includes instructions for disclosing a patent. An individual who has actual knowledge of a patent which the individual believes contains Essential Claim(s) must disclose the information in accordance with section 6 of the W3C Patent Policy.

    차례

    아래의 차례에서 회색으로 표시된 부분은 그 내용이 브라우저 제작자 대상이며, 따라서 번역되지 않았음을 나타냅니다.
    + 가 표시된 부분은 하위 메뉴가 있음을 나타냅니다. 클릭하면 하위 메뉴가 펼쳐집니다.

    1. 1 소개
      1. 1.1 배경
      2. 1.2 대상 독자
      3. 1.3 초점
      4. 1.4 역사
      5. 1.5 디자인 노트
        1. 1.5.1 스크립트 실행의 직렬화
        2. 1.5.2 다른 명세와의 관계
      6. 1.6 HTML 과 XHTML
      7. 1.7 명세의 구조
        1. 1.7.1 명세를 읽는 방법
        2. 1.7.2 표현 방법
      8. 1.8 HTML에 대한 간단한 소개
      9. 1.9 저자가 지켜야 할 것
        1. 1.9.1 표현적 마크업
        2. 1.9.2 문법 에러
        3. 1.9.3 내용 모델과 속성값에 대한 제한들
      10. 1.10 읽을만한 것들
    2. 2 공통 의미구조

      명세 전반에 걸쳐 사용될 클래스, 알고리즘, 정의, 그리고 기반구조들입니다.

      1. 2.1 단어 사용
        1. 2.1.1 자원
        2. 2.1.2 XML
        3. 2.1.3 DOM 트리
        4. 2.1.4 스크립팅
        5. 2.1.5 플러그인
        6. 2.1.6 문자 인코딩
      2. 2.2 이행 요구사항
        1. 2.2.1 종속성
        2. 2.2.2 확장성
      3. 2.3 대소문자 구분과 문자열 비교
      4. 2.4 UTF-8
      5. 2.5 공통 상세문법
        1. 2.5.1 파서 숙어
        2. 2.5.2 불리언 속성
        3. 2.5.3 키워드, 나열 속성
        4. 2.5.4 숫자
          1. 2.5.4.1 음이 아닌 정수
          2. 2.5.4.2 기호가 붙은 정수
          3. 2.5.4.3 실수
          4. 2.5.4.4 퍼센트와 길이
          5. 2.5.4.5 정수 목록
          6. 2.5.4.6 크기 목록
        5. 2.5.5 날짜와 시간
          1. 2.5.5.1 월
          2. 2.5.5.2 일
          3. 2.5.5.3 시간
          4. 2.5.5.4 날짜와 시간(지역)
          5. 2.5.5.5 날짜와 시간(국제)
          6. 2.5.5.6 주
          7. 2.5.5.7 모호한 시간
        6. 2.5.6 색상
        7. 2.5.7 공백문자로 구분된 토큰
        8. 2.5.8 쉼표로 구분된 토큰
        9. 2.5.9 참조
        10. 2.5.10 미디어 쿼리
      6. 2.6 URL
        1. 2.6.1 단어 사용
        2. 2.6.2 기본 URL의 동적 변화
        3. 2.6.3 URL 조작 인터페이스
      7. 2.7 자원 다운로드
        1. 2.7.1 프로토콜 컨셉
        2. 2.7.2 암호화된 HTTP, 관련된 보안 문제
        3. 2.7.3 자원 타입의 판별
      8. 2.8 공통 DOM 인터페이스
        1. 2.8.1 IDL 속성에서 내용 속성의 반영
        2. 2.8.2 컬렉션
          1. 2.8.2.1 HTMLCollection
          2. 2.8.2.2 HTMLAllCollection
          3. 2.8.2.3 HTMLFormControlsCollection
          4. 2.8.2.4 HTMLOptionsCollection
        3. 2.8.3 DOMTokenList
        4. 2.8.4 DOMSettableTokenList
        5. 2.8.5 구조화된 데이터의 안전한 전달
        6. 2.8.6 DOMStringMap
        7. 2.8.7 DOM 기능 문자열
        8. 2.8.8 예외
        9. 2.8.9 메모리 반환
      9. 2.9 네임스페이스
    3. 3 HTML 문서의 의미, 구조, API

      문서는 요소들로 구성됩니다. 이러한 요소들은 DOM을 통해 트리 구조를 가집니다. 이 섹션은 이러한 DOM의 기능들을 정의하며, 또한 모든 요소들에 공통되는 기능을 정의하고, 요소를 정의하는데 사용되는 컨셉들을 설명합니다.

      1. 3.1 문서
        1. 3.1.1 DOM 내부의 문서
        2. 3.1.2 보안
        3. 3.1.3 자원 메타데이터 관리
        4. 3.1.4 DOM 트리 접근자
        5. 3.1.5 문서 생성
        6. 3.1.6 XML 문서 로딩
      2. 3.2 요소
        1. 3.2.1 의미론
        2. 3.2.2 DOM 내부의 요소
        3. 3.2.3 전역 속성
          1. 3.2.3.1 id 속성
          2. 3.2.3.2 title 속성
          3. 3.2.3.3 langxml:lang 속성
          4. 3.2.3.4 xml:base attribute (XML only)
          5. 3.2.3.5 dir 속성
          6. 3.2.3.6 class 속성
          7. 3.2.3.7 style 속성
          8. 3.2.3.8 data-* 속성을 이용한 보이지 않는 커스텀 데이터 사용
        4. 3.2.4 요소 정의
          1. 3.2.4.1 속성
        5. 3.2.5 내용 모델
          1. 3.2.5.1 내용의 종류
            1. 3.2.5.1.1메타데이터
            2. 3.2.5.1.2 플로우 컨텐츠
            3. 3.2.5.1.3 섹션 컨텐츠
            4. 3.2.5.1.4 제목 컨텐츠
            5. 3.2.5.1.5구문 컨텐츠
            6. 3.2.5.1.6 포함된 컨텐츠
            7. 3.2.5.1.7 대화형 컨텐츠
          2. 3.2.5.2 투명한 컨텐츠 모델
          3. 3.2.5.3 문단
        6. 3.2.6 양방향 알고리즘 포맷 문자에 관한 요구사항
        7. 3.2.7 보조 기술 제품을 위한 주석 (ARIA)
      3. 3.3 HTML 문서의 API

      4. 3.4 XPath, XSLT 와의 상호작용
      5. 3.5 동적 마크업 삽입
        1. 3.5.1 입력 스트림 열기
        2. 3.5.2 입력 스트림 닫기
        3. 3.5.3 document.write()
        4. 3.5.4 document.writeln()
        5. 3.5.5 innerHTML
        6. 3.5.6 outerHTML
        7. 3.5.7 insertAdjacentHTML()
    4. 4 HTML의 요소

      각각의 요소들은 미리 정의된 의미를 가지며, 이 섹션에서 그것들을 설명합니다. 저자들이 이 요소를 어떻게 사용해야 할지 역시 설명합니다.

      1. 4.1 The root element
        1. 4.1.1 html 요소
      2. 4.2 문서의 메타데이터
        1. 4.2.1 head 요소
        2. 4.2.2 title 요소
        3. 4.2.3 base 요소
        4. 4.2.4 link 요소
        5. 4.2.5 meta 요소
          1. 4.2.5.1 표준 메타데이터 이름
          2. 4.2.5.2 기타 메타데이터 이름
          3. 4.2.5.3 프라그마 디렉티브
          4. 4.2.5.4 기타 프라그마 디렉티브
          5. 4.2.5.5 문서의 문자 인코딩 명시
        6. 4.2.6 style 요소
        7. 4.2.7 스타일링
      3. 4.3 스크립팅
        1. 4.3.1 script 요소
          1. 4.3.1.1 스크립트 언어
          2. 4.3.1.2 요소의 내용 제한
          3. 4.3.1.3 외부 스크립트에 대한 인라인 문서화
        2. 4.3.2 noscript 요소
      4. 4.4 섹션
        1. 4.4.1 body 요소
        2. 4.4.2 section 요소
        3. 4.4.3 nav 요소
        4. 4.4.4 article 요소
        5. 4.4.5 aside 요소
        6. 4.4.6 h1h2h3h4h5h6 요소
        7. 4.4.7 hgroup 요소
        8. 4.4.8 header 요소
        9. 4.4.9 footer 요소
        10. 4.4.10 address 요소
        11. 4.4.11 제목과 섹션
          1. 4.4.11.1 개요 작성
      5. 4.5 그룹 컨텐츠
        1. 4.5.1 p 요소
        2. 4.5.2 hr 요소
        3. 4.5.3 pre 요소
        4. 4.5.4 blockquote 요소
        5. 4.5.5 ol 요소
        6. 4.5.6 ul 요소
        7. 4.5.7 li 요소
        8. 4.5.8 dl 요소
        9. 4.5.9 dt 요소
        10. 4.5.10 dd 요소
        11. 4.5.11 figure 요소
        12. 4.5.12 figcaption 요소
        13. 4.5.13 div 요소
      6. 4.6 텍스트 레벨 의미론
        1. 4.6.1 a 요소
        2. 4.6.2 em 요소
        3. 4.6.3 strong 요소
        4. 4.6.4 small 요소
        5. 4.6.5 s 요소
        6. 4.6.6 cite 요소
        7. 4.6.7 q 요소
        8. 4.6.8 dfn 요소
        9. 4.6.9 abbr 요소
        10. 4.6.10 time 요소
        11. 4.6.11 code 요소
        12. 4.6.12 var 요소
        13. 4.6.13 samp 요소
        14. 4.6.14 kbd 요소
        15. 4.6.15 subsup 요소
        16. 4.6.16 i 요소
        17. 4.6.17 b 요소
        18. 4.6.18 mark 요소
        19. 4.6.19 ruby 요소
        20. 4.6.20 rt 요소
        21. 4.6.21 rp 요소
        22. 4.6.22 bdi 요소
        23. 4.6.23 bdo 요소
        24. 4.6.24 span 요소
        25. 4.6.25 br 요소
        26. 4.6.26 wbr 요소
        27. 4.6.27 사용법 요약
      7. 4.7 편집
        1. 4.7.1 ins 요소
        2. 4.7.2 del 요소
        3. 4.7.3 insdel 요소에 공통인 속성
        4. 4.7.4 편집과 문단
        5. 4.7.5 편집과 목록
      8. 4.8 포함된 컨텐츠
        1. 4.8.1 img 요소
          1. 4.8.1.1 이미지에 대한 대체로 사용될 텍스트를 제공하는 것에 대한 요구사항
            1. 4.8.1.1.1 범용 가이드라인
            2. 4.8.1.1.2 이미지만을 포함하는 링크 혹은 버튼
            3. 4.8.1.1.3 대체적인 그래픽 표현 - 차트, 다이어그램, 그래프, 지도, 일러스트레이션 - 을 갖는 구문이나 문단
            4. 4.8.1.1.4 대체적인 그래픽 표현 - 아이콘, 로고 - 을 갖는 짧은 구문이나 레이블
            5. 4.8.1.1.5 글자 표현 효과를 위해 그래픽으로 렌더링된 텍스트
            6. 4.8.1.1.6 주위 텍스트 일부를 그래픽으로 표현한 것
            7. 4.8.1.1.7 아무런 정보도 전달하지 않는 순수한 장식적 이미지
            8. 4.8.1.1.8 링크를 형성하지 않는, 더 큰 하나의 이미지를 형성하는 이미지 그룹
            9. 4.8.1.1.9 링크를 형성하는, 더 큰 하나의 이미지를 형성하는 이미지 그룹
            10. 4.8.1.1.10 내용의 핵심 파트
            11. 4.8.1.1.11 사용자에게 보일 의도가 없는 이미지
            12. 4.8.1.1.12 이미지를 볼 수 있음을 알고 있는 특정한 사람이 볼 것으로 의도된 이메일, 또는 사적인 문서에 포함된 이미지
            13. 4.8.1.1.13 마크업 생성기를 위한 가이드
            14. 4.8.1.1.14 유효성 검사기를 위한 가이드
        2. 4.8.2 iframe 요소
        3. 4.8.3 embed 요소
        4. 4.8.4 object 요소
        5. 4.8.5 param 요소
        6. 4.8.6 video 요소
        7. 4.8.7 audio 요소
        8. 4.8.8 source 요소
        9. 4.8.9 track 요소
        10. 4.8.10 Media 요소
          1. 4.8.10.1 에러 코드
          2. 4.8.10.2 미디어 자원의 위치
          3. 4.8.10.3 마임 타입
          4. 4.8.10.4 네트워크 상태
          5. 4.8.10.5 미디어 자원 로딩
          6. 4.8.10.6 미디어 자원으로의 오프셋
          7. 4.8.10.7 "준비됨" 상태
          8. 4.8.10.8 미디어 자원 재생
          9. 4.8.10.9 탐색
          10. 4.8.10.10 시간이 설정된 텍스트 트랙
            1. 4.8.10.10.1 텍스트 트랙 모델
            2. 4.8.10.10.2 Sourcing in-band text tracks
            3. 4.8.10.10.3 Sourcing out-of-band text tracks
            4. 4.8.10.10.4 텍스트 트랙 API
            5. 4.8.10.10.5 이벤트 정의
          11. 4.8.10.11 사용자 인터페이스
          12. 4.8.10.12 시간 범위
          13. 4.8.10.13 이벤트 요약
          14. 4.8.10.14 보안과 프라이버시에 관한 고려
          15. 4.8.10.15 미디어 요소 구현의 모범 사례(웹 저자)
          16. 4.8.10.16 미디어 요소 구현의 모범 사례(구현자)
        11. 4.8.11 canvas 요소
          1. 4.8.11.1 색상 범위와 수정
          2. 4.8.11.2 canvas 요소에서의 보안
        12. 4.8.12 map 요소
        13. 4.8.13 area 요소
        14. 4.8.14 이미지 맵
          1. 4.8.14.1 저작
          2. 4.8.14.2 처리모델
        15. 4.8.15 MathML
        16. 4.8.16 SVG
        17. 4.8.17 크기 속성
      9. 4.9 표 형태의 데이터
        1. 4.9.1 table 요소
        2. 4.9.2 caption 요소
        3. 4.9.3 colgroup 요소
        4. 4.9.4 col 요소
        5. 4.9.5 tbody 요소
        6. 4.9.6 thead 요소
        7. 4.9.7 tfoot 요소
        8. 4.9.8 tr 요소
        9. 4.9.9 td 요소
        10. 4.9.10 th 요소
        11. 4.9.11 tdth 공통적인 속성
        12. 4.9.12 처리 모델
          1. 4.9.12.1 테이블 포맷
          2. 4.9.12.2 데이터 셀과 헤더 셀 사이의 연결 생성
        13. 4.9.13 예제
      10. 4.10 Forms
        1. 4.10.1 소개
          1. 4.10.1.1 사용자 인터페이스 작성
          2. 4.10.1.2 서버사이드 처리 구현
          3. 4.10.1.3 서버와 통신하도록 설정
          4. 4.10.1.4 클라이언트 사이드 유효성 검사
        2. 4.10.2 분류
        3. 4.10.3 form 요소
        4. 4.10.4 fieldset 요소
        5. 4.10.5 legend 요소
        6. 4.10.6 label 요소
        7. 4.10.7 input 요소
          1. 4.10.7.1 type 속성의 상태
            1. 4.10.7.1.1 Hidden state
            2. 4.10.7.1.2 Text state, Search state
            3. 4.10.7.1.3 Telephone state
            4. 4.10.7.1.4 URL state
            5. 4.10.7.1.5 E-mail state
            6. 4.10.7.1.6 Password state
            7. 4.10.7.1.7 Date and Time state
            8. 4.10.7.1.8 Date state
            9. 4.10.7.1.9 Month state
            10. 4.10.7.1.10 Week state
            11. 4.10.7.1.11 Time state
            12. 4.10.7.1.12 Local Date and Time state
            13. 4.10.7.1.13 Number state
            14. 4.10.7.1.14 Range state
            15. 4.10.7.1.15 Color state
            16. 4.10.7.1.16 Checkbox state
            17. 4.10.7.1.17 Radio Button state
            18. 4.10.7.1.18 File Upload state
            19. 4.10.7.1.19 Submit Button state
            20. 4.10.7.1.20 Image Button state
            21. 4.10.7.1.21 Reset Button state
            22. 4.10.7.1.22 Button state
          2. 4.10.7.2 input 요소의 공통 속성
            1. 4.10.7.2.1 autocomplete 속성
            2. 4.10.7.2.2 dirname 속성
            3. 4.10.7.2.3 list 속성
            4. 4.10.7.2.4 readonly 속성
            5. 4.10.7.2.5 size 속성
            6. 4.10.7.2.6 required 속성
            7. 4.10.7.2.7 multiple 속성
            8. 4.10.7.2.8 maxlength 속성
            9. 4.10.7.2.9 pattern 속성
            10. 4.10.7.2.10 minmax 속성
            11. 4.10.7.2.11 step 속성
            12. 4.10.7.2.12 placeholder 속성
          3. 4.10.7.3 input 요소의 공통 API
          4. 4.10.7.4 공통 이벤트 행동
        8. 4.10.8 button 요소
        9. 4.10.9 select 요소
        10. 4.10.10 datalist 요소
        11. 4.10.11 optgroup 요소
        12. 4.10.12 option 요소
        13. 4.10.13 textarea 요소
        14. 4.10.14 keygen 요소
        15. 4.10.15 output 요소
        16. 4.10.16 progress 요소
        17. 4.10.17 meter 요소
        18. 4.10.18 컨트롤과 폼의 연결
        19. 4.10.19 폼 컨트롤에 공통된 속성
          1. 4.10.19.1 폼 컨트롤 명명
          2. 4.10.19.2 폼 컨트롤의 활성화 및 비활성화
          3. 4.10.19.3 컨트롤의 값
          4. 4.10.19.4 컨트롤에 자동으로 포커스 주기
          5. 4.10.19.5 사용자 입력의 길이 제한
          6. 4.10.19.6 폼 제출
          7. 4.10.19.7 요소 방향성 제출
        20. 4.10.20 텍스트 필드 선택을 위한 API
        21. 4.10.21 제약조건
          1. 4.10.21.1 정의
          2. 4.10.21.2 제약사항 검사
          3. 4.10.21.3 제약사항 검사 API
          4. 4.10.21.4 보안
        22. 4.10.22 폼 제출
          1. 4.10.22.1 소개
          2. 4.10.22.2 암시적인 제출
          3. 4.10.22.3 폼 제출 알고리즘
          4. 4.10.22.4 URL로 인코드된 폼 데이터
          5. 4.10.22.5 멀티파트 폼 데이터
          6. 4.10.22.6 단순 텍스트 폼 데이터
        23. 4.10.23 폼 리셋
        24. 4.10.24 이벤트 전달
      11. 4.11 인터랙티브 요소
        1. 4.11.1 details 요소
        2. 4.11.2 summary 요소
        3. 4.11.3 command 요소
        4. 4.11.4 menu 요소
          1. 4.11.4.1 소개
          2. 4.11.4.2 메뉴와 툴바 생성
          3. 4.11.4.3 컨텍스트 메뉴
          4. 4.11.4.4 툴바
        5. 4.11.5 Commands
          1. 4.11.5.1 a 요소로 커맨드 정의
          2. 4.11.5.2 button 요소로 커맨드 정의
          3. 4.11.5.3 input 요소로 커맨드 정의
          4. 4.11.5.4 option 요소로 커맨드 정의
          5. 4.11.5.5 command 요소로 커맨드 정의
          6. 4.11.5.6 label 요소의 accesskey속성으로 커맨드 정의
          7. 4.11.5.7 legend 요소의 accesskey 속성으로 커맨드 정의
          8. 4.11.5.8 다른 요소의 accesskey 속성으로 커맨드 정의
      12. 4.12 링크
        1. 4.12.1 소개
        2. 4.12.2 a 요소와 area 요소로 생성된 링크
        3. 4.12.3 하이퍼링크 따라가기
        4. 4.12.4 링크 타입
          1. 4.12.4.1 Link type "alternate"
          2. 4.12.4.2 Link type "archives"
          3. 4.12.4.3 Link type "author"
          4. 4.12.4.4 Link type "bookmark"
          5. 4.12.4.5 Link type "external"
          6. 4.12.4.6 Link type "help"
          7. 4.12.4.7 Link type "icon"
          8. 4.12.4.8 Link type "license"
          9. 4.12.4.9 Link type "nofollow"
          10. 4.12.4.10 Link type "noreferrer"
          11. 4.12.4.11 Link type "pingback"
          12. 4.12.4.12 Link type "prefetch"
          13. 4.12.4.13 Link type "search"
          14. 4.12.4.14 Link type "stylesheet"
          15. 4.12.4.15 Link type "sidebar"
          16. 4.12.4.16 Link type "tag"
          17. 4.12.4.17 계층형 링크 타입
            1. 4.12.4.17.1 Link type "index"
            2. 4.12.4.17.2 Link type "up"
          18. 4.12.4.18 연속적인 링크 타입
            1. 4.12.4.18.1 Link type "first"
            2. 4.12.4.18.2 Link type "last"
            3. 4.12.4.18.3 Link type "next"
            4. 4.12.4.18.4 Link type "prev"
          19. 4.12.4.19 다른 링크 타입
      13. 4.13 전용 요소는 없지만 일반적인 숙어들
        1. 4.13.1 내용의 주된 파트
        2. 4.13.2 태그 클라우드
        3. 4.13.3 대화
        4. 4.13.4 각주
      14. 4.14 셀렉터를 사용하여 HTML 요소 매칭
        1. 4.14.1 대소문자 구분
        2. 4.14.2 가상 클래스
    5. 5 웹 페이지 로딩

      HTML 문서는 진공 속에 존재하는 것이 아닙니다. 이 섹션은 다양한 문서들을 다루는 환경들에 영향을 미치는 기능들을 설명합니다.

      1. 5.1 브라우징 문맥
        1. 5.1.1 중첩된 브라우징 문맥
          1. 5.1.1.1 DOM에서 중첩된 브라우징 문맥 이동
        2. 5.1.2 보조 브라우징 문맥
          1. 5.1.2.1 DOM에서 보조 브라우징 문맥 이동
        3. 5.1.3 두번째 브라우징 문맥
        4. 5.1.4 보안
        5. 5.1.5 브라우징 문맥 그룹화
        6. 5.1.6 브라우징 문맥 이름
      2. 5.2 Window object
        1. 5.2.1 보안
        2. 5.2.2 이름을 사용해서 브라우징 문맥을 생성하고 탐색하는 API
        3. 5.2.3 다른 브라우징 문맥 접근
        4. 5.2.4 Window 객체에 이름으로 접근
        5. 5.2.5 가비지 컬렉션과 브라우징 문맥
        6. 5.2.6 브라우저 인터페이스 요소
        7. 5.2.7 WindowProxy object
      3. 5.3 Origin
        1. 5.3.1 동일 소스 제한 완화
      4. 5.4 세션 히스토리와 이동
        1. 5.4.1 브라우징 문맥의 세션 히스토리
        2. 5.4.2 History interface
        3. 5.4.3 Location interface
          1. 5.4.3.1 보안
        4. 5.4.4 세션 히스토리 구현 노트
      5. 5.5 웹 브라우징
        1. 5.5.1 문서들간의 이동
        2. 5.5.2 HTML 파일의 페이지 로드 처리 모델
        3. 5.5.3 XML 파일의 페이지 로드 처리 모델
        4. 5.5.4 텍스트 파일의 페이지 로드 처리 모델
        5. 5.5.5 이미지의 페이지 로드 처리 모델
        6. 5.5.6 플러그인을 사용하는 컨텐츠의 페이지 로드 처리 모델
        7. 5.5.7 DOM 을 갖지 않는 인라인 컨텐츠의 페이지 로드 처리 모델
        8. 5.5.8 조각 식별자(#)로 이동
        9. 5.5.9 히스토리 이동
          1. 5.5.9.1 이벤트 정의
        10. 5.5.10 문서 언로드
          1. 5.5.10.1 이벤트 정의
        11. 5.5.11 문서 로드 취소
      6. 5.6 오프라인 웹 어플리케이션
        1. 5.6.1 소개
          1. 5.6.1.1 이벤트 요약
        2. 5.6.2 어플리케이션 캐쉬
        3. 5.6.3 캐쉬 매니페스트 문법
          1. 5.6.3.1 매니페스트 샘플
          2. 5.6.3.2 캐쉬 매니페스트 작성
          3. 5.6.3.3 캐쉬 매니페스트 처리
        4. 5.6.4 어플리케이션 캐쉬의 다운로드 또는 업데이트
        5. 5.6.5 어플리케이션 캐쉬 선택 알고리즘
        6. 5.6.6 네트워크 모델의 변경
        7. 5.6.7 어플리케이션 캐쉬 만료
        8. 5.6.8 디스크 용량
        9. 5.6.9 어플리케이션 캐쉬 API
        10. 5.6.10 브라우저 상태
    6. 6 웹 어플리케이션 API

      이 섹션은 HTML 어플리케이션의 스크립팅을 위한 간단한 기능들을 소개합니다.

      1. 6.1 스크립팅
        1. 6.1.1 소개
        2. 6.1.2 스크립팅 허용과 금지
        3. 6.1.3 처리 모델
          1. 6.1.3.1 정의
          2. 6.1.3.2 스크립트 호출
          3. 6.1.3.3 스크립트 생성
          4. 6.1.3.4 스크립트 중지
        4. 6.1.4 이벤트 루프
          1. 6.1.4.1 정의
          2. 6.1.4.2 처리 모델
          3. 6.1.4.3 범용 작업 소스
        5. 6.1.5 javascript: 프로토콜
        6. 6.1.6 이벤트
          1. 6.1.6.1 이벤트 핸들러
          2. 6.1.6.2 요소, Document 객체, Window 객체의 이벤트 핸들러
          3. 6.1.6.3 이벤트 발생
          4. 6.1.6.4 이벤트와 Window 객체
          5. 6.1.6.5 런타임 스크립트 에러
      2. 6.2 타이머
      3. 6.3 사용자 프롬프트
        1. 6.3.1 간단한 대화상자
        2. 6.3.2 인쇄
        3. 6.3.3 별도의 창을 이용해 구현된 대화상자
      4. 6.4 시스템 상태와 가용성: Navigator 객체
        1. 6.4.1 클라이언트 식별
        2. 6.4.2 커스텀 스키마와 내용 핸들러
          1. 6.4.2.1 보안과 프라이버시
          2. 6.4.2.2 사용자 인터페이스 예제
        3. 6.4.3 저장소간 상호 배제의 수동 해제
    7. 7 사용자 인터랙션

      HTML 문서들은 사용자들이 컨텐츠와 상호작용하고 그것을 변경할 수 있는 다양한 메커니즘들을 제공할 수 있습니다. 이 섹션에서 그것들을 설명합니다.

      1. 7.1 hidden 속성
      2. 7.2 활성화
      3. 7.3 포커스
        1. 7.3.1 순서있는 포커스 이동과 tabindex 속성
        2. 7.3.2 포커스 관리
        3. 7.3.3 문서 레벨의 포커스 API
        4. 7.3.4 요소 레벨의 포커스 API
      4. 7.4 키보드 단축키 할당
        1. 7.4.1 소개
        2. 7.4.2 accesskey 속성
        3. 7.4.3 처리 모델
      5. 7.5 contenteditable 속성
        1. 7.5.1 사용자의 편집 동작
        2. 7.5.2 문서 전체를 편집 가능하도록 만들기
      6. 7.6 철자와 문법 체크
      7. 7.7 드래그-드롭
        1. 7.7.1 소개
        2. 7.7.2 드래그 데이터 저장
        3. 7.7.3 DataTransfer 인터페이스
          1. 7.7.3.1 DataTransferItems 인터페이스
          2. 7.7.3.2 DataTransferItem 인터페이스
        4. 7.7.4 DragEvent 인터페이스
        5. 7.7.5 드래그-드롭 처리 모델
        6. 7.7.6 이벤트 요약
        7. 7.7.7 draggable 속성
        8. 7.7.8 dropzone 속성
        9. 7.7.9 드래그-드롭 모델의 보안 위험성
      8. 7.8 편집 API
    8. 8 The HTML 문법

      이 섹션에서는 HTML의 문법들을 정의하며, 컨텐츠들을 그러한 문법들을 사용해 파싱하는 규칙을 정의할 것입니다.

      1. 8.1 HTML 문서 작성
        1. 8.1.1 The DOCTYPE
        2. 8.1.2 요소
          1. 8.1.2.1 시작 태그
          2. 8.1.2.2 종료 태그
          3. 8.1.2.3 속성
          4. 8.1.2.4 선택적 태그
          5. 8.1.2.5 내용 모델의 제한사항
          6. 8.1.2.6 텍스트 원형과 RCDATA 요소 내용에 대한 제한
        3. 8.1.3 텍스트
          1. 8.1.3.1 줄바꿈
        4. 8.1.4 문자 참조
        5. 8.1.5 CDATA 섹션
        6. 8.1.6 주석
      2. 8.2 HTML 문서 처리
        1. 8.2.1 Overview of the parsing model
        2. 8.2.2 The input stream
          1. 8.2.2.1 Determining the character encoding
          2. 8.2.2.2 Character encodings
          3. 8.2.2.3 Preprocessing the input stream
          4. 8.2.2.4 Changing the encoding while parsing
        3. 8.2.3 Parse state
          1. 8.2.3.1 The insertion mode
          2. 8.2.3.2 The stack of open elements
          3. 8.2.3.3 The list of active formatting elements
          4. 8.2.3.4 The element pointers
          5. 8.2.3.5 Other parsing state flags
        4. 8.2.4 Tokenization
          1. 8.2.4.1 Data state
          2. 8.2.4.2 Character reference in data state
          3. 8.2.4.3 RCDATA state
          4. 8.2.4.4 Character reference in RCDATA state
          5. 8.2.4.5 RAWTEXT state
          6. 8.2.4.6 Script data state
          7. 8.2.4.7 PLAINTEXT state
          8. 8.2.4.8 Tag open state
          9. 8.2.4.9 End tag open state
          10. 8.2.4.10 Tag name state
          11. 8.2.4.11 RCDATA less-than sign state
          12. 8.2.4.12 RCDATA end tag open state
          13. 8.2.4.13 RCDATA end tag name state
          14. 8.2.4.14 RAWTEXT less-than sign state
          15. 8.2.4.15 RAWTEXT end tag open state
          16. 8.2.4.16 RAWTEXT end tag name state
          17. 8.2.4.17 Script data less-than sign state
          18. 8.2.4.18 Script data end tag open state
          19. 8.2.4.19 Script data end tag name state
          20. 8.2.4.20 Script data escape start state
          21. 8.2.4.21 Script data escape start dash state
          22. 8.2.4.22 Script data escaped state
          23. 8.2.4.23 Script data escaped dash state
          24. 8.2.4.24 Script data escaped dash dash state
          25. 8.2.4.25 Script data escaped less-than sign state
          26. 8.2.4.26 Script data escaped end tag open state
          27. 8.2.4.27 Script data escaped end tag name state
          28. 8.2.4.28 Script data double escape start state
          29. 8.2.4.29 Script data double escaped state
          30. 8.2.4.30 Script data double escaped dash state
          31. 8.2.4.31 Script data double escaped dash dash state
          32. 8.2.4.32 Script data double escaped less-than sign state
          33. 8.2.4.33 Script data double escape end state
          34. 8.2.4.34 Before attribute name state
          35. 8.2.4.35 Attribute name state
          36. 8.2.4.36 After attribute name state
          37. 8.2.4.37 Before attribute value state
          38. 8.2.4.38 Attribute value (double-quoted) state
          39. 8.2.4.39 Attribute value (single-quoted) state
          40. 8.2.4.40 Attribute value (unquoted) state
          41. 8.2.4.41 Character reference in attribute value state
          42. 8.2.4.42 After attribute value (quoted) state
          43. 8.2.4.43 Self-closing start tag state
          44. 8.2.4.44 Bogus comment state
          45. 8.2.4.45 Markup declaration open state
          46. 8.2.4.46 Comment start state
          47. 8.2.4.47 Comment start dash state
          48. 8.2.4.48 Comment state
          49. 8.2.4.49 Comment end dash state
          50. 8.2.4.50 Comment end state
          51. 8.2.4.51 Comment end bang state
          52. 8.2.4.52 DOCTYPE state
          53. 8.2.4.53 Before DOCTYPE name state
          54. 8.2.4.54 DOCTYPE name state
          55. 8.2.4.55 After DOCTYPE name state
          56. 8.2.4.56 After DOCTYPE public keyword state
          57. 8.2.4.57 Before DOCTYPE public identifier state
          58. 8.2.4.58 DOCTYPE public identifier (double-quoted) state
          59. 8.2.4.59 DOCTYPE public identifier (single-quoted) state
          60. 8.2.4.60 After DOCTYPE public identifier state
          61. 8.2.4.61 Between DOCTYPE public and system identifiers state
          62. 8.2.4.62 After DOCTYPE system keyword state
          63. 8.2.4.63 Before DOCTYPE system identifier state
          64. 8.2.4.64 DOCTYPE system identifier (double-quoted) state
          65. 8.2.4.65 DOCTYPE system identifier (single-quoted) state
          66. 8.2.4.66 After DOCTYPE system identifier state
          67. 8.2.4.67 Bogus DOCTYPE state
          68. 8.2.4.68 CDATA section state
          69. 8.2.4.69 Tokenizing character references
        5. 8.2.5 Tree construction
          1. 8.2.5.1 Creating and inserting elements
          2. 8.2.5.2 Closing elements that have implied end tags
          3. 8.2.5.3 Foster parenting
          4. 8.2.5.4 The "initial" insertion mode
          5. 8.2.5.5 The "before html" insertion mode
          6. 8.2.5.6 The "before head" insertion mode
          7. 8.2.5.7 The "in head" insertion mode
          8. 8.2.5.8 The "in head noscript" insertion mode
          9. 8.2.5.9 The "after head" insertion mode
          10. 8.2.5.10 The "in body" insertion mode
          11. 8.2.5.11 The "text" insertion mode
          12. 8.2.5.12 The "in table" insertion mode
          13. 8.2.5.13 The "in table text" insertion mode
          14. 8.2.5.14 The "in caption" insertion mode
          15. 8.2.5.15 The "in column group" insertion mode
          16. 8.2.5.16 The "in table body" insertion mode
          17. 8.2.5.17 The "in row" insertion mode
          18. 8.2.5.18 The "in cell" insertion mode
          19. 8.2.5.19 The "in select" insertion mode
          20. 8.2.5.20 The "in select in table" insertion mode
          21. 8.2.5.21 The "in foreign content" insertion mode
          22. 8.2.5.22 The "after body" insertion mode
          23. 8.2.5.23 The "in frameset" insertion mode
          24. 8.2.5.24 The "after frameset" insertion mode
          25. 8.2.5.25 The "after after body" insertion mode
          26. 8.2.5.26 The "after after frameset" insertion mode
        6. 8.2.6 The end
        7. 8.2.7 Coercing an HTML DOM into an infoset
        8. 8.2.8 An introduction to error handling and strange cases in the parser
          1. 8.2.8.1 Misnested tags: <b><i></b></i>
          2. 8.2.8.2 Misnested tags: <b><p></b></p>
          3. 8.2.8.3 Unexpected markup in tables
          4. 8.2.8.4 Scripts that modify the page as it is being parsed
          5. 8.2.8.5 Unclosed formatting elements
      3. 8.3 Serializing HTML fragments
      4. 8.4 Parsing HTML fragments
      5. 8.5 Named character references
    9. 9 The XHTML 문법

      이 섹션에서는 XHTML의 문법들을 정의하며, 컨텐츠들을 그러한 문법들을 사용해 파싱하는 규칙을 정의할 것입니다.

      1. 9.1 Writing XHTML documents
      2. 9.2 Parsing XHTML documents
      3. 9.3 Serializing XHTML fragments
      4. 9.4 Parsing XHTML fragments
    10. 10 Rendering

      웹 브라우저들의 렌더링 규칙을 설명합니다.

      1. 10.1 Introduction
      2. 10.2 The CSS user agent style sheet and presentational hints
        1. 10.2.1 Introduction
        2. 10.2.2 Display types
        3. 10.2.3 Margins and padding
        4. 10.2.4 Alignment
        5. 10.2.5 Fonts and colors
        6. 10.2.6 Punctuation and decorations
        7. 10.2.7 Resetting rules for inherited properties
        8. 10.2.8 hr 요소
        9. 10.2.9 fieldset 요소
      3. 10.3 Replaced elements
        1. 10.3.1 Embedded content
        2. 10.3.2 Timed text tracks
          1. 10.3.2.1 WebVTT cue text rendering rules
          2. 10.3.2.2 Applying CSS properties to WebVTT Node Objects
          3. 10.3.2.3 CSS extensions
            1. 10.3.2.3.1 The '::cue' pseudo-element
            2. 10.3.2.3.2 The ':past' and ':future' pseudo-classes
        3. 10.3.3 Images
        4. 10.3.4 Attributes for embedded content and images
        5. 10.3.5 Image maps
        6. 10.3.6 Toolbars
      4. 10.4 Bindings
        1. 10.4.1 Introduction
        2. 10.4.2 button 요소
        3. 10.4.3 details 요소
        4. 10.4.4 input element as a text entry widget
        5. 10.4.5 input element as domain-specific widgets
        6. 10.4.6 input element as a range control
        7. 10.4.7 input element as a color well
        8. 10.4.8 input element as a check box and radio button widgets
        9. 10.4.9 input element as a file upload control
        10. 10.4.10 input element as a button
        11. 10.4.11 marquee 요소
        12. 10.4.12 meter 요소
        13. 10.4.13 progress 요소
        14. 10.4.14 select 요소
        15. 10.4.15 textarea 요소
        16. 10.4.16 keygen 요소
        17. 10.4.17 time 요소
      5. 10.5 Frames and framesets
      6. 10.6 Interactive media
        1. 10.6.1 Links, forms, navigation
        2. 10.6.2 title 속성
        3. 10.6.3 Editing hosts
        4. 10.6.4 Text rendered in native user interfaces
      7. 10.7 Print media
    11. 11 폐기된 기능들
      1. 11.1 폐기되었지만 올바른 기능들
        1. 11.1.1 폐기되었지만 올바른 기능들의 사용에 관한 경고
      2. 11.2 올바르지 않은 기능들
      3. 11.3 구현에 관한 요구사항
        1. 11.3.1 applet 요소
        2. 11.3.2 marquee 요소
        3. 11.3.3 Frames
        4. 11.3.4 그밖의 요소, 속성, API
    12. 12 IANA considerations
      1. 12.1 text/html
      2. 12.2 text/html-sandboxed
      3. 12.3 application/xhtml+xml
      4. 12.4 text/cache-manifest
    13. Index
      1. 요소
      2. Element content categories
      3. 속성
      4. Interfaces
      5. Events
    14. References
    15. Acknowledgements

    Posted by 1010
    02.Oracle/DataBase2012. 3. 26. 11:01
    반응형

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    WITH t(type, name, code) AS
    (
    SELECT '과일', '사과', '0' FROM dual
    UNION ALL SELECT '과일', '레몬', '1' FROM dual
    UNION ALL SELECT '과일', '포도', '2' FROM dual
    UNION ALL SELECT '과일', '참외', '3' FROM dual
    UNION ALL SELECT '채소', '오이', '0' FROM dual
    UNION ALL SELECT '채소', '당근', '1' FROM dual
    UNION ALL SELECT '채소', '호박', '2' FROM dual
    )
    SELECT type
    , SUBSTR(XMLAgg(XMLElement(x, ',', name) ORDER BY code).Extract('//text()'), 2) name_9i
    , wm_concat(name) name_10g
    , ListAgg(name, ',') WITHIN GROUP(ORDER BY code) name_11g
    FROM t
    GROUP BY type
    ORDER BY type
    ;

    <실행 결과>
    TYPE NAME_AGG
    과일 사과,레몬,포도,참외
    채소 오이,당근,호박


    출처 : http://www.oracleclub.com/article/55512
    Posted by 1010
    02.Oracle/DataBase2012. 3. 16. 11:29
    반응형

    집합 쿼리(UNION, INTERSECT, MINUS)

    집합 연산자를 사용시 집합을 구성할 컬럼의 데이터 타입이 동일해야 한다.

    • - UNION : 합집합
    • - UNION ALL : 중복 데이터를 다 포함하는 합집합
    • - INTERSECT : 교집합
    • - MINUS : 차집합

    UNION

    UNION은 두 테이블의 결합을 나타내며, 결합시키는 두 테이블의 중복되지 않은 값들을 반환 한다.

     
    SQL> SELECT deptno FROM emp
         UNION
         SELECT deptno FROM dept;
     
        DEPTNO
    ----------
            10
            20
            30
            40
        

    UNION ALL

    UNION과 같으나 두 테이블의 중복되는 값 까지 반환 한다.

     
    SQL> SELECT deptno FROM emp
         UNION ALL
         SELECT deptno FROM dept;
     
       DEPTNO
    ---------
           20
           30
           30
           20
           30
           30
           10
           20
           10
           30
        

    INTERSECT

    INTERSECT는 두 행의 집합중 공통된 행을 반환 한다.

     
    SQL> SELECT deptno FROM emp
         INTERSECT
         SELECT deptno FROM dept;
        
        DEPTNO
    ----------
            10
            20
            30
        

    MINUS

    MINUS는 첫 번째 SELECT문에 의해 반환되는 행 중에서 두 번째 SELECT문에 의해 반환되는 행에 존재하지 않는 행들을 반환 한다.

     
    SQL> SELECT deptno FROM dept
         MINUS
         SELECT deptno FROM emp;
     
        DEPTNO
    ----------
            40
        

    문서에 대하여

    • - 작성자 : 김정식 (oramaster _at_ naver.com)
    • - 작성일 : 2002년 08월 30일
    • - 강좌 URL : http://www.oracleclub.com/lecture/1507
    • - 이 문서를 다른 블로그나 홈페이지에 게재하실 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^
    • - 오라클클럽의 모든 강좌는 크리에이티브 커먼즈의 저작자표시-비영리-동일조건변경허락(BY-NC-SA) 라이선스에 따라 자유롭게 사용할 수 있습니다.
    Posted by 1010