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

  1. 2009.06.21 오라클 페이징 처리 깔끔하게...한방에..
  2. 2009.06.15 oracle TRUNC 원하는 소수점 자리수 만큼 보여주기, 소수점 자리 자르기
  3. 2009.06.13 oracle-sql-tuning pocket reference (오라클 튜닝) 2
  4. 2009.06.13 oracle 공인교재 9i 한글판. 4
  5. 2009.06.09 oracel : xdb 8080 Changing XML DB Default Ports
  6. 2009.06.09 oracle : xdb 8080 변경
  7. 2009.06.09 oracle XDB 8080 충돌시 포트 변경하는 거
  8. 2009.06.08 CLOB COLUMN 또는 CLOB VARIABLE를 REPLACE, SEARCH하는 방법
  9. 2009.05.30 sql 함수 사용 방법
  10. 2009.05.30 oracle 스크립트 모음
  11. 2009.05.14 Ora-12571 에러 해결 방법 2
  12. 2009.05.12 sql codes 모든 sql codes
  13. 2009.05.11 공유 풀 영역 튜닝
  14. 2009.05.11 v$sqlarea 뷰
  15. 2009.05.11 *오라클서버의 메모리에 관한 테이블*/
  16. 2009.05.06 오라클 10g 함수 10g Release 1 (10.1)
  17. 2009.04.28 oracle 데이터 삭제 후 commit 데이터 복구 하는방법.[oracle 삭제된 데이터 복구] 2
  18. 2009.04.28 오라클에서의 데이터 암호화 기능
  19. 2009.04.28 oracle 데이터 암호화 2
  20. 2009.04.27 Oracle Version 확인
  21. 2009.04.27 oracle 서비스 명 알아내기
  22. 2009.04.27 oracle 실행된 쿼리확인 하기... 1
  23. 2009.04.25 Oracle Rollup, Cube, and Grouping SetsOracle
  24. 2009.04.24 오라클 주기적 백업 방법
  25. 2009.04.24 유용한 팁(일련번호 관련)
  26. 2009.04.24 /lecture/oracle/sql
  27. 2009.04.24 [ORACLE] MERGE INTO를 활용해 없는 데이터는 INSERT, 있는 데이터는 UPDATE를 해봅시다.
  28. 2009.04.24 [Oracle] TDE(Transparent Database Encryption) 투명한 데이터베이스암호화 체험후기
  29. 2009.04.24 oracle - ROWNUM의 동작 원리와 활용 방법
  30. 2009.04.24 org.apache.commons.dbcp.SQLNestedException: Cannot create PoolableConnectionFactory,
02.Oracle/DataBase2009. 6. 21. 04:19
반응형
오라클의 경우 MYSQL과 같이 LIMIT 기능을 제공하지 않아 페이징 처리하는데 어려움이 따른다.

일반적으로 사람들이 가장 많이 사용하는 방법을 먼저 소개하도록 하겠다.

이 방법은 일방적인 데이터의 양에서는상당히 괜찮은 속도를 보장해준다.
 
그러나 대용량의 경우 부족한 성능을 보다.


1. 일반적인 오라클 페이징 처리

 
01.SELECT * FROM (
02.     SELECT A.*, 
03.                 ROWNUM AS RNUM,
04.                 FLOOR((ROWNUM-1)/{디스플레이수}+1) AS PAGE,
05.                 COUNT(*) OVER() AS TOTCNT FROM (
06.          {검색쿼리 - 정렬이 필요할 경우 정렬조건 포함}
07.    ) A
08.) WHERE PAGE = {페이지번호};
09.  
10.OR
11.  
12.SELECT * FROM (
13.     SELECT A.*, 
14.                 ROWNUM AS RNUM,
15.                 COUNT(*) OVER() AS TOTCNT FROM (
16.          {검색쿼리 - 정렬이 필요할 경우 정렬조건 포함}
17.    ) A
18.) WHERE RNUM > {범위부터} AND RNUM <= {범위까지};


2. 오라클 대용량 페이징 처리

 
01.SELECT * FROM (
02.     SELECT ROWNUM AS RNUM, A.* FROM (
03.          {검색쿼리 - 정렬이 필요할 경우 정렬조건 포함}
04.    ) A WHERE ROWNUM <= {범위까지}
05.) WHERE RNUM > {범위부터};
06.  
07.OR
08.  
09.SELECT * FROM (
10.     SELECT /*+ INDEX_ASC or INDEX_DESC(A {정렬조건 인덱스명}) */
11.                 ROWNUM AS RNUM, A.*  FROM (
12.          {검색쿼리 - 정렬이 필요한 경우 정렬조건을 포함하지 않고 ORACLE 힌트사용}
13.     ) A WHERE ROWNUM <= {범위까지}
14.) WHERE RNUM > {범위부터};
Posted by 1010
02.Oracle/DataBase2009. 6. 15. 00:59
반응형
- 원하는 소수점 자리수 만큼만 보여주고 나머지는 없애버린다.

- EX) TRUNC(12.345, 2)  => 12.34 (소수점 2자리만 보여준다)
         TRUNC(12.345)     => 12 (소수점 자릿수를 지정하지 않으면 정수만 보여준다.)
         TRUNC('2004-05-33', 'MONTH')  => '2004-05-01' (월을 기준으로 1일로 돌아온다)
         TRUNC('2004-05-12', 'YEAR')    =>  '2004-01-01' (년을 기준으로 1월 1일로 돌아온다)
Posted by 1010
02.Oracle/DataBase2009. 6. 13. 15:44
반응형






..오라클 sql 튜닝...포켓 가이드

뭐 대략 간단한거 같네요..

간단한 예제...

DELETE FROM
FROM ps_pf_ledger_f00
WHERE EXISTS
(SELECT 'x'
FROM ps_pf_led_pst2_t1 b
WHERE b.business_unit = ps_pf_ledger_f00.business_unit
AND b.fiscal_year = ps_pf_ledger_f00.fiscal_year
AND b.accounting_period= ps_pf_ledger_f00.accounting_period
AND b.pf_scenario_id = ps_pf_ledger_f00.pf_scenario_id
AND b.source = ps_pf_ledger_f00.source
AND b.account = ps_pf_ledger_f00.account
AND b.deptid = ps_pf_ledger_f00.deptid
AND b.cust_id = ps_pf_ledger_f00.cust_id
AND b.product_id = ps_pf_ledger_f00.product_id
AND b.channel_id = ps_pf_ledger_f00.channel_id
AND b.obj_id = ps_pf_ledger_f00.obj_id
AND b.currency_cd = ps_pf_ledger_f00.currency_cd);
Elapsed: 00:08:160.51

이건 8초 걸린다...

DELETE FROM ps_pf_ledger_f00
WHERE( business_unit,fiscal_year,accounting_period,
pf_scenario_id ,account,deptid ,cust_id ,
product_id,channel_id,obj_id,currency_cd)
IN
(SELECT business_unit,fiscal_year,accounting_period,
pf_scenario_id ,account,deptid ,cust_id ,
product_id,channel_id,obj_id,currency_cd
FROM ps_pf_led_pst2_t1 );
Elapsed: 00:00:00.30

이건 0.8 초 ...
----------------------


SELECT COUNT(*)
FROM trans
WHERE cost_center = 'MASS'
AND bmark_id = 9;
Response Time = 4.255 seconds


The index that has the column that is listed first in the WHERE CLAUSE will drive the query. In this statement, the indexed entries for COST_CENTER = `MASS' will return significantly more rows than those for BMARK_ID=9, which will return at most only one or two rows.
The following query reverses the order of the conditions in the WHERE clause, resulting in a much faster execution time.


SELECT COUNT(*)
FROM trans
WHERE bmark_id = 9
AND cost_center = 'MASS';
Response Time = 1.044 seconds


Posted by 1010
02.Oracle/DataBase2009. 6. 13. 10:26
반응형
Posted by 1010
02.Oracle/DataBase2009. 6. 9. 11:36
반응형

XML DB Port Assignments

by Jeff Hunter, Sr. Database Administrator

Portions of this article are written by Roby Sherman and Copyright 2002


Contents

  1. Introduction
  2. Repository Views and Default Ports
  3. Changing XML DB Default Ports
  4. Disabling the Port Assignment



Introduction

Oracle introduced the XML Database in release 9i. Along with this new feature, Oracle continues the practice of incorporating new, barely documented port assignments that often leave the DBA to search endlessly for possible configuration file(s) that define these port assignments. Well, when it comes to searching for where these port numbers related to XML DB are defined, you will not find them on the file system, but rather inside the database. This article will attempt to unravel some of the mysteries on managing port assignments related to Oracle XML DB.



Repository Views and Default Ports

The key XML DB technologies can be grouped into two major classes - a XMLType that provides a native XML storage and retrieval capability strongly integrated with SQL, and a XML Repository that provides foldering, access control, versioning etc. for XML resources. Users view and manage XML objects like files and schemas in the XML Repository as a hierarchy of folders. This repository aspect of XML DB involves access through standard protocols such as HTTP/WebDAV and FTP. These servers will bind to ports 8080 and 2100 respectively by default.

DBA's will sometimes wonder why their Web Server, that always used to work, has all of the sudden been hijacked after installing Oracle9i and creating a database using DBCA. After some research, they attempt to shutdown the Oracle TNS listener and notice that the port in question (mostly 8080) is no longer being utilized. Unfortunately, there is little to tell the DBA that these ports are going to be used until they find out the hard way: When the database starts and steals the ports away from another process that hasn't yet started or when the other process errors and/or is unreachable.



Changing XML DB Default Ports

The following section describes the syntax that can be used to alter XML DB configuration information from within SQL*Plus. Ensure that you are logged into the database from a DBA account. In the following example, the default HTTP/WebDAV and FTP ports are changed from 8080 and 2100 to 8081 and 2111 respectively:
  SQL> -- Change the HTTP/WEBDAV port from 8080 to 8081
  SQL> call dbms_xdb.cfg_update(updateXML(
    2        dbms_xdb.cfg_get()
    3      , '/xdbconfig/sysconfig/protocolconfig/httpconfig/http-port/text()'
    4      , 8081))
    5  /

  Call completed. 


  SQL> -- Change the FTP port from 2100 to 2111
  SQL> call dbms_xdb.cfg_update(updateXML(
    2         dbms_xdb.cfg_get()
    3       , '/xdbconfig/sysconfig/protocolconfig/ftpconfig/ftp-port/text()'
    4       , 2111))
    5  /

  Call completed. 


  SQL> COMMIT;

  Commit complete. 


  SQL> EXEC dbms_xdb.cfg_refresh;

  PL/SQL procedure successfully completed.


  SQL> -- Verify the change
  SQL> set long 100000
  SQL> set pagesize 9000
  SQL> SELECT dbms_xdb.cfg_get FROM dual;

CFG_GET
--------------------------------------------------------------------------------
<xdbconfig xmlns="http://xmlns.oracle.com/xdb/xdbconfig.xsd" xmlns:xsi="http://w
ww.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.oracle.com/x
db/xdbconfig.xsd                                     http://xmlns.oracle.com/xdb
/xdbconfig.xsd">
  <sysconfig>
    <acl-max-age>900</acl-max-age>
    <acl-cache-size>32</acl-cache-size>
    <invalid-pathname-chars>,</invalid-pathname-chars>
    <call-timeout>300</call-timeout>
    <max-session-use>100</max-session-use>
    <default-lock-timeout>3600</default-lock-timeout>
    <resource-view-cache-size>1048576</resource-view-cache-size>
    <protocolconfig>
      <common>
        <extension-mappings>
          <mime-mappings>
            <mime-mapping>
              <extension>au</extension>
              <mime-type>audio/basic</mime-type>
            </mime-mapping>
            <mime-mapping>
              <extension>avi</extension>
              <mime-type>video/x-msvideo</mime-type>
            </mime-mapping>
            <mime-mapping>
              <extension>bin</extension>
              <mime-type>application/octet-stream</mime-type>
            </mime-mapping>
            <mime-mapping>
              <extension>bmp</extension>
              <mime-type>image/bmp</mime-type>
            </mime-mapping>
            <mime-mapping>
              <extension>doc</extension>
              <mime-type>application/msword</mime-type>
            </mime-mapping>
            <mime-mapping>
              <extension>eml</extension>
              <mime-type>message/rfc822</mime-type>
            </mime-mapping>
            <mime-mapping>
              <extension>gif</extension>
              <mime-type>image/gif</mime-type>
            </mime-mapping>
            <mime-mapping>
              <extension>htm</extension>
              <mime-type>text/html</mime-type>
            </mime-mapping>
            <mime-mapping>
              <extension>html</extension>
              <mime-type>text/html</mime-type>
            </mime-mapping>
            <mime-mapping>
              <extension>jpe</extension>
              <mime-type>image/jpeg</mime-type>
            </mime-mapping>
            <mime-mapping>
              <extension>jpeg</extension>
              <mime-type>image/jpeg</mime-type>
            </mime-mapping>
            <mime-mapping>
              <extension>jpg</extension>
              <mime-type>image/jpeg</mime-type>
            </mime-mapping>
            <mime-mapping>
              <extension>jsp</extension>
              <mime-type>text/html</mime-type>
            </mime-mapping>
            <mime-mapping>
              <extension>mid</extension>
              <mime-type>audio/mid</mime-type>
            </mime-mapping>
            <mime-mapping>
              <extension>mov</extension>
              <mime-type>video/quicktime</mime-type>
            </mime-mapping>
            <mime-mapping>
              <extension>movie</extension>
              <mime-type>video/x-sgi-movie</mime-type>
            </mime-mapping>
            <mime-mapping>
              <extension>mp3</extension>
              <mime-type>audio/mpeg</mime-type>
            </mime-mapping>
            <mime-mapping>
              <extension>mpe</extension>
              <mime-type>video/mpg</mime-type>
            </mime-mapping>
            <mime-mapping>
              <extension>mpeg</extension>
              <mime-type>video/mpg</mime-type>
            </mime-mapping>
            <mime-mapping>
              <extension>mpg</extension>
              <mime-type>video/mpg</mime-type>
            </mime-mapping>
            <mime-mapping>
              <extension>msa</extension>
              <mime-type>application/x-msaccess</mime-type>
            </mime-mapping>
            <mime-mapping>
              <extension>msw</extension>
              <mime-type>application/x-msworks-wp</mime-type>
            </mime-mapping>
            <mime-mapping>
              <extension>pcx</extension>
              <mime-type>application/x-pc-paintbrush</mime-type>
            </mime-mapping>
            <mime-mapping>
              <extension>pdf</extension>
              <mime-type>application/pdf</mime-type>
            </mime-mapping>
            <mime-mapping>
              <extension>ppt</extension>
              <mime-type>application/vnd.ms-powerpoint</mime-type>
            </mime-mapping>
            <mime-mapping>
              <extension>ps</extension>
              <mime-type>application/postscript</mime-type>
            </mime-mapping>
            <mime-mapping>
              <extension>qt</extension>
              <mime-type>video/quicktime</mime-type>
            </mime-mapping>
            <mime-mapping>
              <extension>ra</extension>
              <mime-type>audio/x-realaudio</mime-type>
            </mime-mapping>
            <mime-mapping>
              <extension>ram</extension>
              <mime-type>audio/x-realaudio</mime-type>
            </mime-mapping>
            <mime-mapping>
              <extension>rm</extension>
              <mime-type>audio/x-realaudio</mime-type>
            </mime-mapping>
            <mime-mapping>
              <extension>rtf</extension>
              <mime-type>application/rtf</mime-type>
            </mime-mapping>
            <mime-mapping>
              <extension>rv</extension>
              <mime-type>video/x-realvideo</mime-type>
            </mime-mapping>
            <mime-mapping>
              <extension>sgml</extension>
              <mime-type>text/sgml</mime-type>
            </mime-mapping>
            <mime-mapping>
              <extension>tif</extension>
              <mime-type>image/tiff</mime-type>
            </mime-mapping>
            <mime-mapping>
              <extension>tiff</extension>
              <mime-type>image/tiff</mime-type>
            </mime-mapping>
            <mime-mapping>
              <extension>txt</extension>
              <mime-type>text/plain</mime-type>
            </mime-mapping>
            <mime-mapping>
              <extension>url</extension>
              <mime-type>text/plain</mime-type>
            </mime-mapping>
            <mime-mapping>
              <extension>vrml</extension>
              <mime-type>x-world/x-vrml</mime-type>
            </mime-mapping>
            <mime-mapping>
              <extension>wav</extension>
              <mime-type>audio/wav</mime-type>
            </mime-mapping>
            <mime-mapping>
              <extension>wpd</extension>
              <mime-type>application/wordperfect5.1</mime-type>
            </mime-mapping>
            <mime-mapping>
              <extension>xls</extension>
              <mime-type>application/vnd.ms-excel</mime-type>
            </mime-mapping>
            <mime-mapping>
              <extension>xml</extension>
              <mime-type>text/xml</mime-type>
            </mime-mapping>
            <mime-mapping>
              <extension>zip</extension>
              <mime-type>application/x-zip-compressed</mime-type>
            </mime-mapping>
          </mime-mappings>
          <lang-mappings>
            <lang-mapping>
              <extension>en</extension>
              <lang>english</lang>
            </lang-mapping>
          </lang-mappings>
          <charset-mappings/>
          <encoding-mappings>
            <encoding-mapping>
              <extension>gzip</extension>
              <encoding>zip file</encoding>
            </encoding-mapping>
            <encoding-mapping>
              <extension>tar</extension>
              <encoding>tar file</encoding>
            </encoding-mapping>
          </encoding-mappings>
        </extension-mappings>
        <session-pool-size>50</session-pool-size>
        <session-timeout>6000</session-timeout>
      </common>
      <ftpconfig>
        <ftp-port>2111</ftp-port>
        <ftp-listener>local_listener</ftp-listener>
        <ftp-protocol>tcp</ftp-protocol>
        <session-timeout>6000</session-timeout>
      </ftpconfig>
      <httpconfig>
        <http-port>8081</http-port>
        <http-listener>local_listener</http-listener>
        <http-protocol>tcp</http-protocol>
        <session-timeout>6000</session-timeout>
        <server-name>XDB HTTP Server</server-name>
        <max-header-size>16384</max-header-size>
        <max-request-body>2000000000</max-request-body>
        <servlet-realm>Basic realm="XDB"</servlet-realm>
        <webappconfig>
          <welcome-file-list>
            <welcome-file>index.html</welcome-file>
            <welcome-file>index.htm</welcome-file>
          </welcome-file-list>
          <error-pages/>
          <servletconfig>
            <servlet-mappings>
              <servlet-mapping>
                <servlet-pattern>/Test</servlet-pattern>
                <servlet-name>TestServlet</servlet-name>
              </servlet-mapping>
              <servlet-mapping>
                <servlet-pattern>/oradb/*</servlet-pattern>
                <servlet-name>DBURIServlet</servlet-name>
              </servlet-mapping>
            </servlet-mappings>
            <servlet-list>
              <servlet>
                <servlet-name>TestServlet</servlet-name>
                <servlet-language>Java</servlet-language>
                <display-name>XDB Test Servlet</display-name>
                <description>A servlet to test the internals of the XDB Servlet API</description>
                <servlet-class>xdbtserv</servlet-class>
                <servlet-schema>xdb</servlet-schema>
              </servlet>
              <servlet>
                <servlet-name>DBURIServlet</servlet-name>
                <display-name>DBURI</display-name>
                <servlet-language>C</servlet-language>
                <description>Servlet for accessing DBURIs</description>
                <security-role-ref>
                  <role-name>authenticatedUser</role-name>
                  <role-link>authenticatedUser</role-link>
                </security-role-ref>
              </servlet>
            </servlet-list>
          </servletconfig>
        </webappconfig>
      </httpconfig>
    </protocolconfig>
  </sysconfig>
</xdbconfig>



Disabling the Port Assignment

One of the easist ways to disable Oracle from assigning both XML DB ports (FTP and HTTP/WebDAV) is to remove the following instance parameter from the database:
    dispatchers='(PROTOCOL=TCP) (SERVICE=<ORACLE_SID>XDB)'
This change would obviously require bouncing the database.

A second way to disable the XML DB ports is to simply change their port assignments to the value of zero (0). This is an attractive option since it uses code that can be incorporated directly into database creation scripts so that the value can be tweaked each time you create a new database.

Modifying these ports to zero can also be accomplished using a GUI; Oracle Enterprise Manager (version 9.2.0.1 or higher). Simply open OEM, select and expand the database. Next, expend the XML Database item and click on Configuration. You should be able to see and change any of the XML DB configuration parameters on the right-hand side of the OEM console. Simply make your changes and click APPLY to make them permanent.

For more information on Managing Oracle XML DB Using Oracle Enterprise Manager, click here.

Posted by 1010
02.Oracle/DataBase2009. 6. 9. 11:35
반응형

Tomcat 등의 웹컨테이너 설치 후 서비스 시작을 하려다보면
8080포트 충돌로 인해 서비스가 되지 않는 경우가 있다.

Oracle XDB가 바로 8080포트를 이미 사용하고 있기 때문이다
리스너의 서비스 상태를 점검해보고 Oralce XDB Port를 변경해보자.


C:\Documents and Settings\geenoo>netstat -ano

Proto  Local Address          Foreign Address        State           PID
 TCP    dozuq:8080             dozuq:0                LISTENING        884
 TCP    dozuq:2100             dozuq:0                LISTENING        884
:
:

PID로 프로세스를 찾는다.
C:\Documents and Settings\geenoo>tasklist /SVC /fi "PID eq 884"

이미지 이름                        PID     서비스
========================= ====== =============================================
TNSLSNR.EXE                    884      OracleOraHome92TNSListener


다음 명령으로 리스너의 서비스 상태를 보자.

D:\oracle\ora92\bin>lsnrctl status

.
.



Oracle XDB 가 8080(HTTP)와 2100(FTP) 포트를 쓴다는 걸 확인했다.
이제 포트(Port)를 변경해보자.



1. [시작] -> [프로그램] -> [Oracle - OraHome92]
-> [Configuration and Migration Tools] -> [Database Configuration Assistant] 선택

사용자 삽입 이미지



2. [다음] -> [데이터베이스의 데이이터베이스 옵션구성] 선택

사용자 삽입 이미지



3. 옵션을 구성하고자 하는 [사용 가능한 데이터베이스] 선택하고
DBA의 사용자 이름과 암호를 입력한 후 [다음]

사용자 삽입 이미지



4. [표준데이터베이스 기능...] 클릭

사용자 삽입 이미지



5. 표준데이터베이스 기능 팝업창에서 [사용자정의...] 클릭

사용자 삽입 이미지



6. 이 팝업창에서 FTP 및 WebDAV포트와 HTTP포트를 입력하고 [확인]한다.
만약 클라이언트에서 XML DB로의 접속을 원치 않을 경우엔 'XML DB프로토콜 비활성화'을 선택

사용자 삽입 이미지



7. "표준데이터베이스 기능" 팝업창(5.)의 [확인]을 선택하여 창을 닫는다.



8. 팝업창을 닫고 나면 "데이터베이스 기능"(4.) 화면으로 돌아간다. [다음] 클릭



9. [완료] 클릭

사용자 삽입 이미지


사용자 삽입 이미지



Posted by 1010
02.Oracle/DataBase2009. 6. 9. 11:34
반응형
2009-05-15 00:55

发布时间:2008.03.03 04:58    来源:赛迪网    作者:Alizze

从Oracle 9i开始,Oracle的安装缺省包含了XDB。在启动数据库后,Oracle XDB的http服务将会自动占用了8080端口,这给使用或JBoss、Tomcat进行java web开发的人造成了许多不必要的麻烦。

本文将主要介绍修改XDB的http和ftp服务端口的3种方法。

1.使用dbms_xdb包修改端口设置

使用sys登录sqlplus

sqlplus sys/syspassword as sysdba

执行如下的脚本:

============================ 
-- Change the HTTP/WEBDAV port from 8080 to 8081 
call dbms_xdb.cfg_update(updateXML( 
dbms_xdb.cfg_get() 
, '/xdbconfig/sysconfig/protocolconfig/httpconfig/http-port/text()' 
, 8081)) 
/ 
-- Change the FTP port from 2100 to 2111 
call dbms_xdb.cfg_update(updateXML( 
dbms_xdb.cfg_get() 
, '/xdbconfig/sysconfig/protocolconfig/ftpconfig/ftp-port/text()' 
, 2111)) 
/ 
COMMIT; 
EXEC dbms_xdb.cfg_refresh;

2.使用OEM console

选择数据库,XML Database,Configuration。更改XDB的有关设置。

3.修改SPFILE[SID名].ORA文件,去掉数据库的初始化参数:

这个文件是Oracle的启动配置文件dispatchers='(PROTOCOL=TCP) (SERVICE=XDB)',将会禁止XDB的http和ftp服务。

下面我们来重启计算机,或者在服务中重启OracleService[SID名]这个服务。重启后可能无法使用Enterprise Manager Console和其他客户端连接,这时请大家使用Oracle的Configuration and Migration Tools/Net Configuration Assistant工具删除监听器,然后新建一个监听器,最后重启监听器。(责任编辑:卢兆林)

以下为个人原创:

另外,安装了oracle10g后,lomboz all in one不能正常启动,在日记文件中有如下语句:

!MESSAGE Product org.objectweb.lomboz.product.lomboz could not be found.

原因在于oracle添加的java环境变量。和当前lomboz使用的环境版本不同。

解决办法很简单:

将环境变量中path的值“C:\Program Files\Java\jdk1.7.0\bin;”(此值与你安装的JAVA版本、安装位置不同而有所不同)放在最前面,其它的置后(请务必注意分号的位置)。重新启动Eclipse,可以成功启动。经证实,修改后的环境变量对Oracle的使用没有影响,仍可正常使用。

希望可以帮到遇到这种问题的朋友们。

Posted by 1010
02.Oracle/DataBase2009. 6. 8. 15:17
반응형
CLOB COLUMN 또는 CLOB VARIABLE를 REPLACE, SEARCH하는 방법
Posted: 2007. 1. 29 오전 2:06
Click to report abuse...   Click to reply to this thread Reply
제품 : PL/SQL

작성날짜 : 2001-02-08

CLOB COLUMN 또는 CLOB VARIABLE를 REPLACE, SEARCH하는 방법
=========================================================

1. Table 및 Data 생성

SAL> CREATE TABLE test (key NUMBER,c CLOB);
SAL> INSERT INTO test VALUES (1,'aaa#~#bbb#~#ccc');
SAL> INSERT INTO test VALUES (2,'aaa#~#bbb#~#ccc');

2. 사용된 DBMS_LOB package routines :

- ISOPEN()
- CREATETEMPORARY()
- INSTR()
- GETLENGTH()
- COPY()
- TRIM()

3. 아래처럼 Clob를 handling하기 위한 PL/SQL Code 생성

CREATE OR REPLACE PROCEDURE Srch_N_Repl_Clob
(dest_lob IN OUT CLOB, search_str VARCHAR2,replace_str VARCHAR2)
AS
temp_clob CLOB;
end_offset INTEGER := 1;
start_offset INTEGER := 1;
occurence NUMBER := 1;
replace_str_len NUMBER := LENGTH(replace_str);
temp_clob_len NUMBER := 0;
dest_lob_len NUMBER := 0;

BEGIN
IF DBMS_LOB.ISOPEN(dest_lob) = 0 THEN
NULL;
END IF;
DBMS_LOB.CREATETEMPORARY(temp_clob,TRUE,DBMS_LOB.SESSION);
LOOP
end_offset := DBMS_LOB.INSTR(dest_lob,search_str,1,occurence);
IF end_offset = 0 THEN
temp_clob_len := DBMS_LOB.GETLENGTH(temp_clob);
dest_lob_len := DBMS_LOB.GETLENGTH(dest_lob) - start_offset + 1;
IF dest_lob_len > 0 THEN
DBMS_LOB.COPY(temp_clob,dest_lob,dest_lob_len,temp_clob_len+1,start_offset);
END IF;
EXIT;
END IF;
temp_clob_len := DBMS_LOB.GETLENGTH(temp_clob);
IF (end_offset - start_offset) > 0 THEN
DBMS_LOB.COPY(temp_clob,dest_lob,(end_offset - start_offset),temp_clob_len+1,start_offset);
END IF;
start_offset := end_offset + LENGTH(search_str);
occurence := occurence + 1;
IF replace_str IS NOT NULL THEN
DBMS_LOB.WRITEAPPEND(temp_clob,replace_str_len,replace_str);
END IF;
END LOOP;
IF LENGTH(search_str) > LENGTH(replace_str) THEN
DBMS_LOB.TRIM(dest_lob,DBMS_LOB.GETLENGTH(temp_clob));
END IF;
DBMS_LOB.COPY(dest_lob,temp_clob,DBMS_LOB.GETLENGTH(temp_clob),1,1);
END ;
/

4. Clob의 column 및 variable이 변경된 상태를 실행해보면

SQL>DECLARE
2 dest_lob CLOB;
3 BEGIN
4 SELECT c INTO dest_lob FROM test WHERE key = 1 FOR UPDATE;
5 Srch_N_Repl_Clob(dest_lob,'#~#',' Replaced ');
6 END;
7 /

SQL>SELECT * FROM test;

KEY C


--------------------------------------------------
1 aaa Replaced bbb Replaced ccc
2 aaa#~#bbb#~#ccc
Posted by 1010
02.Oracle/DataBase2009. 5. 30. 14:21
반응형
LIST

1. 문자 함수
 1-1) CHR
 1-2) CONCAT 함수
 1-3) INITCAP 함수
 1-4) LOWER 함수
 1-5) LPAD 함수
 1-6) LTRIM 함수
 1-7) NLS_INITCAP 함수
 1-8) NLS_LOWER 함수
 1-9) NLSSORT 함수
 1-10) NLS_UPPER 함수
 1-11) REPLACE 함수
 1-12) RPAD 함수
 1-13) RTRIM 함수
 1-14) SOUNDEX 함수
 1-15) SUBSTR 함수
 1-16) TRANSLATE 함수
 1-17) TREAT 함수
 1-18) TRIM 함수
 1-19) UPPER 함수
 1-20) ASCII 함수
 1-21) INSTR 함수
 1-22) LENGTH 함수


2. 날짜 처리함수(datetime function)
 2-1) ADD_MONTHS 함수
 2-2) CURRENT_DATE 함수
 2-3) URRENT_TIMESTAMP 함수
 2-4) DBTIMEZONE 함수
 2-5) EXTRACT(datetime) 함수
 2-6) FROM_TZ 함수
 2-7) LAST_DAY 함수
 2-8) LOCALTIMESTAMP 함수 
 2-9) MONTHS_BETWEEN 함수
 2-10) NEW_TIME 함수
 2-11) NEXT_DAY 함수
 2-12) NUMTODSINTERVAL 함수
 2-13) NUMTOYMINTERVAL 함수
 2-14) ROUND(date) 함수
 2-15) SESSIONTIMEZONE 함수
 2-16) SYS_EXTRACT_UTC 함수
 2-17) SYSDATE 함수
 2-18) SYSTIMESTAMP 함수
 2-19) TO_DSINTERVAL 함수
 2-20) TO_TIMESTAMP 함수
 2-21) TO_TIMESTAMP_TZ 함수
 2-22) TO_YMINTERVAL 함수
 2-23) TRUNC(date) 함수
 2-24) TZ_OFFSET 함수


3.데이터 형 변환 함수(conversion function)
 3-1) ASCIISTR 함수
 3-2) BIN_TO_NUM 함수
 3-3) CAST 함수
 3-4) CHARTOROWID 함수
 3-5) COMPOSE 함수 
 3-6) CONVERT 함수
 3-7) HEXTORAW 함수
 3-8) NUMTODSINTERVAL 함수
 3-9) NUMTOYMINTERVAL 함수
 3-10) RAWTOHEX 함수
 3-11) RAWTONHEX 함수
 3-12) ROWIDTOCHAR 함수
 3-13) ROWIDTONCHAR 함수
 3-14) TO_CHAR(character) 함수
 3-15) TO_CLOB 함수
 3-16) TO_DSINTERVAL 함수
 3-17) TO_LOB 함수
 3-18) TO_MULTI_BYTE 함수
 3-19) TO_NCHAR(character) 함수
 3-20) TO_NCHAR(datetime) 함수
 3-21) TO_NCHAR(number) 함수
 3-22) TO_NCLOB 함수
 3-23) TO_NUMBER 함수
 3-24) TO_SINGLE_BYTE 함수
 3-25) TO_YMINTERVAL 함수
 3-26) TRANSLATE ... USING 함수
 3-27) UNISTR 함수


4. 기타함수(miscellaneous single row function)
 4-1) BFILENAME 함수
 4-2) COALESCE 함수
 4-3) DECODE 함수
 4-4) DEPTH 함수
 4-5) DUMP 함수
 4-6) EMPTY_BLOB 함수
 4-7) EMPTY_CLOB 함수
 4-8) EXISTSNODE 함수
 4-9) EXTRACT(XML) 함수
 4-10) EXTRACTVALUE 함수
 4-11) GREATEST 함수
 4-12) LEAST 함수
 4-13) NLS_CHARSET_DECL_LEN 함수
 4-14) NLS_CHARSET_ID 함수
 4-15) NLS_CHARSET_NAME 함수
 4-16) NULLIF 함수
 4-17) NVL2 함수
 4-18) PATH 함수
 4-19) SYS_CONNECT_BY_PATH 함수
 4-20) SYS_CONTEXT 함수
 4-21) SYS_DBURIGEN 함수
 4-22) SYS_EXTRACT_UTC 함수
 4-23) SYS_GUID 함수
 4-24) SYS_XMLAGG 함수
 4-25) SYS_XMLGEN 함수
 4-26) UID 함수
 4-27) USER 함수
 4-28) USERENV 함수
 4-29) VSIZE 함수
 4-30) XMLAGG 함수
 4-31) XMLCOLATTVAL 함수
 4-32) XMLCONCAT 함수
 4-33) XMLFOREST 함수
 4-34) XMLELEMENT 함수


5.그룹함수  Aggregate 함수
 5-1) AVG* 함수
 5-2) CORR* CORR* 함수
 5-3) COUNT* 함수
 5-4) COVAR_POP 함수
 5-5) COVAR_SAMP 함수
 5-6) CUME_DIST 함수
 5-7) DENSE_RANK 함수
 5-8) FIRST 함수
 5-9) GROUP_ID 함수
 5-10) Grouping 함수
 5-11) GROUPING_ID 함수
 5-12) LAST 함수
 5-13) MAX 함수
 5-14) MIN 함수
 5-15) PERCENTILE_CONT 함수
 5-16) PERCENTILE_DISC 함수
 5-17) PERCENT_RANK 함수
 5-18) RANK 함수
 5-19) REGR_(linear regression) function* 함수
 5-20) STDDEV 함수
 5-21) STDDEV_POP 함수
 5-22) STDDEV_SAMP 함수
 5-23) SUM 함수
 5-24) VAR_POP 함수
 5-25) VAR_SAMP 함수
 5-26) VARIANCE 함수
 5-27) Grouping sets 함수


6. Analytic 함수
 6-1) AVG* 함수
 6-2) CORR* CORR* 함수
 6-3) COUNT* 함수
 6-4) COVAR_SAMP 함수
 6-5) CUME_DIST 함수
 6-6) DENSE_RANK 함수
 6-7) FIRST 함수
 6-8) FIRST_VALUE 함수
 6-9) LAG 함수
 6-10) LAST_VALUE 함수
 6-11) LEAD 함수
 6-12) NTILE 함수
 6-13) RATIO_TO_REPORT 함수
 6-14) ROW_NUMBER 함수


7. 객체 참조 함수
 7-1) REF 타입


8. PseudoColumn을 의미하는 것
 8-1) ROWID 컬럼
 8-2) ROWNUM 컬럼


 1-1) CHR 함수
--------------------------------------------------------------------------------

입력된 수의 바이너리 코드에 해당하는 문자를 반환한다.

【예제】
SQL> select chr(75)||chr(79)||chr(82)||chr(69)||chr(65)
   2    from dual;

CHR(7)
-------
KOREA

SQL>

1-2) CONCAT 함수
--------------------------------------------------------------------------------

 입력되는 두 문자열을 연결하여 반환한다.
 입력되는 두 문자열의 타입이 다를 경우 다음과 같이 반환된다.

첫 번째 문자열 타입  두 번째 문자열 타입  반환되는 문자열 타입 CLOB  NCLOB  NCLOB NCLOB  NCHAR  NCLOB NCLOB  CHAR  NCLOB NCHAR  CLOB  NCLOB


【예제】
SQL> select concat('Republic of',' KOREA') from dual;

CONCAT('REPUBLICO
-----------------
Republic of KOREA

SQL> 


1-3) INITCAP 함수
--------------------------------------------------------------------------------

initcap('string‘) 함수는 입력 문자열 중에서
각 단어의 첫 글자를 대문자로 나머지는 소문자로 변환한 스트링을 반환한다

【예제】
SQL> select initcap('beautiful corea') from dual;

INITCAP('BEAUTI
---------------
Beautiful Corea

SQL>


1-4) LOWER 함수
--------------------------------------------------------------------------------

lower(string) 함수는 입력된 문자열을 소문자로 반환한다.

【예제】
SQL> select lower('Beautiful COREA') from dual;

LOWER('BEAUTIFU
---------------
beautiful corea

SQL> 


1-5) LPAD 함수
--------------------------------------------------------------------------------

lpad(char1,n,char2) 함수는
지정된 길이 n에서 문자 char1으로 채우고
남은 공간은 왼쪽부터 char2로 채워서 출력한다.

【형식】
lpad (char1, n [, char2] )

【예제】
SQL> select lpad ('Corea', 12, '*') from dual;

LPAD('COREA'
------------
*******Corea

SQL>


1-6) LTRIM 함수
--------------------------------------------------------------------------------

 LTRIM(문자열, 문자)함수는 문자열중
좌측으로부터 특정문자와 일치하는 문자를 제거하고 출력한다.

【형식】
ltrim(char [,set] )

【예제】
SQL> select LTRIM('xyxXxyLAST WORD','xy') from dual;

LTRIM('XYXXX
------------
XxyLAST WORD

SQL>


1-7) NLS_INITCAP 함수
--------------------------------------------------------------------------------

nls_initcap(‘string’) 함수는 입력 문자열 중에서
 각 단어의 첫 글자를 대문자로
           나머지는 소문자로 변환한 스트링을 반환한다.
 단어의 white space나 character가 알파뉴메릭이 아니더라도 상관없다.
nlsparam는 ‘nls_sort = sort'와 같은 형식을 가지며,
 여기서 sort는 linguistic sort sequence나 binary중의 하나이다.

【형식】
nls_initcap ( char [,'nlsparam'] )

【예제】
SQL> select nls_initcap('beautiful corea', 'nls_sort=binary')
  2  from dual;

NLS_INITCAP('BE
---------------
Beautiful Corea

SQL> select nls_initcap('beautiful corea','nls_sort=XDutch')
  2  from dual;

NLS_INITCAP('BE
---------------
Beautiful Corea

SQL>


1-8) NLS_LOWER 함수
--------------------------------------------------------------------------------

nls_lower(‘string’) 함수는 입력 문자열을 모두 소문자로 변환한 스트링을 반환한다. 
 단어의 white space나 character가 알파뉴메릭이 아니더라도 상관없다.
nlsparam는 ‘nls_sort = sort'와 같은 형식을 가지며,
 여기서 sort는 linguistic sort sequence나 binary중의 하나이다.

【형식】
nls_lower ( char [,'nlsparam'] )

【예제】
SQL> select nls_lower('CITTA''','nls_sort=XGerman') from dual;

NLS_LO
------
citta'

SQL>


1-9) NLSSORT 함수
--------------------------------------------------------------------------------

nlssort(‘string’) 함수는 입력 문자열을 소팅하여 스트링을 반환한다.
  단어의 white space나 character가 알파뉴메릭이 아니더라도 상관없다.
nlsparam는 ‘nls_sort = sort'와 같은 형식을 가지며,
 여기서 sort는 linguistic sort sequence나 binary중의 하나이다.

【형식】
nlssort ( char [,'nlsparam'] )

【예제】
SQL> select * from emp
  2    order by nlssort(name, 'nls_sort=XDanish');

        ID NAME           SALARY      BONUS
---------- ---------- ---------- ----------
      1101 Cho               250        125
      1102 Joe               240        100
      1104 jijoe             220        100
      1103 kim               250        100

SQL>


1-10) NLS_UPPER 함수
--------------------------------------------------------------------------------

nls_upper(‘string’) 함수는 입력 문자열을 모두 소문자로 변환한 스트링을 반환한다.
  단어의 white space나 character가 알파뉴메릭이 아니더라도 상관없다.
nlsparam는 ‘nls_sort = sort'와 같은 형식을 가지며,
 여기서 sort는 linguistic sort sequence나 binary중의 하나이다.

【형식】
nls_upper ( char [,'nlsparam'] )

【예제】
SQL> select nls_upper('gro?e') from dual;

NLS_U
-----
gro?e

SQL> select nls_upper('gro?e','nls_sort=XGerman')
  2  from dual;

NLS_UP
------
grosse

SQL>


1-11) REPLACE 함수
--------------------------------------------------------------------------------

이 함수는 문자열에서 지정한 문자를 다른 문자로 치환한다.
  치환될 문자를 지정하지 않으면 해당 문자를 삭제한다.

【형식】
replace (char, search_string [, replacement_string] )

【예제】
SQL> select replace('aaabb','a','b') from dual;

REPLA
-----
bbbbb

SQL> select replace('aaabb','a') from dual;

RE
--
bb

SQL>


1-12) RPAD 함수
--------------------------------------------------------------------------------

rpad(char1,n,char2) 함수는 지정된 길이 n에서 문자 char1으로 채우고
남은 공간은 오른쪽부터 char2로 채워서 출력한다.

【형식】
rpad (char1, n [, char2] )

【예제】
SQL> select rpad('Corea',12,'*') from dual;

RPAD('COREA'
------------
Corea*******

SQL>


1-13) RTRIM 함수
--------------------------------------------------------------------------------

 RTRIM(문자열, 문자)함수는 문자열중
 우측으로부터 특정문자와 일치하는 문자를 제거하고 출력한다.

【형식】
rtrim(char [,set] )

【예제】
SQL> select RTRIM('BROWINGyxXxy','xy') "RTRIM example" from dual;

RTRIM exam
----------
BROWINGyxX

SQL>


1-14) SOUNDEX 함수
--------------------------------------------------------------------------------

soundex(‘char’) 함수는 char과 같은 발음의 이름을 표현한다.

【예제】
SQL> select name from emp;

NAME
----------
Cho
Joe
kim
jijoe

SQL> select name from emp
  2  where soundex(name) = soundex('jo');

NAME
----------
Joe

SQL>


1-15) SUBSTR 함수
--------------------------------------------------------------------------------

substr(str,m,n) 함수는 문자열 str 중에서 특정 위치 m으로부터 특정 길이n 만큼의 문자를 출력한다.
  m이 0이나 1이면 문자열의 첫글자를 의미하고,
  n이 생략되면 문자열의 끝까지를 의미한다.
  m이 음수이면 뒤쪽으로부터의 위치를 의미한다.

 SUBSTRB는 character 대신 byte를 사용하고,
 SUBSTDC는 unicode를 사용하며,
 SUBSTR2는 UCS2 codepoint를 사용하고,
 SUBSTR4는 UCS4 codepoint를 사용한다.

【형식】
{SUBSTR|SUBSTRB|SUBSTRC|SUNBSTD2|SUBSTR4}
  ( string, position [,substring_length] )

【예제】
SQL> select substr('abcdesfg', 3,2) from dual;

SU
--
cd

SQL> select substr('abcdefg',3) from dual;

SUBST
-----
cdefg

SQL> select substr('abcdefg', -3,2) from dual; ☜ 뒤에서 3번째부터 2글자를 의미한다.
SU
--
ef

SQL>


1-16) TRANSLATE 함수
--------------------------------------------------------------------------------

TRANSLATE (‘char’,‘from_string’,‘to_string’) 함수는
 char 내에 포함된 문자중 from_string에 지정한 모든 각각의 문자를
                         to_string문자로 각각 변경한다.

【형식】
TRANSLATE ('char','from_string','to_string')

【예제】
SQL> select translate('ababccc','c','d') from dual;

TRANSLA
-------
ababddd

SQL> select translate('2KRW229',
  2  '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ',
  3  '9999999999XXXXXXXXXXXXXXXXXXXXXXXXXX') from dual;

TRANSLA
-------
9XXX999

SQL> select translate('2KRW229',
  2  '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ','0123456789')
  3  from dual;

TRAN
----
2229

SQL>


1-17) TREAT 함수
--------------------------------------------------------------------------------

TREAT 함수는 선언된 타입을 변경함으로써, 수퍼타입을 서브타입인 것처럼 처리할 수 있도록 한다.

【형식】
TREAT ( expr AS [ REF] [schema . ] type )

【예제】
SQL> select x.p.empno from person_table p;
select x.p.empno from person_table p
       *
ERROR at line 1:
ORA-00904: "X"."P"."EMPNO": invalid identifier
 
SQL> select treat(x.p as employee).empno empno,
  2               x.p.last_name last_name
  3   from person_table x;
 
     EMPNO LAST_NAME
---------- --------------------
           Seoul
      1234 Inchon
      5678 Arirang
 
SQL>

【예제】
SQL> select name, TREAT(VALUE(p) AS employee_t).salary salary
  2   FROM person p;

NAME                        SALARY
----------------------   ---------
Bob   
Joe                         100000
Tim                           1000

SQL>


1-18) TRIM 함수
--------------------------------------------------------------------------------

 이 함수는 LTRIM과 RTRIM 함수를 결합한 형태로
  문자값의 왼쪽 또는 오른쪽 부분에 정의한 문자를 절삭하여 출력한다.
LEADING은 LTRIM처럼 문자열 왼쪽의 문자를 지정하여 절삭하고,
 TRAILING은 RTRIM처럼 문자열 오른쪽 문자를 지정하여 절삭한다.
 BOTH는 왼쪽과 오른쪽 문자를 지정하여 절삭한다.

【형식】
TRIM ([{{{LEADING|TRAILING|BOTH} [trim_char] } | trim_char} FROM]
      trim_source )

【예제】
SQL> select trim (0 from 000123400) from dual;

TRIM
----
1234

SQL> select trim(trailing 'a' from 'abca') from dual;

TRI
---
abc

SQL> select trim(leading 'a' from 'abca') from dual;

TRI
---
bca

SQL> select trim(both 'a' from 'abca') from dual;

TR
--
bc

SQL>


1-19) UPPER 함수
--------------------------------------------------------------------------------

upper(string) 함수는 입력된 문자열을 대문자로 반환한다.

【예제】
SQL> select upper('Beautiful COREA') from dual;

UPPER('BEAUTIFU
---------------
BEAUTIFUL COREA

SQL>


1-20) ASCII 함수
--------------------------------------------------------------------------------

ASCII
ascii(‘char’) 함수는 주어진 char의 첫 글자의 아스키 값을 반환한다.
 char의 타입은 char, varchar2, nchar, nvarchar2중의 하나이어야 한다.

【예제】
SQL> select ascii('Korea') from dual;

ASCII('KOREA')
--------------
            75

SQL> select ascii('K') from dual;

ASCII('K')
----------
        75

SQL>


1-21) INSTR 함수
--------------------------------------------------------------------------------

이 함수는 문자 스트링 중에서
지정한 문자가 가장 처음 나타나는 위치를 숫자로 출력한다.

【형식】
{INSTR|INSTRB|INSTRC|INSTR2|INSTR4}
  ( string, substring [, position [,occurrence] ] )

【예제】
SQL> select instr('Corea','e') from dual;

INSTR('COREA','E')
------------------
                 4

SQL> select instr('corporate floor','or',3,2) from dual;

INSTR('CORPORATEFLOOR','OR',3,2)
--------------------------------
                              14

SQL> select instrb('corporate floor','or',5,2) from dual;

INSTRB('CORPORATEFLOOR','OR',5,2)
---------------------------------
                               14

SQL>


1-22) LENGTH 함수
--------------------------------------------------------------------------------

 LENGTH(char) 함수는 char의 길이를 반환한다.
LENGTHB는 character 대신 byte를 사용하고,
LENGTHC는 unicode를 사용하며,
LENGTH2는 UCS2 codepoint를 사용하고,
LENGTH4는 UCS4 codepoint를 사용한다.

【형식】
{LENGTH| LENGTHB| LENGTHC| LENGTH2| LENGTH4} (char)

【예제】
SQL> select length('Corea') from dual;

LENGTH('COREA')
---------------
              5

SQL> select lengthb('Corea') from dual;

LENGTHB('COREA')
----------------
               5

SQL>



2-1) ADD_MONTHS 함수
--------------------------------------------------------------------------------

ADD_MONTHS
 ADD_MONTHS(d, n)는 날짜 d에 n 개월을 더한 일자를 반환한다.

【예제】
SQL> select current_date today, add_months(current_date,1) "next month"
  2  from dual;

TODAY     next mont
--------- ---------
29-JUL-04 29-AUG-04

SQL>


2-2) CURRENT_DATE 함수
--------------------------------------------------------------------------------


 이 함수는 현재 session의 날짜 정보를 반환한다.
【예제】
SQL> select current_date from dual;

CURRENT_D
---------
31-JUL-04

SQL> select sessiontimezone from dual;

SESSIONTIMEZONE
--------------------------------------------------------------------------
+09:00

SQL> alter session set NLS_DATE_FORMAT='DD-MON-YYYY HH24:MI:SS';

Session altered.

SQL> select current_date from dual;

CURRENT_DATE
--------------------
31-JUL-2004 09:31:57

SQL> alter session set time_zone='-5:0';

Session altered.

SQL> select sessiontimezone from dual;

SESSIONTIMEZONE
--------------------------------------------------------------------------
-05:00

SQL>


2-3) URRENT_TIMESTAMP 함수
--------------------------------------------------------------------------------

 이 함수는 현재 session의 날짜와 시간 정보를 반환한다.
 current_timestamp는 time zone까지 출력되지만,
 localtimestamp는 time zone은 출력되지 않는다.
【예제】
SQL> select current_timestamp, localtimestamp,
  2  current_date from dual;

CURRENT_TIMESTAMP
--------------------------------------------------------------------------
LOCALTIMESTAMP
--------------------------------------------------------------------------
CURRENT_D
---------
04-AUG-04 11.17.40.768776 AM +09:00
04-AUG-04 11.17.40.768776 AM
04-AUG-04

SQL>


2-4) DBTIMEZONE 함수
--------------------------------------------------------------------------------


데이터베이스 timezone을 반환한다.
【예제】
SQL> select dbtimezone from dual;

DBTIME
------
-07:00

SQL> select sessiontimezone from dual;

SESSIONTIMEZONE
--------------------------------------------------------------------------
+09:00

SQL>


2-5) EXTRACT(datetime) 함수
--------------------------------------------------------------------------------

특정 날짜/시간 값이나 날짜 값을 가진 표현식으로부터
  원하는 날짜 영역을 추출하여 출력한다.

【형식】
EXTRACT ({year|month|day|hour|minute|second|
         timezone_hour|timezone_minute|
         timezone_region|timezone_abbr}
 FROM {datetime_value_expr|interval_value_rxpr})

【예제】
SQL> select extract(year from date '2004-8-2') from dual;

EXTRACT(YEARFROMDATE'2004-8-2')
-------------------------------
                           2004

SQL>


2-6) FROM_TZ 함수
--------------------------------------------------------------------------------

이 함수는 timestamp 값을 timestamp with time zone 값으로 변환한다.

【형식】
FROM_TZ ( timestamp_value, time_zone_value)

【예제】
SQL> select from_tz(timestamp '2004-8-11 08:00:00','3:00') from dual;

FROM_TZ(TIMESTAMP'2004-8-1108:00:00','3:00')
--------------------------------------------------------------------------
11-AUG-04 08.00.00.000000000 AM +03:00

SQL>


2-7) LAST_DAY 함수
--------------------------------------------------------------------------------

 이 함수는 지정한 달의 마지막 날을 출력한다.

【형식】
LAST_DAY ( date )

【예제】
SQL> select sysdate, last_day(sysdate) "last day",
  2  last_day(sysdate)- sysdate "Days Left"
  3  from dual;

SYSDATE   last day   Days Left
--------- --------- ----------
04-AUG-04 31-AUG-04         27

SQL>


2-8) LOCALTIMESTAMP 함수
--------------------------------------------------------------------------------

이 함수는 timestamp의 현재 날짜와 시각을 출력한다.
 current_timestamp는 time zone까지 출력되지만,
 localtimestamp는 time zone은 출력되지 않는다.

【형식】
localtimestamp [(timestamp_precision)]

【예제】
SQL> select current_timestamp, localtimestamp,
  2  current_date from dual;

CURRENT_TIMESTAMP
--------------------------------------------------------------------------
LOCALTIMESTAMP
--------------------------------------------------------------------------
CURRENT_D
---------
04-AUG-04 11.17.40.768776 AM +09:00
04-AUG-04 11.17.40.768776 AM
04-AUG-04

SQL>
 
【예제】오류가 발생하는 이유를 잘 이해하자.
SQL> CREATE TABLE local_test(col1 TIMESTAMP WITH LOCAL TIME ZONE);

Table created.

SQL> INSERT INTO local_test VALUES
  2  (TO_TIMESTAMP(LOCALTIMESTAMP, 'DD-MON-RR HH.MI.SSXFF'));
(TO_TIMESTAMP(LOCALTIMESTAMP, 'DD-MON-RR HH.MI.SSXFF'))
              *
ERROR at line 2:
ORA-01830: date format picture ends before converting entire input string

SQL> INSERT INTO local_test VALUES
  2  (TO_TIMESTAMP(LOCALTIMESTAMP, 'DD-MON-RR HH.MI.SSXFF PM'));

1 row created.

SQL> select * from local_test;

COL1
--------------------------------------------------------------------------
04-AUG-04 11.33.58.183398 AM

SQL>



2-9) MONTHS_BETWEEN 함수
--------------------------------------------------------------------------------

 MONTHS_BETWEEN(date1,date2) 함수는 date1과 date로 나타내는
 날짜와 날짜 사이의 개월 수를 출력한다.

【예제】
SQL> select months_between
  2  (to_date('02-02-2004','MM-DD-YYYY'),
  3   to_date('01-01-2003','MM-DD-YYYY') ) "Months"
  4  FROM dual;

    Months
----------
13.0322581

SQL>


2-10) NEW_TIME 함수
--------------------------------------------------------------------------------

NEW_TIME(date,zone1,zone2) 함수는 date, zone1 시간대를 zone2 시간대로 출력한다.
여기서 사용되는 zone은 다음 중의 하나이다.

 AST,ADT : Atlantic Standard or Daylight Time
 BST,BDT : Bering Standard or Daylight Time
 CST,CDT : Central Standard or Daylight Time
 EST,EDT : Eastern Standard or Daylight Time
 GMT : Greenwich Mean Time
 HST,HDT : Alaska-Hawaii Standard or Daylight Time
 MST,MDT : Mountain Standard or Daylight Time
 NST : Newfoundland Standard Time
 PST,PDT : Pacific Standard or Daylight Time
 YST,YDT : Yukon Standard or Daylight Time

【예제】
SQL> alter session set nls_date_format =
  2  'DD-MON-YYYY HH24:MI:SS';

Session altered.

SQL> select NEW_TIME(TO_DATE(
  2  '11-10-04 01:23:33', 'MM-DD-YY HH24:MI:SS'),
  3  'AST', 'PST') FROM DUAL;

NEW_TIME(TO_DATE('11
--------------------
09-NOV-2004 21:23:33

SQL>



2-11) NEXT_DAY 함수
--------------------------------------------------------------------------------

NEXT_DAY(date,char) 함수는 date로부터 char로 명시한 가장 최근의 날짜를 출력한다.

【예제】
SQL> select next_day('02-AUG-2004','MONDAY') from dual;

NEXT_DAY('02-AUG-200
--------------------
09-AUG-2004 00:00:00

SQL>



2-12) NUMTODSINTERVAL 함수
--------------------------------------------------------------------------------

 NUMTODSINTERVAL(n,'char_expr') 함수는 n을 interval day to second로 변환하여 출력한다.
 char_expr은 다음 중의 하나이다.
  ‘DAY’
  ‘HOUR’
  ‘MINUTE’
  ‘SECOND’

【예제】
SQL> select numtodsinterval(100,'MINUTE') from dual;

NUMTODSINTERVAL(100,'MINUTE')
--------------------------------------------------------------------------
+000000000 01:40:00.000000000

SQL>

【예제】
SQL> connect scott/tiger
Connected.
SQL> select ename, hiredate,
  2  numtodsinterval(100,'day')+hiredate from emp;

ENAME      HIREDATE  NUMTODSIN
---------- --------- ---------
SMITH      17-DEC-80 27-MAR-81
ALLEN      20-FEB-81 31-MAY-81
WARD       22-FEB-81 02-JUN-81
JONES      02-APR-81 11-JUL-81
MARTIN     28-SEP-81 06-JAN-82
BLAKE      01-MAY-81 09-AUG-81
CLARK      09-JUN-81 17-SEP-81
SCOTT      19-APR-87 28-JUL-87
KING       17-NOV-81 25-FEB-82
TURNER     08-SEP-81 17-DEC-81
ADAMS      23-MAY-87 31-AUG-87
JAMES      03-DEC-81 13-MAR-82
FORD       03-DEC-81 13-MAR-82
MILLER     23-JAN-82 03-MAY-82

14 rows selected.

SQL>


2-13) NUMTOYMINTERVAL 함수
--------------------------------------------------------------------------------

NUMTOYMINTERVAL(n,'char_expr') 함수는 n을 interval year to month로 변환하여 출력한다.
 char_expr은 다음 중의 하나이다.
  ‘YEAR’
  ‘MONTH’

【예제】
SQL> select numtoyminterval(30,'month') from dual;

NUMTOYMINTERVAL(30,'MONTH')
---------------------------------------------------------------------------
+000000002-06

SQL>

【예제】
SQL> connect scott/tiger
Connected.
SQL> select ename,hiredate,
  2  numtoyminterval(30,'month')+hiredate from emp;

ENAME      HIREDATE  NUMTOYMIN
---------- --------- ---------
SMITH      17-DEC-80 17-JUN-83
ALLEN      20-FEB-81 20-AUG-83
WARD       22-FEB-81 22-AUG-83
JONES      02-APR-81 02-OCT-83
MARTIN     28-SEP-81 28-MAR-84
BLAKE      01-MAY-81 01-NOV-83
CLARK      09-JUN-81 09-DEC-83
SCOTT      19-APR-87 19-OCT-89
KING       17-NOV-81 17-MAY-84
TURNER     08-SEP-81 08-MAR-84
ADAMS      23-MAY-87 23-NOV-89
JAMES      03-DEC-81 03-JUN-84
FORD       03-DEC-81 03-JUN-84
MILLER     23-JAN-82 23-JUL-84

14 rows selected.

SQL>



2-14) ROUND(date) 함수
--------------------------------------------------------------------------------

이 함수는 날짜를 주어진 형식으로 반올림하는 함수이다.
 날짜 형식이 없으면 가장 가까운 날을 출력한다.

【형식】
ROUND( date [,fmt] )

【예제】
SQL> select localtimestamp, round(sysdate,'year') from dual;

LOCALTIMESTAMP
--------------------------------------------------------------------------
ROUND(SYS
---------
04-AUG-04 01.26.24.197977 PM
01-JAN-05

SQL> select localtimestamp,round(sysdate,'day') from dual;

LOCALTIMESTAMP
--------------------------------------------------------------------------
ROUND(SYS
---------
04-AUG-04 01.29.57.839269 PM
08-AUG-04

SQL> select localtimestamp,round(sysdate) from dual;

LOCALTIMESTAMP
--------------------------------------------------------------------------
ROUND(SYS
---------
04-AUG-04 01.30.11.552050 PM
05-AUG-04

SQL>


2-15) SESSIONTIMEZONE 함수
--------------------------------------------------------------------------------

이 함수는 현재 세션의 시간대역을 출력한다.

【예제】
SQL> select sessiontimezone, current_timestamp from dual;

SESSIONTIMEZONE
--------------------------------------------------------------------------
CURRENT_TIMESTAMP
--------------------------------------------------------------------------
+09:00
04-AUG-04 01.37.13.355873 PM +09:00

SQL> select sessiontimezone, tz_offset(sessiontimezone) from dual;

SESSIONTIMEZONE
--------------------------------------------------------------------------
TZ_OFFS
-------
+09:00
+09:00

SQL>


2-16) SYS_EXTRACT_UTC 함수
--------------------------------------------------------------------------------

sys_extract_utc(datetime_with_timezone) 함수는
UTC(coordinated universal time: Greenwich mean time) 시각을 반환한다.

【예제】
SQL> select systimestamp, sys_extract_utc(systimestamp) from dual;

SYSTIMESTAMP
--------------------------------------------------------------------------
SYS_EXTRACT_UTC(SYSTIMESTAMP)
--------------------------------------------------------------------------
06-AUG-04 02.41.39.258976 PM +09:00
06-AUG-04 05.41.39.258976 AM


SQL>


2-17) SYSDATE 함수
--------------------------------------------------------------------------------

이 함수는 오늘 현재 날짜와 시각을 출력한다.

【예제】
SQL> select sysdate, current_timestamp from dual;

SYSDATE
---------
CURRENT_TIMESTAMP
--------------------------------------------------------------------------
04-AUG-04
04-AUG-04 01.51.39.767156 PM +09:00

SQL> select to_char
  2  (sysdate, 'MM-DD-YYYY HH24:MI:SS') from dual;

TO_CHAR(SYSDATE,'MM
-------------------
08-04-2004 13:53:18

SQL>


2-18) SYSTIMESTAMP 함수
--------------------------------------------------------------------------------

이 함수는 시스템의 날짜를 출력한다.

【예제】
SQL> select sysdate,systimestamp,localtimestamp from dual;

SYSDATE
---------
SYSTIMESTAMP
--------------------------------------------------------------------------
LOCALTIMESTAMP
--------------------------------------------------------------------------
04-AUG-04
04-AUG-04 01.58.06.346528 PM +09:00
04-AUG-04 01.58.06.346552 PM

SQL>


2-19) TO_DSINTERVAL 함수
--------------------------------------------------------------------------------

이 함수는 문자열을 interval day to second 형식으로 변환하는 함수이다.

【형식】
to_dsinterval ( char [ ‘nlsparam’] )

【예제】
SQL> select sysdate,
  2  sysdate+to_dsinterval('003 17:00:00') as "3days 17hours later"
  3  from dual;

SYSDATE   3days 17h
--------- ---------
04-AUG-04 08-AUG-04

SQL>


2-20) TO_TIMESTAMP 함수
--------------------------------------------------------------------------------

이 함수는 문자열을 timestamp 형식으로 변환하여 출력한다

【형식】
to_timestamp ( char [,fmt ['nlsparam'] ] )

【예제】
SQL> select to_timestamp('2004-8-20 1:30:00', 'YYYY-MM-DD HH:MI:SS')
  2  from dual;

TO_TIMESTAMP('2004-8-201:30:00','YYYY-MM-DDHH:MI:SS')
--------------------------------------------------------------------------
20-AUG-04 01.30.00.000000000 AM

SQL>



2-21) TO_TIMESTAMP_TZ 함수
--------------------------------------------------------------------------------

이 함수는 문자열을 timestamp with time zone 형식으로 변환하여 출력한다.

【형식】
to_timestamp_tz ( char [,fmt ['nlsparam'] ] )

【예제】
SQL> select to_timestamp_tz('2004-8-20 1:30:00 -3:00',
  2  'YYYY-MM-DD HH:MI:SS TZH:TZM') from dual;

TO_TIMESTAMP_TZ('2004-8-201:30:00-3:00','YYYY-MM-DDHH:MI:SSTZH:TZM')
--------------------------------------------------------------------------
20-AUG-04 01.30.00.000000000 AM -03:00

SQL>


2-22) TO_YMINTERVAL 함수
--------------------------------------------------------------------------------

TO_YMINTERVAL ( char ) 함수는 문자열을 interval year to month 형식으로 변환하는 함수이다.

【예제】
SQL> select sysdate,
  2  sysdate+to_yminterval('01-03') "15Months later"
  3  from dual;

SYSDATE   15Months
--------- ---------
04-AUG-04 04-NOV-05

SQL>


2-23) TRUNC(date) 함수
--------------------------------------------------------------------------------

이 함수는 날짜를 절삭하여 출력한다.

【형식】
TRUNC ( date [.fmt] )

【예제】
SQL> select trunc(to_date('27-AUG-04','DD-MON-YY'), 'YEAR')
  2  from dual;

TRUNC(TO_
---------
01-JAN-04

SQL>


2-24) TZ_OFFSET 함수
--------------------------------------------------------------------------------

이 함수는 time zone의 offset 값을 출력한다.

【형식】
TZ_OFFSET ( {‘time_zone_name’ | SESSIONTIMEZONE | DBTIMEZONE |
             ‘{+|-} hh:mi’ } )

【예제】
SQL> select sessiontimezone, tz_offset('ROK') from dual;

SESSIONTIMEZONE
---------------------------------------------------------------------------
TZ_OFFS
-------
+09:00
+09:00

SQL>



3-1) ASCIISTR 함수
--------------------------------------------------------------------------------

 asciistr('string')의 string의 아스키 문자로 반환한다.
Ä
【예제】
SQL> select ascii('ABÄCDE') from dual;
☜ ABÄCDE의 두번째 Ä는 A에 움라우트(Umlaut)가 붙은 글씨이다.

ASCIIS
------
ABDCDE
           
SQL>



3-2) BIN_TO_NUM 함수
--------------------------------------------------------------------------------

 이 함수는 2진수 벡터를 10진수로 변환한다.

SQL> select bin_to_num(1,0,1,0) from dual;

BIN_TO_NUM(1,0,1,0)
-------------------
                 10

SQL>


3-3) CAST 함수
--------------------------------------------------------------------------------

 데이터형식이나 collection 형식을 다른 데이터형식이나 다른 collection 형식으로 변환한다.

【예제】데이터형식인 경우
SQL> select current_date from dual;

CURRENT_D
---------
30-JUL-04

SQL> select cast(current_date as timestamp) from dual;

CAST(CURRENT_DATEASTIMESTAMP)
---------------------------------------------------------------------------
30-JUL-04 12.29.15.000000 PM

SQL>


3-4) CHARTOROWID 함수
--------------------------------------------------------------------------------

 이 함수는 char, varchar2, nchar, ncharvar2형 데이터 타입을 rowid 형 데이터 타입으로 변경한다.
【예제】
SQL> select name from emp
  2  where rowid = chartorowid('AAAHZ+AABAAAMWiAAF');

NAME
----------
jijoe

SQL> select rowid,name from emp;

ROWID              NAME
------------------ ----------
AAAHZ+AABAAAMWiAAA Cho
AAAHZ+AABAAAMWiAAB Joe
AAAHZ+AABAAAMWiAAC kim
AAAHZ+AABAAAMWiAAF jijoe

SQL>


여기서 rowid의 의미는 다음과 같다.
AAAHZ+  AAB  AAAMWi  AAA 객체번호  테이블스페이스번호  블록번호  행번호



3-5) COMPOSE 함수
--------------------------------------------------------------------------------

 입력된 스트링을 unicode로 나타낸다.

【예제】
SQL> select compose('aa' || unistr('\0308') ) from dual;

CO
--
aa

SQL>


3-6) CONVERT 함수
--------------------------------------------------------------------------------

입력된 문자열을 지정한 코드로 변환한다.
공용 문자셋은 살펴보자.
US7ASCII  US 7-bit ASCII 문자 WE8DEC  서유럽 8비트 문자 WE8HP  HP 서유럽 레이져젯 8비트 문자 F7DEC  DEC 프랑스 7비트 문자 WE8EBCDIC500  IBM 서유럽 EBCDIC 코드 페이지 500 WE8PC850  IBM PC 코드 페이지 850 WE8ISO8859P1  ISO 8859 서유럽 8비트 문자

【예제】
SQL> select convert('arirang','we8pc850') from dual;

CONVERT
-------
arirang

SQL>


3-7) HEXTORAW 함수
--------------------------------------------------------------------------------

HEXTORAW(char) 함수는 char, varchar2, nchar, nvarchar2 따위의 문자로 주어지는
 hexadecimal digit을 raw 값으로 변환한다.

【예제】
SQL> create table test(raw_col RAW(10));

Table created.

SQL> insert into test VALUES (HEXTORAW('7D'));

1 row created.

SQL> select * from test;

RAW_COL
--------------------
7D

SQL>



3-8) NUMTODSINTERVAL 함수
--------------------------------------------------------------------------------

 NUMTODSINTERVAL(n,'char_expr') 함수는 n을 interval day to second로 변환하여 출력한다.
 char_expr은 다음 중의 하나이다.
  ‘DAY’
  ‘HOUR’
  ‘MINUTE’
  ‘SECOND’

【예제】
SQL> select numtodsinterval(100,'MINUTE') from dual;

NUMTODSINTERVAL(100,'MINUTE')
--------------------------------------------------------------------------
+000000000 01:40:00.000000000

SQL>

【예제】
SQL> connect scott/tiger
Connected.
SQL> select ename, hiredate,
  2  numtodsinterval(100,'day')+hiredate from emp;

ENAME      HIREDATE  NUMTODSIN
---------- --------- ---------
SMITH      17-DEC-80 27-MAR-81
ALLEN      20-FEB-81 31-MAY-81
WARD       22-FEB-81 02-JUN-81
JONES      02-APR-81 11-JUL-81
MARTIN     28-SEP-81 06-JAN-82
BLAKE      01-MAY-81 09-AUG-81
CLARK      09-JUN-81 17-SEP-81
SCOTT      19-APR-87 28-JUL-87
KING       17-NOV-81 25-FEB-82
TURNER     08-SEP-81 17-DEC-81
ADAMS      23-MAY-87 31-AUG-87
JAMES      03-DEC-81 13-MAR-82
FORD       03-DEC-81 13-MAR-82
MILLER     23-JAN-82 03-MAY-82

14 rows selected.

SQL>



3-9) NUMTOYMINTERVAL 함수
--------------------------------------------------------------------------------

NUMTOYMINTERVAL(n,'char_expr') 함수는 n을 interval year to month로 변환하여 출력한다.
 char_expr은 다음 중의 하나이다.
  ‘YEAR’
  ‘MONTH’

【예제】
SQL> select numtoyminterval(30,'month') from dual;

NUMTOYMINTERVAL(30,'MONTH')
---------------------------------------------------------------------------
+000000002-06

SQL>

【예제】
SQL> connect scott/tiger
Connected.
SQL> select ename,hiredate,
  2  numtoyminterval(30,'month')+hiredate from emp;

ENAME      HIREDATE  NUMTOYMIN
---------- --------- ---------
SMITH      17-DEC-80 17-JUN-83
ALLEN      20-FEB-81 20-AUG-83
WARD       22-FEB-81 22-AUG-83
JONES      02-APR-81 02-OCT-83
MARTIN     28-SEP-81 28-MAR-84
BLAKE      01-MAY-81 01-NOV-83
CLARK      09-JUN-81 09-DEC-83
SCOTT      19-APR-87 19-OCT-89
KING       17-NOV-81 17-MAY-84
TURNER     08-SEP-81 08-MAR-84
ADAMS      23-MAY-87 23-NOV-89
JAMES      03-DEC-81 03-JUN-84
FORD       03-DEC-81 03-JUN-84
MILLER     23-JAN-82 23-JUL-84

14 rows selected.

SQL>




3-10) RAWTOHEX 함수
--------------------------------------------------------------------------------

RAWTOHEX(raw) 함수는 raw 값을 hexadecimal 값으로 변환한다.

【예제】
SQL> create table test(raw_col RAW(10));

Table created.

SQL> insert into test VALUES (HEXTORAW('7D'));

1 row created.

SQL> select * from test;

RAW_COL
--------------------
7D

SQL> select rawtohex(raw_col) from test;

RAWTOHEX(RAW_COL)
--------------------
7D

SQL>


3-11) RAWTONHEX 함수
--------------------------------------------------------------------------------

RAWTONHEX(raw) 함수는 raw 값을 nvarchar2형 hexadecimal 값으로 변환한다.

【예제】
SQL> create table test(raw_col RAW(10));

Table created.

SQL> insert into test VALUES (HEXTORAW('7D'));

1 row created.

SQL> select * from test;

RAW_COL
--------------------
7D

SQL> select rawtonhex(raw_col) from test;

RAWTONHEX(RAW_COL)
--------------------
7D

SQL>


3-12) ROWIDTOCHAR 함수
--------------------------------------------------------------------------------

RAWIDTOCHAR(rowid) 함수는 rowid 값을 varchar2 형식의 데이터로 변환한다.

【예제】
SQL> select rowid from test;

ROWID
------------------
AAAHbHAABAAAMXCAAA

SQL> select rowid from test
  2  where rowidtochar(rowid) like '%AABAA%';

ROWID
------------------
AAAHbHAABAAAMXCAAA

SQL>

여기서 rowid의 의미는 다음과 같다.
AAAHbH  AAB  AAAMXC  AAA 객체번호  테이블스페이스번호  블록번호  행번호



3-13) ROWIDTONCHAR 함수
--------------------------------------------------------------------------------

RAWIDTONCHAR(rowid) 함수는 rowid 값을 nvarchar2 형식의 데이터로 변환한다.

【예제】
SQL> select rowid from test;

ROWID
------------------
AAAHbHAABAAAMXCAAA

SQL> select rowid from test
  2  where rowidtochar(rowid) like '%AABAA%';

ROWID
------------------
AAAHbHAABAAAMXCAAA

SQL> select lengthb(rowidtonchar(rowid)), rowidtonchar(rowid)
  2  from test;

LENGTHB(ROWIDTONCHAR(ROWID)) ROWIDTONCHAR(ROWID
---------------------------- ------------------
                          36 AAAHbHAABAAAMXCAAA

SQL>


여기서 rowid의 의미는 다음과 같다.
AAAHbH  AAB  AAAMXC  AAA 객체번호  테이블스페이스번호  블록번호  행번호



3-14) TO_CHAR(character) 함수
--------------------------------------------------------------------------------

 이 함수는 nchar, nvarchar2, clob, nclob 형식의 데이터를
데이터베이스 character set으로 변환한다. 즉, 문자로 변환한다.

【형식】
 TO_CHAR( nchar| clob | nclob)

【예제】
SQL> select to_char('01110') from dual;

TO_CH
-----
01110

SQL>



3-15) TO_CLOB 함수
--------------------------------------------------------------------------------

이 함수는 LOB 컬럼에 있는 NCLOB나 또는 다른 문자 스트링을 CLOB로 변환한다.

【형식】
 TO_CLOBR({ lob_column | char})

【예제】
SQL> select to_clob('corea') from dual;

TO_CLOB('COREA')
--------------------------------------------------------------------------
corea

SQL>



3-16) TO_DSINTERVAL 함수
--------------------------------------------------------------------------------

이 함수는 문자열을 interval day to second 형식으로 변환하는 함수이다.

【형식】
to_dsinterval ( char [ ‘nlsparam’] )

【예제】
SQL> select sysdate,
  2  sysdate+to_dsinterval('003 17:00:00') as "3days 17hours later"
  3  from dual;

SYSDATE   3days 17h
--------- ---------
04-AUG-04 08-AUG-04

SQL>


3-17) TO_LOB 함수
--------------------------------------------------------------------------------

 TO_LOB(long_column) 함수는 LONG, LONG RAW 컬럼의 데이터를 LOB 값으로 변환한다.

【예제】
SQL> create table test2(zz clob);

Table created.

SQL> insert into test2
  2  (select to_lob(p.raw_col) from test p);

SQL>


3-18) TO_MULTI_BYTE 함수
--------------------------------------------------------------------------------

TO_MULTI_BYTE(char) 함수는 싱글 바이트 문자를 포함한 모든 문자열을 다중바이트 문자열로 변환한다.

【예제】
SQL> select dump(to_multi_byte('Corea')) from dual;

DUMP(TO_MULTI_BYTE('COREA'))
-----------------------------------------------------
Typ=1 Len=10: 163,195,163,239,163,242,163,229,163,225

SQL>



3-19) TO_NCHAR(character) 함수
--------------------------------------------------------------------------------

 이 함수는 문자스트링, clob, nclob 형식의 데이터를 national character set,
 즉 nchar으로 변환한다. 이는 translate ... using 문의 경우와 같다.

【형식】
TO_NCHAR({char|clob|nclob} [,fmt [,'nlsparam']])

【예제】
SQL> select to_nchar('Corea') from dual;

TO_NC
-----
Corea

SQL>


3-20) TO_NCHAR(datetime) 함수
--------------------------------------------------------------------------------

 이 함수는 date, timestamp, timestamp with time zone, timestamp with local time zone,
 interval month to year, interval day to second 형식의 데이터를
 nchar 형식의 데이터로 변환한다.

【형식】
TO_NCHAR({datetime|interval} [,fmt [,'nlsparam']])

【예제】
SQL> select to_nchar(sysdate) from dual;

TO_NCHAR(SYSDATE)
------------------------------
05-AUG-04

SQL>



3-21) TO_NCHAR(number) 함수
--------------------------------------------------------------------------------

 이 함수는 숫자를 nvarchar2 형식의 데이터로 변환한다.

【형식】
TO_NCHAR(n [,fmt [,'nlsparam']])

【예제】
SQL> select to_nchar(1234) from dual;

TO_N
----
1234

SQL> select to_nchar(rownum) from test;

TO_NCHAR(ROWNUM)
----------------------------------------
1

SQL>



3-22) TO_NCLOB 함수
--------------------------------------------------------------------------------

이 함수는 clob, 문자열 형식의 데이터를 nclob 형식의 데이터로 변환한다.

【형식】
TO_NCLOB({char|lob_column})

【예제】
SQL> select to_nclob('Corea') from dual;

TO_NCLOB('COREA')
--------------------------------------------------------------------------
Corea

SQL>



3-23) TO_NUMBER 함수
--------------------------------------------------------------------------------

이 함수는 숫자를 포함하는 char, varchar2, nchar, nvarchar2 형식의
 문자 데이터를 number 형식의 숫자 데이터로 변환한다.

【형식】
TO_NUMBER(char [,fmt [,'nlsparam']])

【예제】
SQL> select to_number('1234') from dual;

TO_NUMBER('1234')
-----------------
             1234

SQL>


3-24) TO_SINGLE_BYTE 함수
--------------------------------------------------------------------------------

TO_SINGLE_BYTE(char) 함수는 다중 바이트 문자열을 single byte 문자로 변환한다.

【예제】
SQL> select dump(to_multi_byte('Corea')) from dual;

DUMP(TO_MULTI_BYTE('COREA'))
-----------------------------------------------------
Typ=1 Len=10: 163,195,163,239,163,242,163,229,163,225

SQL> select dump(to_single_byte('Corea')) from dual;

DUMP(TO_SINGLE_BYTE('COREA'))
------------------------------
Typ=1 Len=5: 67,111,114,101,97

SQL> select to_single_byte(chr(65)) from dual;

T
-
A

SQL>



3-25) TO_YMINTERVAL 함수
--------------------------------------------------------------------------------

TO_YMINTERVAL ( char ) 함수는 문자열을 interval year to month 형식으로 변환하는 함수이다.

【예제】
SQL> select sysdate,
  2  sysdate+to_yminterval('01-03') "15Months later"
  3  from dual;

SYSDATE   15Months
--------- ---------
04-AUG-04 04-NOV-05

SQL>


3-26) TRANSLATE ... USING 함수
--------------------------------------------------------------------------------

이 함수는 텍스트 형식의 데이터를 지정한 문자 형식의 데이터로 변환한다.

【형식】
TRANSLATE ( text USING {CHAR_CS|NCHAR_CS} )

【예제】
SQL> select translate('Corea' USING char_cs) from dual;

TRANS
-----
Corea

SQL> select to_nchar('Corea') from dual;

TO_NC
-----
Corea

SQL>


3-27) UNISTR 함수
--------------------------------------------------------------------------------

UNISTR('string') 함수는 스트링 형식의 데이터를 nchar 형식의 데이터로 변환한다.

【예제】
SQL> select unistr('abc\00e5\00f1\00f6') from dual;

UNISTR
------
abc??o

SQL> select unistr('Corea') from dual;

UNIST
-----
Corea

SQL>



4-1) BFILENAME 함수
--------------------------------------------------------------------------------

 서버 파일 시스템 상에 실제로 위치한 LOB 바이너리 파일의 위치한 BFILE locator를 반환한다.
【형식】
bfilename ('디렉토리‘,’파일이름‘)

【예제】BFILE을 insert하는 예
SQL> connect system/manager

SQL> host mkdir /export/home/oracle/bfile

SQL> create directory bfile_dir as '/export/home/oracle/bfile';

Directory created.

SQL> grant read on directory bfile_dir to jijoe;

Grant succeeded.

SQL> connect jijoe/joe_password

SQL> create table bfile_doc (id number, doc bfile);

SQL> insert into bfile_doc

   1    values(1111,bfilename('bfile_dir','unix.hwp'));

1 row created.

SQL>


4-2) COALESCE 함수
--------------------------------------------------------------------------------

이 함수는 나열된 값 중에서 NULL이 아닌 첫 번째 값을 반환한다. 

【예제】
SQL> select coalesce('','','arirang','kunsan') from dual;

COALESC
-------
arirang

SQL>



4-3) DECODE 함수
--------------------------------------------------------------------------------

DECODE는 일반적인 프로그래밍 언어의 IF문을 SQL 문자 또는 PL/SQL 안으로 끌어들여 사용하기 위하여 만들어진 오라클 함수이다.
따라서 일반 프로그래밍 언어의 IF문이 수행 할 수 있는 기능을 포함하고 있다.
  select시의 decode 사용은 from 절만 빼고 어디에서나 사용할 수 있다.
  일반 프로그래밍과 decode 함수를 서로 비교하여 보자.
IF문 Decode 함수 IF A=B THEN RETURN 'T';END IF; DECODE(A,B,'T') IF A=B THENRETURN 'T';ELSIF A=C THENRETURN 'F';ELSERETURN 'X';END IF; DECODE(A,B,'T',C,'F','X')
【형식】
DECODE(검색컬럼,조건1,결과값1,
                  조건2,결과값2,...,기본값);

【예제】
SQL> connect jijoe/jijoe_password
SQL> create table aa(
  2  pid        number(12) primary key,
  3  addr varchar2(20),
  4  name varchar2(10));

SQL> insert into aa values(1234,'kunsan','jijoe')
SQL> insert into aa values(3456,'seoul','sunny')

SQL> select * from aa;

       PID ADDR                 NAME
---------- -------------------- ----------
      1234 kunsan               jijoe
      3456 seoul                sunny

SQL> select decode(pid,1234,name) name from aa;

NAME
----------
jijoe


SQL>
【예제】
SQL> desc ddd
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 NO                                                 NUMBER(4)
 NAME                                               VARCHAR2(10)
 HIRDATE                                            DATE
 DEPTNO                                             NUMBER(5)

SQL> select * from ddd;

        NO NAME       HIRDATE       DEPTNO
---------- ---------- --------- ----------
         1 student1   01-JAN-04         10
         2 student2   01-FEB-04         10
         3 student3   01-MAR-04         20
         4 student4   01-MAY-04         30

SQL> select count(decode(to_char(hirdate,'MM'),'01',1)) "JAN",
  2         count(decode(to_char(hirdate,'MM'),'02',1)) "FEB",
  3         count(decode(to_char(hirdate,'MM'),'03',1)) "MAR",
  4         count(*) "Total"
  5  from ddd
  6  where to_char(hirdate,'MM') >= '01' AND
  7        to_char(hirdate,'MM') <= '06';

       JAN        FEB        MAR      Total
---------- ---------- ---------- ----------
         1          1          1          4

SQL>



4-4) DEPTH 함수
--------------------------------------------------------------------------------

DEPTH( correlation_integer) 함수는 UNDER_PATH나 EQUALS_PATH 조건과 함께 사용되는 보조함수이다.
 이 함수는 UNDER_PATH 조건에 상관관계의 수치를 반환한다.

【예제】
SQL> select * from resource_view;
SQL> select path(1), depth(2)
  2  from resource_view
  3  where under_path(res, '/sys/schemas/PUBLIC/www.w3.org/2001', 1)=1
  4    and under_path(res, '/sys/schemas/PUBLIC/www.w3.org/2001', 2)=1;

PATH(1)                                      DEPTH(2)
------------------------------------------ ----------
/xml.xsd                                            1
        

SQL>


4-5) DUMP 함수
--------------------------------------------------------------------------------

지정한 데이터의 위치와 길이 따위를 지정한 형식으로 반환한다.
【형식】
DUMP(expr [,반환형식[,시작위치[,길이]]] )

【예제】
SQL> select dump('Corea', 1016) from dual;

DUMP('COREA',1016)
-----------------------------------------------------
Typ=96 Len=5 CharacterSet=KO16KSC5601: 43,6f,72,65,61

SQL> select dump('Corea', 8,3,2) "Octal" from dual;

Octal
---------------------
Typ=96 Len=5: 162,145

SQL> select dump('Corea',16,3,2) "ASCII" from dual;

ASCII
-------------------
Typ=96 Len=5: 72,65

SQL>


4-6) EMPTY_BLOB 함수
--------------------------------------------------------------------------------

EMPTY_BLOB () 함수는 LOB 변수를 초기화하기 위하여 쓰이거나,
 또는 INSERT 문이나 UPDATE 문에서 empty LOB 위치를 반환한다.

【예시】
UPDATE print_media SET ad_photo = EMPTY_BLOB();


4-7) EMPTY_CLOB 함수
--------------------------------------------------------------------------------

EMPTY_CLOB () 함수는 LOB 변수를 초기화하기 위하여 쓰이거나,
 또는 INSERT 문이나 UPDATE 문에서 empty LOB 위치를 반환한다.

【예시】
UPDATE print_media SET ad_photo = EMPTY_CLOB();


4-8) EXISTSNODE 함수
--------------------------------------------------------------------------------

이 함수는 node의 존재여부를 확인하여 그 결과를 반환한다.
 0은 노드가 남아 있지 않은 경우이고,
 1은 아직 노드가 존재하는 경우이다.

【형식】
EXISTSNODE(XMLType_instance, XPath_string [,namespace_string] )

【예제】
SQL> select * from resource_view;
SQL> select res,any_path
  2  from resource_view
  3  where existsnode(res, 'xdbconfig.xml') =0;

26 rows selected.
SQL>



4-9) EXTRACT(XML) 함수
--------------------------------------------------------------------------------

이 함수는 existsnode와 유사한 함수이다.

【형식】
EXTRACT(XMLType_instance, XPath_string [,namespace_string] )

【예제】
SQL> select * from resource_view;
SQL> select extract(res,'xdbconfig.xml')
  2  from resource_view;
 
26 rows selected.
SQL>



4-10) EXTRACTVALUE 함수
--------------------------------------------------------------------------------

이 함수는 existsnode와 유사한 함수로써 node의 스칼라 값을 반환한다.

【형식】
EXTRACTVALUE(XMLType_instance, XPath_string [,namespace_string] )

【예제】
SQL> select * from resource_view;
SQL> select extractvalue(res,'xdbconfig.xml')
  2  from resource_view;
 
26 rows selected.
SQL>


4-11) GREATEST 함수
--------------------------------------------------------------------------------

GREATEST (expr,...) 함수는 expr 중에서 가장 큰 값을 반환한다.

【예제】
SQL> select greatest(20,10,30) from dual;

GREATEST(20,10,30)
------------------
                30

SQL>


4-12) LEAST 함수
--------------------------------------------------------------------------------

LEAST (expr,...) 함수는 expr 중에서 가장 작은 값을 반환한다.

【예제】
SQL> select least(20,10,30) from dual;

GREATEST(20,10,30)
------------------
                10

SQL> select least('bb','aa','cc') from dual;

GR
--
aa

SQL>


4-13) NLS_CHARSET_DECL_LEN 함수
--------------------------------------------------------------------------------

NLS_CHARSET_DECL_LEN (byte_count , char_set_id) 함수는 nchar로 선언된 폭을 반환한다.

【예제】
SQL> select nls_charset_decl_len
  2  (200, nls_charset_id('ja16eucfixed')) from dual

NLS_CHARSET_DECL_LEN(200,NLS_CHARSET_ID('JA16EUCFIXED'))
--------------------------------------------------------
                                                     100

SQL>



4-14) NLS_CHARSET_ID 함수
--------------------------------------------------------------------------------

nls_charset_id('text') 함수는 문자셋 이름에 대응하는 ID 번호를 반환한다.
 여기서 text는 서버에서 지원되는 CHAR_CS나 NCHAR_CS이다.

【예제】
SQL> select nls_charset_id('ja16euc') from dual;

NLS_CHARSET_ID('JA16EUC')
-------------------------
                      830

SQL>


4-15) NLS_CHARSET_NAME 함수
--------------------------------------------------------------------------------

nls_charset_name('number') 함수는 문자섹 ID 번호에 대응하는 문자의 이름을 반환한다.

【예제】
SQL> select nls_charset_name(830) from dual;

NLS_CHA
-------
JA16EUC

SQL> select nls_charset_name(1) from dual;

NLS_CHAR
--------
US7ASCII

SQL>



4-16) NULLIF 함수
--------------------------------------------------------------------------------

NULLIF(expr1, expr2) 함수는
 expr1과 expr2를 비교하여
       같으면 null을 반환하고,
       같지 않으면 expr1을 반환한다.

이는 CASE 문으로 쓰면 다음과 같다.
  CASE WHEN expr1 = expr2 THEN NULL ELSE expr1 END

【예제】
SQL> select nullif('aa','AA') from dual;

NU
--
aa

SQL> select nullif('aa','aa') from dual;

NU
--


SQL>



4-17) NVL2 함수
--------------------------------------------------------------------------------

NVL2(expr1, expr2, expr3) 함수는
   expr1이 null이 아니면 expr2를 반환하고,
   expr1이 null이면 expr3을 반환한다.

【예제】
SQL> select nvl2('','Corea','Korea') from dual;

NVL2(
-----
Korea

SQL> select nvl2('aa','Corea','Korea') from dual;

NVL2(
-----
Corea

SQL>



4-18) PATH 함수
--------------------------------------------------------------------------------

PATH(correlation_path) 함수는 under_path나 equals_path의 보조함수로서,
 자원의 관계경로를 반환한다.

【예제】
SQL> select * from resource_view;
SQL> select path(1), depth(2)
  2  from resource_view
  3  where under_path(res, '/sys/schemas/PUBLIC/www.w3.org/2001', 1)=1?
  4    and under_path(res, '/sys/schemas/PUBLIC/www.w3.org/2001', 2)=1;

PATH(1)                                      DEPTH(2)
------------------------------------------ ----------
/xml.xsd                                            1
        

SQL>



4-19) SYS_CONNECT_BY_PATH 함수
--------------------------------------------------------------------------------

SYS_CONNECT_BY_PATH(column, char) 함수는 계층적 쿼리에서만 유효하며,
 column의 절대 경로를 char로 지정한 문자로 분리하여 반환한다.

【예제】
SQL> select sys_connect_by_path(name, '/') from emp
  2  start with name='jijoe'
  3  connect by prior id=1101;

SYS_CONNECT_BY_PATH(NAME,'/')
-----------------------------
/jijoe

SQL> select * from emp;

        ID NAME           SALARY      BONUS
---------- ---------- ---------- ----------
      1101 Cho               250        125
      1102 Joe               240        100
      1103 kim               250        100
      1104 jijoe             220        100

SQL>


4-20) SYS_CONTEXT 함수
--------------------------------------------------------------------------------

 이 함수는 namespace와 관계되는 parameter의 값을 반환한다.

【형식】
SYS_CONTEXT('namespace','parameter' [,length])

【예제】
SQL> select sys_context('userenv','session_user') from dual;

SYS_CONTEXT('USERENV','SESSION_USER')
-------------------------------------
JIJOE

SQL> select sys_context('userenv','lang') from dual;

SYS_CONTEXT('USERENV','LANG')
-----------------------------
US

SQL>

 userenv에서 사용될 parameter는 다음과 같다.
AUDITED_CURSORID AUTHENTICATION_DATA BG_JOB_ID
CLIENT_IDENTIFIER CLIENT_INFO  CURRENT_SCHEMA
CURRENT_SCHEMAID CURRENT_SQL  CURRENT_USER
CURRENT_USERID  DB_DOMAIN  DB_NAME
ENTRY_ID  EXTERNAL_NAME  FG_JOB_ID
GLOBAL_CONTEXT_MEMORY HOST   INSTANCE
IP_ADDRESS  ISDBA   LANG
LANGUAGE  NETWORK_PROTOCOL NLS_CALENDAR
NLS_CURRENCY  NLS_DATE_FORMAT  NLS_DATE_LANGUAGE
NLS_SORT  NLS_TERRITORY  OS_USER
PROXY_USER  PROXY_USERID  SESSION_USER
SESSION_USERID  SESSIONID  TERMINAL



4-21) SYS_DBURIGEN 함수
--------------------------------------------------------------------------------

이 함수는 입력된 argument에 대한 DBURIType의 URL을 반환한다.

【형식】
SYS_DBURIGEN({column|attribute} [rowid],... [,'text()'])

【예제】
SQL> select sys_dburigen(id,name) from emp
  2  where name='jijoe';

SYS_DBURIGEN(ID,NAME)(URL, SPARE)
------------------------------------------------------------------------
DBURITYPE('/PUBLIC/EMP/ROW[ID=''1104'']/NAME', NULL)

SQL> select * from emp;

        ID NAME           SALARY      BONUS
---------- ---------- ---------- ----------
      1101 Cho               250        125
      1102 Joe               240        100
      1103 kim               250        100
      1104 jijoe             220        100

SQL>


4-22) SYS_EXTRACT_UTC 함수
--------------------------------------------------------------------------------

sys_extract_utc(datetime_with_timezone) 함수는
UTC(coordinated universal time: Greenwich mean time) 시각을 반환한다.

【예제】
SQL> select systimestamp, sys_extract_utc(systimestamp) from dual;

SYSTIMESTAMP
--------------------------------------------------------------------------
SYS_EXTRACT_UTC(SYSTIMESTAMP)
--------------------------------------------------------------------------
06-AUG-04 02.41.39.258976 PM +09:00
06-AUG-04 05.41.39.258976 AM


SQL>


4-23) SYS_GUID 함수
--------------------------------------------------------------------------------

sys_guid() 함수는 globally unique identifier를 반환한다.

【예제】
SQL> select sys_guid() from dual;

SYS_GUID()
--------------------------------
E0F6C6D5767C01ADE034080020B588F4

SQL>


4-24) SYS_XMLAGG 함수
--------------------------------------------------------------------------------

이 함수는 sys_xmlgen 문에서 만든 XML 문을 기본적으로 ROWSET 태그를 새로 추가 시킨다.

【형식】
SYS_XMLAGG( expr [fmt] )

【예제】
SQL> select sys_xmlagg(sys_xmlgen(name)) from emp
  2  where name like 'j%';

SYS_XMLAGG(SYS_XMLGEN(NAME))
--------------------------------------------------------------------------
<ROWSET>
  <NAME>jijoe</NAME>
</ROWSET>


SQL>


4-25) SYS_XMLGEN 함수
--------------------------------------------------------------------------------

이 함수는 지정한 행이나 열을 XML 문으로 만들어 반환한다.

【형식】
SYS_XMLGEN( expr [fmt] )

【예제】
SQL> select sys_xmlgen(name) from emp
  2  where name like 'j%';

SYS_XMLGEN(NAME)
--------------------------------------------------------------------------
<NAME>jijoe</NAME>

SQL>


4-26) UID 함수
--------------------------------------------------------------------------------

UID 함수는 사용자의 유일한 ID를 정수로 반환한다.

【예제】
SQL> select uid from dual;

       UID
----------
        93

SQL>


4-27) USER 함수
--------------------------------------------------------------------------------

이 함수는 사용자의 이름을 반환한다.

【예제】
SQL> select user,uid from dual;

USER                                  UID
------------------------------ ----------
JIJOE                                  93

SQL>



4-28) USERENV 함수
--------------------------------------------------------------------------------

USERENV('parameter') 함수는 사용자의 환경에 관한 정보를 반환한다.

 parameter는 다음과 같은 것이 있다.
CLIENT_INFO ENTRYID  ISDBA  LANG
LANGUAGE SESSIONID TERMINAL

【예제】
SQL> select userenv('language') from dual;

USERENV('LANGUAGE')
----------------------------------------------------
AMERICAN_AMERICA.KO16KSC5601

SQL>



4-29) VSIZE 함수
--------------------------------------------------------------------------------

VSIZE('expr') 함수는 expr이 표시되는 바이트 수를 반환한다.

【예제】
SQL> select name, vsize(name) from emp
  2  where name like 'jijoe';

NAME       VSIZE(NAME)
---------- -----------
jijoe                5

SQL>

$ cat .profile
..........
NLS_LANG=AMERICAN_AMERICA.KO16KSC5601  ☜ 한글 문자셋으로 설정
export NLS_LANG
NLS_LANG=AMERICAN_AMERICA.UTF8  ☜ UNICODE로 설정
export NLS_LANG
$


테이블에서 저장된 데이터가 한글 문자셋인지 유니코드인지 식별하려면 다음과 같이 확인해 볼 수 있다.

    select 한글컬럼명, vsize(한글컬럼명) from 테이블명;

여기서 한글 컬럼에 한글이 3글자라면, vsize 결과가
    9이면 unicode이고,
    6이면 한글 문자셋으로 저장된 것임을 알 수 있다.

【예제】
SQL> select * from test;
 
        ID NAME
---------- ----------------------------------------
      1113 아리랑
      1112 쓰리랑
 
SQL> select name, vsize(name) from test;
 
NAME                                     VSIZE(NAME)
---------------------------------------- -----------
아리랑                                             6
쓰리랑                                             6
 
SQL>



4-30) XMLAGG 함수
--------------------------------------------------------------------------------

이 함수는 xmlelement에 의해서 XML 태그를 만든 문장을 모으는 기능이다.

【형식】
XMLAGG( XMLType_instance [order_by_clause])

【예제】
 SQL> select xmlagg(xmlelement("name",e.name)) from emp e;

XMLAGG(XMLELEMENT("NAME",E.NAME))
--------------------------------------------------------------------------
<name>Cho</name>
<name>Joe</name>
<name>kim</name>
<name>jijoe</name>

SQL>



4-31) XMLCOLATTVAL 함수
--------------------------------------------------------------------------------

이 함수는 XML fragment를 만드는 기능이다

【형식】
XMLCOLATTVAL( value_expr [AS c_alias],...)

【예제】
SQL> select xmlcolattval(e.name,e.id,e.salary) from emp e;

XMLCOLATTVAL(E.NAME,E.ID,E.SALARY)
--------------------------------------------------------------------------
<column name="NAME">Cho</column>
<column name="ID">1101</column>
<column name="S

<column name="NAME">Joe</column>
<column name="ID">1102</column>
<column name="S

<column name="NAME">kim</column>
<column name="ID">1103</column>
<column name="S

<column name="NAME">jijoe</column>
<column name="ID">1104</column>
<column name=


SQL> select * from emp;

        ID NAME           SALARY      BONUS
---------- ---------- ---------- ----------
      1101 Cho               250        125
      1102 Joe               240        100
      1103 kim               250        100
      1104 jijoe             220        100

SQL>



4-32) XMLCONCAT 함수
--------------------------------------------------------------------------------

XMLCONCAT( XMLType_instance,...) 함수는 XMLType instance를 series로 넣어 만드는 기능이다.

【예제】
SQL> select xmlconcat(
  2    xmlelement("name",e.name),xmlelement("bonus",e.bonus))
  3  from emp e;

XMLCONCAT(XMLELEMENT("NAME",E.NAME),XMLELEMENT("BONUS",E.BONUS))
--------------------------------------------------------------------------
<name>Cho</name>
<bonus>125</bonus>

<name>Joe</name>
<bonus>100</bonus>

<name>kim</name>
<bonus>100</bonus>

<name>jijoe</name>
<bonus>100</bonus>

SQL>


4-33) XMLFOREST 함수
--------------------------------------------------------------------------------

이 함수는 각각의 argument parameter를  XML로 변환한다.

【형식】
XMLFOREST( value_expr [AS c_alias],...)

【예제】
SQL> select xmlelement("emp",
  2  xmlforest(e.id, e.name, e.bonus)) from emp e;

XMLELEMENT("EMP",XMLFOREST(E.ID,E.NAME,E.BONUS))
--------------------------------------------------------------------------
<emp>
  <ID>1101</ID>
  <NAME>Cho</NAME>
  <BONUS>125</BONUS>
</emp>

<emp>
  <ID>1102</ID>
  <NAME>Joe</NAME>
  <BONUS>100</BONUS>
</emp>

<emp>
  <ID>1103</ID>
  <NAME>kim</NAME>
  <BONUS>100</BONUS>
</emp>

<emp>
  <ID>1104</ID>
  <NAME>jijoe</NAME>
  <BONUS>100</BONUS>

</emp>

SQL> select * from emp;

        ID NAME           SALARY      BONUS
---------- ---------- ---------- ----------
      1101 Cho               250        125
      1102 Joe               240        100
      1103 kim               250        100
      1104 jijoe             220        100

SQL>
 


4-34) XMLELEMENT 함수
--------------------------------------------------------------------------------

이 함수는 XML 태그를 붙이는 기능이다

【예제】
SQL> select xmlelement("name",e.name) from emp e
  2  where name like 'j%';

XMLELEMENT("NAME",E.NAME)
--------------------------------------------------------------------------
<name>jijoe</name>

SQL>



5-1) AVG* 함수
--------------------------------------------------------------------------------

조건을 만족하는 행(row)의 평균을 값을 반환하며,
 aggregate 함수나
 analytic 함수로 사용된다.

【형식】
AVG( [DISTINCT | ALL] 컬럼명)
   [ [OVER] (analytic 절)]

【예제】aggregate 예
SQL> select * from emp;

        ID NAME           SALARY      BONUS
---------- ---------- ---------- ----------
      1101 Cho               250        125
      1102 Joe               240        100
      1103 kim               250        100
      1104 jijoe             220        100

SQL> select avg(salary) from emp;

AVG(SALARY)
-----------
        240

SQL>
【예제】analytic 예
SQL> select avg(distinct salary) over(partition by bonus)
  2  from emp;

AVG(DISTINCTSALARY)OVER(PARTITIONBYBONUS)
-----------------------------------------
                               236.666667
                               236.666667
                               236.666667
                                      250


SQL> select avg(salary) over(partition by bonus order by id
    2 rows between 1 preceding and 1 following) as avg  from emp;

       AVG
----------
       245
236.666667
       235
       250

SQL>



5-2) CORR* 함수
--------------------------------------------------------------------------------

집합 쌍의 상관관계 계수를 반환한다.

【형식】
CORR( expr1, expr2 ) [ [OVER] (analytic 절)]

【예제】
SQL> select corr(avg(bonus),max(bonus))
  2  from employees
  3  group by dept_no;

CORR(AVG(BONUS),MAX(BONUS))
---------------------------
                          1

SQL>


5-3) COUNT* 함수
--------------------------------------------------------------------------------


 쿼리한 행의 수를 반환한다.
【형식】
COUNT([*|DISTINCT|ALL] 컬럼명) [ [OVER] (analytic 절)]

【예제】
SQL> select count(*) from emp;

  COUNT(*)
----------
         4

SQL> select count (distinct dept_no) from employees;

COUNT(DISTINCTDEPT_NO)
----------------------
                     2

SQL> select count (all dept_no) from employees;

COUNT(ALLDEPT_NO)
-----------------
                4

SQL> select salary,count(*)
  2  over (order by salary)
  3  from emp;

    SALARY COUNT(*)OVER(ORDERBYSALARY)
---------- ---------------------------
       220                           1
       240                           2
       250                           4
       250                           4

SQL>



5-4) COVAR_POP 함수
--------------------------------------------------------------------------------

이 함수는 number 쌍의 집합에 대한 population covariance를 반환한다.

【형식】
COVAR_POP(expr1, expr2 [ OVER (analytic 절)] )

【예제】
SQL> select covar_pop(bonus,salary) from emp;

COVAR_POP(BONUS,SALARY)
-----------------------
                   62.5

SQL> select * from emp;

        ID NAME           SALARY      BONUS
---------- ---------- ---------- ----------
      1101 Cho               250        125
      1102 Joe               240        100
      1103 kim               250        100
      1104 jijoe             220        100

SQL>


5-5) COVAR_SAMP 함수
--------------------------------------------------------------------------------

이 함수는 number 쌍의 집합에 대한 sample covariance를 반환한다.

【형식】
COVAR_SAMP(expr1, expr2 [ OVER (analytic 절)] )

【예제】
SQL> select covar_samp(bonus,salary) from emp;

COVAR_SAMP(BONUS,SALARY)
------------------------
              83.3333333

SQL> select * from emp;

        ID NAME           SALARY      BONUS
---------- ---------- ---------- ----------
      1101 Cho               250        125
      1102 Joe               240        100
      1103 kim               250        100
      1104 jijoe             220        100

SQL>


5-6) CUME_DIST 함수
--------------------------------------------------------------------------------

이 함수는 그룹 값 내에서 어떤 값의 cumulative distribution(누적분포)을 계산한다.

【형식】
CUME_DIST(expr,... WITHIN GROUP (ORDER BY
     expr [DESC | ASC] [NULLS {FIRST|LAST}],...)
또는
CUME_DIST() over ([query_partition_clause] order_by_clause)

【예제】
SQL> select cume_dist(230) within group
  2  (order by salary ) from emp;

CUME_DIST(230)WITHINGROUP(ORDERBYSALARY)
----------------------------------------
                                      .4

SQL> select * from emp;

        ID NAME           SALARY      BONUS
---------- ---------- ---------- ----------
      1101 Cho               250        125
      1102 Joe               240        100
      1103 kim               250        100
      1104 jijoe             220        100

SQL>



5-7) DENSE_RANK 함수
--------------------------------------------------------------------------------


그룹 내에서 순위를 반환한다.

【예제】
SQL> select * from employees;

        ID    DEPT_NO NAME           SALARY      BONUS
---------- ---------- ---------- ---------- ----------
      1101         10 Cho               250        125
      1102         20 Joe               240        100
      1103         10 kim               250        100
      1104         20 jijoe             220        100

SQL> select dense_rank(230, .05) within group
  2  (order by salary, bonus) "Dense Rank"
  3  from employees;

Dense Rank
----------
         2

SQL>



5-8) FIRST 함수
--------------------------------------------------------------------------------

first나 last 함수는 행을 서열화 시켜서 첫 번째나 마지막 행을 추출한다.
【형식】
집합함수 KEEP (
 DENSE_RANK FIRST ORDER BY
    expr [DESC|ASC][NULL{FIRST|LAST}],...)
【예제】
SQL> select
  2  min(salary) keep (dense_rank first order by salary) "Worst",
  3  max(salary) keep (dense_rank last order by salary) "Best"
  4  from employees
  5  order by id;

     Worst       Best
---------- ----------
       220        250

SQL> select * from employees;

        ID    DEPT_NO NAME           SALARY      BONUS
---------- ---------- ---------- ---------- ----------
      1101         10 Cho               250        125
      1102         20 Joe               240        100
      1103         10 kim               250        100
      1104         20 jijoe             220        100

SQL>



5-9) GROUP_ID 함수
--------------------------------------------------------------------------------

GROUP() 함수는 group by로 분리되어 복제된 번호로 복제 횟수를 구분하도록 출력한다.
번호가 0부터 시작되므로 n번 복제되었으면 n-1의 번호가 출력된다.

【예제】
SQL> select dept_no, group_id() from employees
  2  group by dept_no;

   DEPT_NO GROUP_ID()
---------- ----------
        10          0
        20          0

SQL> select * from employees;

        ID    DEPT_NO NAME           SALARY      BONUS
---------- ---------- ---------- ---------- ----------
      1101         10 Cho               250        125
      1102         20 Joe               240        100
      1103         10 kim               250        100
      1104         20 jijoe             220        100

SQL>



5-10) Grouping 함수
--------------------------------------------------------------------------------

Grouping 함수는 Rollup이나 cube 연산자랑 함께 사용하여
 grouping 함수에서 기술된 컬럼이 그룹핑시 사용되었는지 보여주는 함수이다.
특별히 연산의 기능은 없으며,
  rollup이나 cube 연산 후 출력된 결과에 대한 사용자의 이해를 높이기 위해 사용된다.
  즉, grouping 함수를 이용할 경우 출력되는 결과값 중 null 값이 있다면,
      이 null 값이 rollup이나 cube 연산의 결과로 생성된 값인지,
      원래 테이블상에 null 값으로 저장된 것인지 확인할 수 있다.

. grouping 함수는 인수로 하나의 값만을 가진다.
. grouping 함수에 사용된 인수는 group by 절에 기술된 값 중에 하나와 반드시 일치해야 한다.
. grouping 함수의 결과값으로 0 또는 1을 반환한다.
    0은 해당인수로 쓰인 값이 rollup이나 cube 연산에 사용되었음을 나타나고,
    1은 사용되지 않았음을 의미한다.
【형식】
SELECT   컬럼명,그룹함수(컬럼명), GROUPING(컬럼명)
FROM  테이블명
WHERE  조건
GROUP BY [ROLLUP | CUBE] 그룹핑하고자하는 컬럼명,...
HAVING  그룹조건
ORDER BY 컬럼명 또는 위치번호

【예제】
SQL> select grade,deptno,sum(salary),GROUPING(deptno)
  2  from aaa
  3  group by rollup(grade,deptno);

     GRADE     DEPTNO SUM(SALARY) GROUPING(DEPTNO)
---------- ---------- ----------- ----------------
         1         10         100                0
         1         20         500                0
         1         30         300                0
         1                    900                1
         2         10         400                0
         2         20         200                0
         2         30         600                0
         2                   1200                1
                             2100                1

9 rows selected.

SQL>


5-11) GROUPING_ID 함수
--------------------------------------------------------------------------------

GROUPING_ID(expr,...) 함수는 행과 관련되는 GROUPING 비트 벡터에 대응되는 수치를 반환한다.

【예제】
SQL> select * from employees;

        ID    DEPT_NO NAME           SALARY      BONUS
---------- ---------- ---------- ---------- ----------
      1101         10 Cho               250        125
      1102         20 Joe               240        100
      1103         10 kim               250        100
      1104         20 jijoe             220        100

SQL> select sum(salary), grouping_id(dept_no)
  2  from employees
  3  group by dept_no;

SUM(SALARY) GROUPING_ID(DEPT_NO)
----------- --------------------
        500                    0
        460                    0

SQL>


5-12) LAST 함수
--------------------------------------------------------------------------------

first나 last 함수는 행을 서열화 시켜서 첫 번째나 마지막 행을 추출한다.
【형식】
집합함수 KEEP (
 DENSE_RANK LAST ORDER BY
    expr [DESC|ASC][NULL{FIRST|LAST}],...)
【예제】
SQL> select
  2  min(salary) keep (dense_rank first order by salary) "Worst",
  3  max(salary) keep (dense_rank last order by salary) "Best"
  4  from employees
  5  order by id;

     Worst       Best
---------- ----------
       220        250

SQL> select * from employees;

        ID    DEPT_NO NAME           SALARY      BONUS
---------- ---------- ---------- ---------- ----------
      1101         10 Cho               250        125
      1102         20 Joe               240        100
      1103         10 kim               250        100
      1104         20 jijoe             220        100

SQL>



5-13) MAX 함수
--------------------------------------------------------------------------------

이 함수는 최대 값을 반환한다.

【형식】
MAX ([{DISTINCT|ALL}] expr) [OVER(analytic_clause)]

【예제】
SQL> select max(salary) over (partition by dept_no)
  2  from employees;

MAX(SALARY)OVER(PARTITIONBYDEPT_NO)
-----------------------------------
                                250
                                250
                                240
                                240

SQL> select max(salary) from employees;

MAX(SALARY)
-----------
        250

SQL>


5-14) MIN 함수
--------------------------------------------------------------------------------

이 함수는 최소 값을 반환한다.

【형식】
MIN ([{DISTINCT|ALL}] expr) [OVER(analytic_clause)]

【예제】
SQL> select min(salary) over (partition by dept_no)
  2  from employees;

MIN(SALARY)OVER(PARTITIONBYDEPT_NO)
-----------------------------------
                                250
                                250
                                220
                                220

SQL> select min(salary) from employees;

MIN(SALARY)
-----------
        220

SQL>



5-15) PERCENTILE_CONT 함수
--------------------------------------------------------------------------------

이 함수는 연속 모델에 대한 inverse distribution function이다.

【형식】
PERCENTILE_CONT(expr) WITHIN GROUP (ORDER BY expr [{DESC|ASC}])
  [OVER (query_partition_cluause)]

【예제】
SQL> select dept_no,percentile_cont(0.5) within group
  2  (order by salary DESC)
  3  from employees GROUP BY dept_no;

   DEPT_NO PERCENTILE_CONT(0.5)WITHINGROUP(ORDERBYSALARYDESC)
---------- --------------------------------------------------
        10                                                250
        20                                                230

SQL> select * from employees;

        ID    DEPT_NO NAME           SALARY      BONUS
---------- ---------- ---------- ---------- ----------
      1101         10 Cho               250        125
      1102         20 Joe               240        100
      1103         10 kim               250        100
      1104         20 jijoe             220        100

SQL>



5-16) PERCENTILE_DISC 함수
--------------------------------------------------------------------------------

이 함수는 불연속 모델에 대한 inverse distribution function이다.

【형식】
PERCENTILE_DISC(expr) WITHIN GROUP (ORDER BY expr [{DESC|ASC}])
  [OVER (query_partition_cluause)]

【예제】
SQL> select dept_no,percentile_disc(0.5) within group
  2  (order by salary DESC)
  3  from employees GROUP BY  dept_no;

   DEPT_NO PERCENTILE_DISC(0.5)WITHINGROUP(ORDERBYSALARYDESC)
---------- --------------------------------------------------
        10                                                250
        20                                                240

SQL> select * from employees;

        ID    DEPT_NO NAME           SALARY      BONUS
---------- ---------- ---------- ---------- ----------
      1101         10 Cho               250        125
      1102         20 Joe               240        100
      1103         10 kim               250        100
      1104         20 jijoe             220        100

SQL>



5-17) PERCENT_RANK 함수
--------------------------------------------------------------------------------

이 함수는 CUME_DIST 함수와 유사하게 percent_rank 값을 반환한다.

【형식】
PERCENT_RANK(expr,...) WITHIN GROUP (ORDER BY expr [{DESC|ASC}]
  [NULLS {FIRST|LAST}],...)
또는
PERCENT_RANK() OVER( [query_partition_clause] order_by_clause)

【예제】
SQL> select percent_rank(230,0.05) within group
  2  (order by salary,bonus) from employees;

PERCENT_RANK(230,0.05)WITHINGROUP(ORDERBYSALARY,BONUS)
------------------------------------------------------
                                                   .25

SQL> select * from employees;

        ID    DEPT_NO NAME           SALARY      BONUS
---------- ---------- ---------- ---------- ----------
      1101         10 Cho               250        125
      1102         20 Joe               240        100
      1103         10 kim               250        100
      1104         20 jijoe             220        100

SQL>



5-18) RANK 함수
--------------------------------------------------------------------------------

이 함수는 그룹 내에서 위치를 반환한다.

【형식】
RANK(expr,...) WITHIN GROUP (ORDER BY expr [{DESC|ASC}]
  [NULLS {FIRST|LAST}],...)
또는
RANK() OVER( [query_partition_clause] order_by_clause)

【예제】
SQL> select rank(230,0.05) within group
  2 (order by salary,bonus) from employees;

RANK(230,0.05)WITHINGROUP(ORDERBYSALARY,BONUS)
----------------------------------------------
                                             2
SQL> select * from employees;

        ID    DEPT_NO NAME           SALARY      BONUS
---------- ---------- ---------- ---------- ----------
      1101         10 Cho               250        125
      1102         20 Joe               240        100
      1103         10 kim               250        100
      1104         20 jijoe             220        100

SQL>



5-19) REGR_(linear regression) function* 함수
--------------------------------------------------------------------------------

선형 회귀(linear regression) 함수 ordinary-least squares regression line을 찾도록 한다.
 사용되는 회귀함수는 자음 중 하나이다.
 REGR_SLOPE REGR_INTERCEPT REGR_COUNT
 REGR_R2 REGR_AVGX REGR_AVGY
 REGR_SXX REGR_SYY REGR_SXY

【형식】
REGR { REGR_SLOPE|REGR_INTERCEPT|REGR_COUNT|REGR_R2|REGR_AVGX|
       REGR_AVGY|REGR_SXX|REGR_SYY|REGR_SXY}
    (expr1,expr2) [OVER (analytic_clause)]

【예제】
SQL> select regr_slope(salary,bonus) from employees

REGR_SLOPE(SALARY,BONUS)
------------------------
              .533333333

SQL> select * from employees;

        ID    DEPT_NO NAME           SALARY      BONUS
---------- ---------- ---------- ---------- ----------
      1101         10 Cho               250        125
      1102         20 Joe               240        100
      1103         10 kim               250        100
      1104         20 jijoe             220        100

SQL>



5-20) STDDEV 함수
--------------------------------------------------------------------------------

이 함수는 standard deviation을 반환한다.

【형식】
STDDEV [{DISTINCT|ALL}] (expr) [OVER (analytic_clause)]

【예제】
SQL> select stddev(salary) from emp;

STDDEV(SALARY)
--------------
    14.1421356

SQL> select * from emp;

        ID NAME           SALARY      BONUS
---------- ---------- ---------- ----------
      1101 Cho               250        125
      1102 Joe               240        100
      1103 kim               250        100
      1104 jijoe             220        100

SQL>



5-21) STDDEV_POP 함수
--------------------------------------------------------------------------------

이 함수는 population standard deviation을 반환한다.

【형식】
STDDEV_POP (expr) [OVER (analytic_clause)]

【예제】
SQL> select stddev_pop(salary) from emp;

STDDEV_POP(SALARY)
------------------
        12.2474487

SQL> select * from emp;

        ID NAME           SALARY      BONUS
---------- ---------- ---------- ----------
      1101 Cho               250        125
      1102 Joe               240        100
      1103 kim               250        100
      1104 jijoe             220        100

SQL>


5-22) STDDEV_SAMP 함수
--------------------------------------------------------------------------------

이 함수는 cumulative sample standard deviation을 반환한다.

【형식】
STDDEV_SAMP (expr) [OVER (analytic_clause)]

【예제】
SQL> select stddev_samp (salary) from emp;

STDDEV_SAMP(SALARY)
-------------------
         14.1421356

SQL> select * from emp;

        ID NAME           SALARY      BONUS
---------- ---------- ---------- ----------
      1101 Cho               250        125
      1102 Joe               240        100
      1103 kim               250        100
      1104 jijoe             220        100


SQL>



5-23) SUM 함수
--------------------------------------------------------------------------------

이 함수는 합계를 반환한다.

【형식】
SUM ([{DISTINCT|ALL}] expr) [OVER (analytic_clause)]

【예제】
SQL> select sum(salary) from emp;

SUM(SALARY)
-----------
        960

SQL> select * from emp;

        ID NAME           SALARY      BONUS
---------- ---------- ---------- ----------
      1101 Cho               250        125
      1102 Joe               240        100
      1103 kim               250        100
      1104 jijoe             220        100

SQL>



5-24) VAR_POP 함수
--------------------------------------------------------------------------------

이 함수는 population variance를 반환한다.

【형식】
VAR_POP (expr) [OVER (analytic_clause)]

【예제】
SQL> select var_pop(salary) from emp;

VAR_POP(SALARY)
---------------
            150

SQL> select * from emp;

        ID NAME           SALARY      BONUS
---------- ---------- ---------- ----------
      1101 Cho               250        125
      1102 Joe               240        100
      1103 kim               250        100
      1104 jijoe             220        100


SQL>



5-25) VAR_SAMP 함수
--------------------------------------------------------------------------------

이 함수는 sample variance를 반환한다.

【형식】
VAR_SAMP (expr) [OVER (analytic_clause)]

【예제】
SQL> select var_samp(salary) from emp;

VAR_SAMP(SALARY)
----------------
             200

SQL> select * from emp;

        ID NAME           SALARY      BONUS
---------- ---------- ---------- ----------
      1101 Cho               250        125
      1102 Joe               240        100
      1103 kim               250        100
      1104 jijoe             220        100


SQL>



5-26) VARIANCE 함수
--------------------------------------------------------------------------------

이 함수는 variance를 반환한다.

【형식】
VARIANCE ([{DISTINCT|ALL}] expr) [OVER (analytic_clause)]

【예제】
SQL> select variance(salary) from emp;

VARIANCE(SALARY)
----------------
             200

SQL> select * from emp;

        ID NAME           SALARY      BONUS
---------- ---------- ---------- ----------
      1101 Cho               250        125
      1102 Joe               240        100
      1103 kim               250        100
      1104 jijoe             220        100

SQL>



5-27) Grouping sets 함수
--------------------------------------------------------------------------------

Grouping sets 함수는 Group by의 확장된 형태로 하나의 쿼리문에서 원하는 그룹핑 조건을 여러 개 기술할 수 있으며,
 grouping sets 함수 사용이 불가능한 이전 버전에서
 복잡한 union all 연산자를 사용하여 기술하던 것을 간단하게
 한 문장 안에서 해결할 수 있어 검색시 효율성이 증대 된다.
 다시 말해서, grouping sets 함수를 사용하면,
              group by ... union all을 사용한 것보다
              SQL 문이 간단해지고 또한 실행시 성능이 빨라진다.
【형식】
SELECT   컬럼명,그룹함수(컬럼명), GROUPING(컬럼명)
FROM  테이블명
WHERE  조건
GROUP BY [ROLLUP | CUBE] 그룹핑하고자하는 컬럼명, ...
  [GROUPING SETS (컬럼명,컬럼명, ...), ...]
HAVING  그룹조건
ORDER BY 컬럼명 또는 위치번호

【예제】
SQL> select grade,deptno,sum(salary)
  2  from aaa
  3  group by grouping sets(grade,deptno);

     GRADE     DEPTNO SUM(SALARY)
---------- ---------- -----------
         1                    900
         2                   1200
                   10         500
                   20         700
                   30         900

SQL> select grade,deptno,sum(salary)
  2  from aaa
  3  group by grouping sets((grade,name),(deptno,name));

     GRADE     DEPTNO SUM(SALARY)
---------- ---------- -----------
         1                    100
         1                    300
         1                    500
         2                    200
         2                    400
         2                    600
                   10         100
                   20         200
                   30         300
                   10         400
                   20         500
                   30         600

12 rows selected.
SQL>
【예제】Union all을 사용한 경우
SQL> select grade,deptno,sum(salary)
  2  from aaa
  3  group by grade,deptno
  4  union all
  5  select grade,deptno,sum(salary)
  6  from aaa
  7  group by grade,deptno;

     GRADE     DEPTNO SUM(SALARY)
---------- ---------- -----------
         1         10         100
         1         20         500
         1         30         300
         2         10         400
         2         20         200
         2         30         600
         1         10         100
         1         20         500
         1         30         300
         2         10         400
         2         20         200
         2         30         600

12 rows selected.

SQL>

composite columns란 rollup, cube, grouping sets 절과 같은 기능을 사용하면
표현되는 각 컬럼이 하나가 아닌 복수 개의 컬럼으로 정의되는 경우이다.
 


6-1) AVG* 함수
--------------------------------------------------------------------------------

조건을 만족하는 행(row)의 평균을 값을 반환하며,
 aggregate 함수나
 analytic 함수로 사용된다.

【형식】
AVG( [DISTINCT | ALL] 컬럼명)
   [ [OVER] (analytic 절)]

【예제】aggregate 예
SQL> select * from emp;

        ID NAME           SALARY      BONUS
---------- ---------- ---------- ----------
      1101 Cho               250        125
      1102 Joe               240        100
      1103 kim               250        100
      1104 jijoe             220        100

SQL> select avg(salary) from emp;

AVG(SALARY)
-----------
        240

SQL>
【예제】analytic 예
SQL> select avg(distinct salary) over(partition by bonus)
  2  from emp;

AVG(DISTINCTSALARY)OVER(PARTITIONBYBONUS)
-----------------------------------------
                               236.666667
                               236.666667
                               236.666667
                                      250


SQL> select avg(salary) over(partition by bonus order by id
    2 rows between 1 preceding and 1 following) as avg  from emp;

       AVG
----------
       245
236.666667
       235
       250

SQL>



6-2) CORR* CORR* 함수
--------------------------------------------------------------------------------

집합 쌍의 상관관계 계수를 반환한다.

【형식】
CORR( expr1, expr2 ) [ [OVER] (analytic 절)]

【예제】
SQL> select corr(avg(bonus),max(bonus))
  2  from employees
  3  group by dept_no;

CORR(AVG(BONUS),MAX(BONUS))
---------------------------
                          1

SQL>


6-3) COUNT* 함수
--------------------------------------------------------------------------------


 쿼리한 행의 수를 반환한다.
【형식】
COUNT([*|DISTINCT|ALL] 컬럼명) [ [OVER] (analytic 절)]

【예제】
SQL> select count(*) from emp;

  COUNT(*)
----------
         4

SQL> select count (distinct dept_no) from employees;

COUNT(DISTINCTDEPT_NO)
----------------------
                     2

SQL> select count (all dept_no) from employees;

COUNT(ALLDEPT_NO)
-----------------
                4

SQL> select salary,count(*)
  2  over (order by salary)
  3  from emp;

    SALARY COUNT(*)OVER(ORDERBYSALARY)
---------- ---------------------------
       220                           1
       240                           2
       250                           4
       250                           4

SQL>



6-4) COVAR_SAMP 함수
--------------------------------------------------------------------------------

이 함수는 number 쌍의 집합에 대한 sample covariance를 반환한다.

【형식】
COVAR_SAMP(expr1, expr2 [ OVER (analytic 절)] )

【예제】
SQL> select covar_samp(bonus,salary) from emp;

COVAR_SAMP(BONUS,SALARY)
------------------------
              83.3333333

SQL> select * from emp;

        ID NAME           SALARY      BONUS
---------- ---------- ---------- ----------
      1101 Cho               250        125
      1102 Joe               240        100
      1103 kim               250        100
      1104 jijoe             220        100

SQL>



6-5) CUME_DIST 함수
--------------------------------------------------------------------------------

이 함수는 그룹 값 내에서 어떤 값의 cumulative distribution(누적분포)을 계산한다.

【형식】
CUME_DIST(expr,... WITHIN GROUP (ORDER BY
     expr [DESC | ASC] [NULLS {FIRST|LAST}],...)
또는
CUME_DIST() over ([query_partition_clause] order_by_clause)

【예제】
SQL> select cume_dist(230) within group
  2  (order by salary ) from emp;

CUME_DIST(230)WITHINGROUP(ORDERBYSALARY)
----------------------------------------
                                      .4

SQL> select * from emp;

        ID NAME           SALARY      BONUS
---------- ---------- ---------- ----------
      1101 Cho               250        125
      1102 Joe               240        100
      1103 kim               250        100
      1104 jijoe             220        100

SQL>


6-6) DENSE_RANK 함수
--------------------------------------------------------------------------------


그룹 내에서 순위를 반환한다.

【예제】
SQL> select * from employees;

        ID    DEPT_NO NAME           SALARY      BONUS
---------- ---------- ---------- ---------- ----------
      1101         10 Cho               250        125
      1102         20 Joe               240        100
      1103         10 kim               250        100
      1104         20 jijoe             220        100

SQL> select dense_rank(230, .05) within group
  2  (order by salary, bonus) "Dense Rank"
  3  from employees;

Dense Rank
----------
         2

SQL>


6-7) FIRST 함수
--------------------------------------------------------------------------------

first나 last 함수는 행을 서열화 시켜서 첫 번째나 마지막 행을 추출한다.
【형식】
집합함수 KEEP (
 DENSE_RANK FIRST ORDER BY
    expr [DESC|ASC][NULL{FIRST|LAST}],...)
【예제】
SQL> select
  2  min(salary) keep (dense_rank first order by salary) "Worst",
  3  max(salary) keep (dense_rank last order by salary) "Best"
  4  from employees
  5  order by id;

     Worst       Best
---------- ----------
       220        250

SQL> select * from employees;

        ID    DEPT_NO NAME           SALARY      BONUS
---------- ---------- ---------- ---------- ----------
      1101         10 Cho               250        125
      1102         20 Joe               240        100
      1103         10 kim               250        100
      1104         20 jijoe             220        100

SQL>


6-8) FIRST_VALUE 함수
--------------------------------------------------------------------------------

이 함수는 서열화된 값에서 첫 번째를 출력한다.

【형식】
FIRST_VALUE ( expr ) OVER ( analytic_절)

【예제】
SQL> select salary,first_value(name)
  2  over (order by salary asc)
  3  from (select * from employees
  4        where dept_no = 20
  5        order by salary);

    SALARY FIRST_VALU
---------- ----------
       220 jijoe
       240 jijoe

SQL> select * from employees;

        ID    DEPT_NO NAME           SALARY      BONUS
---------- ---------- ---------- ---------- ----------
      1101         10 Cho               250        125
      1102         20 Joe               240        100
      1103         10 kim               250        100
      1104         20 jijoe             220        100

SQL>


6-9) LAG 함수
--------------------------------------------------------------------------------

이 함수는 analytic 함수로서,
self join하지 않고 하나의 테이블에서 동시에 한 행(row) 이상을 접근할 수 있도록 한다.

【형식】
LAG ( value_expr [,offset] [,default] )
     OVER ([query_partition_clause] order_by_clause )

【예제】
SQL> select name,salary,LAG(salary,1,0)    
  2   OVER (ORDER BY salary) FROM employees;

NAME           SALARY LAG(SALARY,1,0)OVER(ORDERBYSALARY)
---------- ---------- ----------------------------------
jijoe             220                                  0
Joe               240                                220
Cho               250                                240
kim               250                                250

SQL> select * from employees;

        ID    DEPT_NO NAME           SALARY      BONUS
---------- ---------- ---------- ---------- ----------
      1101         10 Cho               250        125
      1102         20 Joe               240        100
      1103         10 kim               250        100
      1104         20 jijoe             220        100

SQL>



6-10) LAST_VALUE 함수
--------------------------------------------------------------------------------

이 함수는 서열화된 값에서 마지막 번째를 출력한다.

【형식】
LAST_VALUE ( expr ) OVER ( analytic_절)

【예제】
SQL> select salary,last_value(name)
  2  over (order by salary asc)
  3  from (select * from employees
  4        where dept_no = 20
  5        order by salary);

    SALARY LAST_VALUE
---------- ----------
       220 jijoe
       240 Joe

SQL> select * from employees;

        ID    DEPT_NO NAME           SALARY      BONUS
---------- ---------- ---------- ---------- ----------
      1101         10 Cho               250        125
      1102         20 Joe               240        100
      1103         10 kim               250        100
      1104         20 jijoe             220        100

SQL>



6-11) LEAD 함수
--------------------------------------------------------------------------------

이 함수는 analytic 함수로서, self join하지 않고
하나의 테이블에서 동시에 한 행(row) 이상을 접근할 수 있도록 한다.

【형식】
LEAD ( value_expr [,offset] [,default] )
     OVER ([query_partition_clause] order_by_clause )

【예제】
SQL> select name,salary,LEAD(salary,1,0)   
  2   OVER (ORDER BY salary) FROM  employees;

NAME           SALARY LEAD(SALARY,1,0)OVER(ORDERBYSALARY)
---------- ---------- -----------------------------------
jijoe             220                                 240
Joe               240                                 250
Cho               250                                 250
kim               250                                   0

SQL> select * from employees;

        ID    DEPT_NO NAME           SALARY      BONUS
---------- ---------- ---------- ---------- ----------
      1101         10 Cho               250        125
      1102         20 Joe               240        100
      1103         10 kim               250        100
      1104         20 jijoe             220        100

SQL>


6-12) NTILE 함수
--------------------------------------------------------------------------------

이 함수는 analytic 함수로서, 데이터를 주어진 bucket 수 expr로 분리한다.

【형식】
NTILE ( expr ) OVER ([query_partition_clause] order_by_clause )

【예제】
SQL> select name,salary,NTILE(3) OVER (ORDER BY salary DESC)
  2  FROM  employees;

NAME           SALARY NTILE(3)OVER(ORDERBYSALARYDESC)
---------- ---------- -------------------------------
Cho               250                               1
kim               250                               1
Joe               240                               2
jijoe             220                               3

SQL> select * from employees;

        ID    DEPT_NO NAME           SALARY      BONUS
---------- ---------- ---------- ---------- ----------
      1101         10 Cho               250        125
      1102         20 Joe               240        100
      1103         10 kim               250        100
      1104         20 jijoe             220        100

SQL>



6-13) RATIO_TO_REPORT 함수
--------------------------------------------------------------------------------

이 함수는 analytic 함수로서, 데이터 합에 대한 구성비를 계산한다.

【형식】
RATIO_TO_REPORT ( expr ) OVER ([query_partition_clause])

【예제】
SQL> select name,salary,RATIO_TO_REPORT(salary) OVER ()
  2   FROM  employees;

NAME           SALARY RATIO_TO_REPORT(SALARY)OVER()
---------- ---------- -----------------------------
Cho               250                    .260416667
Joe               240                           .25
kim               250                    .260416667
jijoe             220                    .229166667

SQL> select * from employees;

        ID    DEPT_NO NAME           SALARY      BONUS
---------- ---------- ---------- ---------- ----------
      1101         10 Cho               250        125
      1102         20 Joe               240        100
      1103         10 kim               250        100
      1104         20 jijoe             220        100

SQL>



6-14) ROW_NUMBER 함수
--------------------------------------------------------------------------------

이 함수는 analytic 함수로서, 각 행(row)에 unique 번호를 부여한다.

【형식】
ROW_NUMBER () OVER ([query_partition_clause] order_by_clause )

【예제】
SQL> SELECT ROW_NUMBER() OVER (ORDER BY salary DESC),name
  2    FROM  employees;

ROW_NUMBER()OVER(ORDERBYSALARYDESC) NAME      
----------------------------------- ----------
                                  1 Cho       
                                  2 kim       
                                  3 Joe       
                                  4 jijoe     

SQL> select * from employees;

        ID    DEPT_NO NAME           SALARY      BONUS
---------- ---------- ---------- ---------- ----------
      1101         10 Cho               250        125
      1102         20 Joe               240        100
      1103         10 kim               250        100
      1104         20 jijoe             220        100

SQL>



7-1) REF 타입
--------------------------------------------------------------------------------
테이블의 어떤 컬럼이 독립된 다른 객체 테이블을 참조하는 데이터 타입을 의미한다.
일반적으로 테이블을 만들때 사용하는 외부키(foreign-key)를 이용한 참조관계와 유사하다.
REF 타입의 컬럼 데이터를 읽을 때는 반드시 DEREF 함수를 사용한다.
REF 타입으로 정의된 컬럼에는 실제 데이터가 저장되는 것이 아니고 참조되는 객체가 존재하는 포인트정보만 가지고 있기 때문에 객체가 삭제 된다면, 해당 컬러은 정상적으로 검색되지 못한다.
이러한 현상을 REF의 Dangling 현상이고 한다.
이러한 dangling 현상을 방지하기 위해서는 삭제된 객체 정보를 참조하는 행의 컬럼 정보를 analyze 명령어를 이용하여 null 값으로 변경해 주어야 한다.
【예제】
SQL> connect jijoe/jijoe_password
connected

SQL> create type person_type as object(
  2  first_name         varchar2(10),
  3  last_name          varchar2(10),
  4  phone              varchar(12),
  5  birthday           varchar2(12));
  6  /

Type created.

SQL> create type emp_type as object (
  2  empno      number,
  3  emp        person_type);
  4  /

Type created.

SQL> create table emp2 of emp_type
  2  oidindex emp_oid;

Table created.

SQL> insert into emp2 values(
  2  emp_type(1000,person_type('junik','joe','123-1234','20-jul-04')));

1 row created.

SQL> create table dept(
  2  empno      number(4),
  3  ename      varchar2(15),
  4  mgr        REF emp_type SCOPE IS emp2);

Table created.

SQL> insert into dept
  2  select empno, 'SCOTT', REF(e)
  3  from emp2 e
  4  where empno=1000;

1 row created.


【예제】
SQL> select ename,empno from dept;

ENAME                EMPNO
--------------- ----------
SCOTT                 1000

SQL> select mgr, DEREF(mgr) from dept;

MGR
--------------------------------------------------------------------------------
DEREF(MGR)(EMPNO, EMP(FIRST_NAME, LAST_NAME, PHONE, BIRTHDAY))
--------------------------------------------------------------------------------
0000220208DFA05B27A63701D9E034080020B588F4DFA05B27A63601D9E034080020B588F4
EMP_TYPE(1000, PERSON_TYPE('junik', 'joe', '123-1234', '20-jul-04'))


SQL>

【예제】
SQL> select empno,ename,mgr
  2  from dept
  3  where mgr is dangling;

no rows selected

SQL> analyze table dept validate REF update set dangling to NULL;

Table analyzed.

SQL>


8-1) ROWID 컬럼
--------------------------------------------------------------------------------

오라클에서 내부적으로 사용되는 컬럼을 pseudocolumn이라고 하며,
ROWID, ROWNUM등이 있다.
ROWID는 데이터베이스에서 컬럼이 위치한 장소이다.

【예제】
SQL> select rowid from test;

ROWID
------------------
AAAHbHAABAAAMXCAAA

SQL> select rowid from test
  2  where rowidtochar(rowid) like '%AABAA%';

ROWID
------------------
AAAHbHAABAAAMXCAAA

SQL> select lengthb(rowidtonchar(rowid)), rowidtonchar(rowid)
  2  from test;

LENGTHB(ROWIDTONCHAR(ROWID)) ROWIDTONCHAR(ROWID
---------------------------- ------------------
                          36 AAAHbHAABAAAMXCAAA

SQL>


여기서 rowid의 의미는 다음과 같다.
AAAHbH  AAB  AAAMXC  AAA 객체번호  테이블스페이스번호  블록번호  행번호



8-2) ROWNUM 컬럼
--------------------------------------------------------------------------------

오라클에서 내부적으로 사용되는 컬럼을 pseudocolumn이라고 하며,
ROWID, ROWNUM등이 있다.
ROWNUM은 테이블에서 select 되어진 일련 번호임
【예제】
SQL> select rownum,ename from emp;
 
    ROWNUM ENAME
---------- ----------
         1 CLARK
         2 MILLER
         3 JONES
         4 ALLEN
         5 MARTIN
         6 CHAN
 
6 rows selected.
 
SQL> delete from emp where ename='JONES';
 
1 row deleted.
 
SQL> select rownum,ename from emp;
 
    ROWNUM ENAME
---------- ----------
         1 CLARK
         2 MILLER
         3 ALLEN
         4 MARTIN
         5 CHAN
 
SQL>

Posted by 1010
02.Oracle/DataBase2009. 5. 30. 13:59
반응형




세부폴더
------------------
constraints
miscellaneous
monitoring
rac
resource_manager
script_creation
security

자세한 내용은 관련 URL 입니다

http://www.oracle-base.com/dba/DBACategories.php 

Posted by 1010
02.Oracle/DataBase2009. 5. 14. 16:11
반응형

참고할만한 사이트

http://cexx.org/lspfix.htm


ORA-12571: TNS:packet writer failure


문제발견 : 하나의 클라이언트가 데이타베이스 접속을 못한다.

                그래서 업무를 수행하지 못한다.


문제해결 : 첨부된 실행파일을 실행한후 Finish 버튼을 누르면 해결된다.


이거땜시 하루 정도는 고생한거 같다. ㅜ.ㅜ

Posted by 1010
02.Oracle/DataBase2009. 5. 12. 16:23
반응형
Posted by 1010
02.Oracle/DataBase2009. 5. 11. 15:49
반응형
공유 풀 영역 튜닝

서버 튜닝

server tuning은 최적의 성능을 얻기 위해 DB 버퍼 캐시, 로그 버퍼와 같은 메모리 영역과 기타 프로세스 영역의 크기를 적당하게 할당하여 성능을 향상시키는 방법을 말한다.
서버튜닝을 통하여 성능을 향상시킬 수 있는 내용은 다음과 같다.
• DB 메모리 영역의 튜닝을 통한 성능 향상
• 물리적 디스크로부터 입출력 수행에 따른 성능 저하 개선
• 백그라운드 프로세스의 활성하를 통한 DB 성능 개선

1)공유 풀 영역튜닝
2)
데이터버퍼 캐시 영역튜닝
3)리두로그 버퍼 튜닝


공유 풀 영역튜닝

공유 풀(shared pool)은 사용자가 실행한 SQL 문의 구문 분석 정보가 저장되는 영역으로 라이브러리 캐시 영역과 데이터 사전 캐시로 구성되어 있다.

라이브러리 캐시는 오라클 DB가 메모리에서 데이터를 얼마나 자주 변경했는지, 어떤 SQL 문이 자주 실행되는지 등의 실행 결과와, 사용자가 실행한 SQL 문의 텍스트 정보가 저장되어 있다.
데이터 사전 캐시 영역은 테이블/뷰의 이름, 테이블을 구성하는 컬럼의 이름과 타입, 이들에 대한 사용자 권한 등과 같은 정보를 저장하는 영역이다.


라이브러리 캐시 튜닝

라이브러리 캐시 튜닝의 목적은 동일한 SQL이나 PL/SQL은 라이브러리 캐시에 한번만 저장될 수 있도록 하자는 것이다. 즉, 동일한 SQL이나 PL/SQL의 텍스트, 파싱(parsing) 결과, 실행계획 등이 각각 메모리에 저장되도록 하는 것이 아니라 하나의 SQL이나 PL/SQL의 정보들만 메모리에 저장되도록 하고 나머지는 이미 메모리에 저장된 정보를 이용할 수 있도록 하자는 것이다.

이를 위해서는 표준화된 코딩 규칙에 따라 SQL과 PL/SQL을 개발함으로써 모든 사용자가 공유할 수 있도록 하고, 이미 라이브러리 캐시에 저장되어 있는 정보가 제거 되지 않도록 하면 된다.

동일한 SQL 문이란 다음과 같은 조건을 만족하는 두 개의 SQL 문을 의미한다.

	• 대문자/소문자 동일
	• 띄어쓰기 규칙 동일
	• 공백(space)의 개수 동일
	• SQL 문에 사용된 변수의 데이터 타입과 변수 이름이 동일
공유 푸 영역을 검색할 때는 V$SQLAREA, V$SQLTEXT 데이터 사전을 사용한다.
검색 결과에서 PARSE_CALLS 항목을 유의해볼 필요가 있다.

동일한 SQL 문에 대해서는 구문 분석이 이루어 지지 않음을 알 수 있다.

SQL> conn system/manager
connected
SQL> select ename,sal from scott.emp where sal >=3000;
 
ENAME             SAL
---------- ----------
SCOTT            3000
KING             5000
FORD             3000
 
SQL> select ename,sal from scott.emp where sal >=3000;
 
ENAME             SAL
---------- ----------
SCOTT            3000
KING             5000
FORD             3000
 
SQL> select sql_text,version_count,loads,invalidations,parse_calls,sorts
  2  from v$sqlarea
  3  where sql_text not like '%$%'
  4             and command_type in (2,3,6,7)
  5             and upper(sql_text) like '%SCOTT.EMP%'
  6             order by sql_text;
 
SQL_TEXT
--------------------------------------------------------------------------------
VERSION_COUNT      LOADS INVALIDATIONS PARSE_CALLS      SORTS
------------- ---------- ------------- ----------- ----------
select ename,sal from scott.emp where sal>=3000
            1          1             0           2          0
 
 
SQL> select sql_text,version_count,loads,invalidations,parse_calls,sorts
  2  from v$sqlarea
  3  where sql_text not like '%$%'
  4             and command_type in (2,3,6,7)
  5             and upper(sql_text) like '%SCOTT.EMP%'
  6             order by sql_text;
 
SQL_TEXT
--------------------------------------------------------------------------------
VERSION_COUNT      LOADS INVALIDATIONS PARSE_CALLS      SORTS
------------- ---------- ------------- ----------- ----------
select ename,sal from scott.emp where sal>=3000
            1          1             0           3          0
 
 
SQL>

사용하고 있는 DB의 라이브러리 캐시 영역에 대한 분석은 라이브러리 캐시에 대한 튜닝의 계힉을 세우기 위해 아주 중요하다. 공유 풀 영역에 대한 분석을 위한 데이터 사전 뷰는 다음과 같다.
V$sgastat 모든 SQL 구조의 크기에 대한 정보를 제공
V$librarycache 라이브러리 캐시에 있는 항목의 유형에 대한 통계정보들을 제공
V$sql
V$sqlarea 현재 어떤 SQL 문들이 사용자들에게 공유되고 있는지에 대한 정보
V$sqltext 현재 어떤 SQL 문들이 사용자들에게 공유되고 있는지에 대한 정보
V$db_object_cache 패키지를 포함한 캐시된 객체들

V$librarycache 뷰를 사용한 분석

히트율 분석 v$librarycache 데이터 사전의 GETS 컬럼과 GETTHIS 컬럼에 대한 백분율
GETS는 사용자가 실행한 SQL 구문이 분석되어 라이브러리 캐시 영역에 로더 되려고 했던 횟수
GETTHIS는 그 중에서 실제로 load된 수를 의미함
reload비율 v$librarycache 데이터 사전으로부터 라이브러리 캐시의 reload 비율을 분석한다.
reload비율은 PINS 컬럼에 대한 RELOADS 컬럼에 대한 비율임
PINS 컬럼은 라이브러리 캐시의 정보가 사용된 횟수를 의미하고,
RELOADS 컬럼은 라이브러리 캐시의 정보가 메모리로부터 제거디어 다시 로딩된 횟수를 의미한다. 만약 0.01이하라면 SHARED_POOL_SIZE 값을 늘려야 한다.
무효화 invalidation(무효화)는 v$librarycache 데이터 사전으로부터 SQL문에서 참조된 객체가 다른 사용자에의해 삭제된 상태가 얼마나 발생했는지를 나타내는 것으로 INVALIDATION 컬럼의 값이 계속 증가하는 값이면 공유 풀 영역이 작아 성능이 저하됨을 나타낸다.

SQL> select * from v$sgastat;
 
POOL         NAME                            BYTES
------------ -------------------------- ----------
             fixed_sga                      778796
             buffer_cache                184549376
             log_buffer                     524288
shared pool  subheap                         52652
shared pool  KQR L SO                       213068
shared pool  KQR M PO                      3021240
shared pool  KQR M SO                       483516
shared pool  KQR S PO                       669044
shared pool  KQR S SO                        12628
shared pool  sql area                     13678560
shared pool  KGLS heap                     2622804
 
POOL         NAME                            BYTES
------------ -------------------------- ----------
shared pool  joxs heap                        4220
shared pool  row cache                     3707272
shared pool  PX subheap                     131068
shared pool  parameters                      27604
shared pool  repository                     145944
shared pool  ASH buffers                   4194304
shared pool  free memory                  10909496
shared pool  PL/SQL DIANA                  1225720
shared pool  PL/SQL MPCODE                 2761632
shared pool  library cache                11884516
shared pool  miscellaneous                23639736
 
POOL         NAME                            BYTES
------------ -------------------------- ----------
shared pool  pl/sql source                   18244
shared pool  PLS non-lib hp                  10404
shared pool  XDB Schema Cac                3797208
shared pool  alert threshol                   4220
shared pool  joxlod exec hp                 337180
shared pool  joxlod pcod hp                  56004
shared pool  partitioning d                 347548
shared pool  table definiti                   1988
shared pool  trigger defini                   2668
shared pool  trigger inform                   2008
shared pool  trigger source                   5832
 
POOL         NAME                            BYTES
------------ -------------------------- ----------
shared pool  type object de                 251344
shared pool  event statistics per sess     3860360
shared pool  fixed allocation callback         352
large pool   PX msg pool                    902160
large pool   free memory                   3292144
java pool    joxs heap                      354816
java pool    free memory                   2578496
java pool    joxlod exec hp                5455296
 
41 rows selected.
 
SQL> select namespace,gethitratio from v$librarycache;
 
NAMESPACE       GETHITRATIO
--------------- -----------
SQL AREA         .980316179
TABLE/PROCEDURE  .817467385
BODY             .997121957
TRIGGER          .984754522
INDEX            .112746633
CLUSTER          .987701768
OBJECT                    1
PIPE                      1
JAVA SOURCE               1
JAVA RESOURCE             1
JAVA DATA                 0
 
11 rows selected.
 
SQL> select sum(pins) PINS, sum(reloads) RELOADS, sum(reloads/pins) RATIO
  2  from v$librarycache where pins != 0;
 
      PINS    RELOADS      RATIO
---------- ---------- ----------
   3000107       7964 .014909064
 
SQL>
SQL> select namespace,gethitratio, invalidations 
  2  from v$librarycache;
 
NAMESPACE       GETHITRATIO INVALIDATIONS
--------------- ----------- -------------
SQL AREA         .980312259          2065
TABLE/PROCEDURE  .817544718             0
BODY             .997125699             0
TRIGGER          .984762397             0
INDEX            .112746633             0
CLUSTER          .987701768             0
OBJECT                    1             0
PIPE                      1             0
JAVA SOURCE               1             0
JAVA RESOURCE             1             0
JAVA DATA                 0             0
 
11 rows selected.
 
SQL>
공유 풀 크기의 변경

위에서 설명한 것과 같은 다양한 튜닝 도구들에 의해 공유 풀 영역의 튜닝이 필요하다면 공유 풀의 크기를 변경해야 한다.
공유 풀 크기의 변경은 다음 사항을 고려하여 정해야 한다.
1) 저장된 객체(테이블, 뷰,프로시저등)들을 위해 필요한 공간얼마나 되는지 산정한다.
2) 자주 사용되는 (4회이상) 응용 프로그램의 메모리를 조회해 본다.
3) 한 사용자의 open 커서당 공유 풀은 250바이트 정도 할당하는 것이 좋으며, 최고조일 때의 전체 메모리는 (오픈커서수 x 25바이트)로 산정한다.
이제 매개변수 shared_pool_size는 (1+2+3+30% 정도의 여유공간)로 잡는다. 공유 풀 영역의 크기를 설정하기 위해 다음 매개변수의 값을 설정한다.

  
	SHARED_POOL_SIZE=[크기];
	SHARED_POOL_REVERSED_SIZE=[크기];
【예제】
SQL> select sum(sharable_mem) from v$db_object_cache;
 
SUM(SHARABLE_MEM)
-----------------
         35909092        ☜  가용 설정 공간
 
SQL> select sum(sharable_mem) from v$db_object_cache
  2  where owner is not null;
 
SUM(SHARABLE_MEM)
-----------------
         16046514  	 ☜  1) 공유객체를 위한 공간
 
SQL> select sum(sharable_mem) from v$sqlarea
  2  where executions > 4;
 
SUM(SHARABLE_MEM)
-----------------
          9785693       ☜  2) 자주 사용되는 으용 프로그램 공간
 
SQL> select sum(250*users_opening) from v$sqlarea;
 
SUM(250*USERS_OPENING)
----------------------
                 10500       ☜  3) 오픈된 커서의 수에 따른 할당된 메모리 크기
 
SQL> 
이 예제에서 가용 메모리=35909092로 되어 있다.
계산하여 보면 { 1)+2)+3)}*30%추가=25842707 * 1.3= 335955191임
그러므로 가용메모리 설정 값 35909092이 계산 값 335955191보다 크므로 여유가 있음

데이터 사전 캐시 튜닝

라이브러리 캐시와 함께 공유 풀의 데이터 사전 캐시에서의 튜닝의 목적은 히트율을 높이는 것이다. 데이터 사전 캐시를 모니터링하기 위해 V$ROWCACHE 뷰를 사용한다.
GETS 컬럼은 사용자가 자료사전을 쿼리했을 때 data dictionary영역으로 자료를 요청했던 횟수
GETMISSES는 자료 요청을 했지만 data dictionary로부터 자료를 얻지 못했던 횟수

대부분 자료사전을 빠르게 검색하기 위해서 GETS에 대한 GETMISSES의 백분율이 2% 미만이어야하고, 아주 큰 자료사전이라면 15%미만이어야 좋은 성능을 기대할 수 있음

이 값들이 15% 이상이면 매개변수 shared_pool_size 크기를 늘리는 것을 고려해 보아야 한다. DB 캐시 영역의 크기는 shared_pool_size 매개변수를 사용하여 변경할 수 있다.
utlbstat, utlestat 유틸리티의 분석결과인 report.txt나 statspack 패키지의 분석 결과인 report.txt에서 다음 사항을 참고해도 좋다.

name GET_REQS GET_MISS SCAN_REQSMOD_REQS COUNT CUR_USAGE
dc_objects
dc_synonyms

【예제】
SQL> select parameter, gets, getmisses, getmisses/gets
  2  from v$rowcache 
  3  where gets != 0;
 
PARAMETER                              GETS  GETMISSES GETMISSES/GETS
-------------------------------- ---------- ---------- --------------
dc_segments                          157452       5536     .035159922
dc_tablespaces                       127769          8     .000062613
dc_tablespace_quotas                   5896          7     .001187246
dc_files                                 72          4     .055555556
dc_users                             661602         80     .000120919
dc_rollback_segments                  46198         21     .000454565
dc_objects                           118673       9587     .080785014
dc_global_oids                       461691        175     .000379041
dc_constraints                         1899        634     .333859926
dc_object_ids                        599331       3945     .006582339
dc_sequences                            181         28     .154696133
dc_usernames                          29648         48     .001618996
dc_histogram_defs                    168054      62822      .37382032
dc_table_scns                           133        133              1
dc_profiles                            5472          1     .000182749
global database name                      4          2             .5
outstanding_alerts                     5597       1100     .196533857
dc_awr_control                         6079          1     .000164501
dc_histogram_data                     31078       6155     .198050068
dc_histogram_data                     13713        488      .03558667
dc_users                              63178         60     .000949698
 
21 rows selected.
 
SQL> 

Posted by 1010
02.Oracle/DataBase2009. 5. 11. 15:48
반응형
v$sqlarea 뷰
공유 풀 영역을 검사할 때 v$sqlarea나 v$sqltext을 사용

【예제】 
SQL> conn system/manager
connected
SQL> select ename,sal from scott.emp where sal >=3000;
 
ENAME             SAL
---------- ----------
SCOTT            3000
KING             5000
FORD             3000
 
SQL> select ename,sal from scott.emp where sal >=3000;
 
ENAME             SAL
---------- ----------
SCOTT            3000
KING             5000
FORD             3000
 
SQL> select sql_text,version_count,loads,invalidations,parse_calls,sorts
  2  from v$sqlarea
  3  where sql_text not like '%$%'
  4             and command_type in (2,3,6,7)
  5             and upper(sql_text) like '%SCOTT.EMP%'
  6             order by sql_text;
 
SQL_TEXT
--------------------------------------------------------------------------------
VERSION_COUNT      LOADS INVALIDATIONS PARSE_CALLS      SORTS
------------- ---------- ------------- ----------- ----------
select ename,sal from scott.emp where sal>=3000
            1          1             0           2          0
 
 
SQL> select sql_text,version_count,loads,invalidations,parse_calls,sorts
  2  from v$sqlarea
  3  where sql_text not like '%$%'
  4             and command_type in (2,3,6,7)
  5             and upper(sql_text) like '%SCOTT.EMP%'
  6             order by sql_text;
 
SQL_TEXT
--------------------------------------------------------------------------------
VERSION_COUNT      LOADS INVALIDATIONS PARSE_CALLS      SORTS
------------- ---------- ------------- ----------- ----------
select ename,sal from scott.emp where sal>=3000
            1          1             0           3          0
 
 
SQL>


SQL> select executions, disk_reads, buffer_gets from v$sqlarea; EXECUTIONS DISK_READS BUFFER_GETS ---------- ---------- ----------- 9 0 9 1 2 47 2 11 94 0 0 0 3 4 56 0 0 0 0 0 0 9 8 73 1 0 4 737 0 2211 1 2 15 EXECUTIONS DISK_READS BUFFER_GETS ---------- ---------- ----------- 1 2 15 1 1 15 8 104 471 1 0 0 1 0 0 1 0 0 0 0 0 1 0 0 1 2 55 2 0 0 11 0 0 EXECUTIONS DISK_READS BUFFER_GETS ---------- ---------- ----------- 0 0 0 7 0 14 9 0 27 9 0 45 4 2 55 12 3 24 737 2 2212 3 0 9 1 0 3 30 2 92 1 0 3 EXECUTIONS DISK_READS BUFFER_GETS ---------- ---------- ----------- 6 8 44 3 1 6 2 0 6 4 2 30 6 5 43 4 2 42 1 0 3 1 0 3 10 8 56 4 75 316 1 0 966 EXECUTIONS DISK_READS BUFFER_GETS ---------- ---------- ----------- 0 0 0 9 10 130 4 1 28 0 0 0 118 7 478 55 26 294 1 0 2 1 0 2 0 0 0 1 0 3 1 0 17 EXECUTIONS DISK_READS BUFFER_GETS ---------- ---------- ----------- 0 0 0 77 10 573 1 39 582 192 5 1070 1 0 2 43 1 43 0 0 0 26 1 129 17 3 60 1 4 15 1 0 0 EXECUTIONS DISK_READS BUFFER_GETS ---------- ---------- ----------- 3 9 35 1 0 3 1 3 25 26 0 88 26 0 121 15 1 39 1 1 37 4567 0 4567 2 3 69 9 0 45 1 1 33 EXECUTIONS DISK_READS BUFFER_GETS ---------- ---------- ----------- 3 3 28 0 0 0 4 0 12 76 13 1368 175 3 525 26 1 112 1 69 2397 26 0 112 0 0 0 1 4 43 1 117 2816 EXECUTIONS DISK_READS BUFFER_GETS ---------- ---------- ----------- 76 0 76 77 1 585 1 4 81 1 0 46 0 0 0 12 15 120 12 14 84 12 59 192 9 1 43 1 0 23 12 10 86 EXECUTIONS DISK_READS BUFFER_GETS ---------- ---------- ----------- 0 0 0 26 1 121 44 1 245 9 6 142 0 0 0 39 8 90 8 12 118 37 7 74 2 0 6 3 1 3 55 29 557 EXECUTIONS DISK_READS BUFFER_GETS ---------- ---------- ----------- 8 0 26 3 0 6 7 0 3514 25 0 50 194 13 582 26 1 119 16214 1 113754 1 6 55 1 6 58 1 7 55 1 6 55 EXECUTIONS DISK_READS BUFFER_GETS ---------- ---------- ----------- 9 11 72 31 3 62 1 6 55 1 6 55 1 6 55 1 7 58 7 11 283 1 6 55 1 1 27 3 0 3 0 0 0 EXECUTIONS DISK_READS BUFFER_GETS ---------- ---------- ----------- 4566 0 9132 1 2 37 1 12 80 1 0 7 1 12 112 1 0 7 1 0 7 1 0 7 9 0 27 7 4 69 1 11 211 EXECUTIONS DISK_READS BUFFER_GETS ---------- ---------- ----------- 1 0 7 1 0 7 1 0 7 1 0 7 1 0 7 0 0 0 7 490 3514 0 0 0 1 368 1317 1 0 7 1 0 7 EXECUTIONS DISK_READS BUFFER_GETS ---------- ---------- ----------- 1 0 7 1 0 7 1 0 7 1 0 7 1 0 7 1 0 7 190 36 552 1 0 7 0 1 92 0 1 82 0 1 92 EXECUTIONS DISK_READS BUFFER_GETS ---------- ---------- ----------- 0 1 91 13 1 65 0 1 94 0 4 93 0 2 84 0 1 84 737 10 905 737 2 2299 737 1 2286 0 1 82 116 12 361 EXECUTIONS DISK_READS BUFFER_GETS ---------- ---------- ----------- 737 143 310752 737 13 855 121 3 408 737 13 867 737 3 849 737 2 861 4 2 30 9 1 54 1 32 674 12 4 62 4 0 107 EXECUTIONS DISK_READS BUFFER_GETS ---------- ---------- ----------- 3 2 57 118 24 688 189 rows selected. SQL> 【예제】 SQL> select substr(sql_text,1,40) "SQL", count(*), 2 sum(executions) "총실행회수" 3 from v$sqlarea 4 where sql_text like '%emp%' 5 group by substr(sql_text, 1,40) 6 having count(*) >0 7 order by 2; SQL COUNT(*) 총실행회수 --------------------------------------------- ---------- ---------- select substr(sql_text,1,40) "SQL", coun 1 5 select count(*) from emp 1 1 select ename from emp where ename=:test 1 2 INSERT INTO wrh$_sql_plan sp (sn 1 1 select t.ts#,t.file#,t.block#,nvl(t.bobj 1 20013 select obj#, dataobj#, part#, hiboundlen 1 144 6 rows selected. SQL> 【예제】 SQL> show user USER is "SYS" SQL> desc v$sqlarea Name Null? Type ----------------------------------------- -------- ---------------------------- SQL_TEXT VARCHAR2(1000) SQL_FULLTEXT CLOB SQL_ID VARCHAR2(13) SHARABLE_MEM NUMBER PERSISTENT_MEM NUMBER RUNTIME_MEM NUMBER SORTS NUMBER VERSION_COUNT NUMBER LOADED_VERSIONS NUMBER OPEN_VERSIONS NUMBER USERS_OPENING NUMBER FETCHES NUMBER EXECUTIONS NUMBER PX_SERVERS_EXECUTIONS NUMBER END_OF_FETCH_COUNT NUMBER USERS_EXECUTING NUMBER LOADS NUMBER FIRST_LOAD_TIME VARCHAR2(38) INVALIDATIONS NUMBER PARSE_CALLS NUMBER DISK_READS NUMBER DIRECT_WRITES NUMBER BUFFER_GETS NUMBER APPLICATION_WAIT_TIME NUMBER CONCURRENCY_WAIT_TIME NUMBER CLUSTER_WAIT_TIME NUMBER USER_IO_WAIT_TIME NUMBER PLSQL_EXEC_TIME NUMBER JAVA_EXEC_TIME NUMBER ROWS_PROCESSED NUMBER COMMAND_TYPE NUMBER OPTIMIZER_MODE VARCHAR2(10) OPTIMIZER_COST NUMBER OPTIMIZER_ENV RAW(2000) OPTIMIZER_ENV_HASH_VALUE NUMBER PARSING_USER_ID NUMBER PARSING_SCHEMA_ID NUMBER PARSING_SCHEMA_NAME VARCHAR2(30) KEPT_VERSIONS NUMBER ADDRESS RAW(8) HASH_VALUE NUMBER OLD_HASH_VALUE NUMBER PLAN_HASH_VALUE NUMBER MODULE VARCHAR2(64) MODULE_HASH NUMBER ACTION VARCHAR2(64) ACTION_HASH NUMBER SERIALIZABLE_ABORTS NUMBER OUTLINE_CATEGORY VARCHAR2(64) CPU_TIME NUMBER ELAPSED_TIME NUMBER OUTLINE_SID VARCHAR2(40) LAST_ACTIVE_CHILD_ADDRESS RAW(8) REMOTE VARCHAR2(1) OBJECT_STATUS VARCHAR2(19) LITERAL_HASH_VALUE NUMBER LAST_LOAD_TIME DATE IS_OBSOLETE VARCHAR2(1) IS_BIND_SENSITIVE VARCHAR2(1) IS_BIND_AWARE VARCHAR2(1) IS_SHAREABLE VARCHAR2(1) CHILD_LATCH NUMBER SQL_PROFILE VARCHAR2(64) SQL_PATCH VARCHAR2(30) SQL_PLAN_BASELINE VARCHAR2(30) PROGRAM_ID NUMBER PROGRAM_LINE# NUMBER EXACT_MATCHING_SIGNATURE NUMBER FORCE_MATCHING_SIGNATURE NUMBER LAST_ACTIVE_TIME DATE BIND_DATA RAW(2000) TYPECHECK_MEM NUMBER SQL> select count(*) from v$sqlarea; COUNT(*) ---------- 1469 SQL>
Posted by 1010
02.Oracle/DataBase2009. 5. 11. 15:02
반응형

*오라클서버의 메모리에 관한 테이블*/
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'

/*hash_value 가지고 SQL 문장 찾아내는 쿼리 */
select sql_text from v$sqltext where hash_value= 317853294


/*오라클 세션과 관련된 테이블*/
select count(*) from v$session where machine ='머신이름' and schemaname ='스키마이름'

/*인엑티브 상태의 세션들-로그온타입이 과도하게 지나도록 없어지지 않는것은 세션을 죽이도록 한다
단 machine이 머신이름 에 해당하는 것만 죽이도록 한다
prev_hash_value 로 해쉬밸류를 알아내어 쿼리문을 확인할 수 있다
*/ 
select sid,serial#,username,status,logon_time,prev_hash_value,machine
from v$session
where machine ='머신이름' and schemaname ='스키마이름' and status = 'INACTIVE'

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

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

SELECT COUNT(*) FROM V$SESSION WHERE MACHINE ='머신이름' AND SCHEMANAME ='스키마이름'  AND STATUS = 'ACTIVE'
   
--현재 스키마이름 스키마로 실행중인(active) 프로세스를 알아내는 쿼리문
select SID, SERIAL#, SQL_HASH_VALUE, PREV_HASH_VALUE,ROW_WAIT_OBJ#, LOGON_TIME, MACHINE
from v$session
where schemaname ='스키마이름' and status = 'ACTIVE'
  
--위에서 알아내 hash_value 값을 이용하여 해당 프로세스가 실행중인 쿼리문 알아내기
select * from v$sqltext where hash_value = 2626426688-
order by piece

select * from v$session
where machine ='머신이름' and schemaname ='스키마이름' and status = 'ACTIVE' and ROW_WAIT_OBJ# > 0


/******************************************************************************************/
 현재 커서 수 확인하는 Query
/******************************************************************************************/
 

SELECT sid, count(sid) cursor
FROM V$OPEN_CURSOR
WHERE user_name = '유저이름'
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



  
  
 
  
   116, 15217
  
    select sql_text from v$sqltext
 where hash_value= 3252988466 --1389452958 
 order by piece
  
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
 
 
  select user_name, sql_text, count(*) cnt from sys.v_$open_cursor
 where user_name = '유저이름' and sid = 114
  group by user_name, sql_text
  order by cnt desc

 alter system kill session '27,127'

--ALTER SYSTEM KILL SESSION '45, 3977'
--이런식으로 통계정보를 생성하신 후에

 analyze table emp compute statistics;

 alter table customers pctfree 5 ;

select * from dba_tables
where table_name = 'RP_PART_MST'



/*******************************************************************************
* LOCK 관련
*******************************************************************************/

--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'

/**********************************************************************************************/





select *
  from v$session
  where sid in (80,100)

SELECT l.SESSION_ID,
    LPAD('  ', DECODE(l.xidusn,0,3,0))
    ||l.oracle_username "User Name",
    o.owner, o.object_name, o.object_type
    FROM v$locked_object l, dba_objects o
WHERE l.object_id = o.object_id
ORDER by o.object_id, 1 desc


--아래 table 은 존재하지 않네...

SELECT sw.username "WAITING_USER", bu.username "LOCKING_USER",
    dw.lock_type, dw.mode_held, dw.mode_requested,
    dw.waiting_session, dw.holding_session
FROM dba_waiters dw, v$session sw, v$session bu
WHERE dw.waiting_session = sw.sid
ANd dw.holding_session = bu.sid   
   


SELECT s.username, s.sid, s.serial#
FROM dba_blockers db, v$session s
WHERE db.holding_session = s.sid 


SELECT vo.session_id,do.object_name, do.owner, do.object_type,do.owner, vo.xidusn, vo.locked_mode
FROM v$locked_object vo , dba_objects do
WHERE vo.object_id = do.object_id

SELECT do.object_name, do.owner, do.object_type,do.owner, vo.xidusn, vo.session_id, vo.locked_mode
FROM v$locked_object vo , dba_objects do
WHERE vo.object_id = do.object_id



Select *
FROM
  all_col_comments
WHERE
  table_name = '테이블이름'
 
 
/************************************************
alter session으로 죽지않는 프로세스 죽이기
1.oracle이 설치된 서버에 텔넷으로 root로 접속한다
2.su -오라클계정
3.sqlplus '/as sysdba''
4.connect system/sys
5.ALTER SYSTEM KILL SESSION '137,1723'

**************************************************/ 

 

 

database.sarang.net 에서 펌

Posted by 1010
02.Oracle/DataBase2009. 5. 6. 13:21
반응형

Skip Headers

오라클 10g 함수
10g Release 1 (10.1)
Go to Documentation Home
HOME
Go to Book List
ORA_home
Go to Table of Contents
연구회
Go to Index
자료실
Go to Master Index
ORA_10G
Go to Feedback page
MAIL

Go to previous page
Previous
Go to next page
Next

SQL Functions

1. 수치함수
2. 문자값을 반환하는 문자 함수
3. NLS 문자 함수
4. 수치값을 반환하는 문자함수
5. 일시 함수
6. 일반적인 비교 함수
7. 변환 함수
8. LARGE OBJECT(LOB) 함수
9. 수집 함수
10. 계층 함수
11. XML 함수
12. 인코딩 함수와 디코딩 함수
13. NULL 함수
14. 환경 함수 와 식별자 함수
15. 집계 함수
16. 분석 함수
17. Object 참조 함수
18. 모델 함수
19. 기타 단일행 함수

일행 함수

단일행 함수는 쿼리 테이블 또는 뷰의 모든 행에 대하여 단일 결과 행을 반환한다. 이 함수는 select lists,where 구문,START WITH, CONNECT BY 구문, HAVING구문을 지정할수 있다.

1. 수치함수

처음메뉴로

함수명 설명
002.ABS  절대값을 반환한다.
003.ACOS

n의 역코사인(arc cosine)값을 반환한다.

007.ASIN  n의 역사인(arc sine)값을 반환한다.
008.ATAN  n의 역탄젠트(arc tangent)값을 반환한다.
009.ATAN2  ATAN2(n,m)은 atan2(n/m)과 같으며, n/m의 역탄젠트(arc tangent)값을 반환한다.
013.BITAND  인수1과 인수2의 비트에 대한 AND연산을 수행하여 정수를 반환한다.
016.CEIL  인수에서 지정한 수치를 올림하여 정수를 구하는 함수이다.
026.COS  n(라디안으로 표현되는 각도)의 코사인값을 반환한다.
027.COSH

n(라디안으로 표현되는 각도)의 쌍곡 코사인값(hyperbolic cosine)을 반환한다

044.EXP  e의 n 제곱 값을 반환한다.
050.FLOOR  지정한 숫자보다 작거나 같은 정수 중에서 최대값을 반환한다
067.LN  입력값의 자연 로그 값을 반환한다.
070.LOG  LOG(m,n)에서 밑을 m으로 한 n의 로그 값을 반환.
078.MOD  n2을 n1으로 나눈 나머지값을 반환.
080.NANVL  입력 값 n2가 Nan(숫치가 아닌)라면, 대체 값 n1을 반환. n2가 NaN이 아니라면, n2를 반환
102.POWER  n2의 n1승 값을 반환.
118.REMAINDER  n2를 n1으로 나눈 나머지를 반환
120.ROUND (number)  n값을 소수점 이하를 integer를 기준으로 반올림하여 반환한다
130.SIGN  n의 부호를 반환.
131.SIN  n의 사인(sine)값을 반환.
132.SINH  n의 쌍곡선 사인(hyperbolic sine)을 반환.
134.SQRT  n의 제곱근을 반환.
159.TAN  n의 사인(tangent)값을 반환.
160.TANH  n의 쌍곡선 탄젠트(hyperbolic tangent)을 반환.
185.TRUNC (number)  인수 n1을 소수점 자리 파라미터 n2 이하를 절삭.
199.WIDTH_BUCKET  동일한 넓이를 갖는 히스토그램을 생성.

 
2. 문자값을 반환하는 문자 함수

처음메뉴로

함수명 설명
018.CHR  10진수 n 에 대응하는 아스키코드를 반환.
022.CONCAT

char1과 char2를 연결하여 반환한다

057.INITCAP  입력 문자열 중에서 각 단어의 첫 글자를 대문자로 나머지는 소문자로 변환하여 반환한다
071.LOWER  입력된 문자열을 소문자로 변환한다
072.LPAD  지정된 자리수 n으로부터 expr1을 채우고,왼편의 남은 공간에 expr1을 채운다.
073.LTRIM  문자열 char 좌측으로부터 set으로 지정된 모든 문자를 제거한다.
081.NCHR  유니코드 문자를 반환.
087.NLS_INITCAP  각 단어의 처음 문자를 대문자로, 나머지 문자를 소문자로 변환하여 char를 반환한다
088.NLS_LOWER  모든 문자를 소문자로 변환하여 반환한다.
089.NLSSORT

입력 문자열을 소팅하여 스트링을 반환한다.

090.NLS_UPPER  입력 문자열을 모두 대문자로 변환한 문자열을 반환한다.
115.REGEXP_REPLACE   지정한 정규 표현을 만족하는 부분을, 지정한 다른 문자열로 치환합니다.
116.REGEXP_SUBSTR   지정한 정규 표현을 만족하는 부분 문자열을 반환.
119.REPLACE   파라미터로 주어지는 첫번째 문자열에서, 두번째 문자열을 모두 세번째 문자열로 바꾼 후 결과를 반환한다.
125.RPAD  인수 expr1 오른편으로 인수 expr2로 지정한 문자를 길이 필요에 따라 반복하여 n만큼 붙여준다
126.RTRIM  인수 char의 오른쪽 끝에서 부터 set으로 지정된 모든 문자를 제거한다.
133.SOUNDEX  char의 음성 표현을 가지는 문자열을 반환.
147.SUBSTR  문자열 Char에서 position 문자 위치로부터 substring_length 문자 길이만큼 문자열을 추출하여 반환.
181.TRANSLATE  from_string에서 각 문자를 to_string안의 대응하는 문자로 치환하여 expr을 반환.
183.TREAT  인수의 선언형을 변경.
184.TRIM  문자열부터 선행 또는 후행(양쪽)문자를 제거.
191.UPPER  모든 문자를 대문자로 변환.

3. NLS 문자 함수

처음메뉴로

함수명 설명
084.NLS_CHARSET_DECL_LEN  NCHAR열의 선언된 폭을 반환.
085.NLS_CHARSET_ID  문제셋 이름에 상응하는 ID번호를 반환.
086.NLS_CHARSET_NAME  ID번호 number에 상응하는 문자 세트의 이름을 반환.

4. 수치값을 반환하는 문자함수

처음메뉴로

함수명 설명
005.ASCII  주어진 char의 첫 문자의 아스키 값에 상응하는 10진수값을 반환한다.
058.INSTR  문자열중에서 지정한 문자가 처음 나타나는 위치를 숫자로 반환.
066.LENGTH  인수 char의 길이를 반환한다
114.REGEXP_INSTR   지정한 조건(정규 표현)을 만족하는 부분의 최초의 위치(무슨 문자인지)를 반환.

 
5. 일시 함수

처음메뉴로

함수명 설명
004.ADD_MONTHS  일자 date에 특정 개월수 integer를 더한 값을 반환한다
032.CURRENT_DATE

현재 세션의 날짜 정보를 Date 데이터 형으로 반환한다.

033.CURRENT_TIMESTAMP  현재 session의 날짜와 시간 정보를 반환한다
035.DBTIMEZONE  데이터 베이스 time zone의 값을 반환한다
045.EXTRACT (datetime)  특정 날짜,시간 값이나 날짜 값 표현식으로부터 지정된 날짜 영역의 값을 추출하여 반환한다
051.FROM_TZ  timestamp 데이터형과 time zone데이터 형을 TIMESTAMP WITH TIME ZONE 데이터형으로 변환.
062.LAST_DAY  해당 날짜가 속한 달의 마지막 날짜를 반환한다.
069.LOCALTIMESTAMP  timestamp의 현재 날짜와 시각을 출력한다.
079.MONTHS_BETWEEN

일자 date1과 date2 사이의 월을 계산한다

082.NEW_TIME  date,zone1시간대를 zone2 시간대로 출력.
083.NEXT_DAY  해당일을 기준으로 명시된 요일의 다음 날짜를 변환.
093.NUMTODSINTERVAL  n을 INTERVAL DAY TO SECOND 문자로 변경한다.
094.NUMTOYMINTERVAL  n을 INTERVAL YEAR TO MONTH문자로 변경한다
121.ROUND (date)  포맷 모델 fmt에 의해 지정한 단위로 반올림된 날짜를 반환한다
128.SESSIONTIMEZONE  현재 세션의 시간대역(time zone)을 반영한다
152.SYS_EXTRACT_UTC  협정 세계시간 UTC (Coordinated Universal Time—formerly Greenwich Mean Time)을 반환
157.SYSDATE  데이터 베이스가 있는 OS의 일자와 시간을 반환한다
158.SYSTIMESTAMP  시스템의 날짜를 반환한다
165.TO_CHAR (datetime)   사용자가 지정한 폼을 갖는 varchar2 형식의 데이터로 변환한다
169.TO_DSINTERVAL  INTERVAR DAY TO SECOND값으로 변환한다.
178.TO_TIMESTAMP  TIMESTAMP 데이터형의 값으로 변환한다.
179.TO_TIMESTAMP_TZ  TIMESTAMP WITH TIME ZONE 데이터형으로 변환한다.
180.TO_YMINTERVAL  INTERVAL YEAR TO MONTH 형태로 변경한다
186.TRUNC (date)    날짜를 년,월,일을 기준으로 반올림하거나 절삭한다.
187.TZ_OFFSET  문장이 실행된 일자에 근거한 인수에 상응하는 time zone offset을 반환한다
 
6. 일반적인 비교 함수

처음메뉴로

함수명 설명
052.GREATEST  하나 이상의 인수중에서 가장 큰 값을 반환.
065.LEAST  인수 EXPR의 리스트 중에서 가장 작은 값을 반환.

7. 변환 함수

처음메뉴로

함수명 설명
006.ASCIISTR  주어진 문자열의 아스키 문자열을 반환.
012.BIN_TO_NUM

비트(2진수) 벡터를 동등한 수치(10진수)로 변환.

015.CAST    데이터 형식이나 collection 형식을 다른 데이터 형식이나 collection 형식으로변환.
017.CHARTOROWID  CHAR, VARCHAR2, NCHAR, or NVARCHAR2 데이터형태의 값으로부터 ROWID형으로 변환.
021.COMPOSE  완전한 정규화된 형태의 유니코드를 반환.
023.CONVERT  문자세트를 다른 문자세트로 문자열을 변환.
037.DECOMPOSE  입력과 같은 문자 세트로 분해후의 UNICODE 문자열을 반환.
056.HEXTORAW  16진수를 raw값으로 변환.
093.NUMTODSINTERVAL

n을 INTERVAL DAY TO SECOND 문자로 변경.

094.NUMTOYMINTERVAL  n을 INTERVAL YEAR TO MONTH문자로 변경한다.
110.RAWTOHEX  RAW을 16진수의 문자로 변환.
111.RAWTONHEX  RAW을 NVARCHAR2 형태의 16진수로 변환.
123.ROWIDTOCHAR  rowid 값을 VARCHAR2형식으로 변환.
124.ROWIDTONCHAR  rowid값을 NVARCHAR2형식으로 변환.
127.SCN_TO_TIMESTAMP  시스템 변경 번호(SCN)로 평가되는 수치를 인수로 취하여, SCN과 관련된 가까운 timestamp를 반환.
161.TIMESTAMP_TO_SCN  timestamp와 관련된 시스템 변경 번호(system change number,SCN)을 반환.
162.TO_BINARY_DOUBLE  배정밀도 부동소수점을 반환.
163.TO_BINARY_FLOAT  단순정밀도(single-precision) 부동 소수점수(floating-point number)를 반환.
164.TO_CHAR (character)  데이터 베이스 문자 세트로 변환.
165.TO_CHAR (datetime)  지정된 포맷의 VARCHAR2 데이터 타입의 값으로 변환.
166.TO_CHAR (number)  VARCHAR2 데이터형의 값으로 변환.
167.TO_CLOB  NCLOB값을 CLOB값으로 변환.
168.TO_DATE  char을 날짜형 데이터 타입값으로 변환.
169.TO_DSINTERVAL  INTERVAR DAY TO SECOND값으로 변환.
170.TO_LOB  LONG또는 LONG ROW값을 LOB값으로 변환.
171.TO_MULTI_BYTE  multibyte 문자를 상응하는 single-byte 문자로 변환한 문자를 반환.
172.TO_NCHAR (character)  문자열,CLOB,NCLOB 값을 각국 문자 세트로 변환.
173.TO_NCHAR (datetime)  national character set으로 변환.
174.TO_NCHAR (number)  n을 national character set으로 변환.
175.TO_NCLOB  CLOB값을 NCLOB값으로 변환.
176.TO_NUMBER  expr을 NUMBER 데이터형의 값으로 변환.
177.TO_SINGLE_BYTE  multibyte문자를 그에 상응하는 single-byte문자로 변환하여 char을 반환.
178.TO_TIMESTAMP  CHAR,VARCHAR2,NCHAR,NVARCHAR2 데이터형의 char을 TIMESTAMP 데이터형의 값으로 변환.
179.TO_TIMESTAMP_TZ  CHAR,VARCHAR2,NCHAR,NVARCHAR2데이터형의 char을 TIMESTAMP WITH TIME ZONE 데이터형으로 변환.
180.TO_YMINTERVAL  CHAR,VARCHAR2,NCHAR,NVARCHAR2 데이터형의 문자열을 INTERVAL YEAR TO MONTH 형태로 변경
182.TRANSLATE ... USING  char을 데이터 베이스 문자세트와 각국어 문자 센트사이의 변환에 대한 지정된 문자 세트로 변경.
189.UNISTR  텍스트 문자열을 인수로 취하고, 각국어 문자 세트로 반환.
 
8. LARGE OBJECT(LOB) 함수

처음메뉴로

함수명 설명
011.BFILENAME  서버 파일 시스템의 물리 LOB 바이너리 파일과 연관된 BFILE locator를 반환.
042.EMPTY_BLOB, EMPTY_CLOB  LOB 변수를 초기화하기 위하여 쓰이거나, 또는 INSERT 문이나 UPDATE 문에서 empty LOB 위치를 반환.

9. 수집 함수

처음메뉴로

함수명 설명
014.CARDINALITY  nested table에서 원소의 수를 반환.
020.COLLECT  선택된 행으로부터 입력된 형태의 중첩 테이블을 생성.
103.POWERMULTISET  입력된 중첩(nested)테이블의 공백이 아닌 모든 부분집합(submultisets)을 소유한 중첩 테이블의 중첩된 테이블을 반환.
104.POWERMULTISET_BY_CARDINALITY  중첩 테이블과 cardinality(주어진 수학적 집합에서 요소들의 개수)를 취해서, 지정한 카디나리트의 중첩 테이블의 모든 비공백 부분집합(submultisets이라고 불리는)을 소유하는 중첩 테이블의 중첩테이블을 반환.
129.SET  중첩 테이블에서 중복을 배제하여 반환.

10. 계층 함수

처음메뉴로

함수명 설명
149.SYS_CONNECT_BY_PATH  루트로 부터 node로 열의 값 Path를 반환.

11. XML 함수

처음메뉴로

함수명 설명
039.DEPTH  상관 변수를 가지는 UNDER_PATH조건에 의해 지정된 PATH에서 레벨의 수를 반환.
043.EXISTSNODE  node의 존재여부를 확인하여 그 결과를 반환.
046.EXTRACT (XML)

XML 플래그먼트(fragment)를 포함한 XMLType 인스턴스를 반환.

047.EXTRACTVALUE  node의 스칼라 값을 반환.
098.PATH  지정된 자원에서 상대적인 경로를 반환.
151.SYS_DBURIGEN  특정 열 또는 행 오브젝트에 대한 DBURIType 데이터 타입의 URL을 생성.
155.SYS_XMLAGG  입력 받은 모든 문서를 하나의 XML문서를 통합.
156.SYS_XMLGEN  스칼라값,object type,xml type 인스턴스를 XML문서로 변형.
200.XMLAGG  XML fragment(조각)의 집합체를 취해서, 집계된 XML 문서를 반환.

 GROUP BY 질의에서 XML 데이타를 그룹으로 분류 또는 집계하는 함수.

201.XMLCOLATTVAL  XML 단편(fragment)을 생성하고, 각각의 XML 단편(fragment)이 속성 name을 포함한 name열을 가지는 결과 XML으로 확장.
202.XMLCONCAT  둘 이상의 XML 값을 연결하는 함수.
203.XMLELEMENT  XMLType 타입의 instance를 반환.

 관계형 값을 XML 요소로 변형시키는 함수.

204.XMLFOREST  각 인수의 파라미터를 XML로 변환하고, 변환된 인수를 연결한 XML 단편(fragment)을 반환.

 관계형 값 목록으로부터 XML 요소의 목록(일명: '포리스트(forest)')을 생성하는 함수.

205.XMLSEQUENCE  XMLType에 있는 top-level 노드의 varray를 반환.

 커서의 각 행에 대하여 XMLSequence 형태로써 XML문서를 반환.

206.XMLTRANSFORM  스타일 쉬트를 인스턴스로 적용하고, XMLType를 반환.
 
12. 인코딩 함수와 디코딩 함수

처음메뉴로

함수명 설명
036.DECODE  일반적인 프로그래밍 언어의 IF문을 SQL 문자 또는 PL/SQL안으로 끌여들여 사용하기 위하여 만들어진 오라클함수.
041.DUMP  지정한 데이터의 위치와 길이 등을 지정한 형식으로 반환.
097.ORA_HASH  주어진 표현에 대한 해쉬 값을 계산하는 함수.
198.VSIZE  expr의 내부 표현에서 바이트의 수를 반환.

13. NULL 함수

처음메뉴로

함수명 설명
019.COALESCE  나열된 값을 순차적으로 체크하여 NULL이 아닌 첫번째 인수를 반환.
068.LNNVL  조건의 한쪽 또는 양쪽 연산자가 NULL이 존재할 경우에, 조건문을 평가하기 위한 방법을 제공.
092.NULLIF  expr1과 expr2가 같으면, NULL값을 반환.
095.NVL  쿼리의 결과에서 NULL(공백으로 반환)값을 치환.
096.NVL2  지정한 표현이 NULL인지 여부에 근거하여 쿼리의 반환될 값을 판단할수 있다. expr1이 NULL이 아니라면, NVL2는 expr2를 반환한다. 만약 expr1인 NULL이라면, NVL2는 expr3을 반환.

14. 환경 함수 와 식별자 함수

처음메뉴로

함수명 설명
150.SYS_CONTEXT  문맥 namespace와 관련된 parameter의 값을 반환.
153.SYS_GUID  16바이트로 구성된 고유전역식별자(globally unique identifier,RAW 값)을 생성하여 반환.
154.SYS_TYPEID  피연산자(operand)의 대부분 지정한 형태의 typeid를 반환.
188.UID  세션 사용자의 유일한 식별하는 정수를 반환.(로그인 유저)
192.USER  VARCHAR2 형태를 가지는 세션 사용자(로그인 유저)의 이름을 반환.
193.USERENV  현재 세션에 대한 정보를 반환.

 
15. 집계 함수

처음메뉴로

Aggregate functions return a single result row based on groups of rows, rather than on single rows. Aggregate functions can appear in select lists and in ORDER BY and HAVING clauses. They are commonly used with the GROUP BY clause in a SELECT statement, where Oracle Database divides the rows of a queried table or view into groups. In a query containing a GROUP BY clause, the elements of the select list can be aggregate functions, GROUP BY expressions, constants, or expressions involving one of these. Oracle applies the aggregate functions to each group of rows and returns a single result row for each group.

If you omit the GROUP BY clause, then Oracle applies aggregate functions in the select list to all the rows in the queried table or view. You use aggregate functions in the HAVING clause to eliminate groups from the output based on the results of the aggregate functions, rather than on the values of the individual rows of the queried table or view.


Many (but not all) aggregate functions that take a single argument accept these clauses:

  • DISTINCT causes an aggregate function to consider only distinct values of the argument expression.

  • ALL causes an aggregate function to consider all values, including all duplicates.

For example, the DISTINCT average of 1, 1, 1, and 3 is 2. The ALL average is 1.5. If you specify neither, then the default is ALL.

All aggregate functions except COUNT(*) and GROUPING ignore nulls. You can use the NVL function in the argument to an aggregate function to substitute a value for a null. COUNT never returns null, but returns either a number or zero. For all the remaining aggregate functions, if the data set contains no rows, or contains only rows with nulls as arguments to the aggregate function, then the function returns null.

You can nest aggregate functions. For example, the following example calculates the average of the maximum salaries of all the departments in the sample schema hr:

SELECT AVG(MAX(salary)) FROM employees GROUP BY department_id;

AVG(MAX(SALARY))
----------------
           10925

This calculation evaluates the inner aggregate (MAX(salary)) for each group defined by the GROUP BY clause (department_id), and aggregates the results again.

The aggregate functions are:

함수명 설명
010.AVG  지정된 컬럼에 대한 조건을 만족하는 행중에서 Null을 제외한 평균을 반환.
020.COLLECT  선택된 행으로부터 입력된 형태의 중첩 테이블을 생성.
024.CORR  수치 쌍에 대한 상관 계수를 반환.
025.CORR_*  (CORR 참조) Pearson's 상관계수를 계산.
028.COUNT  쿼리에 의해 반환된 행의 수를 반환.
029.COVAR_POP  number조합의 세트의 모집단 공분산을 반환.
030.COVAR_SAMP  number쌍의 세트의 표본 공분산을 반환.
031.CUME_DIST  값의 그룹에 있는 값의 누적 분포치를 계산.
038.DENSE_RANK  ORDER BY절에 사용된 컬럼이나 표현식에 대하여 순위를 부여하는데 RANK()와 달리 동일 순위 다음의 순위는 동일 순위의 수와 상관없이 1 증가된 값을 돌려준다
048.FIRST  주어진 소트 지정에 대해서 FIRST 또는 LAST로서 순위를 주어서 행의 세트로부터 값의 세트에 운영하는 집계와 분석 함수.
053.GROUP_ID  지정된 GROUP BY 결과로부터 중복된 그룹을 구별.
054.GROUPING  ROLLUP이나 CUBE 연산자와 함께 사용하여 GROUPING 함수에 기술된 컬럼이 그룹핑 시 즉, ROLLUP이나 CUBE 연산시 사용이 되었는지를 보여 주는 함수.
055.GROUPING_ID  행과 관련되는 GROUPING 비트 벡터에 대응되는 수치를 반환.
061.LAST  행을 서열화 시켜서 마지막 행을 추출.
075.MAX  인수중에서 최대값을 반환.
076.MEDIAN  중앙값 또는 값의 정렬후에 중앙값이 보간된 값을 반환.
077.MIN  인수중에서 최소값을 반환.
099.PERCENT_RANK  그룹 수에 대한 값의 순위 퍼센트를 반환.
100.PERCENTILE_CONT  연속된 분포 모델을 가정한 역 분포 함수(inverse distribution function).
101.PERCENTILE_DISC  이산 분포 모형을 가정하는 역 분포 함수.
108.RANK  값의 그룹에서 값의 순위를 계산.
117.REGR_ (Linear Regression) Functions  선형회귀함수는 정규 최소 제곱 회귀 선상을 수치 쌍의 세트에 적합.
135.STATS_BINOMIAL_TEST  단지 두개의 유효한 값이 존재하는 이분 변수(두개의 배타적인 값을 가지는 변수)에 대해서 이용되는 정확 확률 테스트.
136.STATS_CROSSTAB  교차분석(crosstab)은 두개의 명목 변수를 분석하는 방법.
137.STATS_F_TEST  STATS_F_TEST함수는 두개의 분산이 유의한 차가 있는지 테스트.
138.STATS_KS_TEST  두개의 표본이 같은 모집단에 속하고 있는지 또는 같은 분포를 가지는 모집단에 속하고 있는지 테스트 하는 Kolmogorov-Smirnov함수.
139.STATS_MODE  가장 큰 빈도를 가지는 값을 반환.
140.STATS_MW_TEST  A Mann Whitney test는 2개의 독립 표본을 비교.
141.STATS_ONE_WAY_ANOVA  일원분산분석 함수(STATS_ONE_WAY_ANOVA)는 분산의 다른 2개 추정치 비교에 의해 통계적 유의성에 대한 평균(그룹 또는 변수에 대한)의 유의한 차를 검증.
142.STATS_T_TEST_*   t검정에서는, 평균치의 차이의 유의성을 측정.
143.STATS_WSR_TEST  대응쌍표본의 윌콕스 부호 순위 검증을 수행하며,표본간의 차이가 zero로부터 유의한 차이가 있는지 검정.
144.STDDEV  Number의 조합인 expr의 표본표준편차를 반환.
145.STDDEV_POP  모집단 표준 편차를 계산하고, 모집단 분산의 제곱근값을 반환.
146.STDDEV_SAMP  누적 표본 표준편차를 계산하고, 표본 분산의 제곱근값을 반환.
148.SUM  expr의 값의 합을 반환.
195.VAR_POP  Null값들을 제거한후에 Number 세트의 모집단 분산을 반환.
196.VAR_SAMP  null들을 제거한후에 number의 세트의 표본분산을 반환.
197.VARIANCE  expr의 분산을 반환.

 
16. 분석 함수

처음메뉴로

Analytic functions compute an aggregate value based on a group of rows. They differ from aggregate functions in that they return multiple rows for each group. The group of rows is called a window and is defined by the analytic_clause. For each row, a sliding window of rows is defined. The window determines the range of rows used to perform the calculations for the current row. Window sizes can be based on either a physical number of rows or a logical interval such as time.

Analytic functions are the last set of operations performed in a query except for the final ORDER BY clause. All joins and all WHERE, GROUP BY, and HAVING clauses are completed before the analytic functions are processed. Therefore, analytic functions can appear only in the select list or ORDER BY clause.

Analytic functions are commonly used to compute cumulative, moving, centered, and reporting aggregates.


analytic_function::=
Description of analytic_function.gif follows
Description of the illustration analytic_function.gif


analytic_clause::=
Description of analytic_clause.gif follows
Description of the illustration analytic_clause.gif


query_partition_clause::=
Description of query_partition_clause.gif follows
Description of the illustration query_partition_clause.gif


order_by_clause::=
Description of order_by_clause.gif follows
Description of the illustration order_by_clause.gif


windowing_clause ::=
Description of windowing_clause.gif follows
Description of the illustration windowing_clause.gif

The semantics of this syntax are discussed in the sections that follow.


analytic_function

Specify the name of an analytic function (see the listing of analytic functions following this discussion of semantics).


arguments

Analytic functions take 0 to 3 arguments. The arguments can be any numeric datatype or any nonnumeric datatype that can be implicitly converted to a numeric datatype. Oracle determines the argument with the highest numeric precedence and implicitly converts the remaining arguments to that datatype. The return type is also that datatype, unless otherwise noted for an individual function.



analytic_clause

Use OVER analytic_clause to indicate that the function operates on a query result set. That is, it is computed after the FROM, WHERE, GROUP BY, and HAVING clauses. You can specify analytic functions with this clause in the select list or ORDER BY clause. To filter the results of a query based on an analytic function, nest these functions within the parent query, and then filter the results of the nested subquery.

Notes on the analytic_clause:
  • You cannot specify any analytic function in any part of the analytic_clause. That is, you cannot nest analytic functions. However, you can specify an analytic function in a subquery and compute another analytic function over it.

  • You can specify OVER analytic_clause with user-defined analytic functions as well as built-in analytic functions. See CREATE FUNCTION .


query_partition_clause

Use the PARTITION BY clause to partition the query result set into groups based on one or more value_expr. If you omit this clause, then the function treats all rows of the query result set as a single group.

To use the query_partition_clause in an analytic function, use the upper branch of the syntax (without parentheses). To use this clause in a model query (in the model_column_clauses) or a partitioned outer join (in the outer_join_clause), use the lower branch of the syntax (with parentheses).

You can specify multiple analytic functions in the same query, each with the same or different PARTITION BY keys.

If the objects being queried have the parallel attribute, and if you specify an analytic function with the query_partition_clause, then the function computations are parallelized as well.

Valid values of value_expr are constants, columns, nonanalytic functions, function expressions, or expressions involving any of these.


order_by_clause

Use the order_by_clause to specify how data is ordered within a partition. For all analytic functions except PERCENTILE_CONT and PERCENTILE_DISC (which take only a single key), you can order the values in a partition on multiple keys, each defined by a value_expr and each qualified by an ordering sequence.

Within each function, you can specify multiple ordering expressions. Doing so is especially useful when using functions that rank values, because the second expression can resolve ties between identical values for the first expression.

Whenever the order_by_clause results in identical values for multiple rows, the function returns the same result for each of those rows. Please refer to the analytic example for SUM for an illustration of this behavior.


Restriction on the ORDER BY Clause

When used in an analytic function, the order_by_clause must take an expression (expr). The SIBLINGS keyword is not valid (it is relevant only in hierarchical queries). Position (position) and column aliases (c_alias) are also invalid. Otherwise this order_by_clause is the same as that used to order the overall query or subquery.


ASC | DESC

Specify the ordering sequence (ascending or descending). ASC is the default.


NULLS FIRST | NULLS LAST

Specify whether returned rows containing nulls should appear first or last in the ordering sequence.

NULLS LAST is the default for ascending order, and NULLS FIRST is the default for descending order.

Analytic functions always operate on rows in the order specified in the order_by_clause of the function. However, the order_by_clause of the function does not guarantee the order of the result. Use the order_by_clause of the query to guarantee the final result ordering.



windowing_clause

Some analytic functions allow the windowing_clause. In the listing of analytic functions at the end of this section, the functions that allow the windowing_clause are followed by an asterisk (*).


ROWS | RANGE

These keywords define for each row a window (a physical or logical set of rows) used for calculating the function result. The function is then applied to all the rows in the window. The window moves through the query result set or partition from top to bottom.

  • ROWS specifies the window in physical units (rows).

  • RANGE specifies the window as a logical offset.

You cannot specify this clause unless you have specified the order_by_clause.

The value returned by an analytic function with a logical offset is always deterministic. However, the value returned by an analytic function with a physical offset may produce nondeterministic results unless the ordering expression results in a unique ordering. You may have to specify multiple columns in the order_by_clause to achieve this unique ordering.


BETWEEN ... AND

Use the BETWEEN ... AND clause to specify a start point and end point for the window. The first expression (before AND) defines the start point and the second expression (after AND) defines the end point.

If you omit BETWEEN and specify only one end point, then Oracle considers it the start point, and the end point defaults to the current row.


UNBOUNDED PRECEDING

Specify UNBOUNDED PRECEDING to indicate that the window starts at the first row of the partition. This is the start point specification and cannot be used as an end point specification.


UNBOUNDED FOLLOWING

Specify UNBOUNDED FOLLOWING to indicate that the window ends at the last row of the partition. This is the end point specification and cannot be used as a start point specification.


CURRENT ROW

As a start point, CURRENT ROW specifies that the window begins at the current row or value (depending on whether you have specified ROW or RANGE, respectively). In this case the end point cannot be value_expr PRECEDING.

As an end point, CURRENT ROW specifies that the window ends at the current row or value (depending on whether you have specified ROW or RANGE, respectively). In this case the start point cannot be value_expr FOLLOWING.


value_expr PRECEDING or value_expr FOLLOWING

For RANGE or ROW:

  • If value_expr FOLLOWING is the start point, then the end point must be value_expr FOLLOWING.

  • If value_expr PRECEDING is the end point, then the start point must be value_expr PRECEDING.

If you are defining a logical window defined by an interval of time in numeric format, then you may need to use conversion functions.


If you specified ROWS:

  • value_expr is a physical offset. It must be a constant or expression and must evaluate to a positive numeric value.

  • If value_expr is part of the start point, then it must evaluate to a row before the end point.

If you specified RANGE:

  • value_expr is a logical offset. It must be a constant or expression that evaluates to a positive numeric value or an interval literal. Please refer to "Literals " for information on interval literals.

  • You can specify only one expression in the order_by_clause

  • If value_expr evaluates to a numeric value, then the ORDER BY expr must be a numeric or DATE datatype.

  • If value_expr evaluates to an interval value, then the ORDER BY expr must be a DATE datatype.

If you omit the windowing_clause entirely, then the default is RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW.

Analytic functions are commonly used in data warehousing environments. In the list of analytic functions that follows, functions followed by an asterisk (*) allow the full syntax, including the windowing_clause.

함수명 설명
010.AVG *  지정된 컬럼에 대한 조건을 만족하는 행중에서 Null을 제외한 평균을 반환.
024.CORR *  수치 쌍에 대한 상관 계수를 반환.
028.COUNT *  쿼리에 의해 반환된 행의 수를 반환.
029.COVAR_POP *  number조합의 세트의 모집단 공분산을 반환.
030.COVAR_SAMP *  number쌍의 세트의 표본 공분산을 반환.
031.CUME_DIST  값의 그룹에 있는 값의 누적 분포치를 계산.
038.DENSE_RANK  ORDER BY절에 사용된 컬럼이나 표현식에 대하여 순위를 부여하는데 RANK()와 달리 동일 순위 다음의 순위는 동일 순위의 수와 상관없이 1 증가된 값을 돌려준다
048.FIRST  주어진 소트 지정에 대해서 FIRST 또는 LAST로서 순위를 주어서 행의 세트로부터 값의 세트에 운영하는 집계와 분석 함수.
049.FIRST_VALUE *  값의 정렬된 세트에서 첫번째 값을 반환.
060.LAG   현재 행을 기준으로 이전 값을 참조하는 함수.
061.LAST  행을 서열화 시켜서 마지막 행을 추출.
063.LAST_VALUE *  윈도우에서 정렬된 값중에서 마지막 값을 반환.
064.LEAD   현재 행을 기준으로 이후의 값을 참조하는 함수.
075.MAX *  인수중에서 최대값을 반환.
077.MIN *  인수중에서 최소값을 반환.
091.NTILE  순서화된 데이터를 expr에 의해 지정된 bucket의 수로 분한하여, 각 행을 적절한 bucket 번호를 할당.

 출력 결과를 사용자가 지정한 그룹 수로 나누어 출력하는 함수.

099.PERCENT_RANK  그룹 수에 대한 값의 순위 퍼센트를 반환.
100.PERCENTILE_CONT  연속된 분포 모델을 가정한 역 분포 함수(inverse distribution function).
101.PERCENTILE_DISC  이산 분포 모형을 가정하는 역 분포 함수.
108.RANK  값의 그룹에서 값의 순위를 계산.
109.RATIO_TO_REPORT  값의 세트의 합에 대한 값의 비율을 계산.
117.REGR_ (Linear Regression) Functions *  선형회귀함수는 정규 최소 제곱 회귀 선상을 수치 쌍의 세트에 적합.
122.ROW_NUMBER   분할별로 정렬된 결과에 대해 순위를 부여하는 기능.

 1로 시작하는 order_by_clause에서 지정된 행의 순위 순서로, 적용되는 각 행에 unique 순서를 할당.

144.STDDEV *  Number의 조합인 expr의 표본표준편차를 반환.
145.STDDEV_POP *  모집단 표준 편차를 계산하고, 모집단 분산의 제곱근값을 반환.
146.STDDEV_SAMP *  누적 표본 표준편차를 계산하고, 표본 분산의 제곱근값을 반환.
148.SUM *  expr의 값의 합을 반환.
195.VAR_POP *  Null값들을 제거한후에 Number 세트의 모집단 분산을 반환.
196.VAR_SAMP *  null들을 제거한후에 number의 세트의 표본분산을 반환.
197.VARIANCE *  expr의 분산을 반환.
 
17. Object 참조 함수

처음메뉴로

함수명 설명
040.DEREF  인수 expr의 오브젝트 참조를 반환.
074.MAKE_REF  object 인식자가 주 키로 근거하고 있는 object 테이블에서 object view의 행 또는 object 표의 행에 대한 REF를 생성.
112.REF  인수로써 오브젝트 테이블 또는 오브젝트 뷰의 행과 연관된 상관 변수(테이블 별명)를 취한다
113.REFTOHEX  인수 expr을 16진수로 변환.
194.VALUE  object 테이블에 저장된 object instance를 반환.

18. 모델 함수

처음메뉴로

함수명 설명
034.CV  포뮬러의 좌측 항에 정의된 multi-cell reference를 우측 항으로 복사하는 기능을 제공.

 우측 항 계산을 위해 좌측 항의 값 이용하기.

059.ITERATION_NUMBER  델 규칙에 따라 완료된 반복을 나타내는 정수를 반환.
105.PRESENTNNV  cell_reference가 존재하고 NULL이 아닌 경우, model_clause이 실행되기 전에 expr1을 반환.
106.PRESENTV  cell_reference가 존재할때 expr1을 반환한다. 그 이외에는 expr2를 반환.
107.PREVIOUS  각 iteration의 초기에 cell_reference의 값을 반환.

19. 기타 단일행 함수

처음메뉴로

함수명 설명
152.SYS_EXTRACT_UTC  협정 세계시간 UTC (Coordinated Universal Time—formerly Greenwich Mean Time)을 추출.
190.UPDATEXML  XMLType인스턴스와 XPath값 쌍을 취하고, 업데이트된 값을 가지는 XMLType 인스턴스를 반환.


 
Posted by 1010
02.Oracle/DataBase2009. 4. 28. 13:51
반응형
나른한 점심시간.
비몽사몽중에 다음과 같은 업무요건가 들어왔다.
A 라는 테이블에서 errcode 가 309 이고 pt_no 가 3 이상인 모든 데이터를 지워라.

sql 로 표현하면 다음과 같은 쿼리가 나온다.

delete from A where errcode = '309' and pt_no >= 3;
commit;

하지만 쿼리를 다음과 같이 잘못 작성한 무대리.
delete from A where pt_no >= 3;
commit;

commit 하고 담배를 피고 와서 select 를 해보니
아뿔사!! pt_no 가 3 이상인 모든 데이터가 지워진 것이다.
commit 까지 했으니 돌릴 방법이 없을 것 같아
조용히 도망치는 무대리!!

하지만 다음 쿼리로 commit 까지 마친 delete 컬럼에 대해서 복구를 할 수 있다.

INSERT INTO A
SELECT *
FROM A
AS OF TIMESTAMP(SYSTIMESTAMP - INTERVAL '15' MINUTE);

현재 시간 기준으로 15분 이내의 데이터들을 모두 복구하는 쿼리!

멋지다 오라클!

 hanho9@nate.com
Posted by 1010
02.Oracle/DataBase2009. 4. 28. 13:13
반응형

오라클에서의 데이터 암호화 기능

1. 설 명

☞ Bulletin no : 12036 참고

 
Oracle 8i Release2(8.1.6)에서는 데이터를 암호화하여 저장할 수 있는
향상된 기능(DES Encryption)을 제공 합니다
 
 
신용카드번호, 패스워드 등 보안이 필요한 데이터를 암호화된 형태로 저장하여
기존의 3rd Party Tool이나, Application Logic으로 구현하던 암호화 정책을
데이터베이스 차원에서 구현할 수 있도록 해줍니다.
 
일단 암호화의 결과의 길이는 8의 배수로 나옵니다.
자리수가 8이하는 8자리, 8초과 16이하는 16자리...
'123'을 암호화하면 그 자리수는 8자리가 나오지요

 
DBMS_OBFUSCATION_TOOLKIT

암호화 기능을 이용하려면 DBMS_OBFUSCATION_TOOLKIT을 이용해야 합니다.
 
 
이 패키지는 4개의 프로시져로 이루어져 있습니다.

- VARCHAR2 타입을 Encrypt/Decrypt할 수 있는 2개의 프로시져

- RAW 타입을 Encrypt/Decrypt할 수 있는 2개의 프로시져
(다른 타입은 지원하지 않으므로 number인 경우는 to_char 이용)
 
 

DBMS_OBFUSCATION_TOOLKIT을 이용하기 위해서는 :

1) SYS 유저로 아래의 스크립트를 실행 시킵니다.

   @$ORACLE_HOME/rdbms/admin/dbmsobtk.sql
   @$ORACLE_HOME/rdbms/admin/prvtobtk.plb
   
2) 권한을 부여 합니다.

   SQL>GRANT execute ON dbms_obfuscation_toolkit TO public;



2. 패키지 실행하기



--> 패키지 선언부 생성

CREATE OR REPLACE PACKAGE CryptIT AS
   FUNCTION encrypt( Str VARCHAR2,  
                     hash VARCHAR2 ) RETURN VARCHAR2;

   FUNCTION decrypt( xCrypt VARCHAR2,
                     hash VARCHAR2 ) RETURN VARCHAR2;
END CryptIT;
/
 
 
 
--> 패키지 본체 생성

CREATE OR REPLACE PACKAGE BODY CryptIT AS
   crypted_string VARCHAR2(2000);
 
   FUNCTION encrypt( Str VARCHAR2,  
                     hash VARCHAR2 ) RETURN VARCHAR2 AS
   pieces_of_eight INTEGER := ((FLOOR(LENGTH(Str)/8 + .9)) * 8);
 
   BEGIN
 
      dbms_obfuscation_toolkit.DESEncrypt(
               input_string     => RPAD( Str, pieces_of_eight ),
               key_string       => RPAD(hash,8,’#’),
               encrypted_string => crypted_string );
      RETURN crypted_string;
   END;
 
   FUNCTION decrypt( xCrypt VARCHAR2,
                     hash VARCHAR2 ) RETURN VARCHAR2 AS
   BEGIN
      dbms_obfuscation_toolkit.DESDecrypt(
               input_string     => xCrypt,
               key_string       => RPAD(hash,8,’#’),
               decrypted_string => crypted_string );
      RETURN trim(crypted_string);
   END;
END CryptIT;
/

 



3. 실행 예제


1) Encrypt하여 데이터 입력

-- 테스트 테이블을 생성 합니다.

SQL>create table encrypt_table( id number, passwd varchar(20) );


 
-- 테스트 데이트럴 입력 합니다.
-- CryptIT.encrypt(비밀번호, 키값)

SQL>INSERT INTO encrypt_table VALUES( 1, CryptIT.encrypt(’1234’, ’storm’));
1 개의 행이 만들어졌습니다.

 
SQL>INSERT INTO encrypt_table VALUES( 2, CryptIT.encrypt(’5678’, ’oramaster’));
1 개의 행이 만들어졌습니다.

 
 
2) Decrypt하여 데이터 조회
 
--> Decrypt하지 않으면 암호화된 데이터와 비교되서 결과값이 출력되지 않습니다.
SQL> select id, passwd from encrypt_table where passwd = ’1234’;
 
선택된 레코드가 없습니다.
 
 
--> 저장장치에 Encrypt된 값으로 저장 됩니다.

SQL> col passwd format a60
SQL> select id, dump(passwd) passwd from encrypt_table;

         ID PASSWD
---------- -------------------------------------------------------------
         1 Typ=1 Len=8: 246,27,80,184,227,225,245,31
         2 Typ=1 Len=8: 175,231,213,125,85,223,46,133
 


--> Encrypt할 때 사용한 Key로만 Decrypt할 수 있습니다.
 
SQL>SELECT id, CryptIT.decrypt(passwd,’storm’) passwd
       FROM encrypt_table
       WHERE CryptIT.decrypt(passwd,’storm’) = ’1234’;
 
        ID PASSWD
---------- -----------
         1 1234
 
 
SQL>SELECT id, CryptIT.decrypt(passwd,’oramaster’) passwd
    FROM encrypt_table
    WHERE CryptIT.decrypt(passwd,’oramaster’) = ’5678’;
 
        ID PASSWD
---------- -----------
         2 5678
 
 
주의) Table에 접근 권한이 있는 다른 유저도 Key값을 알면 Decrypt할 수 있습니다.
 
 
 
4) 관련 ORA error number
 
ORA error 28231 "Invalid input to Obfuscation toolkit"
- input data, key값이 NULL일 경우 발생
 
ORA error 28232 "Invalid input size for Obfuscation toolkit"
- input data가 8 bytes 배수가 아닐 경우 발생
 
ORA error 28233 "Double encryption not supported by DESEncrypt in Obfuscation toolkit"
- encrypt data를 다시 encrypt경우 발생
 

관 련 자 료
===========
Oracle8i Supplied PL/SQL Packages Reference Release 2 (8.1.6)

 
암호화 하는 프로시저 소스를 암호화하여 보안하자~
암호화 Stored Function을 하나 만들어 wrap사용하시면 됩니다.

복호화는 만들지 안으시는게 좋습니다. (정히 필요하시면 만드시고)
복호화 함수가 있으면 개발자에 의하여 노출될 우려가 있습니다.

암호화 Stored Function => sf_encrypt
wrap iname=/mydir/sf_encrypt.sql oname=/mydir/sf_encrypt.plb
/mydir/sf_encrypt.plb 파일를 이용하여 DB에 rap된 sf_encrypt를 만들고


입력
INSERT INTO encrypt_table VALUES( 1, sf_encrypt('1234'));

SELECT id, '*****' as passwd
FROM encrypt_table
WHERE passwd = sf_encrypt('1234');

이런식으로 사용하시면 인덱스 사용 가능합니다.
 
 
 
========================================================================================================================
========================================================================================================================
 
 
 
일부 서비스에 대해 오라클 DB 버전을 9i에서 10g로 변경하면서, 암호화 패키지 CRYPTIT에서 일부 문제가 있었다.

9i에서 암호화된 테이블을 10g로 가져와서 다음과 같이 decrypt 를 쿼리하면 에러가 발생했다.

select CRYPTIT.decrypt(passwd, 'keyvalue) from user_tbl

ORA-28232: obfuscation 툴킷에 부적합한 입력 길이입니다.
ORA-06512: "SYS.DBMS_OBFUSCATION_TOOLKIT_FFI", 줄 40에서
ORA-06512: "SYS.DBMS_OBFUSCATION_TOOLKIT", 줄 153에서
ORA-06512: "WLOWN.CRYPTIT", 줄 20에서


처음에는 일부 데이터는 정상으로 조회되길래 무슨 문제인가 찾아봐도 뽀죡한 답변을 못찾았다.

좀 삽질하다가 9i와 10g의 sys user의 DBMS_OBFUSCATION_TOOLKIT의 함수내용이 틀린 것을 보고,
암호화 데이터를 다시 갱신해 줫다.

update user_tbl set passwd = CRYPTIT.encrypt(raw_pass, 'keyvalue')

그런후 다시 조회하니 잘 된다. 역시 오라클 버전이 틀려짐에 따라 암호화 내용이 달라진 거 같다.



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

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




CREATE OR REPLACE PACKAGE CRYPTIT
AS
   FUNCTION ENCRYPT (STR VARCHAR2)
      RETURN VARCHAR2;

   FUNCTION DECRYPT (XCRYPT VARCHAR2)
      RETURN VARCHAR2;
END CRYPTIT;
/



CREATE OR REPLACE PACKAGE BODY CRYPTIT
AS
   CRYPTED_STRING   VARCHAR2 (2000);
   HASH_KEY   VARCHAR2 (10) := '암호화키';

   FUNCTION ENCRYPT (STR VARCHAR2)
      RETURN VARCHAR2
   AS
      PIECES_OF_EIGHT   INTEGER := ((FLOOR (LENGTH (STR) / 8 + .9)) * 8);
   BEGIN
      DBMS_OBFUSCATION_TOOLKIT.DESENCRYPT (INPUT_STRING          => RPAD (STR, PIECES_OF_EIGHT)
                                         , KEY_STRING            => RPAD (HASH_KEY, 8, '#')
                                         , ENCRYPTED_STRING      => CRYPTED_STRING
                                          );
      RETURN CRYPTED_STRING;
   END;

   FUNCTION DECRYPT (XCRYPT VARCHAR2)
      RETURN VARCHAR2
   AS
   BEGIN
      DBMS_OBFUSCATION_TOOLKIT.DESDECRYPT (INPUT_STRING          => XCRYPT
                                         , KEY_STRING            => RPAD (HASH_KEY, 8, '#')
                                         , DECRYPTED_STRING      => CRYPTED_STRING
                                          );
      RETURN TRIM (CRYPTED_STRING);
   END;
END CRYPTIT;
/

Posted by 1010
02.Oracle/DataBase2009. 4. 28. 13:08
반응형
기술: 보안

투명한 데이터 암호화
Arup Nanda

단 한 줄의 코드도 작성하지 않고 기밀 데이터를 투명하게 암호화합니다.

누군가가 데이터베이스 백업 테이프를 훔쳐가는 것은 조직에게는 최악의 악몽입니다. 물론 보안 시스템을 구축하고 매우 중요한 기밀 자산은 암호화하고 데이터베이스 서버에 방화벽을 설치했습니다. 그러나 침입자가 쉽게 접근했습니다. 침입자는 백업 테이프를 가져가서 틀림 없이 다른 서버에서 데이터베이스를 복원하여 데이터베이스를 시작하고 느긋하게 데이터를 보고 있습니다. 그러한 침입자로부터 데이터베이스 데이터를 보호하는 것은 훌륭한 업무방식이 아닙니다. 그것은 대부분의 법률, 규정, 지침을 준수하기 위한 요구 사항입니다. 이러한 취약성으로부터 데이터베이스를 어떻게 보호할 수 있겠습니까?

한 해결책은 데이터베이스의 기밀 데이터를 암호화하고 별도의 위치에 암호화 키를 저장하는 것입니다. 암호화 키 없이 훔쳐간 데이터는 쓸모가 없습니다. 그러나 두 상반된 개념 간의 균형을 유지해야 합니다. 그 개념이란 애플리케이션이 암호화 키에 액세스할 수 있는 편리성과 키 절도를 방지하는데 필요한 보안성입니다. 그리고 회사와 연방 정부 규정을 준수하기 위해 복잡한 코딩 없이 즉시 솔루션이 필요합니다.

Oracle Database 10g Release 2의 새로운 기능을 사용하여 그렇게 할 수 있습니다. 단 한 줄의 코드도 작성하지 않고 열을 암호화됨으로 선언할 수 있습니다. 사용자가 데이터를 삽입할 때 데이터베이스가 투명하게 데이터를 암호화하여 그 열에 저장합니다. 마찬가지로 사용자가 열을 선택할 때 데이터베이스가 데이터를 자동으로 해독합니다. 이러한 모든 프로세스가 투명하게 애플리케이션의 코드를 변경하지 않고 수행되기 때문에 이 기능에는 이에 잘 어울리는 TDE(투명한 데이터 암호화)라는 이름이 붙여졌습니다.

작동 방식

전에 Oracle Magazine 1/2월호 "데이터 자산의 암호화" 에서 암호화 기초에 대해 다루었습니다. 주요 사항을 다시 설명하면, 암호화는 암호화 알고리즘과 암호화 키를 일반 텍스트 입력 데이터에 적용해야 합니다. 그리고 암호화된 값을 성공적으로 해독하려면 동일한 알고리즘과 키 값을 알아야 합니다.

그 기사에서 저는 오라클이 제공하는 암호화 툴을 사용하여 암호화 기반 구조를 구축하는 방법을 설명하였습니다. 그러나 Oracle Database 10g Release 2와 TDE를 사용할 경우 암호화 기반 구조를 구축할 필요가 없습니다. 단지 암호화할 열을 정의하기만 하면Oracle Database 10g에서 그 열이 포함된 테이블에 대한 암호화 방식의 안전한 암호화 키를 생성하고 지정한 암호화 알고리즘을 사용하여 그 열의 일반 텍스트 데이터를 암호화합니다. 이 테이블 키를 보호하는 것이 매우 중요합니다. Oracle Database 10g는 지갑이라고 부르는 안전한 위치에 저장되는 마스터 키를 사용하여 데이터를 암호화합니다. 이 마스터 키는 데이터베이스 서버의 파일일 수 있습니다. 암호화된 테이블 키는 데이터 딕셔너리에 저장됩니다. 사용자가 암호화됨으로 정의된 열에 데이터를 입력할 경우 그림 1에서와 같이 Oracle Database 10g가 지갑에서 마스터 키를 가져와 데이터 딕셔너리의 암호화 키를 해독하고 입력 값에 대해 그 암호화 키를 사용하고 데이터베이스에 암호화된 데이터를 저장합니다.

figure 1
그림 1: TDE(투명한 데이터 암호화) 작동 방식

테이블의 모든 열을 암호화할 수 있습니다. 그림 1과 같이 테이블에 열이 4개 있고 열 2와 3을 암호화할 경우 Oracle Database 10g는 테이블에 대하여 하나의 암호화된 테이블 키를 생성하고 그 키를 사용하여 두 열을 암호화합니다. 디스크에 열 1과 열 4의 값을 일반 텍스트로 저장하고 다른 두 열의 값은 암호화된 형식으로 저장됩니다. 데이터가 암호화되어 저장되기 때문에 백업과 아카이브된 로그 등 모든 다운스트림 구성 요소는 암호화된 형식을 갖습니다.

사용자가 암호화된 열을 선택할 경우 Oracle Database 10g는 투명하게 데이터 딕셔너리에서 암호화된 테이블 키를 검색하고 지갑에서 마스터 키를 인출한 다음 테이블 키를 해독합니다. 그런 다음 데이터베이스가 디스크의 암호화된 데이터를 해독하여 일반 텍스트로 사용자에게 반환합니다.

이 암호화된 데이터를 사용할 경우 디스크의 데이터가 도난되어도 훔친 데이터의 일부가 아니라 지갑에 저장되어 있는 마스터 키 없이 데이터를 검색할 수 없습니다. 지갑을 도난 당할 경우에도 지갑 암호 없이 마스터 키를 검색할 수 없습니다. 그러므로 그 침입자는 디스크를 훔치거나 데이터 파일을 복사하더라도 데이터를 해독할 수 없습니다. 이것은 여러 규정과 행정 명령(directive)에 대한 준수 요구 사항을 충족합니다. 그리고 이러한 모든 프로세스가 애플리케이션의 변경이나 복잡한 암호화 작성, 키 관리 시스템 없이 수행됩니다. 그러면 지금부터 TDE를 설정하고 사용하는 방법에 대해 설명하겠습니다.

단 한번의 설정

처음 TDE를 사용할 경우 지갑 위치를 지정하고 지갑 암호를 설정하고 지갑을 열어야 합니다.

1. 지갑 위치를 지정합니다.
처음 TDE를 설정할 경우 마스터 키를 저장할 지갑을 생성해야 합니다. 기본적으로 지갑은 디렉토리 $ORACLE_BASE/admin/$ORACLE_SID/wallet에서 생성됩니다. 그러므로 $ORACLE_BASE is /u01/app/oracle 및 $ORACLE_SID가 SWBT4일 경우 지갑은 디렉토리 /u01/app/oracle/admin/SWBT4/wallet에 저장됩니다. $ORACLE_HOME/network/admin 디렉토리에 저장되는 sqlnet.ora 파일에서 디렉토리를 지정하여 다른 디렉토리를 선택할 수 있습니다. 예를 들어 지갑을 /orawall 디렉토리에 저장하려면 sqlnet.ora 파일에 다음 행을 추가합니다.

ENCRYPTION_WALLET_LOCATION =
 (SOURCE=
   (METHOD=file)
     (METHOD_DATA=
       (DIRECTORY=/orawall)))

이 예제에서는 기본 위치가 선택된 것으로 가정합니다. 또한 지갑 위치를 정기적 백업에 포함시켜야 합니다.

2. 지갑을 생성합니다.
이제 지갑을 생성하고 지갑에 액세스하기 위한 암호를 설정합니다. 이 작업을 하려면 ALTER SYSTEM 권한을 가진 사용자로서 다음 명령을 실행합니다.

alter system set encryption key 
authenticated by "remnant";

이 명령은 다음을 수행합니다.

  • 단계 1에서 지정한 위치에 지갑을 생성합니다.
  • 지갑의 암호를 "remnant"로 설정합니다.
  • 마스터 키를 저장하고 검색할 TDE에 대한 지갑을 엽니다.

암호는 대소문자를 구분하며 큰 따옴표로 묶어야 합니다. 암호 "remnant"는 어느 동적 성능 뷰나 로그에도 일반 텍스트로 표시되지 않습니다.

지갑 열기

지갑은 한 번만 생성되기 때문에 앞의 두 단계는 한 번만 수행해야 합니다. 그러나 데이터베이스 인스턴스가 시작된 후에 지갑을 명시적으로 열어야 합니다. 지갑을 생성할 때(앞의 단계 2) 사용할 지갑을 열어야 합니다. 지갑을 생성하고 암호를 설정한 후 데이터베이스를 열 때마다 동일한 암호를 사용하여 다음과 같이 지갑을 열어야 합니다.

alter system set encryption wallet open authenticated by "remnant";

지갑을 닫으려면 다음 명령을 실행합니다.

alter system set encryption wallet close;

TDE를 사용하려면 지갑을 열어야 합니다. 지갑이 닫혀 있는 경우 암호화되지 않은 열에 액세스할 수 있으나 암호화된 열에는 액세스할 수 없습니다.

열 암호화

TDE를 사용하여 열을 암호화하려면 단지 열 정의에 간단한 절, ENCRYPT를 추가하기만 하면 됩니다. 그러나 추가하기 전에 사용할 암호화 유형과 키 길이를 선택해야 합니다. 이 문제에 대한 자세한 설명은 위에서 언급한 "데이터 자산의 암호화" 기사를 참조하십시오.

정규 스키마에서 다음의 계정 소유자의 테이블이 있다고 가정합시다.

ACC_NO      NUMBER
ACC_NAME    VARCHAR2(30) 
SSN         VARCHAR2(9)

현재 테이블의 모든 데이터는 일반 텍스트입니다. 주민등록번호가 저장된 열 SSN을 변환하여 암호화됨으로 저장하려고 합니다. 다음 명령을 실행할 수 있습니다.

alter table accounts modify (ssn encrypt);

이 명령문은 다음 두 작업을 수행합니다.

  • 테이블에 대한 암호화 키를 생성합니다. 암호화된 형식을 사용하여 동일한 테이블의 다른 열을 변경할 경우 동일한 테이블 키가 사용됩니다.
  • 열의 모든 값을 암호화된 형식으로 변환합니다.

이 명령은 열의 데이터 유형이나 크기를 변경하지 않으며 트리거 또는 뷰를 생성하지 않습니다.

기본적으로 192비트 키를 사용하는 알고리즘 AES가 암호화에 사용됩니다. 명령에 해당 절을 추가적으로 지정하여 다른 알고리즘을 선택할 수 있습니다. 예를 들어 128비트 AES 암호화를 사용하려면 다음과 같은 명령을 사용합니다.

alter table accounts modify (ssn encrypt using 'AES128');

AES128, AES192, AES256 또는 3DES168(168비트 Triple DES 알고리즘)을 절로서 사용할 수 있습니다. 이 값은 설명할 필요 없이 자명합니다. 예를 들어AES256은 256비트 키를 사용하는 AES(Advanced Encryption Standard) 알고리즘을 의미합니다.

열을 암호화한 후 테이블을 설명할 때 다음이 나타납니다.

SQL> desc accounts

Name	       Null?	      Type
------------   ------------   --------------------------------------------------
ACC_NO		              NUMBER
ACC_NAME		      VARCHAR2(30)
SSN		              VARCHAR2(9) ENCRYPT

데이터 유형 다음의 ENCRYPT 키워드에 주의하십시오. 데이터베이스에서 암호화된 열을 찾으려면 데이터 딕셔너리 뷰 DBA_ENCRYPTED_COLUMNS를 검색할 수 있습니다. (SYS 소유 테이블에 대해 TDE를 사용할 수 없습니다.)

성능 고려 사항

암호화와 해독은 CPU 주기를 소비하기 때문에 성능에 대한 영향을 고려해야 합니다. 테이블의 암호화되지 않은 열에 액세스할 때 성능은 TDE가 없는 테이블과 다르지 않습니다. 그러나 암호화된 열에 액세스할 때 selects 시 해독하는 동안과 inserts 시 암호화하는 동안 작은 성능 오버헤드가 발생하며 따라서 열을 선택적으로 암호화해야 합니다. 열을 암호화할 필요가 없을 경우 다음을 사용하여 TDE를 해제할 수 있습니다.

alter table account modify (ssn decrypt);

또한 인덱스 사용을 고려하십시오. 위 예에서 열 SSNin_accounts_ssn이라는 이름의 인덱스가 있다고 가정합시다. ACCOUNTS 테이블에 대한 질의에 다음과 같이 동등 술어가 있을 경우

select * from accounts 
where ssn = '123456789';

인덱스 in_accounts_ssn이 사용됩니다. 질의에서 다음과 같이 LIKE 술어를 사용할 경우

select * from accounts 
where ssn like '123%';

인덱스가 무시되고 전체 테이블 스캔이 사용됩니다. 그 이유는 간단합니다. 인덱스의 B 트리 구조에서 앞 몇 문자가 동일한 값("fraternal", "fraternity" 등)은 물리적으로 서로 가까이 있습니다. LIKE 술어를 처리할 때 Oracle Database 10g는 패턴 일치를 사용하여 인덱스 항목을 검색하고 물리적 근접성이 인덱스 검색 속도를 증가시키므로 전체 테이블 스캔보다 좋습니다.

그러나 열을 암호화할 경우 인덱스의 실제 값이 암호화되었기 때문에 크게 다르고 따라서 인덱스 전역에 흩어져 있습니다. 그렇기 때문에 전체 테이블 스캔보다 인덱스 스캔이 더 많은 리소스를 사용합니다. 그래서 이 LIKE 술어 질의 예제에서 Oracle Database 10g는 인덱스를 무시하고 전체 테이블 스캔을 선택합니다. 동등 술어의 경우 패턴을 따르는 여러 값 대신에 특정 인덱스 항목이 검색됩니다. 그래서 인덱스를 사용한 실행 경로가 전체 테이블 스캔보다 속도가 빠르며 최적기가 인덱스 사용을 선택합니다. 암호화할 열을 결정할 때 암호화가 인덱스에 얼마나 영향을 주는지 고려하고 암호화 열을 포함하는 특정 질의를 재작성해야 하는 경우가 있으니 주의하십시오.

키와 암호 관리

누군가가 테이블 키를 알고 있거나 암호화된 테이블 키를 해독했을지도 모른다는 의심이 들 때에는 어떻게 할까요? 간단하게 테이블에 대한 새 키를 생성할 수 있고 간단한 명령을 실행하여 새로운 테이블 키를 사용하여 암호화된 열 값을 다시 생성할 수 있습니다. 또한 이 작업을 할 때 AES256 등 다른 암호화 알고리즘을 선택할 수도 있습니다. 다음 명령을 수행하여 두 작업을 수행할 수 있습니다.

alter table accounts rekey using 'aes256';

누군가가 지갑 암호를 알고 있을 경우 어떻게 할까요? Oracle Wallet Manager를 사용하여 암호를 변경할 수 있습니다. 이 그래픽 툴을 호출하려면 명령줄에 OWM을 입력합니다(그림 2 참조). 상단 메뉴에서 지갑 -> 열기를 선택하고 지정한 지갑 위치를 선택한 다음 지갑 암호를 입력합니다. 그런 다음 지갑 -> 암호 변경을 선택하여 암호를 변경합니다. 지갑 암호를 변경하여도 키는 변경되지 않습니다.

figure 2
그림 2: Oracle Wallet Manager

암호화와 함께 "Salt"를 원하십니까?

암호화는 완전히 데이터를 숨기지만 때때로 데이터의 원본 일반 텍스트 값에 반복되는 값이 있을 경우 암호화된 데이터 값을 쉽게 추측할 수 있습니다. 예를 들어 급여 정보 테이블에 반복되는 값이 포함될 수 있습니다. 이 경우에 암호화된 값도 동일하며 침입자가 동일한 급여 항목을 판별할 수 있습니다. 그러한 경우를 방지하기 위해 입력 데이터가 같더라도 암호화된 값이 다르도록 데이터에 "salt"를 추가합니다. 기본적으로 TDE는 salt를 적용합니다. 암호화된 열에 대한 인덱스를 생성할 경우 인덱스에 salt를 포함시킬 수 없습니다. 예를 들어 SSN 열에서 salt를 제거하려면 다음을 실행합니다.

alter table accounts modify 
(ssn encrypt no salt);

salt를 사용하여 암호화된 열에 대한 인덱스를 생성할 경우 다음 예에서와 같이 오류가 발생합니다.

SQL> create index in_acc_01 
on accounts (ssn);

ORA-28338: cannot encrypt indexed column(s) with salt

salt를 사용하여 인덱스된 열을 암호화할 경우에도 동일한 오류가 발생합니다. 마찬가지로 암시적 인덱스 생성이 있을 경우, 즉 열이 기본 키의 일부이거나 unique로 정의된 경우 salt를 사용할 수 없습니다. 또한 열이 외래 키의 일부인 경우에도 salt를 사용할 수 없습니다.

TDE와 Data Pump 사용

기본적으로 Data Pump 엑스포트 유틸리티(EXPDP)를 사용하여 암호화된 열이 있는 테이블의 데이터를 엑스포트할 경우 생성되는 덤프 파일의 데이터는 일반 텍스트입니다(암호화된 열 데이터의 경우에도 마찬가지). 다음 명령은 ACCOUNTS 테이블(암호화된 열이 있음)을 엑스포트하고 경고를 반환합니다.

다음 단계

암호화에 대한
추가 정보를 참조하십시오.
oracle.com/technology/oramag/oracle/05-jan/o15security.html
www.dbazine.com/olc/olc-articles/nanda11

투명한 데이터 암호화에 대한 추가 정보를 참조하십시오.
Oracle Database Advanced Security Administrator's Guide

$ expdp arup/arup tables=accounts

ORA-39173: Encrypted data has been stored unencrypted in dump file set.

이 메시지는 단지 경고이고 오류가 아니며 행이 엑스포트됩니다..

Data Pump 덤프 파일의 암호화된 열 데이터를 보호하려면 테이블을 엑스포트할 때 덤프 파일을 암호로 보호할 수 있습니다. EXPDP 명령에서 ENCRYPTION_PASSWORD 매개변수로 지정되는 이 암호는 이 엑스포트 프로세스에만 적용됩니다. 이것은 지갑 암호가 아닙니다. 목록 1은 암호 "pooh"를 사용하여 실행한 EXPDP 명령입니다. 목록 1의 명령에 대한 출력이 어떤 방식으로 암호 "pooh"를 표시하지 않는지 주목하십시오. 암호는 별표(*) 문자열로 숨겨집니다. 생성되는 덤프 파일에는 TDE로 암호화된 열의 일반 텍스트 데이터가 보이지 않습니다.

코드 목록 1: 암호로 보호된 덤프 파일의 엑스포트


$ expdp arup/arup ENCRYPTION_PASSWORD=pooh tables=accounts
 
Export: Release 10.2.0.0.0 - Beta on Friday, 01 July, 2005 16:14:06
 
Copyright (c) 2003, 2005, Oracle.  All rights reserved.
 
Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.0.0 - Beta
With the Partitioning, OLAP and Data Mining options
Starting "ARUP"."SYS_EXPORT_TABLE_01":  arup/******** ENCRYPTION_PASSWORD=********* tables=accounts 
Estimate in progress using BLOCKS method...
Processing ...

이 암호화된 덤프 파일을 임포트할 때 목록 2에서와 같이 엑스포트 시 사용한 동일한 암호를 지정해야 합니다.

코드 목록 2: 암호로 보호된 덤프 파일의 임포트


$ impdp arup/arup ENCRYPTION_PASSWORD=pooh tables=accounts table_exists_action=replace
 
Import: Release 10.2.0.0.0 - Beta on Friday, 01 July, 2005 16:04:20
 
Copyright (c) 2003, 2005, Oracle.  All rights reserved.
 
Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.0.0 - Beta
With the Partitioning, OLAP and Data Mining options
Master table "ARUP"."SYS_IMPORT_TABLE_01" successfully loaded/unloaded
Starting "ARUP"."SYS_IMPORT_TABLE_01":  arup/******** ENCRYPTION_PASSWORD=********* table_exists_action=replace 
Processing ...

다음은 임포트 시 ENCRYPTION_PASSWORD 매개변수를 지정하지 않은 경우의 결과입니다.

$ impdp arup/arup tables=accounts

ORA-39174: Encryption password must 
be supplied.

다음은 틀린 암호를 지정한 경우의 결과입니다.

$ impdp arup/arup ENCRYPTION_PASSWORD
=piglet tables=accounts

ORA-39176: Encryption password is 
incorrect.

원본 엑스포트 유틸리티(EXP)는 암호화된 열이 있는 테이블을 엑스포트할 수 없습니다..

결론

공격으로부터 데이터를 보호하고 기업에 적용되는 많은 법률을 준수하는 일은 간단한 작업이 아닙니다. TDE를 사용하면 코딩이나 키 관리 복잡성 없이 데이터 암호화와 준수를 모두 수행할 수 있으므로 더 전략적 활동에 주력할 수 있습니다.


Arup Nanda (arup@proligence.com) 는 뉴욕주 White Plains에 소재한 Starwood Hotels and Resorts의 선임 DBA이며, Rampant Press에서 출판된 Oracle Privacy Security Auditing(2003)의 공동 저자입니다.

Posted by 1010
02.Oracle/DataBase2009. 4. 27. 14:26
반응형
출처 : http://yamoe.tistory.com/98

0. sqlplus
(sqlplus 실행)
    SQL*Plus: Release 10.2.0.1.0 - Production on Thu Feb 12 14:11:00 2009
   
    Copyright (c) 1982, 2005, Oracle.  All rights reserved.
   
    Connected to:
    Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
    With the Partitioning, OLAP and Data Mining options

1. > select * from PRODUCT_COMPONENT_VERSION
    PRODUCT                                                           VERSION        STATUS
    ----------------------------------------------------------------------------------------------
    NLSRTL                                                            10.2.0.1.0     Production
    Oracle9i Enterprise EditionOracle Database 10g Enterprise Edition 10.2.0.1.0     Production
    PL/SQL                                                            10.2.0.1.0     Production
    TNS for Linux:                                                    10.2.0.1.0     Production

2. > select * from V$VERSION
    BANNER
    ----------------------------------------------------------------
    Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
    PL/SQL Release 10.2.0.1.0 - Production
    CORE    10.2.0.1.0      Production
    TNS for Linux: Version 10.2.0.1.0 - Production
    NLSRTL Version 10.2.0.1.0 - Production

3. ojdbc14.jar 버전 확인(Oracle JDBC Driver) : jar 압축 풀면 META-INF/MANIFEST.MF에 버전 정보 들어있음.
Posted by 1010
02.Oracle/DataBase2009. 4. 27. 14:23
반응형
select name, value from v$parameter where name like '%service%' 
Posted by 1010
02.Oracle/DataBase2009. 4. 27. 13:38
반응형

select * from v$sqltext where rownum < 100;

select * from v$sqlarea where rownum < 100;

select * from v$sql order by first_load_time desc;

Posted by 1010
02.Oracle/DataBase2009. 4. 25. 16:05
반응형
Oracle Rollup, Cube, and Grouping Sets
Version 10.2
 
General
Rollup Note: ROLLUP enables a SELECT statement to calculate multiple levels of subtotals across a specified group of dimensions. It also calculates a grand total. ROLLUP is a simple extension to the GROUP BY clause, so its syntax is extremely easy to use. The ROLLUP extension is highly efficient, adding minimal overhead to a query.

The action of ROLLUP is straight forward: it creates subtotals that roll up from the most detailed level to a grand total, following a grouping list specified in the ROLLUP clause. ROLLUP takes as its argument an ordered list of grouping columns. First, it calculates the standard aggregate values specified in the GROUP BY clause. Then, it creates progressively higher-level subtotals, moving from right to left through the list of grouping columns. Finally, it creates a grand total.

ROLLUP creates subtotals at n+1 levels, where n is the number of grouping columns. For instance, if a query specifies ROLLUP on grouping columns of time, region, and department (n=3), the result set will include rows at four aggregation levels.
Cube Note: CUBE takes a specified set of grouping columns and creates subtotals for all of their possible combinations. In terms of multidimensional analysis, CUBE generates all the subtotals that could be calculated for a data cube with the specified dimensions. If you have specified CUBE(time, region, department), the result set will include all the values that would be included in an equivalent ROLLUP statement plus additional combinations.

Consider Using CUBE in any situation requiring cross-tabular reports. The data needed for cross-tabular reports can be generated with a single SELECT using CUBE. Like ROLLUP, CUBE can be helpful in generating summary tables. Note that population of summary tables is even faster if the CUBE query executes in parallel.

CUBE is typically most suitable in queries that use columns from multiple dimensions rather than columns representing different levels of a single dimension. For instance, a commonly requested cross-tabulation might need subtotals for all the combinations of month, state, and product. These are three independent dimensions, and analysis of all possible subtotal combinations is commonplace. In contrast, a cross-tabulation showing all possible combinations of year, month, and day would have several values of limited interest, because there is a natural hierarchy in the time dimension. Subtotals such as profit by day of month summed across year would be unnecessary in most analyses.
 
Create demo schema @$ORACLE_HOME\demo\schema\sales_history\sh_main.sql
 
ROLLUP
Full Rollup Demo SQL Statement col country_name format a25

SELECT ch.channel_desc, t.calendar_month_desc, co.country_name,
TO_CHAR(SUM(s.amount_sold), '9,999,999,999') SALES$
FROM sales s, customers cu, times t, channels ch, countries co
WHERE s.time_id = t.time_id
AND s.cust_id = cu.cust_id
AND s.channel_id = ch.channel_id
AND cu.country_id = co.country_id
AND ch.channel_desc IN ('Direct Sales','Internet')
AND t.calendar_month_desc IN ('2000-09', '2000-10')
AND co.country_name LIKE 'U%'
GROUP BY ROLLUP(ch.channel_desc, t.calendar_month_desc, co.country_name);
Partial Rollup Demo SQL Statement SELECT ch.channel_desc, t.calendar_month_desc, co.country_name,
TO_CHAR(SUM(s.amount_sold), '9,999,999,999') SALES$
FROM sales s, customers cu, times t, channels ch, countries co
WHERE s.time_id = t.time_id
AND s.cust_id = cu.cust_id
AND s.channel_id = ch.channel_id
AND ch.channel_desc IN ('Direct Sales','Internet')
AND t.calendar_month_desc IN ('2000-09', '2000-10')
AND co.country_name LIKE 'U%'
GROUP BY ch.channel_desc, ROLLUP(t.calendar_month_desc, co.country_name);
 
GROUP_ID

The following demonstrates a GROUP BY with repeating values and their identification with the GROUP_ID() function
GROUP_ID()
CREATE TABLE grp_rep (
person_id   NUMBER(3),
division    VARCHAR2(3),
commission  NUMBER(5));

INSERT INTO grp_rep VALUES (1,'SAM',1000);
INSERT INTO grp_rep VALUES (2,'EUR',1200);
INSERT INTO grp_rep VALUES (1,'EUR',1450);
INSERT INTO grp_rep VALUES (1,'EUR',700);
INSERT INTO grp_rep VALUES (2,'SEA',1000);
INSERT INTO grp_rep VALUES (2,'SEA',2000);
INSERT INTO grp_rep VALUES (1,'EUR',800);
COMMIT;

SELECT person_id, division, SUM(commission)
FROM grp_rep
GROUP BY person_id, division;

SELECT person_id, division, SUM(commission)
FROM grp_rep
GROUP BY person_id, ROLLUP (person_id, division);

SELECT person_id, division, SUM(commission), GROUP_ID() g
FROM grp_rep
GROUP BY person_id, ROLLUP (person_id, division);

SELECT person_id, division, SUM(commission), GROUP_ID() g
FROM grp_rep
GROUP BY person_id, ROLLUP (person_id, division)
HAVING GROUP_ID() = 0;
 
GROUPING
Distinguishes superaggregate rows from regular grouped rows.
Distinguish a null representing the set of all values in a superaggregate row from a null in a regular row.
GROUPING(<expression>)
conn hr/hr

set linesize 121
col job format a10

SELECT DECODE(department_name, '1', 'All Departments',
department_name) AS DEPARTMENT,
DECODE(job_id, '1', 'All Jobs', job_id) AS job,
COUNT(*) "Total Empl", AVG(salary) * 12 "Average Sal"
FROM employees e, departments d
WHERE d.department_id = e.department_id
GROUP BY ROLLUP (department_name, job_id);

SELECT DECODE(GROUPING(department_name), '1', 'All Departments',
department_name) AS DEPARTMENT,
DECODE(GROUPING(job_id), '1', 'All Jobs', job_id) AS job,
COUNT(*) "Total Empl", AVG(salary) * 12 "Average Sal"
FROM employees e, departments d
WHERE d.department_id = e.department_id
GROUP BY ROLLUP (department_name, job_id);
 
GROUPING SETS
Demo from OTN conn sh/sh

SELECT channel_desc, calendar_month_desc, co.country_id,
TO_CHAR(SUM(amount_sold) , '9,999,999,999') SALES$
FROM sales, customers, times, channels, countries co
WHERE sales.time_id=times.time_id
AND sales.cust_id=customers.cust_id
AND sales.channel_id= channels.channel_id
AND customers.country_id = co.country_id
AND channels.channel_desc IN ('Direct Sales', 'Internet')
AND times.calendar_month_desc IN ('2000-09', '2000-10')
AND co.country_iso_code IN ('UK', 'US')
GROUP BY GROUPING SETS(
(channel_desc, calendar_month_desc, co.country_id),
(channel_desc, co.country_id),
(calendar_month_desc, co.country_id));

SELECT channel_desc, calendar_month_desc, co.country_id,
TO_CHAR(SUM(amount_sold) , '9,999,999,999') SALES$
FROM sales, customers, times, channels, countries co
WHERE sales.time_id=times.time_id
AND sales.cust_id=customers.cust_id
AND sales.channel_id= channels.channel_id
AND customers.country_id = co.country_id
AND channels.channel_desc IN ('Direct Sales', 'Internet')
AND times.calendar_month_desc IN ('2000-09', '2000-10')
AND co.country_iso_code IN ('UK', 'US')
GROUP BY CUBE(channel_desc, calendar_month_desc, co.country_id);
CUBE

Full Cube Rollup
GROUP BY CUBE()
conn sh/sh

col sales$ format a20

SELECT ch.channel_desc, calendar_month_desc, co.country_name,
TO_CHAR(SUM(s.amount_sold), '9,999,999,999') SALES$
FROM sales s, customers cu, times t, channels ch, countries co
WHERE s.time_id = t.time_id
AND s.cust_id = cu.cust_id
AND s.channel_id = ch.channel_id
AND ch.channel_desc IN ('Direct Sales', 'Internet')
AND t.calendar_month_desc IN ('2000-09', '2000-10')
AND co.country_name LIKE 'U%'
GROUP BY CUBE(channel_desc, t.calendar_month_desc, co.country_name);

Partial Cube Rollup
conn sh/sh

SELECT ch.channel_desc, calendar_month_desc, co.country_name,
TO_CHAR(SUM(s.amount_sold), '9,999,999,999') SALES$
FROM sales s, customers cu, times t, channels ch, countries co
WHERE s.time_id = t.time_id
AND s.cust_id = cu.cust_id
AND s.channel_id = ch.channel_id
AND ch.channel_desc IN ('Direct Sales', 'Internet')
AND t.calendar_month_desc IN ('2000-09', '2000-10')
AND co.country_name LIKE 'U%'
GROUP BY channel_desc, CUBE(t.calendar_month_desc, co.country_name);
 
GROUPING_ID
Returns a number corresponding to the GROUPING bit vector associated with a row.

In queries with many GROUP BY expressions, determining the GROUP BY level of a particular row requires many GROUPING functions, which leads to cumbersome SQL. GROUPING_ID is useful in these cases.
GROUPING_ID(<expression>, <expression>, ..)
conn sh/sh

SELECT channel_id, promo_id, SUM(amount_sold) s_sales,
GROUPING(channel_id) gc,
GROUPING(promo_id) gp
FROM sales
WHERE promo_id > 496
GROUP BY CUBE(channel_id, promo_id);

SELECT channel_id, promo_id, SUM(amount_sold) s_sales,
GROUPING(channel_id) AS GC,
GROUPING(promo_id) AS GP,
GROUPING_ID(channel_id, promo_id) AS GCP,
GROUPING_ID(promo_id, channel_id) AS GPC
FROM sales
WHERE promo_id > 496
GROUP BY CUBE(channel_id, promo_id);
 
출처 :: http://www.psoug.org/reference/OLD/rollup.html#gbgi
Posted by 1010
02.Oracle/DataBase2009. 4. 24. 15:16
반응형
http://www.oracleclub.com/article/11368

현재는 삼성SDS에 근무중이신 양진석 DBA님께서 프로젝트 기간중에 직접 작성하신 내용들을 몰래(?) 빼내서 올립니다.


요즈음 한참 바빠서 자바쪽 강의를 계속 쉬고 있어 죄송하네요^^ 앞으로 계속 정진하도록 노력하겠습니다.


파일백업을 물리적으로 하는 방법도 있지만 전체를 백업받고 또 문제가 생겼을 때 그것이 아주 작은 문제라 하더라도 전체를 복구하고 ... 머 이런식으로 해도 되지만 이건 좀 문제가 있죠. 그래서 논리적 백업과 복구(export / import)를 가끔 해주시면 DB관리를 좀 더 효율적으로 해줄 수 있지 않을까 합니다.

정기기적으로 물리적인 백업을 해주시고, 주기적으로 아래처럼 테이블 단위의 논리적인 백업을 해주시면 좋을듯 싶습니다.


주의해서 보실 부분은 붉은 글씨 부분이며 여러가지 옵션은 검색을 하시거나 책을 보시면 자세히 나와 있습니다. 그리고 반대로 import는 문제가 생겼을 때 해주시면 되겠죠.


#!/bin/ksh

export ORACLE_HOME=/oracle

export NLS_LANG=American_America.KO16KSC5601

export PATH=$PATH:$HOME/bin:$ORACLE_HOME/bin:$ORACLE_HOME/lib

export ORACLE_SID=UNIABS

DATE=`date '+%Y%m%d'`
LOG_FILE="/unidb3/export_backup/IRIS_Full_${DATE}.log"
DUMP_FILE="/unidb3/export_backup/IRIS_Full_${DATE}.dmp"

find /oracle2/orabackup/data/. -name "IRIS_Full*" -exec rm -fr {} \;
mknod /tmp/exp_IRIS p
compress </tmp/exp_IRIS> /unidb3/export_backup/IRIS_Full_${DATE}.dmp.Z &

echo `date` >> $LOG_FILE
#exp system/iris920 file=$DUMP_FILE full=y buffer=6000000 log=$LOG_FILE
exp system/iris920 file=/tmp/exp_IRIS full=y buffer=6000000 log=$LOG_FILE
# exp를 통신화일에 집어넣고 그 파일을 background로 compress한다.
echo `date` >> $LOG_FILE


양진석 DBA 께서 아주 간단한 내용이라고 하지만 저는 좀 어렵네요^^

Posted by 1010
02.Oracle/DataBase2009. 4. 24. 15:16
반응형

출처 : http://oracleclub.com/article/12449

아시는 분은 아시리라 생각이 됩니다만 행여나 도움이 될까 해서 이렇게 몇 글자 적습니다.


우리 보통 일련번호를 만들 때면 max(일련번호)를 조회한 후 다음 쿼리를 시작하죠. 이 경우에는 두 번의 SQL 문장이 실행되었으므로 매우 비 효율적이라 할 수 있습니다.

그래서 이 단점을 보완한 것이 decode 문을 이용해서 한번에 처리하는 방법이 나왔습니다. 그러나 이 방법 역시 데이터가 적을 경우에는 상관이 없으나 대량의 데이터가 되면 상황은 완전히 달라지죠. 그 많은 데이터를 grouping 해야 하니까요.

그래서 채번 테이블이라는 것을 구성해서 일련번호가 일정 수준 이상까지는 증가하지 못하도록 구성을 하죠.


* PK 코드 + 구분 + 일련번호로 구성된 테이블이 있다고 하면 쿼리는 아래처럼 되겠죠.


select 최종일련번호 + 1

into     :v_주문일련번호

from    주문

where  코드 = '001'

and     구분 = 'off line'


그 후에는 보통 본 테이블에 입력을 하는 쿼리가 오겠죠.


그러나 이것도 여러명의 사용자가 이용할 경우에는 중복에 문제가 있기 때문에 FOR UPDATE를 통한 Lock을 걸어주어야 하므로 결국 잠금으로 인한 부하가 발생할 수 있습니다.


그래서 최종적으로 도출된 것이 인덱스 역방향 정렬을 이용한 채번 방법이라는 것이 있습니다.


/* i_01: 인덱스명 */

insert into 주문(주문일련번호, col2, col3, ...)

select /*+ INDEX_DESC(B i_01) +*/

from   주문 A,

         목록 B

where A.주문일련번호 = B.주문일련번호

and    rownum = 1;


인덱스 역방향 정렬을 이용하여 ROWNUM = 1에 해당하는 데이터를 조회하였으므로 성능도 좋고, 잠금으로 인한 대기현상도 나타나지 않겠죠.

Posted by 1010
02.Oracle/DataBase2009. 4. 24. 12:19
02.Oracle/DataBase2009. 4. 24. 11:36
반응형
출처 : http://mudchobo.tomeii.com/tt/279?category=12

저는 전에 데이터를 SELECT해와서 데이터가 0개면 INSERT하고, 있는 놈이면 해당 값을 업데이트 하는 식으로 했었는데요. 우연히 MERGE INTO라는 것을 알게 되었네요.

ORACLE에서만 되는 듯 하네요-_-; 9i이상에서만 된다고 하네요.

MERGE INTO의 목적은 어떤 테이블이나 뷰테이블을 해당 목표테이블과 합체(MERGE)하기 위한 목적인데요. 이걸 이용해서 데이터가 들어왔을 때 있는 데이터면 UPDATE하고, 없는 데이터면 INSERT하는 형태로도 쓰일 수 있습니다.

http://radiocom.kunsan.ac.kr/lecture/oracle/sql/merge.html
위에는 MERGE INTO를 잘 설명한 사이트네요.

여기서 조금 응용하면 원하는 대로 구현할 수 있습니다-_-;

MERGE INTO 테이블명  별칭
USING 대상테이블/뷰  별칭
ON 조인조건
WHEN MATCHED THEN
  UPDATE SET
   컬럼1=값1
   컬럼2=값2
WHEN NOT MATCHED THEN
  INSERT (컬럼1,컬럼2,...)
       VALUES(값1,값2,...);

MERGE INTO다음에 나오는 테이블명은 실제로 데이터가 들어가거나 업데이트 되는 테이블이구요.
USING 다음에 나오는 테이블명은 실제 데이터를 가져오거나 할 테이블이구요.
ON은 WHERE과 같은 조건문이죠.
WHEN MATCHED THEN은 매치되는게 있으면 UPDATE하라는 얘기구요.
WHEN NOT MATCHED THEN은 매치되는게 없으면 INSERT하게 되죠.

응용해봅시다.

           MERGE INTO INSERTTABLE
           USING DUAL
           ON (ID = 1)
           WHEN MATCHED THEN
           UPDATE SET
           DATA = 'idoori'
           WHEN NOT MATCHED THEN
           INSERT (ID, DATA)
           VALUES (1, 'mudchobo')

INSERTTABLE이라는 곳에 USING은 DUAL이라고 했는데 DUAL은 dual은 1개의 레코드 만을 갖는 dummy 테이블이라고 합니다. select 1 from dual해버리면, 1이 나오죠. 대상테이블은 필요없으니 dual로 설정합니다.
ON에서 ID = 1은 ID가 1인게 만약 있으면, DATA부분을 idoori로 업데이트하고, 없으면 mudchobo로 넣게 되는겁니다.

아놔 별거 없는데 막 늘어썼네-_-;
Posted by 1010
02.Oracle/DataBase2009. 4. 24. 11:29
반응형
출처 : http://mudchobo.tomeii.com/tt/293?category=12

오라클 10G R2부터 TDE라는 기능을 제공합니다.
(참고로 Enterprise 이상의 버전에서만 됩니다. Oracle XE를 설치했는데 안되서 삽질했었습니다-_-)

말그대로 Transparent(투명한) Database Encryption(데이터베이스 암호화) 입니다-_-;
투명하다는 얘기는 암호화가 투명하게 되었다는 얘기인데요.
암호화가 되어서 DATABASE에 저장이 되지만, 암호화가 됐는지 확인 하는 방법은 며느리도 모릅니다.
해당 계정의 사용자는 데이터를 다 볼 수 있어야하니깐요 ^^
데이터베이스를 도난당했을 때 해당계정의 비밀번호를 모르는 이상 데이터베이스를 확인 할 수 없는 것 같습니다.
즉, SQL Injection같이 Application 단에서 발생하는 해킹은....소용없다는 얘기죠.

장점이 있다면 어플리케이션을 변경하지 않아도, 데이터베이스를 암호화 할 수 있습니다.

어쨌든 암호화가 필요해서 체험해봤습니다.
우선 ORACLE 10g이 필요하죠.

전자지갑을 생성해야합니다.
cd $ORACLE_HOME/network/admin
sqlnet.ora파일을 편집해서 아래와 같은 내용을 넣습니다.
ENCRYPTION_WALLET_LOCATION=
  (SOURCE=(METHOD=FILE)(METHOD_DATA=
   (DIRECTORY=/export/home/oracle/oracle/product/10.2.0/db_2/)))

전자지갑 저장소를 설정하는 듯하네요.

이제 오라클에 접속해봅시다.
-bash-3.00$ sqlplus /nolog

SQL*Plus: Release 10.2.0.2.0 - Production on Wed Jul 16 16:57:08 2008

Copyright (c) 1982, 2005, Oracle.  All Rights Reserved.

SQL> connect / as sysdba
Connected.
SQL> alter system set key identified by "welcome1";

System altered.

SQL>

이게 마스터키를 생성하는 부분인데요. 마스터키는 단 한번만 생성되어야 한다고 합니다. 다시 생성하게 되면 기존에 암호화 되어있던 데이터를 다시 암호화 해야한다는군요. 무슨 얘기지-_-;

저거대로 따라할라니까 힘들어서-_-; 그냥 insert해서 로그에 안찍히는 것만 보여주도록 해봅시다-_-;
Oracle LogMiner라는 놈을 이용해서 로그를 볼 수 있는데 이놈은 암호화된 데이터를 지원하지 않습니다. 그래서 암호화된 데이터는 보여지지가 않습니다.

테이블을 생성해봅시다.

connect oe/oe
create table cust_payment_info 
(first_name varchar2(11),
last_name varchar2(10),
order_number number(5),
credit_card_number varchar2(16) ENCRYPT NO SALT,
active_card varchar2(3));

Table created.
자세히 보면 credit_card_number 부분에만 ENCRYPT NO SALT라는 것을 적용했네요.
이렇게 해버리면 테이블 구조만 바꾸면서 암호화를 할 수 있습니다. 이미 만들어진 어플리케이션은 손대지 않아도 됩니다. 8i에서 제공하는 방법이 찾아보니까 있었는데 그건 키테이블을 따로 만들어서 데이터를 암호화시킨 상태에서 저장해버립니다. 나중에 데이터를 가져올 때 복호화 하고 그런식으로 하더라구요. 그거나 이거나 암호화해서 저장되는 법은 똑같습니다.

데이터를 insert해봅시다.
예제에는 조낸 많이 삽입하는데 조낸 귀찮으니까 1개만 삽입해봅시다-_-;
SQL> insert into cust_payment_info values
  2    ('Jon', 'Oldfield', 10001, '5446959708812985','YES');

1 row created.

SQL>

또 예제에서는 뭔가 삽질을 하는데 귀찮으니까 바로 로그확인에 들어갑시다-_-;
oradata에 있는 redo01~3으로 설정해주어야합니다.
SQL> connect / as sysdba;
Connected.
SQL> alter database add supplemental log data;

Database altered.

SQL> REM select member as LOG_FILE_LOCATION from v$logfile;
SQL> EXECUTE DBMS_LOGMNR.ADD_LOGFILE ('/export/home/oracle/oradata/orcl/redo03.log', DBMS_LOGMNR.NEW);

PL/SQL procedure successfully completed.

SQL> EXECUTE DBMS_LOGMNR.ADD_LOGFILE ('/export/home/oracle/oradata/orcl/redo02.log', DBMS_LOGMNR.ADDFILE);

PL/SQL procedure successfully completed.

SQL> EXECUTE DBMS_LOGMNR.ADD_LOGFILE ('/export/home/oracle/oradata/orcl/redo01.log', DBMS_LOGMNR.ADDFILE);

PL/SQL procedure successfully completed.

SQL> EXECUTE DBMS_LOGMNR.START_LOGMNR (options => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG + DBMS_LOGMNR.COMMITTED_DATA_ONLY);

PL/SQL procedure successfully completed.

SQL> select sql_redo from v$logmnr_contents where
  2  table_name = 'CUST_PAYMENT_INFO' and operation='INSERT';

SQL_REDO
--------------------------------------------------------------------------------
insert into "OE"."CUST_PAYMENT_INFO"("FIRST_NAME","LAST_NAME","ORDER_NUMBER","CR
EDIT_CARD_NUMBER","ACTIVE_CARD") values ('Jon','Oldfield','10001',Unsupported Ty
pe,'YES');


SQL>

결과에 암호화된 칼럼은 Unsupported Type이라고 뜨는군요.
잘은 모르지만 암호화가 된 듯 합니다.

암튼 손쉽게 암호화 할 수 있게 해놨군요.
어플리케이션에 손대지 않는 방법을 찾다가 이짓까지 삽질해보는군요.
Posted by 1010
02.Oracle/DataBase2009. 4. 24. 11:25
반응형

ROWNUM의 동작 원리와 활용 방법
저자 - Tom Kyte

오라클 전문가 Tom Kyte가 ROWNUM의 동작 원리와 활용 방법에 대해 설명합니다.

이번 호의 Ask Tom 컬럼은 지금까지와는 조금 다른 내용을 담고 있습니다. 필자는 오라클 데이터베이스에서 Top-N 쿼리와 페이지네이션(pagination) 쿼리를 구현하는 방법에 대해 자주 질문을 받곤 합니다. 하나의 컬럼을 통해 이러한 질문에 한꺼번에 대답하기 위한 방편으로, < Effective Oracle by Design (Oracle Press, 2003)> 의 내용을 인용하기로 했습니다. 컬럼의 포맷에 맞게 책의 내용이 다소 수정되었음을 참고하시기 바랍니다.

결과 셋의 제한

ROWNUM은 오라클 데이터베이스가 제공하는 마술과도 같은 컬럼입니다. 이 때문에 많은 사용자들이 문제를 겪기도 합니다. 하지만 그 원리와 활용 방법을 이해한다면 매우 유용하게 사용할 수 있습니다. 필자는 주로 두 가지 목적으로 ROWNUM을 사용합니다.

  • Top-N 프로세싱: 이 기능은 다른 일부 데이터베이스가 제공하는 LIMIT 구문과 유사합니다.
  • 쿼리 내에서의 페이지네이션(pagination) – 특히 웹과 같은 "stateless" 환경에서 자주 활용됩니다. 필자는 asktom.oracle.com 웹 사이트에서도 이 테크닉을 사용하고 있습니다.

두 가지 활용 방안을 설명하기 전에, 먼저 ROWNUM의 동작 원리에 대해 살펴 보기로 하겠습니다

ROWNUM의 동작 원리

ROWNUM은 쿼리 내에서 사용 가능한 (실제 컬럼이 아닌) 가상 컬럼(pseudocolumn)입니다. ROWNUM에는 숫자 1, 2, 3, 4, ... N의 값이 할당됩니다. 여기서 N 은 ROWNUM과 함께 사용하는 로우의 수를 의미합니다. ROWNUM의 값은 로우에 영구적으로 할당되지 않습니다(이는 사람들이 많이 오해하는 부분이기도 합니다). 테이블의 로우는 숫자와 연계되어 참조될 수 없습니다. 따라서 테이블에서 "row 5"를 요청할 수 있는 방법은 없습니다. "row 5"라는 것은 존재하지 않기 때문입니다.

또 ROWNUM 값이 실제로 할당되는 방법에 대해서도 많은 사람들이 오해를 하고 있습니다. ROWNUM 값은 쿼리의 조건절이 처리되고 난 이후, 그리고 sort, aggregation이 수행되기 이전에 할당됩니다. 또 ROWNUM 값은 할당된 이후에만 증가(increment) 됩니다. 따라서 아래 쿼리는 로우를 반환하지 않습니다.

select * 
  from t 
 where ROWNUM > 1;

첫 번째 로우에 대해 ROWNUM > 1의 조건이 True가 아니기 때문에, ROWNUM은 2로 증가하지 않습니다. 아래와 같은 쿼리를 생각해 봅시다.

select ..., ROWNUM
  from t
 where <where clause>
 group by <columns>
having <having clause>
 order by <columns>;

이 쿼리는 다음과 같은 순서로 처리됩니다.

1. FROM/WHERE 절이 먼저 처리됩니다.
2. ROWNUM이 할당되고 FROM/WHERE 절에서 전달되는 각각의 출력 로우에 대해 증가(increment) 됩니다.
3. SELECT가 적용됩니다.
4. GROUP BY 조건이 적용됩니다.
5. HAVING이 적용됩니다.
6. ORDER BY 조건이 적용됩니다.

따라서 아래와 같은 쿼리는 에러가 발생할 수 밖에 없습니다.

select * 
  from emp 
 where ROWNUM <= 5 
 order by sal desc;

이 쿼리는 가장 높은 연봉을 받는 다섯 명의 직원을 조회하기 위한 Top-N 쿼리로 작성되었습니다. 하지만 실제로 쿼리는 5 개의 레코드를 랜덤하게(조회되는 순서대로) 반환하고 salary를 기준으로 정렬합니다. 이 쿼리를 위해서 사용되는 가상코드(pseudocode)가 아래와 같습니다.

ROWNUM = 1
for x in 
( select * from emp )
loop
    exit when NOT(ROWNUM <= 5)
    OUTPUT record to temp
    ROWNUM = ROWNUM+1
end loop
SORT TEMP

위에서 볼 수 있듯 처음의 5 개 레코드를 가져 온후 바로 sorting이 수행됩니다. 쿼리에서 "WHERE ROWNUM = 5" 또는 "WHERE ROWNUM > 5"와 같은 조건은 의미가 없습니다. 이는 ROWNUM 값이 조건자(predicate) 실행 과정에서 로우에 할당되며, 로우가 WHERE 조건에 의해 처리된 이후에만 increment 되기 때문입니다.

올바르게 작성된 쿼리가 아래와 같습니다.

select *
  from  
( select * 
    from emp 
   order by sal desc ) 
 where ROWNUM <= 5;

위 쿼리는 salary를 기준으로 EMP를 내림차순으로 정렬한 후, 상위의 5 개 레코드(Top-5 레코드)를 반환합니다. 아래에서 다시 설명되겠지만, 오라클 데이터베이스가 실제로 전체 결과 셋을 정렬하지 않습니다. (오라클 데이터베이스는 좀 더 지능적인 방식으로 동작합니다.) 하지만 사용자가 얻는 결과는 동일합니다.

ROWNUM을 이용한 Top-N 쿼리 프로세싱

일반적으로 Top-N 쿼리를 실행하는 사용자는 다소 복잡한 쿼리를 실행하고, 그 결과를 정렬한 뒤 상위의 N 개 로우만을 반환하는 방식을 사용합니다. ROWNUM은 Top- N쿼리를 위해 최적화된 기능을 제공합니다. ROWNUM을 사용하면 대량의 결과 셋을 정렬하는 번거로운 과정을 피할 수 있습니다. 먼저 그 개념을 살펴보고 예제를 통해 설명하기로 하겠습니다.

아래와 같은 쿼리가 있다고 가정해 봅시다.

select ... 
  from ... 
 where ... 
 order by columns;

또 이 쿼리가 반환하는 데이터가 수천 개, 수십만 개, 또는 그 이상에 달한다고 가정해 봅시다. 하지만 사용자가 실제로 관심 있는 것은 상위 N개(Top 10, Top 100)의 값입니다. 이 결과를 얻기 위한 방법에는 두 가지가 있습니다.

  • 클라이언트 애플리케이션에서 쿼리를 실행하고 상위 N 개의 로우만을 가져오도록 명령
  • • 쿼리를 인라인 뷰(inline view)로 활용하고, ROWNUM을 이용하여 결과 셋을 제한 (예: SELECT * FROM (your_query_here) WHERE ROWNUM <= N)

두 번째 접근법은 첫 번째에 비해 월등한 장점을 제공합니다. 그 이유는 두 가지입니다. 첫 번째로, ROWNUM을 사용하면 클라이언트의 부담이 줄어듭니다. 데이터베이스에서 제한된 결과 값만을 전송하기 때문입니다. 두 번째로, 데이터베이스에서 최적화된 프로세싱 방법을 이용하여 Top N 로우를 산출할 수 있습니다. Top-N 쿼리를 실행함으로써, 사용자는 데이터베이스에 추가적인 정보를 전달하게 됩니다. 그 정보란 바로 "나는N 개의 로우에만 관심이 있고, 나머지에 대해서는 관심이 없다"는 메시지입니다. 이제, 정렬(sorting) 작업이 데이터베이스 서버에서 어떤 원리로 실행되는지 설명을 듣고 나면 그 의미를 이해하실 수 있을 것입니다. 샘플 쿼리에 위에서 설명한 두 가지 접근법을 적용해 보기로 합시다.

select * 
  from t 
 order by unindexed_column;

여기서 T가 1백만 개 이상의 레코드를 저장한 큰 테이블이라고, 그리고 각각의 레코드가 100 바이트 이상으로 구성되어 있다고 가정해 봅시다. 그리고 UNINDEXED_COLUMN은 인덱스가 적용되지 않은 컬럼이라고, 또 사용자는 상위 10 개의 로우에만 관심이 있다고 가정하겠습니다. 오라클 데이터베이스는 아래와 같은 순서로 쿼리를 처리합니다.

1. T에 대해 풀 테이블 스캔을 실행합니다.
2. UNINDEXED_COLUMN을 기준으로 T를 정렬합니다. 이 작업은 "full sort"로 진행됩니다.
3. Sort 영역의 메모리가 부족한 경우 임시 익스텐트를 디스크에 스왑하는 작업이 수행됩니다.
4. 임시 익스텐트를 병합하여 상위 10 개의 레코드를 확인합니다.
5.쿼리가 종료되면 임시 익스텐트에 대한 클린업 작업을 수행합니다. .

결과적으로 매우 많은 I/O 작업이 발생합니다. 오라클 데이터베이스가 상위 10 개의 로우를 얻기 위해 전체 테이블을 TEMP 영역으로 복사했을 가능성이 높습니다.

그럼 다음으로, Top-N 쿼리를 오라클 데이터베이스가 개념적으로 어떻게 처리할 수 있는지 살펴 보기로 합시다.

select *
  from 
(select * 
   from t 
  order by unindexed_column)
 where ROWNUM < :N;

오라클 데이터베이스가 위 쿼리를 처리하는 방법이 아래와 같습니다.

1. 앞에서와 마찬가지로 T에 대해 풀-테이블 스캔을 수행합니다(이 과정은 피할 수 없습니다).
2. :N 엘리먼트의 어레이(이 어레이는 메모리에 저장되어 있을 가능성이 높습니다)에서 :N 로우만을 정렬합니다.

상위N 개의 로우는 이 어레이에 정렬된 순서로 입력됩니다. N +1 로우를 가져온 경우, 이 로우를 어레이의 마지막 로우와 비교합니다. 이 로우가 어레이의 N +1 슬롯에 들어가야 하는 것으로 판명되는 경우, 로우는 버려집니다. 그렇지 않은 경우, 로우를 어레이에 추가하여 정렬한 후 기존 로우 중 하나를 삭제합니다. Sort 영역에는 최대 N 개의 로우만이 저장되며, 따라서 1 백만 개의 로우를 정렬하는 대신N 개의 로우만을 정렬하면 됩니다.

이처럼 간단한 개념(어레이의 활용, N개 로우의 정렬)을 이용하여 성능 및 리소스 활용도 면에서 큰 이익을 볼 수 있습니다. (TEMP 공간을 사용하지 않아도 된다는 것을 차치하더라도) 1 백만 개의 로우를 정렬하는 것보다 10 개의 로우를 정렬하는 것이 메모리를 덜 먹는다는 것은 당연합니다.

아래의 테이블 T를 이용하면, 두 가지 접근법이 모두 동일한 결과를 제공하지만 사용되는 리소스는 극적인 차이를 보임을 확인할 수 있습니다.

create table t
as
select dbms_random.value(1,1000000) 
id, 
       rpad('*',40,'*' ) data
  from dual
connect by level <= 100000;

begin
dbms_stats.gather_table_stats
( user, 'T');
end;
/

Now enable tracing, via

exec 
dbms_monitor.session_trace_enable
(waits=>true);

And then run your top-N query with ROWNUM:

select *
  from
(select *
   from t
  order by id)
where rownum <= 10;
 

마지막으로 상위 10 개의 레코드만을 반환하는 쿼리를 실행합니다.

declare
cursor c is
select *
  from t
 order by id;
l_rec c%rowtype;
begin
    open c;
    for i in 1 .. 10
    loop
        fetch c into l_rec;
        exit when c%notfound;
    end loop;
    close c;
end;
/

이 쿼리를 실행한 후, TKPROF를 사용해서 트레이스 결과를 확인할 수 있습니다. 먼저 Top-N 쿼리 수행 후 확인한 트레이스 결과가 Listing 1과 같습니다.

Code Listing 1: ROWNUM을 이용한 Top-N 쿼리

select *
  from
(select *
   from t
  order by id)
where rownum <= 10

call         count     cpu	elapsed   disk     query      current    rows
--------     --------  -------  -------   -------  --------   --------   ------ 
Parse        1         0.00     0.00      0          0        0           0
Execute      1         0.00     0.00      0          0        0           0
Fetch        2         0.04     0.04      0        949        0          10
--------     --------  -------  -------   -------  --------   --------   ------ 
total        4         0.04     0.04      0        949        0          10

Rows                         Row          Source Operation
-----------------            ---------------------------------------------------
10                           COUNT STOPKEY (cr=949 pr=0 pw=0 time=46997 us)
10                           VIEW  (cr=949 pr=0 pw=0 time=46979 us)
10                           SORT ORDER BY STOPKEY (cr=949 pr=0 pw=0 time=46961 us)
100000                       TABLE ACCESS FULL T (cr=949 pr=0 pw=0 time=400066 us)

이 쿼리는 전체 테이블을 읽어 들인 후, SORT ORDER BY STOPKEY 단계를 이용해서 임시 공간에서 사용되는 로우를 10 개로 제한하고 있습니다. 마지막 Row Source Operation 라인을 주목하시기 바랍니다. 쿼리가 949 번의 논리적 I/O를 수행했으며(cr=949), 물리적 읽기/쓰기는 전혀 발생하지 않았고(pr=0, pw=0), 불과 400066 백만 분의 일초 (0.04 초) 밖에 걸리지 않았습니다. 이 결과를 Listing 2의 실행 결과와 비교해 보시기 바랍니다.

Code Listing 2: ROWNUM을 사용하지 않은 쿼리

SELECT * FROM T ORDER BY ID
call         count     cpu	elapsed   disk     query      current    rows
--------     --------  -------  -------   -------  --------   --------   ------ 
Parse         1        0.00     0.00        0        0        0           0
Execute       2        0.00     0.00        0        0        0           0
Fetch        10        0.35     0.40      155      949        6          10
--------     --------  -------  -------   -------  --------   --------   ------ 
total        13        0.36     0.40      155      949        6          10

Rows                         Row          Source Operation
-----------------            ---------------------------------------------------
10                           SORT ORDER BY (cr=949 pr=155 pw=891 time=401610 us)
100000                       TABLE ACCESS FULL T (cr=949 pr=0 pw=0 time=400060 us)

Elapsed times include waiting for the following events:

Event waited on                  Times
------------------------------   ------------
direct path write temp           33
direct path read temp             5

결과가 완전히 다른 것을 확인하실 수 있습니다. "elapsed/CPU time"이 크게 증가했으며, 마지막 Row Source Operation 라인을 보면 그 이유를 이해할 수 있습니다. 정렬 작업은 디스크 상에서 수행되었으며, 물리적 쓰기(physical write) 작업이 "pw=891"회 발생했습니다. 또 다이렉트 경로를 통한 읽기/쓰기 작업이 발생했습니다. (10 개가 아닌) 100,000 개의 레코드가 디스크 상에서 정렬되었으며, 이로 인해 쿼리의 실행 시간과 런타임 리소스가 급증하였습니다.

ROWNUM을 이용한 페이지네이션

필자가 ROWNUM을 가장 즐겨 사용하는 대상이 바로 페이지네이션(pagination)입니다. 필자는 결과 셋의 로우 N 에서 로우 M까지를 가져오기 위해 ROWNUM을 사용합니다. 쿼리의 일반적인 형식이 아래와 같습니다.

select * 
  from ( select /*+ FIRST_ROWS(n) */ 
  a.*, ROWNUM rnum 
      from ( your_query_goes_here, 
      with order by ) a 
      where ROWNUM <= 
      :MAX_ROW_TO_FETCH ) 
where rnum  >= :MIN_ROW_TO_FETCH;

where

여기서,

  • FIRST_ROWS(N)는 옵티마이저에게 "나는 앞부분의 로우에만 관심이 있고, 그 중 N 개를 최대한 빨리 가져오기를 원한다"는 메시지를 전달하는 의미를 갖습니다.
  • :MAX_ROW_TO_FETCH는 결과 셋에서 가져올 마지막 로우로 설정됩니다. 결과 셋에서 50 번째 – 60 번째 로우만을 가져오려 한다면 이 값은 60이 됩니다.
  • :MIN_ROW_TO_FETCH는 결과 셋에서 가져올 첫 번째 로우로 설정됩니다. 결과 셋에서 50 번째 – 60 번째 로우만을 가져오려 한다면 이 값은 50이 됩니다.

이 시나리오는 웹 브라우저를 통해 접속한 사용자가 검색을 마치고 그 결과를 기다리고 있는 상황을 가정하고 있습니다. 따라서 첫 번째 결과 페이지(그리고 이어서 두 번째, 세 번째 결과 페이지)를 최대한 빨리 반환해야 할 것입니다. 쿼리를 자세히 살펴 보면, (처음의 :MAX_ROW_TO_FETCH 로우를 반환하는) Top-N 쿼리가 사용되고 있으며, 따라서 위에서 설명한 최적화된 기능을 이용할 수 있음을 알 수 있습니다. 또 네트워크를 통해 클라이언트가 관심을 갖는 로우만을 반환하며, 조회 대상이 아닌 로우는 네트워크로 전송되지 않습니다.

페이지네이션 쿼리를 사용할 때 주의할 점이 하나 있습니다. ORDER BY 구문은 유니크한 컬럼을 대상으로 적용되어야 합니다. 유니크하지 않은 컬럼 값을 대상으로 정렬을 수행해야 한다면 ORDER BY 조건에 별도의 조건을 추가해 주어야 합니다. 예를 들어 SALARY를 기준으로 100 개의 레코드를 정렬하는 상황에서 100 개의 레코드가 모두 동일한 SALARY 값을 갖는다면, 로우의 수를 20-25 개로 제한하는 것은 의미가 없을 것입니다. 여러 개의 중복된 ID 값을 갖는 작은 테이블을 예로 들어 설명해 보겠습니다.

SQL> create table t
  2  as
  3  select mod(level,5) id, 
     trunc(dbms_random.value(1,100)) data 
  4    from dual
  5  connect by level <= 10000;
Table created.

ID 컬럼을 정렬한 후 148-150 번째 로우, 그리고 148–151 번째 로우를 쿼리해 보겠습니다.

SQL> select *
  2    from
  3  (select a.*, rownum rnum
  4     from
  5  (select id, data
  6     from t
  7   order by id) a
  8   where rownum <= 150
  9  )
 10   where rnum >= 148;

 ID           DATA           RNUM
-------       ----------     -----------
0             38             148
0             64             149
0             53             150

SQL>
SQL> select *
  2    from
  3  (select a.*, rownum rnum
  4     from
  5  (select id, data
  6     from t
  7   order by id) a
  8   where rownum <= 151
  9  )
 10   where rnum >= 148;

 ID           DATA           RNUM
-------       ----------     -----------
0             59             148
0             38             149
0             64             150
0             53             151

로우 148의 경우 DATA=38의 결과가 반환되었습니다. 두 번째 쿼리에서는 DATA=59의 결과가 반환되었습니다. 두 가지 쿼리 모두 올바른 결과를 반환하고 있습니다. 쿼리는 데이터를 ID 기준으로 정렬한 후 앞부분의 147 개 로우를 버린 후 그 다음의 3 개 또는 4 개의 로우를 반환합니다. 하지만 ID에 중복값이 너무 많기 때문에, 쿼리는 항상 동일한 결과를 반환함을 보장할 수 없습니다. 이 문제를 해결하려면 ORDER BY 조건에 유니크한 값을 추가해 주어야 합니다. 위의 경우에는 ROWID를 사용하면 됩니다.

SQL> select *
  2    from
  3  (select a.*, rownum rnum
  4     from
  5  (select id, data
  6     from t
  7   order by id, rowid) a
  8   where rownum <= 150
  9  )
 10   where rnum >= 148;

 ID           DATA           RNUM
-------       ----------     -----------
0             45             148
0             99             149
0             41             150

SQL>
SQL> select *
  2    from
  3  (select a.*, rownum rnum
  4     from
  5  (select id, data
  6     from t
  7   order by id, rowid) a
  8   where rownum <= 151
  9  )
 10   where rnum >= 148;

 ID           DATA           RNUM
-------       ----------     -----------
0             45             148
0             99             149
0             41             150
0             45             151

이제 쿼리를 반복 실행해도 동일한 결과를 보장할 수 있게 되었습니다. ROWID는 테이블 내에서 유니크한 값을 가집니다. 따라서 ORDER BY ID 조건과 ORDER BY ROWID 기준을 함께 사용함으로써 사용자가 기대한 순서대로 페이지네이션 쿼리의 결과를 확인할 수 있습니다.

다음 단계

ASK Tom
오라클 부사장 Tom Kyte가 까다로운 기술적 문제에 대한 답변을 제공해 드립니다. 포럼의 하이라이트 정보를 Tom의 컬럼에서 확인하실 수 있습니다.
asktom.oracle.com

추가 자료:
Expert Oracle Database Architecture: 9i and 10g Programming Techniques and Solutions
Effective Oracle By Design

ROWNUM 개념 정리

지금까지 ROWNUM에 관련하여 아래와 같은 개념을 설명하였습니다.

  • ROWNUM의 할당 원리와 잘못된 쿼리 작성을 피하는 방법
  • ROWNUM이 쿼리 프로세싱에 미치는 영향과 웹 환경의 페이지네이션을 위한 활용 방안
  • ROWNUM을 이용하여 Top N쿼리로 인한 TEMP 공간의 사용을 피하고 쿼리 응답 속도를 개선하는 방법
오라클 오픈월드 행사에 관련하여

이번 오라클 매거진은 오픈월드 특별호로 기획되었습니다. 필자는 이번 행사를 통해 많은 사람들과 직접 대면할 수 있는 기회를 얻게 된 것을 무척 기쁘게 생각하고 있습니다. 행사에 참석하신다면 필자가 진행하는 세션에도 참석해 주실 것을 기대합니다. (필자는 데이터베이스 및 개발에 관련한 세션을 진행할 예정입니다.) 또 OTN이 주최하는 "Meet the Expert" 행사에도 참가할 것입니다. 이미 오래 전부터 오라클 오픈월드 행사에 참여해 왔지만, 일대일 또는 그룹으로 사용자와 만날 수 있다는 것은 언제나 즐거운 경험입니다. 필자가 진행하는 세션과 OTN 이벤트의 스케줄을 한 번 확인해 보시기 바랍니다.

또 필자는 블로그(tkyte.blogspot.com)를 통해 행사 현장의 뉴스와 사진을 제공해 드리고 있습니다. 그 밖에 OTN 에서도 포드캐스트, 동영상, 프리젠테이션 자료와 같은 행사 컨텐트를 다운로드하실 수 있습니다.


Tom Kyte는 1993년부터 오라클에서 일해 왔습니다. 그는 현재 오라클 퍼블릭 섹터 그룹 담당 부사장으로 근무 중이며, Expert Oracle Database Architecture: 9i and 10g Programming Techniques and Solutions (Apress, 2005) , Effective Oracle by Design (Oracle Press, 2003)와 같은 전문서를 집필하였습니다.
Posted by 1010
02.Oracle/DataBase2009. 4. 24. 10:18
반응형

거의 대부분이 오라클 계정설정이나 dbcp 관련 세팅부분이다..
아이피 주소를 로컬이나 127.0.0.1 이나 아님 고정주소값으로 바꾸어서 해보거나
설정된 계정정보로 sqlplus 에서 테스트해보면 답이 나온다..

Posted by 1010