[출처] http://blog.sdnkorea.com/blog/677

 업체에서 사활을 건 싸움을 하고 있다. 그리고 이러한 경쟁 시장에 JavaDB가 도전장을 내밀게 되었다. JavaDB는 제목처럼 경량화 DB를 모토로 만들어 졌으며 이 글은 소개 및 설치하는 방법과 실행 예제 등 기본적인 정보만 다루도록 하겠다.

1. JavaDB의 등장과 기원

여기서 필자는 JavaDB의 등장과 함께 기원이라는 단어를 사용했다. 그럼 JavaDB는 부모가 있다는 것인가? 그렇다. JavaDB의 기원은 1996년으로 거슬러 올라간다. IBM이 Cloudscape라는 프로젝트를 시작 하였으며 1999년에 Informix, 2001년에는 IBM에서 관리 하였으며 2004년에 지금의 Apache에 기부 되었다. Apache는 Apache Derby라는 프로젝트로 오픈 소스 프로젝트를 진행하고 있으며 Apache Derby는 Apache DB subproject라는 이름 또한 가지고 있다. 기존 Database가 무겁고 비싼 것에 비해 Derby는 경량화와 무료 라이센스 그리고 무엇보다 매력적인 오픈 소스를 표방하며 만들어 졌다. 이 프로젝트를 Sun에서 JavaDB라는 이름으로 JavaSE6에 포함시키며 공급하기 시작했다.

2. JavaDB의 특징

JavaDB의 특징은 Apache Derby의 특징과 같다. 이는 기존 Dababase와 성격이 매우 다른데 특징은 다음과 같다.

1) base engine과 JDBC driver 모두 합쳐 2메가바이트
2) 자바와 JDBC, SQL을 기초로 만들어짐
3) client/server 모드를 Derby Network Client JDBC driver and Derby Network Server. 를 통해 지원 가능
4) 설치 및 디플로이, 사용이 편함

또한 JavaDB는 다음과 같은 환경에 적합하다고 소개되어 있다.

1) 자바 애플리케이션 개발 및 테스트 : 사용하기 쉬우며 사용자의 컴퓨터나 메인프레임에서도 잘 돌아감. 
아파치 라이센스하에 무료임.
2) 임베디드 애플리케이션
3) 멀티 플랫폼 환경 : 100% 자바이므로 Java DB에서 다른 오픈 스탠더드 데이터베이스로 마이그레이트 가능함.
4) Web 2.0 기반의 브라우져 based 환경
5) PDA와 같이 J2ME CDC에서 돌아가는 애플리케이션 

먼저 base engine과 JDBC driver를 모두 합쳐서 2메가바이트라는 획기적이고도 믿을 수 없는 용량을 자랑한다. 
또한 이전에 설명했듯이 Pure Java로 만들어 졌으며 설치법 또한 간단하다.

3. JavaDB 설치

JavaDB는 SE6를 설치하면 자동으로 설치되나 수동으로 설치하는 방법도 있다. 

(1) homepage(http://developers.sun.com/javadb/downloads/index.jsp)에 접속하여 다운로드 하기
(2) 설치하기

① 윈도우의 경우

     javadb_<version>.ms를 더블 클릭하거나 msiexec /i javadb_<version>.msi 명령 실행

② 솔라리스의 경우
    1) 다운로드 하기
       javadb-<version>-solaris-<arch>-pkg.sh
    2) 권한 확인하기
       

chmod +x javadb-<version>-solaris-<arch>-pkg.sh

    3) 압축풀기
       
./javadb-<version>-solaris-<arch>-pkg.sh

    이 명령을 실행하고 나면 javadb-<version> 디렉토리 밑에 여러 개의 다음의 SVR4 package 디렉토리들이 생성된다

SUNWjavadb-common
SUNWjavadb-client
SUNWjavadb-core
SUNWjavadb-demo
SUNWjavadb-docs
SUNWjavadb-javadoc
SUNWjavadb-service

      4) su – root등을 사용하여 수퍼 권한자로 변경하기 
      5) 기존 JavaDB 삭제하기
         기존에 JavaDB가 설치되어 있다면(디폴트 설치 경로는 /opt/SUNWjavadb 이다) 새 버전을 설치하기 전에 제거해야 한다. 현재 돌아가고 있는 패키지를 보는 방법은 다음과 같다.
    
pkginfo | grep SUNQjavadb-

          기존 패키지를 제거하기           
        
pkgrm SUNWjavadb-client SUNWjavadb-core SUNWjavadb-demo SUNWjavadb-docs SUNWjavadb-javadoc SUNWjavadb-service SUNWjavadb-common

      6) 설치하기
        
cd javadb-<version>
pkgadd
-d . SUNWjavadb-common SUNWjavadb-client SUNWjavadb-core SUNWjavadb-demo SUNWjavadb-docs SUNWjavadb-javadoc SUNWjavadb-service

      7) 새 JavaDB 패키지 설치하기
         
cd javadb-<version>
          pkgadd
-d . SUNWjavadb-common SUNWjavadb-client SUNWjavadb-core SUNWjavadb-demo SUNWjavadb-docs SUNWjavadb-javadoc SUNWjavadb-service



③ 리눅스의 경우
   1) 다운로드 하기
      javadb-<version>-linux-rpm.bin
   2) 권한 확인하기
        
chmod +x javadb-<version>-linux-rpm.bin

       3) 압축풀기
          
/javadb-<version>-linux-rpm.bin

    이 명령을 실행하고 나면 javadb-<version> 디렉토리 밑에 여러 개의 RPM 패키지
Sun-javadb-*.i386.rpm이 생긴다. 

       4) 수퍼 권한자로 변경하기
       5) 기존 JavaDB 삭제하기
          만약 기존에 JavaDB 설치가 되어 있으면(디폴트 설치 경로는 /opt/sun/javadb 이다)
          이를 새 버전을 설치하기 전에 삭제해야 한다.
          현재 돌아가고 있는 JavaDB 패키지의 리스트를 보는 방법은 다음과 같다.
          
rpm qa | grep sun-javadb-

          기존 패키지를 제거하기        
         
rpm -ev sun-javadb-common sun-javadb-client sun-javadb-core sun-javadb-demo sun-javadb-docs sun-javadb-javadoc


        6) 새 JavaDB 패키지 설치하기

cd javadb-<version>
rpm
-ivh sun-javadb-*.rpm

        
위와 같이 JavaDB를 설치하면 demo, frameworks, javadoc, docs 그리고 lib라는 서브 디렉토리가 
생긴다.
이들 서브 디렉토리가 어떤 정보를 가지고 있는지 살펴보자.

1) demo : 2개의 데모 프로그램을 가지고 있으며 database 폴더는 임베디드 애플리케이션을 어떻게 만드는 지에 대한 데모이며 programs 폴더는 클라이언트-서버 환경에서 JavaDB를 사용하는 데모이다. 이 데모는 밑에서 실행해 보도록 하겠다.
2) frameworks : 환경 변수, 데이터베이스 생성 및 작업의 셋팅을 위한 유틸리티를 가지고 있다.
3) javadoc : 예상 했겠지만 API 관련 문서가 있으며 jdbc3와 jdbc4 폴더로 나뉘어져 있다.
4) docs : JavaDB의 셋업 및 어드민, 레퍼런스 가이드가 있다.
5) lib : JAR 파일과 같은 패키지 된 JavaDB 라이브러리가 있다.

4. JavaDB 실행하기

설치를 마쳤으면 이제 JavaDB를 가동시켜 보자. 가동하기 전 현재 환경 셋업이 잘 되었는지 테스트 해야 한다. 테스트 하는 명령어는 다음과 같다.

java org.apache.derby.tools.sysinfo -cp embedded SimpleApp.class


명령어를 실행하면 다음과 같은 결과 화면이 나온다.

 



이 테스트는 먼저 클래스 경로를 찾고 라이브러리와 클래스를 찾는다.
이 테스트가 성공적으로 끝나면 화면과 같은 메시지가 나온다.

그럼 이제 Derby 프로그램을 실행시켜 보자.
우선 실행할 프로그램은 SimpleApp라는 자바 프로그램이다. 이 프로그램은 설치 시 예제로 들어가 있으며 기본적인 커넥션 얻는 법부터 SQL 문을 수행하는 예제이다. 소스는 다음과 같다.


import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

public class SimpleApp
{
   
/* the default framework is embedded*/
   
public String framework = "embedded";
   
public String driver = "org.apache.derby.jdbc.EmbeddedDriver";
   
public String protocol = "jdbc:derby:";

   
public static void main(String[] args)
   
{
       
new SimpleApp().go(args);
   
}

   
void go(String[] args)
   
{
       
/* parse the arguments to determine which framework is desired*/
        parseArguments
(args);

       
System.out.println("SimpleApp starting in " + framework + " mode.");

       
try
       
{
           
/*
               The driver is installed by loading its class.
               In an embedded environment, this will start up Derby, since it is not already running.
             */

           
Class.forName(driver).newInstance();
           
System.out.println("Loaded the appropriate driver.");

           
Connection conn = null;
           
Properties props = new Properties();
            props
.put("user", "user1");
            props
.put("password", "user1");

           
/*
               The connection specifies create=true to cause
               the database to be created. To remove the database,
               remove the directory derbyDB and its contents.
               The directory derbyDB will be created under
               the directory that the system property
               derby.system.home points to, or the current
               directory if derby.system.home is not set.
             */

            conn
= DriverManager.getConnection(protocol +
                   
"derbyDB;create=true", props);

           
System.out.println("Connected to and created database derbyDB");

            conn
.setAutoCommit(false);

           
/*
               Creating a statement lets us issue commands against
               the connection.
             */

           
Statement s = conn.createStatement();

           
/*
               We create a table, add a few rows, and update one.
             */

            s
.execute("create table derbyDB(num int, addr varchar(40))");
           
System.out.println("Created table derbyDB");
            s
.execute("insert into derbyDB values (1956,'Webster St.')");
           
System.out.println("Inserted 1956 Webster");
            s
.execute("insert into derbyDB values (1910,'Union St.')");
           
System.out.println("Inserted 1910 Union");
            s
.execute(
               
"update derbyDB set num=180, addr='Grand Ave.' where num=1956");
           
System.out.println("Updated 1956 Webster to 180 Grand");

            s
.execute(
               
"update derbyDB set num=300, addr='Lakeshore Ave.' where num=180");
           
System.out.println("Updated 180 Grand to 300 Lakeshore");

           
/*
               We select the rows and verify the results.
             */

           
ResultSet rs = s.executeQuery(
                   
"SELECT num, addr FROM derbyDB ORDER BY num");

           
if (!rs.next())
           
{
               
throw new Exception("Wrong number of rows");
           
}

           
if (rs.getInt(1) != 300)
           
{
               
throw new Exception("Wrong row returned");
           
}

           
if (!rs.next())
           
{
               
throw new Exception("Wrong number of rows");
           
}

           
if (rs.getInt(1) != 1910)
           
{
               
throw new Exception("Wrong row returned");
           
}

           
if (rs.next())
           
{
               
throw new Exception("Wrong number of rows");
           
}

           
System.out.println("Verified the rows");

            s
.execute("drop table derbyDB");
           
System.out.println("Dropped table derbyDB");

           
/*
               We release the result and statement resources.
             */

            rs
.close();
            s
.close();
           
System.out.println("Closed result set and statement");

           
/*
               We end the transaction and the connection.
             */

            conn
.commit();
            conn
.close();
           
System.out.println("Committed transaction and closed connection");

           
/*
               In embedded mode, an application should shut down Derby.
               If the application fails to shut down Derby explicitly,
               the Derby does not perform a checkpoint when the JVM shuts down, which means
               that the next connection will be slower.
               Explicitly shutting down Derby with the URL is preferred.
               This style of shutdown will always throw an "exception".
             */

           
boolean gotSQLExc = false;

           
if (framework.equals("embedded"))
           
{
               
try
               
{
                   
DriverManager.getConnection("jdbc:derby:;shutdown=true");
               
}
               
catch (SQLException se)
               
{
                    gotSQLExc
= true;
               
}

               
if (!gotSQLExc)
               
{
                   
System.out.println("Database did not shut down normally");
               
}
               
else
               
{
                   
System.out.println("Database shut down normally");
               
}
           
}
       
}
       
catch (Throwable e)
       
{
           
System.out.println("exception thrown:");

           
if (e instanceof SQLException)
           
{
                printSQLError
((SQLException) e);
           
}
           
else
           
{
                e
.printStackTrace();
           
}
       
}

       
System.out.println("SimpleApp finished");
   
}

   
static void printSQLError(SQLException e)
   
{
       
while (e != null)
       
{
           
System.out.println(e.toString());
            e
= e.getNextException();
       
}
   
}

   
private void parseArguments(String[] args)
   
{
       
int length = args.length;

       
for (int index = 0; index < length; index++)
       
{
           
if (args[index].equalsIgnoreCase("jccjdbcclient"))
           
{
                framework
= "jccjdbc";
                driver
= "com.ibm.db2.jcc.DB2Driver";
                protocol
= "jdbc:derby:net://localhost:1527/";
           
}
           
if (args[index].equalsIgnoreCase("derbyclient"))
           
{
                framework
= "derbyclient";
                driver
= "org.apache.derby.jdbc.ClientDriver";
                protocol
= "jdbc:derby://localhost:1527/";
           
}
       
}
   
}
}

 
이 소스를 실행하면 다른 DB에 접속하는 법과 다른 점은 없다.
 


지금까지 JavaDB의 기본적인 설명을 다루었다. JavaDB를 사용해보면서 느낀 점은 가볍다는
것이었다. 향후 임베디드 시장에서의 활약을 기대해 보지만 이를 뚫기 위해 넘어야 할 난관이
많으며 이 중 오라클에서 Oracle Berkeley DB라는 오픈소스 기반 Lightweight 
데이터베이스와의 경쟁이 그 하나이다. 오라클은 Derby와 Oracle Berkeley DB의 성능을 비교한
문서를 공개하며 성능 이슈를 재기하고 있다. 임베디드 시장에서의 두 데이터베이스간의 활약이
기대하며 기고를 마친다.

참조 문헌 :
JavaDB 설치: http://developers.sun.com/javadb/downlo ··· ons.html
아파치 Derby 소개: http://db.apache.org/derby/docs/dev/getstart/
오라클 버클리 DB 소개: http://www.oracle.com/technology/produc ··· dex.html

블로그 이미지

유효하지않음

,

[출처] http://blog.sdnkorea.com/blog/675

이 테크팁은 안전한 ftp 서버를 생성하는 방법에 대해서 설명 합니다. ftp 데몬은 비-root 유저에 의해 실행되고, 유저가 정의한 포트를 리스닝하며, chroot 를 이용한 고립된 환경에서 동작합니다. 이 구현은 표준 ftp 포트를 이용해서 root 유저가 ftpd 를 실행하도록 변경하실 수도 있습니다. 이 환경은 설정이 가능한 접근제어 권한을 통해서 미리 지정된 사용자만이 로그인 할 수 있도록 합니다. 물론 여러분이 이러한 고립된 환경을 생성하려면 root 유저 권한이 필요 합니다.


참고: 이 방법은 솔라리스9 에서만 테스트 되었지만 기타 다른 솔라리스 버전에서도 잘 동작할 것입니다.


고립된 ftp 환경을 위치할 장소를 지정합니다, 필자는 이 글에서 /ftpjail 을 사용할 것입니다. 

이 디렉토리는 설정파일과 ftp 서버 바이너리를 담기에 충분한 공간,즉 약 8메가 정도 와 ftp 를 통해 전송될 파일들의 용량을 더한 만큼의 공간을 가진 마운트된 파일시스템이어야 합니다.


이 테크팁에서 설명하고 있는 고립된 FTP 환경을 위한 전체 파일 리스트를 보여주고 있는 보조자료는 다음 링크에서 찾으실 수 있습니다: http://wikis.sun.com/display/BigAdmin/Building+a+Secure+FTP+Server+-+File+List

<ftp jail root> (/ftpjail) 환경 만들기

<ftp jail root> (/ftpjail) 디렉토리 아래에 심볼릭 링크와 디렉토리들을 생성합니다.

mkdir -p /ftpjail
cd
/ftpjail
mkdir
-p dev etc etc/ftpd etc/default usr/bin usr/sbin usr/lib/security usr/lib/locale usr/lib/security/sparcv9 usr/lib usr/share/lib/zoneinfo upload
chmod
100 usr/sbin
chmod
444 dev etc/default usr/share usr/share/lib usr/share/lib/zoneinfo
chmod
555 etc etc/ftpd usr usr/bin usr/lib usr/lib/locale usr/lib/security
chmod
777 upload
Create ln -s usr/bin bin


고립 환경에 필요한 특수 디바이스 파일들을 생성하기

디바이스 심볼링 링크의 목록을 통해서 현재 사용하고 있는 특수 디바이스 파일들과 메이저, 마이너 넘버를 찾습니다.

cd /dev
ls
-l conslog null tcp ticlts ticotsord udp zero
lrwxrwxrwx  
1 root     other         31 Aug  8 12:36 conslog -> ../devices/pseudo/log@0:conslog
lrwxrwxrwx  
1 root     other         27 Aug  8 12:36 null -> ../devices/pseudo/mm@0:null
lrwxrwxrwx  
1 root     other         27 Aug  8 12:36 tcp -> ../devices/pseudo/tcp@0:tcp
lrwxrwxrwx  
1 root     other         29 Aug  8 12:36 ticlts -> ../devices/pseudo/tl@0:ticlts
lrwxrwxrwx  
1 root     other         32 Aug  8 12:36 ticotsord -> ../devices/pseudo/tl@0:ticotsord
lrwxrwxrwx  
1 root     other         27 Aug  8 12:36 udp -> ../devices/pseudo/udp@0:udp
lrwxrwxrwx  
1 root     other         27 Aug  8 12:36 zero -> ../devices/pseudo/mm@0:zero


이제 실제 디바이스 파일을 찾습니다.

cd ../devices/pseudo
ls
-l log@0:conslog mm@0:null tcp@0:tcp tl@0:ticlts tl@0:ticotsord udp@0:udp mm@0:zero
crw
-rw-rw-   1 root     sys       21,  0 Aug  8 12:36 log@0:conslog
crw
-rw-rw-   1 root     sys       13,  2 Sep 25 11:47 mm@0:null
crw
-rw-rw-   1 root     sys       13, 12 Aug  8 12:36 mm@0:zero
crw
-rw-rw-   1 root     sys       42,  0 Aug  8 12:36 tcp@0:tcp
crw
-rw-rw-   1 root     sys      105,  2 Aug  8 12:36 tl@0:ticlts
crw
-rw-rw-   1 root     sys      105,  1 Aug  8 12:36 tl@0:ticotsord
crw
-rw-rw-   1 root     sys       41,  0 Aug  8 12:36 udp@0:udp


위에서 찾은 메이저, 마이너 넘버를 이용하여 새로운 디바이스 파일들을 고립된 환경에 생성합니다.

cd /dev
ls
-l conslog null tcp ticlts ticotsord udp zero
lrwxrwxrwx  
1 root     other         31 Aug  8 12:36 conslog -> ../devices/pseudo/log@0:conslog
lrwxrwxrwx  
1 root     other         27 Aug  8 12:36 null -> ../devices/pseudo/mm@0:null
lrwxrwxrwx  
1 root     other         27 Aug  8 12:36 tcp -> ../devices/pseudo/tcp@0:tcp
lrwxrwxrwx  
1 root     other         29 Aug  8 12:36 ticlts -> ../devices/pseudo/tl@0:ticlts
lrwxrwxrwx  
1 root     other         32 Aug  8 12:36 ticotsord -> ../devices/pseudo/tl@0:ticotsord
lrwxrwxrwx  
1 root     other         27 Aug  8 12:36 udp -> ../devices/pseudo/udp@0:udp
lrwxrwxrwx  
1 root     other         27 Aug  8 12:36 zero -> ../devices/pseudo/mm@0:zero


그 다음으로 실제 디바이스 파일들의 목록을 살펴 봅니다.

cd ../devices/pseudo
ls
-l log@0:conslog mm@0:null tcp@0:tcp tl@0:ticlts tl@0:ticotsord udp@0:udp mm@0:zero
crw
-rw-rw-   1 root     sys       21,  0 Aug  8 12:36 log@0:conslog
crw
-rw-rw-   1 root     sys       13,  2 Sep 25 11:47 mm@0:null
crw
-rw-rw-   1 root     sys       13, 12 Aug  8 12:36 mm@0:zero
crw
-rw-rw-   1 root     sys       42,  0 Aug  8 12:36 tcp@0:tcp
crw
-rw-rw-   1 root     sys      105,  2 Aug  8 12:36 tl@0:ticlts
crw
-rw-rw-   1 root     sys      105,  1 Aug  8 12:36 tl@0:ticotsord
crw
-rw-rw-   1 root     sys       41,  0 Aug  8 12:36 udp@0:udp


위에서 찾은 메이저, 마이너 넘버를 이용하여 새로운 디바이스 파일들을 생성합니다.

cd  /ftpjail/dev
mknod conslog c
21 0
mknod
null c 13 2
mknod zero c
13 12
mknod tcp c
42 0
mknod ticlts c
105 2
mknod ticotsord c
105 1
mknod udp c
41 0
chmod
666 conslog null tcp ticlts ticotsord udp zero


작업한 결과를 확인 합니다.


ls -l
crw
-rw-rw-   1 root     other     21,  0 Sep 25 11:57 conslog
crw
-rw-rw-   1 root     other     13,  2 Sep 25 11:57 null
crw
-rw-rw-   1 root     other     42,  0 Sep 25 11:57 tcp
crw
-rw-rw-   1 root     other    105,  2 Sep 25 11:57 ticlts
crw
-rw-rw-   1 root     other    105,  1 Sep 25 11:57 ticotsord
crw
-rw-rw-   1 root     other     41,  0 Sep 25 11:57 udp
crw
-rw-rw-   1 root     other     13, 12 Sep 25 11:57 zero


고립된 ftp 환경에서 설정 파일들을 생성합니다
vi 같은 에디터를 사용해서 다음의 파일들을 생성합니다.

/ftpjail/etc/group

other::1:root
ftp
::30000:

/ftpjail/etc/pam.conf

ftp auth required /usr/lib/security/pam_unix.so.1
ftp account required
/usr/lib/security/pam_unix.so.1
ftp session required
/usr/lib/security/pam_unix.so.1


/ftpjail/etc/passwd
참고: 아래의 gftp 를 ftp 서버를 이용해 로그인할 유저 이름으로 변경합니다. 여러분은 ftp 서버를 로그인할때 사용할 다른 유저들을 이 파일에 추가하실 수 있습니다.

root:x:0:1:::
ftp
:x:30000:30000::/upload:/bin/false
gftp
:x:30000:30000::/upload:/bin/sh





/ftpjail/etc/shadow
참고: 아래의 gftp 를 ftp 서버를 이용해 로그인할 유저 이름으로 변경하고, $$ 를 유저가 사용할 패스워드로 변경 합니다.
암호화된 패스워드 생성을 위해서, 패스워드 설비를 이용해서 여러분이 패스워드를 알고 있는 호스트 유저의 패스워드를 변경 합니다. 그다음에 암호화된 패스워드를 /etc/shadow 에서 복사해 옵니다. passwd 유틸리티를 이용해서 패스워드를 다시 변경해야 함을 기억하시기 바랍니다. 이 파일에 있는 유저들은 반드시 var/ftpjail/etc/passwd 에 있는 유저들과 매치 되어야 합니다.
root:*LK*:6445::::::
ftp
:*LK*:13651::::::
gftp
:$$:13651::::::


/ftpjail/etc/shells

/bin/sh


/ftpjail/etc/ftpd/ftpaccess
hostname ftpserver
defaultserver
private
class   all   real,guest,anonymous  *
# all the following default to "yes" for everybody
delete          no      real,guest,anonymous
overwrite       no      real
,guest,anonymous
rename          no      real
,guest,anonymous
chmod           no      real
,guest,anonymous
umask           no      real
,guest,anonymous
# specify the upload directory information
upload  
/       *       no
upload  
/       /upload yes
greeting terse
noretrieve
*
#allow-retrieve /upload/*
defumask
777


/ftpjail/usr/bin/runme
/usr/sbin/in.ftpd -P 2020 -p 2021 -S -u 022 -W -a -Q


새롭게 생성된 파일의 퍼미션 정정하기

cd /ftpjail/etc
chmod
444 group pam.conf passwd shadow shells /ftpjail/etc/ftpd/ftpaccess
chmod
100 /ftpjail/usr/bin/runme


고립된 ftp 환경으로 현재 파일들을 복사하고, 퍼미션 정정하기

cp -p /etc/default/init /ftpjail/etc/default/init
cp
/usr/bin/sh /ftpjail/usr/bin/sh; chmod 111 /ftpjail/usr/bin/sh
cp
/usr/sbin/in.ftpd /ftpjail/usr/sbin/in.ftpd; chmod 6100 /ftpjail/usr/sbin/in.ftpd; chown 30000:30000 /ftpjail/usr/sbin/in.ftpd
cp
-rp /usr/lib/locale/* /ftpjail/usr/lib/locale
cp -rp /usr/share/lib/zoneinfo/*  /ftpjail/usr/share/lib/zoneinfo
cd /ftpjail/usr/lib
cp -p /usr/lib/libbsm.so.1 .
cp -p /usr/lib/libc.so.1 .
cp -p /usr/lib/libcmd.so.1 .
cp -p /usr/lib/libdl.so.1 .
cp -p /usr/lib/libgen.so.1 .
cp -p /usr/lib/libmd5.so.1 .
cp -p /usr/lib/libmp.so.2 .
cp -p /usr/lib/libnsl.so.1 .
cp -p /usr/lib/libpam.so.1 .
cp -p /usr/lib/libresolv.so.2 .
cp -p /usr/lib/libsecdb.so.1 .
cp -p /usr/lib/libsocket.so.1 .
cp -p /usr/lib/ld.so.1 .
cp -p /usr/lib/nss_user.so.1 .
cp -p /usr/lib/nss_files.so.1 .
chmod 555 *
cd /ftpjail/usr/lib/security
cp -p /usr/lib/security/crypt_bsdbf.so.1 .
cp -p /usr/lib/security/crypt_bsdmd5.so.1 .
cp -p /usr/lib/security/crypt_sunmd5.so.1 .
cp -p /usr/lib/security/pam* .
cd /ftpjail/usr/lib/security/sparcv9
cp -p /usr/lib/security/sparcv9/* .
 

새로운 환경을 살펴 보기 위한 초기 테스트

한가지 빼먹은것이 있는데 만약 유저가 ls 커맨드를 사용할 수 있도록 하길 원한다면 해당 파일을 환경으로 복사해야 합니다. 필자는 파일을 테스트 후에 지울 것을 추천합니다.

cp /usr/bin/ls /ftpjail/usr/bin/ls; chmod 111 /ftpjail/usr/bin/ls


고립 환경에서 sh 쉘 스크립트를 실행합니다.
참고: 환경안에서는 오직 제한된 커맨드들만이 존재 합니다. 그러나 ls 와 cd 같은 명령은 사용이 가능합니다.

chroot /ftpjail /usr/bin/sh

ftp 서버 시작하기

참고: ftpd 프로세스가 고립된 환경에서 생성되고 실행될 것이고 런타임 커맨드에서 지정된 포트를 리스닝하게 될 것입니다.

chroot /ftpjail /usr/bin/sh -c runme


서버가 시작되었는지 확인합니다.
참고: 필자의 /etc/password 파일에는 UID 30000 에 대한 항목이 없으므로 아래의 결과는 오직 숫자로 출력 됩니다.

ps -ef|grep ftpd
0030000 26704     1  0 09:04:30 ?        0:00 /usr/sbin/in.ftpd -P 2020 -p 2021 -S -u 022 -W -a -Q

ftp 서버 테스트하기

참고:/ftpjail/etc/ftpd/ftpaccess 에 설정된대로 여러분은 오직 파일의 업로드만 가능합니다.

ftp 127.0.0.1 2021
login gftp
/<as set in /ftpjail/etc/shadow>


저자에 관하여

Ross Moffatt 은 유닉스 시스템 관리자로 10년 이상 일해 왔고 ross.stuff@telstra.com 로 연락하실 수 있습니다.


이 글의 영문 원본은

Building a Secure FTP Server

에서 보실 수 있습니다

블로그 이미지

유효하지않음

,
Inside Oracle Database 10g

정규 표현식을 이용한 SQL 구문의 개선

저자 - Alice Rischert

Oracle Database 10g의 정규 표현식 기능을 텍스트 데이터 처리를 위한 강력한 도구로 활용할 수 있습니다.

Oracle Database 10g에 추가된 새로운 기능을 이용하여 문자 데이터의 검색, 처리 능력을 극적으로 개선할 수 있습니다. 정규 표현식(regular expression)이라 불리는 이 기능은, 텍스트 패턴을 기술하기 위한 일종의 표기법으로, 이미 오래 전부터 다양한 프로그래밍 언어와 UNIX 유틸리티를 통해 지원되어 왔습니다.

오라클의 정규 표현식은 SQL 함수와 WHERE절 연산자의 형태로 제공됩니다. 정규 표현식에 익숙하지 않은 독자라면, 이 문서를 통해 전혀 새롭고 강력한 기능을 체험하실 수 있을 것입니다. 또 정규 표현식에 이미 친숙한 독자분들은, Oracle SQL 언어의 문맥에 이 기능을 적용하는 방법을 이해하는 기회로 활용하실 수 있습니다.

정규 표현식이란?

정규 표현식은 하나 또는 그 이상의 문자열과 메타문자(metacharacter)로 구성됩니다. 가장 단순한 형태의 정규 표현식은 cat과 같은 단 하나의 문자열로만 구성될 수 있습니다. 이 정규 표현식은 문자 c와 문자 a, 문자 t의 순서를 갖는 패턴 매치 문자열로 cat, location, catalog 등의 문자열과 매치됩니다. 메타문자는 정규 표현식을 구성하는 문자들을 처리하는 방법을 명시하기 위한 알고리즘을 제공합니다. 다양한 메타문자의 의미를 이해한다면, 정규 표현식이 텍스트 데이터를 비교하고 대체하는 용도로 매우 유용하게 활용될 수 있음을 금방 깨닫게 되실 것입니다.

데이터의 검증, 중복 단어의 확인, 불필요한 공백의 제거, 문자의 파싱(parsing) 등 정규 표현식의 활용 방법은 실로 다양합니다. 정규 표현식을 이용하여 전화 번호, 우편 번호, 이메일 주소, 주민등록번호, IP 주소, 파일 이름, 경로 이름 등을 검증할 수도 있습니다. 또 HTML 태그, 숫자, 날짜, 기타 특정 텍스트 데이터와 일치하는 패턴을 확인하고 다른 패턴으로 대체하는 것이 가능합니다.

Oracle Database 10g에서 정규 표현식 사용하기

오라클에 새로 추가된 기능으로 Oracle SQL REGEXP_LIKE 연산자, REGEXP_INSTR, REGEXP_SUBSTR, REGEXP_REPLACE 함수 등이 있습니다. 이 함수와 연산자는 기존의 LIKE 연산자와 INSTR, SUBSTR, REPLACE 함수를 보완하는 효과를 제공합니다. 실제로 새로운 기능들은 기존 연산자 및 함수와 유사하지만 훨씬 강력한 패턴 매칭 환경을 구현하고 있습니다. 검색의 기준이 되는 데이터는 간단한 문자열일 수도 있고 데이터베이스 테이블의 문자 컬럼에 저장된 대량의 텍스트일 수도 있습니다. 정규 표현식을 이용하면 이전에는 생각도 못했던 유연한 방법으로 데이터를 검색, 대체, 검증할 수 있습니다.

정규 표현식의 기본적 예제

새로운 기능을 사용해 보기기 전에, 몇 가지 메타문자의 의미를 이해해 보기로 합시다. 마침표(.)는 정규 표현식에 존재하는 모든 문자(newline 제외)와 매칭됩니다. 예를 들어 정규 표현식 a.b는 문자 a, (newline을 제외한) 임의의 단일 문자, 그리고 문자 b의 순서로 구성된 문자열과 매칭됩니다. 문자열 axb, xaybx, abba는 모두 이 정규표현식에 정의된 패턴을 포함하고 있으므로 매치가 가능합니다. 라인이 a로 시작하여 b로 끝나는, 3 개 문자로 구성된 문자열을 매칭하고자 하는 경우에는 앵커(anchor)가 사용되어야 합니다. 캐럿(^) 메타문자는 라인의 시작을, 달러($) 기호는 라인의 끝을 의미합니다 (표 1 참고). 따라서 정규 표현식 ^a.b$aab, abb, axb와 같은 문자열과 매칭됩니다. LIKE 연산자에서 이와 동일한 기능을 수행하려면 a_b 패턴을 사용해야 합니다. 여기서 밑줄 기호(_)는 단문자 와일드카드를 의미합니다.

기본적으로, 정규 표현식의 개별 문자 또는 문자 리스트는 단 한 번만 매칭됩니다. 정규 표현식은 문자가 여러 번 반복 출현되는 조건을 지정하기 위한? 반복 연산자(repetition operator)를 제공합니다("quantifier"라 부르기도 합니다). 문자 a로 시작해서 b로 끝나는 문자열 매칭을 위한 정규 표현식이 아래와 같습니다: ^a.*b$. * 메타문자는 임의의 메타문자(.)가 0 번, 한 번, 또는 여러 번 반복되는 조건에 매칭됩니다. LIKE 연산자에서는 이와 동일한 연산자로 a%b를 지원합니다. 여기서 퍼센트(%) 기호는 임의 문자가 0 번, 한 번, 또는 여러 번 반복됨을 의미합니다.

표 2는 반복 연산자의 전체 목록을 보여 주고 있습니다. 이 표에 제시된 예를 통해 정규 표현식이 기존의 LIKE와일드카드 문자보다 훨씬 뛰어난 유연성을 제공함을 확인할 수 있습니다. 표현식에 괄호를 씌우는 경우, 서브표현식(subexpression)으로 활용됩니다. 서브표현식은 임의의 횟수만큼 반복될 수 있습니다. 예를 들어, 정규 표현식 b(an)*aba, bana, banana, yourbananasplit등과 매치됩니다.

오라클의 정규 표현식은 POSIX(Portable Operating System Interface) 문자 클래스를 지원합니다(표 3 참고). 따라서 검색하는 문자의 유형을 세부적으로 정의하는 것이 가능합니다. 알파벳이 아닌 문자를 검색하는 조건을 LIKE 연산자로 작성한다면, WHERE 절이 훨씬 복잡한 형태로 구현되어야 할 것입니다.

POSIX 문자 클래스는 반드시 대괄호([])로 묶여 져야 합니다. 예를 들어, 정규 표현식 [[:lower:]]는 소문자와 매치되며 d [[:lower:]]{5}는 5 개의 연속적인 소문자와 매치됩니다.

POSIX 문자 클래스와 별도로, 개별 문자를 문자 리스트(character list)에 포함시키는 기능이 제공됩니다. 예를 들어 정규 표현식 ^ab[cd]ef$는 문자열 abcef , abdef와 매치됩니다. 여기서 c 또는 d 두 개의 문자 중 하나가 사용되고 있어야 합니다.

문자 리스트 내부에 위치하는 대부분의 메타문자는 일반 문자로 인식됩니다. 그 예외가 캐럿 (^) 기호와 하이픈 (-)기호입니다. 일부 메타문자는 문맥에 따라 다른 의미를 갖습니다. 이 때문에 정규 표현식이 무척 복잡해 보일 수도 있습니다. 캐럿 ^이 그 한 가지 예입니다. 이 기호를 문자 리스트의 첫 번째 문자로 사용되는 경우에는, 문자 리스트의 반대 조건(negation)을 의미합니다. 따라서[^[:digit:]]은  숫자가 아닌 문자로 구성된 패턴과 매칭되는 반면 ^[[:digit:]] 은  숫자로 시작되는 패턴과 매칭됩니다. 하이픈 (-)은 영역(range)을 의미합니다. 정규 표현식 [a-m]am 사이의 임의의 문자와 매칭됩니다. 하지만 [-afg]의 경우처럼 하이픈이 문자 리스트의 첫 번째 문자로 사용된 경우에는 실제 하이픈 문자를 의미합니다

앞에서 괄호를 사용하여 서브표현식을 구현하는 방법을 예시한 바 있습니다. 서브표현식에서는 수직 기호(|)메타문자를 사용하여 여러 개의 대체 문자를 지정할 수 있습니다.

예를 들어, 정규 표현식 t(a|e|i)n은 문자 tn 사이에 오는 3 개의 대체 문자를 지정하고 있습니다. tan, ten, tin, Pakistan 등의 문자열은 매치되지만 teen, mountain, tune 등은 매치되지 않습니다. 또 정규 표현식 t(a|e|i)n을 문자 리스트 t[aei]n으로 표현할 수도 있습니다. 표 4는 이러한 메타문자들을 요약하고 있습니다. 지금까지 설명한 것 말고도 다양한 메타문자가 있지만, 여기에서는 본 문서에서 예제로 사용되는 정규 표현식을 이해할 수 있는 정도만 이해하고 넘어가기로 합니다.

REGEXP_LIKE연산자

REGEXP_LIKE오라클 데이터베이스에 적용 가능한 정규 표현식 기능을 제공합니다. 표 5REGEXP_LIKE의 문법을 보여주고 있습니다

아래 SQL 쿼리의 WHERE 절에서 사용된 REGEXP_LIKE 연산자는 정규 표현식 [^[:digit:]]을 만족하는 패턴의 ZIP 컬럼을 검색하고 있습니다. 이 조건절을 이용하여, ZIPCODE 테이블로부터 숫자가 아닌 문자를 포함하는 ZIP 컬럼이 포함된 모든 로우를 가져올 수 있습니다.

SELECT zip
  FROM zipcode
 WHERE REGEXP_LIKE(zip, '[^[:digit:]]')
ZIP
-----
ab123
123xy
007ab
abcxy

이 정규 표현식은 메타문자, 좀 더 정확히 말하면 콜론과 대괄호로 묶인 POSIX 문자 클래스 digit만을 사용하고 있습니다. [^[:digit:]]에서 두 번째로 사용된 대괄호는  문자 클래스 리스트를 묶는 용도로 사용됩니다. 앞에서 설명한 것처럼 POSIX는 문자 리스트를 구성하는 용도로만 사용되므로 이와 같은 처리가 필요합니다.

REGEXP_INSTR 함수

이 함수는 패턴의 시작 위치를 반환하며, 따라서 INSTR 함수와 유사한 형태로 동작합니다. REGEXP_INSTR함수의 사옹 방법은 표 6에서 확인할 수 있습니다. 두 함수의 가장 중요한 차이는 REGEXP_INSTR를 이용하는 경우 특정 문자열이 아닌 패턴을 지정할 수 있으며, 따라서 훨씬 유연한 검색이 가능하다는 사실입니다. 다음 예에서는 REGEXP_INSTR을 사용하여 Joe Smith, 10045 Berry Lane, San Joseph, CA 91234문자열에서 5 개의 숫자로 구성된 우편 번호 패턴의 시작 부분을 반환하고 있습니다. 정규 표현식 [[:digit:]]{5}를 사용하는 경우 우편 번호가 아닌 집 주소 번호의 시작 위치를 얻게 됩니다 (처음으로 검색되는 5 개 연속 숫자 패턴이 10045이기 때문입니다). 따라서 $ 메타문자를 사용하여 표현식의 앵커를 라인 끝부분으로 지정해야 합니다. 이렇게 하면 집 주소 번호에 관계없이 우편 번호의 시작 위치를 얻을 수 있습니다.

SELECT REGEXP_INSTR('Joe Smith, 10045 Berry Lane, San Joseph, CA 91234',
       '[[:digit:]]{5}$')
       AS rx_instr
  FROM dual
  RX_INSTR
----------
        45

좀 더 복잡한 패턴의 작성

앞의 예의 우편 번호 패턴을 확장하여 네 가지 숫자를 포함하는 패턴을 만들어 보기로 합시다. 새로 작성된 패턴이 아래와 같습니다:

[[:digit:]]{5}(-[[:digit:]]{4})?$.

소스 문자열이 5 개 숫자로 종료되든, 또는 "5 개 숫자 + 4 자리 우편 번호" 포맷을 갖든, 패턴의 시작 위치를 얻을 수 있습니다.

SELECT REGEXP_INSTR('Joe Smith, 10045 Berry Lane, San Joseph, CA 91234-1234',
       ' [[:digit:]]{5}(-[[:digit:]]{4})?$')
    AS starts_at
  FROM dual
 STARTS_AT
----------
        44

위의 예에서 괄호로 묶인 서브표현식 (-[[:digit:]]{4})는 반복 연산자 ?로 지정된 조건에 따라 0 회 또는 1 회 반복됩니다. 다시 말하지만, 기존의 SQL 함수를 이용하여 같은 결과를 얻어 내려면 아무리 SQL 전문가라 해도 쉽지 않은 작업이 될 것입니다. 표 7은 정규 표현식을 구성하는 각 문자와 메타문자의 의미를 설명하고 있습니다.

REGEXP_SUBSTR함수

REGEXP_SUBSTR 함수는 SUBSTR 함수와 마찬가지로 문자열의 일부를 추출합니다. 표 8은 새로운 함수의 사용법을 설명하고 있습니다. 아래 예제에서는 [^,]*, 패턴에 매치되는 문자열이 반환됩니다. 정규 표현식은 공백에 이어 사용된 쉼표를 검색하고, 쉼표가 아닌 문자가 0 회 또는 그 이상 반복되는 패턴을 검색([^,]*)한 후 마지막으로 또 다른 쉼표를 검색합니다. 이 패턴은 쉼표로 구분된 문자열(comma-separated values)과 유사한 배열을 갖습니다.

SELECT REGEXP_SUBSTR('first field, second field , third field',
       ', [^,]*,')
  FROM dual
REGEXP_SUBSTR('FIR
------------------
, second field   ,

REGEXP_REPLACE 함수

특정 문자열을 다른 문자열로 대체하는 기존의 REPLACE SQL 함수의 기능을 잠시 되짚어 보겠습니다. 데이터의 텍스트에 필요 이상의 공백 기호가 존재하는 상황에서, 이를 단일 공백 기호로 대체하는 경우를 가정해 봅시다 REPLACE 함수를 사용할 때에는 대체할 공백 기호의 숫자를 정확하게 지정해야 합니다. 하지만, 필요 없는 공백의 수가 일정하리라는 보장은 없습니다. 아래 예는 JoeSmith사이에 3 개의 공백 기호가 존재하는 경우를 검색하고 있습니다. REPLACE 함수의 매개변수는 두 개의 공백 기호를 하나의 공백 기호로 대체할 것을 명시하고 있습니다. 하지만 JoeSmith 사이에 3 개의 공백 기호가 존재하는 경우에는 여전히 필요 없는 공백이 하나 남게 됩니다.

SELECT REPLACE('Joe   Smith','  ', ' ')
       AS replace
  FROM dual
REPLACE
---------
Joe Smith

REGEXP_REPLACE 한층 개선된 문자열 대체 기능을 제공합니다. 그 사용법은 표 9에서 설명되고 있습니다. 아래 쿼리는 두 개 또는 그 이상의 공백 기호를 하나의 공백 기호로 대체합니다. ( )서브표현식은 하나의 공백 기호를 포함하며 {2,}의 조건에 의해 지정된 대로 2 회 또는 그 이상 반복되는 조건을 명시합니다.

SELECT REGEXP_REPLACE('Joe   Smith',
       '( ){2,}', ' ')
       AS RX_REPLACE
  FROM dual
RX_REPLACE
----------
Joe Smith

 

백레퍼런스(Backreference)

정규 표현식의 유용한 기능의 하나로 재활용을 위해 서브표현식을 저장하는 기능이 제공됩니다. 이 기능을 백레퍼런스(backreferencing)라 부릅니다(상세한 설명은 표 10 참고). 백레퍼런스를 이용하여 패턴을 새로운 위치에 맞교체하거나 반복적인 단어 또는 문자를 검색하는 등의 고급 대체 기능을 구현할 수 있습니다. 서브표현식과 일치하는 문자열은 임시 버퍼에 저장됩니다. 이 버퍼에는 왼쪽에서 오른쪽 순서로 숫자가 매겨지며 \digit 형태로 표현됩니다. 여기서 digit은 1과 9 사이의 숫자를 의미하며 각 숫자에 해당하는 서브표현식과 매치됩니다.

아래 예제는 서브익스프레션에 대한 백레퍼런스를 이용하여 Ellen Hildi Smith라는 이름을 Smith, Ellen Hildi로 변환하고 있습니다.

SELECT REGEXP_REPLACE(
       'Ellen Hildi Smith',
       '(.*) (.*) (.*)', '\3, \1 \2')
  FROM dual
REGEXP_REPLACE('EL
------------------
Smith, Ellen Hildi

위의 SQL 구문은 각각 괄호로 묶인 3 개의 서브표현식을 사용하고 있습니다. 각 서브표현식은 임의의 단일 문자와 매치되는 메타문자(.)와, 임의의 문자(newline 제외)와 0 회 또는 그 이상 매치되는 * 메타문자를 연이어 사용하고 있습니다. 각 서브표현식 사이에 사용된 공백 기호 역시 매치되어야 합니다. 괄호로 묶인 서브표현식에 의해 캡처된 값은 \digit에 의해 참조할 수 있습니다. 따라서 첫 번째 서브표현식에는 \1이, 두 번째 표현식에는\2이 할당됩니다. 이 백레퍼런스들은 함수의 마지막 매개변수 (\3, \1 \2)로 사용되어, 서브문자열을 대체하고 (쉼표와 공백을 포함하는) 포맷으로 표현하는 용도로 활용되고 있습니다. 표 11은 정규 표현식의 개별 컴포넌트에 대한 상세 정보를 설명하고 있습니다.

백레퍼런스는 값을 대체, 포맷하는 용도로 유용하게 활용되며, 서로 인접한 값을 찾기 위해 이용할 수도 있습니다. 다음 예제는 REGEP_SUBSTR 함수를 이용하여 공백 기호로 구분된 알파벳/숫자 값의 중복 사례를 검색하고 있습니다. 이 함수가 반환된 서브문자열을 통해 is 문자열이 반복되고 있음을 알 수 있습니다.

SELECT REGEXP_SUBSTR(
       'The final test is is the implementation',
       '([[:alnum:]]+)([[:space:]]+)\1') AS substr
  FROM dual
SUBSTR
------
is is

매치 매개변수 옵션

앞에서 예시한 예제들을 통해 정규 표현식 연산자와 함수에 매치 매개변수(match parameter)를 추가적으로 활용할 수 있음을 눈치 채셨을 것입니다. 이 매개변수는 대소문자 구분, newline 문자의 매치, 멀티라인 입력의 보존 등을 지원합니다.

정규 표현식의 활용 사례

Y정규 표현식은 단순 쿼리 이외에도 PL/SQL 언어처럼 SQL 연산자, 함수가 사용되는 경우라면 언제든 적용이 가능합니다. 또 정규 표현식을 이용하여 값의 검증, 생성, 추출을 위한 기능을 트리거 형태로 구현할 수 있습니다.

다음 예제는 입력된 데이터에 대해 컬럼 제약 조건을 검증하기 위해 REGEXP_LIKE 연산자를 사용하는 방법을 예시하고 있습니다. 이 쿼리는 INSERT, UPDATE 작업이 발생하는 경우 입력이 사회보장번호의 포맷과 일치하는지 확인합니다. 123-45-6789 또는 123456789과 같은 포맷으로 표현된 사회보장번호는 컬럼의 제약 조건을 만족합니다. 데이터는 3 개의 숫자로 시작하여 하이픈으로 연결된 후, 다시 두 개의 숫자, 하이픈, 마지막으로 4 개의 숫자로 표현됩니다. 또는 사회보장번호를 9 개의 연속적 숫자로 표현하는 것도 가능합니다. 수직 기호(|)는 두 가지 옵션 중 선택이 가능함을 의미합니다.

ALTER TABLE students
  ADD CONSTRAINT stud_ssn_ck CHECK
  (REGEXP_LIKE(ssn,
  '^([[:digit:]]{3}-[[:digit:]]{2}-[[:digit:]]{4}|[[:digit:]]{9})$'))
      

^, $. 기호는 가장 앞에 또는 가장 뒤에 오는 문자를 무시할 것을 지정하고 있습니다. 정규 표현식이 두 개 이상의 라인으로 분절되거나 표현식에 불필요한 공백 기호가 포함되지 않도록 주의하시기 바랍니다. 표 12는 위 정규 표현식 예제에서 사용된 각각의 컴포넌트에 대해 설명하고 있습니다.

정규 표현식과 기존 SQL 기능의 비교

정규 표현식은 기존에 사용되던 LIKE 연산자와 INSTR, SUBSTR, and REPLACE 함수와 비교했을 때 여러 가지 이점을 제공하고 있습니다. 기존의 SQL 함수는 패턴 매칭을 전혀 지원하지 않고 있습니다. 문자의 매칭을 지원하는 컴포넌트는 LIKE연산자가 유일하며 % , _와일드카드 문자가 지원됩니다. 하지만 LIKE 연산자는 표현식의 반복, 복잡한 대체 패턴, 문자 영역, 문자 리스트, POSIX 문자 클래스 등을 지원하지 않습니다. 또 새로운 정규 표현식 함수는 반복 단어와 패턴의 맞교환(swap)을 지원한다는 장점이 있습니다. 본 문서에서 제시된 예제들이 정규 표현식의 개념과 활용 방법을 이해하는데 도움이 되었기 바랍니다.

툴킷 확장을 위한 유용한 도구

정규 표현식은 복잡한 문제의 해결을 가능하게 하는 매우 강력한 기능입니다. 정규 표현식은 기존 SQL 함수로는 흉내내기 어려운 다양한 기능을 지원합니다. 정규 표현식의 사용법이 다소 복잡해 보이기는 하지만, 그 기본적인 구성 요소만 익혀도 SQL뿐 아니라 다른 프로그래밍 언어에서도 유용한 도구로 활용하실 수 있을 것입니다. 원하는 패턴을 얻기 위해서는 여러 차례의 시행착오가 불가피할 수도 있습니다. 하지만 어느 누구도 정규 표현식의 우아함과 강력한 기능을 결코 무시할 수 없을 것입니다.

Alice Rischert (ar280@yahoo.com)는 콜럼비아 대학 컴퓨터 테크놀로지/애플리케이션 프로그램의 데이터베이스 애플리케이션 개발/설계 트랙 담당 회장입니다. 그녀는 <Oracle SQL Interactive Workbook 2nd edition(Prentice Hall, 2002)>과 조만간 출판 예정인 <Oracle SQL by Example(Prentice Hall, 2003)>의 저자이기도 합니다. Rischert 는 포춘 100대 기업에서 데이터베이스 설계, DBA, 프로젝트 리더로 15 년 간의 경력을 보유하고 있으며 오라클 데이터베이스는 버전 5부터 사용해 온 베테랑입니다.

표 1: 메타문자의 앵커(anchor) 적용

Metacharacter 설명
^ 라인의 시작 부분에 표현식을 적용
$ 라인의 끝부분에 표현식을 적용

표 2: 반복 연산자(Repetition Operator, Quantifier)

Quantifier 설명
* 0 회 또는 그 이상 횟수로 매치
? 0 회 또는 1 회 매치
+ 1 회 또는 그 이상 횟수로 매치
{m} 정확히 m 회 매치
{m,} 최소한 m 회 매치
{m, n} 최소 m 회, 최대 n 회 매치

표 3: 사전정의된 POSIX 문자 클래스

Character Class 설명
[:alpha:] 알파벳 문자
[:lower:] 소문자 알파벳 문자
[:upper:] 대문자 알파벳 문자
[:digit:] 숫자
[:alnum:] 알파벳/숫자
[:space:] 출력되지 않는 공백 문자(예: carriage return, newline, vertical tab, form feed 등
[:punct:] 구두점 기호
[:cntrl:] (출력되지 않는) 컨트롤 문자
[:print:] 출력 가능한 문자

표 4: 대체 매칭 및 표현식의 그룹화

Metacharacter 설명
| Alternation 대체 문자를 구분 (그룹핑 연산자 ()와 함께 사용하기도 함)
( ) Group 반복 연산자 또는 백레퍼런스(backreference)를 위해 대체 유닛을 서브표현식으로 그룹화 ("백레퍼런스" 섹션 참고)
[char] Character list I문자 리스트. 문자 리스트 내부에 위치하는 대부분의 메타문자는 일반 문자로 인식됨. 그 예외가 캐럿(^) 기호와 하이픈(-) 기호

표 5: REGEXP_LIKE 연산자

문법 설명
REGEXP_LIKE(source_string, pattern
[, match_parameter])
source_string은 문자 데이터타입 지원 (CHAR, VARCHAR2, CLOB, NCHAR, NVARCHAR2, NCLOB LONG 은 제외). pattern매개변수는 정규 표현식을 참조하는 또 다른 이름. 옵션으로 제공되는 match_parameter를 이용하여 newline 문자의 처리, 멀티라인 포맷의 유지, 대소문자 구분 등을 처리할 수 있음.

표 6: REGEXP_INSTR 함수

문법 설명
REGEXP_INSTR(source_string, pattern
[, start_position
[, occurrence
[, return_option
[, match_parameter]]]])
pattern을 검색하여 패턴의 첫 번째 위치를 반환. 필요한 경우 start_position y을 이용하여 검색을 시작할 위치를 지정할 수 있음. occurrence매개변수는 같은 패턴을 여러 번 검색하고자 하는 경우에 사용(디폴트는 1). return_option은 패턴의 시작 위치를 반환(디폴트 값은 0). 1로 설정되는 경우 매치된 패턴의 다음 문자 위치를 반환.

표 7: 5 자리 숫자 + 4 자리 Zip-Code 표현식에 대한 설명

문법 설명
  매치되어야 하는 빈 공백
[:digit:] POSIX "numeric digit" 클래스
] 문자 리스트(character list)의 끝
{5} 문자 리스트에 대해 정확히 5 회 반복
( 서브표현식(subexpression)의 시작 부분
- 하이픈(-) 문자 (문자 리스트 내의 range 메타문자로 사용되지 않았음에 주의)
[ 문자 리스트의 시작 부분
[:digit:] POSIX [:digit:] 클래스
[ 문자 리스트의 시작 부분
] 문자 리스트의 끝 부분
{4} 문자 리스트를 정확히 4 회 반복
) 서브표현식을 묶는 괄호 기호
? ? 반복 연산자는 그룹핑된 서브표현식을 0 회 또는 1 회 매치하여 옵션으로 4 자리 코드를 사용할 수 있게 함
$ 검색 위치를 라인의 끝부분으로 지정하기 위한 앵커 메타문자

표 8: The REGEXP_SUBSTR 함수

문법 설명
REGEXP_SUBSTR(source_string, pattern
[, position [, occurrence
[, match_parameter]]])
REGEXP_SUBSTR 함수는 패턴애 매치되는 서브문자열을 반환.

표 9: TheREGEXP_REPLACE 함수

문법 설명
REGEXP_REPLACE(source_string, pattern
[, replace_string [, position
[,occurrence, [match_parameter]]]])
매치된 패턴을 지정된 replace_string으로 대체하고, 복잡한 검색/대체 작업을 가능하게 하는 함수.

표 10: 백레퍼런스 메타문자 (Backreference Metacharacter)

Metacharacter 설명
\digit Backslash 백슬래시 뒤에 1-9 사이의 숫자를 명시하여, 괄호 처리된 N 번째 서브표현식을 참조하기 위해 사용.
(참고: 백슬래시는 정규 표현식에서 다른 의미로 사용되기도 함. 문맥에 따라 Escape 문자를 의미할 수도 있음.

표 11: 패턴-스왑(Pattern-Swap) 정규 표현식의 설명

정규 표현식 아이템 설명
( 첫 번째 서브표현식의 시작
. (newline을 제외한) 임의의 단일 문자와 매치
* 반복 연산자 - 앞의 . 메타문자와 0 회에서 n 회까지 매치
) 첫 번째 서브표현식의 마지막. 매치 결과는 \1
에 캡처됨(예제에서는 Ellen을 캡처)
  공백 기호
( 두 번째 서브표현식의 시작
. newline을 제외한 임의의 단일 문자와 매치
* 반복 연산자 - 앞의 . 메타문자와 0 회에서 n 회까지 매치
) 두 번째 서브표현식의 마지막; 매치 결과는 \2
에 캡처됨(예제에서는 Hildi를 저장).
  공백 기호
( 세 번째 서브표현식의 시작
. newline을 제외한 임의의 단일 문자와 매치
* 반복 연산자 - 앞의 . 메타문자와 0 회에서 n 회까지 매치
) 세 번째 서브표현식의 끝 부분. 매치 결과는 \3
에 캡처(예제에서는 Smith를 저장).

표 12: Social Security Number 정규 표현식의 설명

정규 표현식 아이  템 설명
^ 라인 문자의 시작(정규 표현식은 매치되기 이전의 문자를 가져 올 수 없음.)
( 서브표현식을 시작하고 | 메타문자를 이용하여 대체 목록을 제공
[ 문자 리스트(character list)의 시작
[:digit:] POSIX "numeric digit" 클래스
] 문자 리스트의 끝 부분
{3} 문자 리스트를 정확하게 3 회 반복 적용
- 하이픈
[ 문자 리스트의 시작
[:digit:] POSIX numeric digit 클래스
] 문자 리스트의 끝 부분
{2} 문자 리스트를 정확하게 2 회 반복 적용
- 또 다른 하이픈 기호
[ 문자 리스트의 시작
[:digit:] POSIX numeric digit 클래스
] 문자 리스트의 끝 부분
{4} 문자 리스트를 정확하게 4 회 반복 적용
| 대체(alternation) 메타문자 - 첫 번째 선택을 종료하고 두 번째 대체 표현식을 시작
[ 문자 리스트의 시작
[:digit:] POSIX numeric digit 클래스.
] 문자 리스트의 끝 부분
{9} 문자 리스트를 정확하게 9 회 반복
) 대체를 위해 사용된 서브표현식 그룹을 종료하는 괄호 기호
$ 라인의 끝부분을 의미하는 앵커 메타문자 (매치된 패턴 이후에 어떤 문자도 뒤따라 올 수 없음)

 

오라클 정규표현식 예제

REGEXP_SUBSTR

  1. STUDYUNITCODE를 숫자와 문자를 분리하여 나타낸다. (맨 앞에 0은 삭제한다.)
    SELECT  
        STUDYUNITCODE,
        REGEXP_SUBSTR(REGEXP_REPLACE(STUDYUNITCODE,'^\0',''),'[[:digit:]]{1,2}') TAPE,
        REGEXP_SUBSTR(STUDYUNITCODE,'[[:alpha:]]{1}') SIDE
    FROM TB_STUDYUNIT 
    ORDER BY KWON,STUDYUNITCODE
  2. 결과값
    STUDYUNITCODE	TAPE	SIDE
    
    01A	        1	A
    10B	       10	B
    12A      	12	A
    02B     	 2	B
    23A     	23	A
    30B     	30	B
    
  1. 페이지정보에서 첫페이지를 찾아서 알려준다.
    SELECT SOURCE, REPLACE(REGEXP_SUBSTR(SOURCE,'p[[:digit:]]{1,3}'),'p','') PAGE
    FROM QUESTION WHERE ROWNUM < 10;
  2. 결과값
    SOURCE	                 PAGE
    
    b1: p24	                  24
    b1: p19, 24, 32, 46	    19
    b3: p5	                   5
    b3: p29	                  29
    b3: p10-11	           10
    b2: p22	                  22
    b1: p20 b2: p15 b4: p40  20
    b2: p8-9, 30	            8
    b3: p16-17	           16
    
블로그 이미지

유효하지않음

,

SELECT REGEXP_REPLACE(TEST,'(ire_v0[0-2][0-9]*)', 'decode(\1, null, 0, \1)') REG_REP
FROM
(
SELECT '((ire_v001/ire_v002*100)*0.5+(ire_v003/ire_v020*100)*0.5)' TEST
FROM dual
)

--> 결과
((decode(ire_v001, null, 0, ire_v001)/decode(ire_v002, null, 0, ire_v002)*100)*0.5+(decode(ire_v003, null, 0, ire_v003)/decode(ire_v020, null, 0, ire_v020)*100)*0.5)





-- 정규식 테스트(위 내용과 관계없음.)
WITH tmp AS
(
    SELECT 1 idx, '(90)abcdefg' txt   FROM DUAL UNION ALL
    SELECT 2, '(80) abcdefg'          FROM DUAL UNION ALL
    SELECT 3, '70맒ㄴ;람낢ㄴ'         FROM DUAL UNION ALL
    SELECT 4, '60 ㄻㅇㄴㄻㄴㅇㄹ'     FROM DUAL UNION ALL
    SELECT 5, '50 ㅁㄴㄻㄴㄴㅁ 40'    FROM DUAL UNION ALL
    SELECT 6, 'ㅎㅎㅎㅎㅎㅎㅎㅎ'      FROM DUAL UNION ALL
    SELECT 7, 'ㅋㅋㅋㅋㅋㅋㅋ 40'     FROM DUAL
)
SELECT  idx, txt, regexp_replace(txt, '^(\([0-9\)]+)(.*)', '\1점 \2')
FROM    tmp
WHERE   regexp_like(txt, '^(\([0-9\)])');


ELECT oi_sub_linkedcode, oi_sub_linkedcodename
FROM
(
    SELECT  REGEXP_SUBSTR(oi_sub_linkedcodes,     '[^,]+', 1, LEVEL) oi_sub_linkedcode
           ,REGEXP_SUBSTR(oi_sub_linkedcodenames, '[^,]+', 1, LEVEL) oi_sub_linkedcodename
    FROM (SELECT oi_sub_linkedcodes, oi_sub_linkedcodenames FROM NG02_ORGAN_INFO WHERE oi_code = 57)
    CONNECT BY LEVEL <= LENGTH(REGEXP_REPLACE(oi_sub_linkedcodes, '[^,]+'))  + 1
)
WHERE oi_sub_linkedcode = '50901240003'



SELECT  TRIM(COLUMN_VALUE) str 
FROM    (SELECT 'aaaa,bbbb,cccc,dddd' str FROM DUAL)
       ,XMLTABLE(('"' || REPLACE(str, ',', '","') || '"'))


SELECT COLUMN_VALUE oi_sub_linkedcodes
FROM   TABLE(SPLIT((SELECT REGEXP_REPLACE(REGEXP_REPLACE('50901240001,50901240002,50901240003,50901240004,50901240005,50901240006,50901240007', '(50901240001|50901240002|50901240004|50901240005|50901240008)', ','), '([^0-9],)', '') FROM DUAL)))

SELECT oi_sub_linkedcodes
FROM
(
       SELECT COLUMN_VALUE oi_sub_linkedcodes FROM TABLE(SPLIT('50901240001,50901240002,50901240003,50901240004,50901240005,50901240006,50901240007', ','))
       MINUS
       SELECT COLUMN_VALUE oi_sub_linkedcodes FROM TABLE(SPLIT('50901240001,50901240002,50901240004,50901240005,50901240008', ','))
)

그 밖에
REGEXP_LIKE
REGEXP_INSTR
REGEXP_SUBSTR 등이 존재하니 참고하시기 바랍니다.

http://www.psoug.org/reference/regexp.html

http://www.adminschool.net/wiki/doku.php?id=dbms:oracle:devel:regexp

블로그 이미지

유효하지않음

,

OS에 locale을 ko_KR.eucKR로 변경하기 어려운 사항이면 아래처럼 처리해 주시기 바랍니다.

1. web.xml

     :

     :

   <jsp-config>
        <taglib>
            <taglib-uri>/WEB-INF/ngtag.tld</taglib-uri>
            <taglib-location>/WEB-INF/ngtag.tld</taglib-location>
        </taglib>
        <jsp-property-group>
            <url-pattern>*.ng</url-pattern>
            <page-encoding>MS949</page-encoding>
        </jsp-property-group>
    </jsp-config>

     :

     :

 

2-1. $JEUS_HOME/config/<HOSTNAME>/JEUSMain.xml

     :

     :  

    <node>
        <name>NG230</name>
        <engine-container>
            <name>container2</name>

     <!-- 톰켓 한글처리 방식 -->
            <command-option>
                -Djeus.servlet.jsp.modern=true
            </command-option>

            <id>122</id>
            <base-port>10971</base-port>
            <engine-command>
                <type>servlet</type>
                <name>engine2</name>
            </engine-command>
        </engine-container>
        <class-ftp>true</class-ftp>
        <sequential-start>true</sequential-start>
        <enable-webadmin>true</enable-webadmin>
    </node>

     :

     :

 

 

2-2. WebRoot/WEB-INF/jeus-web-dd.xml (JEUSMain.xml 수정하지 못하는 사항이면)

 

<?xml version="1.0" encoding="UTF-8"?>
<jeus-web-dd xmlns="http://www.tmaxsoft.com/xml/ns/jeus">
    <context-path>/</context-path>
    <enable-jsp>true</enable-jsp>
    <auto-reload>
        <enable-reload>false</enable-reload>
        <check-on-demand>false</check-on-demand>
    </auto-reload>
    <max-instance-pool-size>-1</max-instance-pool-size>
    <url-rewriting>false</url-rewriting>
    <enable-default-login>false</enable-default-login>
    <webinf-first>false</webinf-first>
    <jndi-properties>
        <local-bindings>false</local-bindings>
    </jndi-properties>
    <properties>
        <property>

     <!-- 톰켓 한글처리 방식 -->
            <key>jeus.servlet.jsp.modern</key>
            <value>true</value>
        </property>
    </properties>
</jeus-web-dd>

 

 

3. $JEUS_HOME/config/<HOSTNAME>/<SERVLET_ENGINE_NAME>/WEBMain.xml

 

<?xml version="1.0" encoding="UTF-8"?>
<web-container xmlns="http://www.tmaxsoft.com/xml/ns/jeus">
    <context-group>
    <jsp-engine>
        <java-compiler>javac</java-compiler>

<!-- include 다시 읽기옵션 서비스시 주석처리요망 -->
        <check-included-jspfile>true</check-included-jspfile>

    </jsp-engine>

        <group-name>MyGroup</group-name>
        <virtual-host>
            <virtual-host-name>192.168.0.222</virtual-host-name>
            <host-list>NG230</host-list>
        </virtual-host>
        <webserver-connection>
            <http-listener>
                <listener-id>10</listener-id>
                <port>80</port>
                <output-buffer-size>8192</output-buffer-size>
                <thread-pool>
                    <min>10</min>
                    <max>20</max>
                </thread-pool>
            </http-listener>
        </webserver-connection>
        <encoding>
            <request-encoding>
                <default>MS949</default>
                <forced>MS949</forced>
            </request-encoding>
            <response-encoding>
                <default>MS949</default>
                <forced>MS949</forced>
            </response-encoding>
            <postdata-encoding>
                <default>MS949</default>
                <forced>MS949</forced>
            </postdata-encoding>
        </encoding>
    </context-group>
</web-container>

블로그 이미지

유효하지않음

,
Q. JBoss는 Open Source 입니까?

네. Open Source입니다. 그래서 비용 지불없이 자유롭게 소스코드 및 바이너리를 사용할 수 있으며 소스코드를 수정할 수도 있습니다.


Q. JBoss는 J2SE 및 Java EE 표준을 충실히 따릅니까?

네. JBoss는 표준을 엄격히 따릅니다.


Q. Java EE 5를 지원하는 JBoss의 버전은 무엇입니까?

Java EE 5를 지원하는 공식 JBoss는 5.0이며 2008년도에 릴리즈 될 예정으로 있습니다. 현재 4.2.x 버전은 J2EE 1.4와 Java EE 5의 일부 기능(예; EJB 3.0)을 지원합니다.


Q. JBoss는 어떤 JDK에서 가장 잘 동작합니까?

JBoss또한 Java EE 표준을 따르기 때문에 Java EE 표준에서 정하는 Java SE 버전을 사용해야 합니다. 현재 릴리즈된 JBoss 4.2.3 버전은 JDK 1.6/JDK 1.5를, JBoss 4.2.2.GA는 JDK 1.5를 사용하면 되며, JBoss 5는 Java EE 5 표준에 따른 Application Server이므로 무리없이 가장 잘 동작하려면 JDK1 .5를 쓰는 것이 바람직합니다.


Q. 국내 레퍼런스가 있습니까?

네. SKT HELIO, 로밍포탈, SKT ISF, 통합결제 UI서버, 국세청국세법령유, 도로교통관리공단포탈, KIPA유러닝사업, 행자부G4C장비개선사업, 행자부성과측정관리시스템, 방송작가협회내부시스템, 서울시청상시기록평가시스템, 캠크로스개발서버, 일양택배물류시스템, 한미IT 어플리케이션서버 등에서 공식적으로 사용하는 것으로 알려져 있으며 카페 조사 결과 그외에도 많이 사용하는 것으로 알고 있습니다.


Q. 전문적인 기술지원을 받을 수 있습니까?

네. JBoss가 오픈소스이기는 하나 RedHat에서 인수하고 상용화하여 별도의 subscription에 가입하게 되면 기술지원을 받을 수 있습니다. 현재 다우기술이나 LDS 등등의 회사를 통해서 기술지원을 받을 수 있습니다.


Q. 상용 JBoss의 가격정책은 어떻습니다?

jboss.org에서 다운받을 수 있는 오픈소스 JBoss의 사용은 완전한 무료입니다. 하지만 subscription에 가입하는 경우 비용을 지불해야 하며 이때 전문적인 기술지원을 받을 수 있게 됩니다. 일반적인 가격정책은 4 CPU를 단위로 결정됩니다. 상용 Application Server와 JBoss Subscription의 비교는 http://cafe.naver.com/jbossug/767 또는 http://www.redhat.com/promo/migration/calc.html을 참고하십시오.


Q. 상용과 오픈소스의 제품 차이가 있습니까?

아니오. 전혀 그렇지 않습니다. 상용과 오픈소스는 차이가 없습니다. 상용은 subscription을 구매하시면 되며 릴리즈가 오픈소스와 달리 공식적인 릴리즈 버전을 제공하며 이것에 따라서 hotfix나 patch도 릴리즈 됩니다. 오픈소스 사용자는 이러한 버전을 다운로드할 수 없고 subscription에 가입되어 있는 사용자만 subscription 사이트에서 다운받을  수 있습니다.

버전업은 오픈소스가 일반적으로 더 빠릅니다. 따라서 오픈소스를 사용하시더라도 버그가 패치되고 기능이 향상된 버전이 더 빨리 jboss.org를 통해서 공개되기 때문에 제품 자체에 대한 차이는 없다고 보시면 됩니다. 즉, 상용과 오픈소스의 차이는 기술지원 여부입니다.


Q. JBoss의 현재 시장 점유율은 어떻습니까?

공식적을 RedHat이 발표하지는 않았지만 2005년도 ONJava에서 조사한 것에 따르면 JBoss는 38%, WebSphere 21%, WebLogic 20% 정도입니다. 특히 북미시장은 JBoss를 매우 선호합니다.


Q. JBoss는 Clustering을 지원합니까?

네. JBoss는 Clustering을 지원합니다. JBoss는 클러스터링을 통해서 부하분산, 상태복제, 자동장애복구 등을 구현하고 있습니다. HTTP Session, EJB, JMS, JNDI 등에서 Clustering 기술을 이용할 수 있습니다.


Q. JBoss에서 웹 컨테이너만 사용할 수 있습니까?

네. JBossAS에서 웹 컨테이너만 사용할 수 있으며, 웹 서버로서 기능을 수행하는 JBossWeb을 사용하실 수도 있습니다. 또한 SSL 등의 성능향상을 도와주는 JBoss Web Native Library를 제공합니다. JBossWeb은 웹 컨테이너 이외에는 웹 서버의 기능을 제공하기 때문에 PHP 및 Rewrite 모듈등을 제공합니다. JBossWeb 사이트는 http://labs.jboss.com/jbossweb 입니다.


Q. JBoss 개발도구가 있습니까?


네. 많습니다. Eclipse, IntelliJ IDEA, NetBeans 등이 모두 지원하며 거의 대부분 지원한다고 보시면 됩니다. JBoss에서는 JBossIDE라는 개발도구가 있으며 Exadel의 기여로 현재 JBossTools로 이름이 변경되었습니다. JBossIDE 또는 JBossTools는 Eclipse를 기반으로 하고 있으며 JBoss jBPM, JBoss Seam 과 같은 JBoss Project도 지원합니다. 현재 버전은 2.0입니다.


    * First-class support for JBoss Seam 1.2 and 2.0
    * Visual Page editor for rich editing of (X)HTML, JSP, JSF and Facelets pages
    * Unique JSF and Facelets support
    * JBoss AS server integration
    * Project Archives
    * Hibernate 3 Support

또한 상용버전인 JBoss Developer Studio가 있습니다. 이 제품의 가격은 $99입니다. 이 제품은 JBossIDE와 기능적으로는 유사하지만 다음의 제품이 추가적으로 더 포함되어 있으며 현재 1.0입니다.

  * Hibernate
  * JBoss Seam
  * JBoss Application Server

또한 JBoss Developer Studio는 JBossIDE보다 다음의 기능이 더 추가되어 있습니다.

  * An installer
  * Eclipse and Web Tools preconfigured
  * JBoss EAP with JBoss AS and Seam preconfigured
  * 3rd party plugins bundled and configured
  * Access to RHEL and Red Hat Network
  * Access to the JBoss/Red Hat supported software


Q. JBoss는 사용하기 쉽습니까?


네. JBoss는 사용하기 쉽습니다. WebLogic과 같은 WAS에 익숙해져 있다면 편리한 관리 콘솔을 지원하므로 상대적으로 어려워 보일 수 있습니다. 하지만 가만히 들여다 보면 사용하기 쉬운 WAS입니다. Tomcat 정도의 웹 컨테이너를 사용하신다면 JBoss도 쉽게 접근할 수 있습니다.


Q. JBoss는 웹 콘솔이 있습니까?


네. 있습니다. JBoss 구동후 http://localhost:8080/ 에 접속하시면 웹 페이지 기반 JMX Console과 Applet 기반 JMX Console을 제공합니다. 현재까지는 Console이 가장 JBoss의 취약부분이라 할 수 있습니다. RedHat에서 콘솔에 대한 부분은 지속적으로 개선할 것이라고 합니다.


Q. JBoss를 특정 IP로 바인딩할 수 있습니까?


네. 가능합니다. JBoss 구동시 IP 주소를 인수로 넘겨주면 됩니다. 다음과 같이 할수 있습니다.

#run.sh -b 0.0.0.0  (모든 네트워크의 IP로 바인딩) 또는 #run.sh -b 192.168.1.100 (특정 IP로 바인딩)


Q. JBoss에 Configuration Profile을 이용하여 사용할 수 있습니까?


네. 가능합니다. JBoss는 기본적으로 all, default, minimum의 3 가지 sever configuration을 제공합니다. 예를 들어 Clustering을 사용하려면 반드시 all server configuration으로 구동해야 합니다. 일반적으로는 default server configuration을 사용하면 됩니다. minimum을 사용하면 최소 기능이 동작하게 되며 EJB, 클러스터링과 같은 기능은 활용할 수 없게 됩니다.

또한 server configuration을 별도로 구성할 수도 있습니다. 이렇게 하여 경량의 JBoss 또는 나만의 JBoss를 구성할 수도 있습니다. 이러한 server configuration은 <JBOSS_HOME>/server 디렉토리에 configuration 별로 디렉토리가 구성되며 직접 구성할 수도 있습니다.

JBoss 구동시 configuration을 적용하려면 다음과 같이 구동하시면 됩니다.

#run.sh -c all 또는 #run.sh -c default


Q. JBoss 한글 관리자 가이드를 구할 수 있습니까?

현재 JBoss 4.x 버전은 없지만 JBoss 3.x 버전은 국내 엔지니어가 번역한 문서가 있습니다. 기본적인 내용은 거의 비슷하므로 도움이 되실 것입니다. JBoss 관리자 개발 가이드는 
http://openframework.or.kr/framework_reference/jbossAdmin/ 을 참고하십시오.

 


Q. 타 WAS로 개발한 웹 애플리케이션을 JBoss로 이식(포팅)할 수 있습니까?

네 가능합니다. 표준대로 애플리케이션을 구현했다면 다른 WAS(예; WebLogic)에서 충분히 포팅할 수 있습니다. 다른 WAS에서 작성했더라도 표준에서 지원하는 부분은 동일하며 WAS에 특정 정보를 가지고 있는 배포 디스크립터를 JBoss용 디스크립터로 변환해 주시면 됩니다. 예를 들면 JBoss의 경우에는 jboss-web.xml 파일들이 있으며 WebLogic에는 weblogic.xml 파일들이 있습니다.


Q. JBoss가 WebLogic과 같은 상용보다 성능이 느리지 않을까요?

그렇지는 않습니다. 오히려 성능시험을 해보면 상용보다 빠른경우가 많습니다. 즉, 오픈소스라서 성능이 느리다는 생각은 하지 않으셔도 됩니다(성능 측정 결과는 1차 모임 발표자료를 참고하세요). 오히려 많은 엔지니어를 통해 검증받기 때문에 더 좋습니다. JBoss가 오픈소스이기 때문에 특정 도메인에서 성능이 느리다고 생각하시면 WAS 구매 비용으로 장비를 추가하시는 것도 좋은 방법입니다.


Q. JBoss로 운영시 적은 비용으로 모니터링할 수 있는 방법이 있습니까?

JBoss는 JMX를 지원하므로 JMX를 기반으로 모니터링 기능을 제공하는 APM 제품에서 모두 사용이 가능합니다. 하지만 APM은 비용이 많이 발생하므로 적은 비용으로 모니터링할 수 있는 방법을 찾아야 합니다. 가장 적합한 제품이 AdventNet ManagedEngine Applications Manager(http://manageengine.adventnet.com/products/applications_manager/index.html)입니다. 이 제품은 OS, DB, WAS, JVM, Web Transaction, WebServices, JMX 등등을 한번에 모니터링하여 운영시 JBoss 모니터링 제품으로써 적은 비용으로 사용할 수 있습니다.

 이 비용마저 줄이고자 한다면 JMX를 기반으로 모니터링 애플리케이션을 구성하시면 됩니다.


Q. JBoss.ORG에는 어떤 프로젝트들이 있습니까?



블로그 이미지

유효하지않음

,

IIS 6.0의 경우 설정값이 최대로 보안을 유지하는 기본값으로 설정되어 이전 버전의 시간 제한 및 제약으로 인한 공격을 최소화합니다. IIS는 연결 수준에서 다음 시간 제한을 강제 적용합니다.

응답 버퍼링 제약: AspBufferingLimit 메타베이스 속성 의 기본값은 4MB입니다. ASP 스크립트 버퍼가 이보다 많아지면 오류가 초과됩니다. IIS 6.0 이전에는 버퍼링에 제약이 없었습니다.

전송할 때의 제약: AspMaxRequestEntityAllowed 메타베이스 속성 은 최대 ASP 전송 크기를 204,800바이트(각 필드는 100KB)로 제한합니다. IIS 6.0 이전에는 전송에 제약이 없었습니다.

ServerListenTimeout 메타베이스 속성은 IIS 6.0의 WWW 서비스에서는 사용되지 않지만 FTP와 SMTP, NNTP 등의 서비스에서는 계속 사용할 수 있습니다. WWW 서비스에서 ServerListenTimeout은 다음 메타베이스 속성으로 대체되었습니다.

ConnectionTimeout 메타베이스 속성 : 이 속성은 서버가 비활성화된 연결을 해제할 때까지의 대기 시간(초)을 설정합니다.

MinFileBytesPerSec 메타베이스 속성 : IIS가 클라이언트 요청에 응답하면 MinFileBytesPerSec 속성이 클라이언트가 전체 응답을 수신해야 하는 시간 길이를 결정합니다. 만일 클라이언트 시스템이 전체 응답을 너무 오래 수신하고 있으면 커널 모드 드라이버인 HTTP.sys가 시간 제한 값에 따라 연결을 종료합니다.

HeaderWaitTimeout 메타베이스 속성 : 클라이언트에 웹 서버가 연결하면 클라이언트 컴퓨터에 요청의 모든 헤더를 전송할 시간 제한(마지막에 \r\n으로 표시)이 제공됩니다. 요청의 완전한 헤더 세트가 HeaderWaitTimeout에 표시된 시간 기간 내에 수신되지 않으면 HTTP.sys가 연결을 다시 설정합니다. HeaderWaitTimeout의 값을 구성할 수 있습니다.

헤더 크기 제한: 기본값으로 HTTP.sys는 요청 헤더가 16KB보다 적은 요청만 승인합니다. 즉, HTTP.sys가 16KB 내에 종료 <CRLF><CRLF> 시퀀스를 수신하지 못하면 HTTP.sys는 악의 있는 요청으로 간주하고 연결을 종료합니다. MaxRequestBytes 레지스트리 키의 값을 조정하여 헤더 크기 제한을 변경할 수 있습니다.

블로그 이미지

유효하지않음

,
블로그 이미지

유효하지않음

,

 문제)

Coldfusion 6.1 에서 Apache 서버와 configuration을 하는 경우 아래와 같은 에러가 발생.

httpd.exe: Syntax error on line 486 of c:/Program Files/Apache Software Foundation/Apache2.2/conf/httpd.conf: Cannot load c:/JRUN4/lib/wsconfig/1/mod_jrun20.so into server: The specified procedure could not be found.

 

 

해결책)

I notice that you are using apache 2.2. You will need to use the mod_jrun22.so

1. Download this hotfix: http://www.adobe.com/support/coldfusion/ts/documents/8001e97/wsconfig.zip
2. Extract the jar and open it with winrar or similar.
3. Copy wsconfig.jar\connectors\apache\intel-win\prebuilt\mod_jrun22.so to your machine {path to mod_jrun}

 

***  cf_root/runtime/lib/wsconfig.jar 파일을 다운로드 받은 파일로 변경한다. 

블로그 이미지

유효하지않음

,
[출처] http://www.wearethebest.co.kr/zbxe/?mid=CodeGear_Lecture_Capture&category=6065&document_srl=3752&sort_index=readed_count&order_type=desc

브라우저 빈창 하나띄우고(1번) Ctrl+N해서 새창 띄우고(2번) 2번창에 axtivexform이는 경로 페이지 로드하고
2번창에서 Ctrl+N해서 새창 띄우고(3번) 2번 창 닫고
3번창을 리로드하거나 3번창에서 새창을 띄우면
에러납니다.
여기에 있는 방법 말고도 Borland QC(3315)에 있는 해봤는데도
똑같네요

------------------------------------------------------------------------------------
[답변]DAXParkingWindow란 무엇인가여?  
Parking Windows는 델파이에서 ActiveX 컨트롤이나 ActiveForm을 사용시
컨트롤들을 구성,제어하기 위해 생성하는 윈도우 입니다.
AxCtrls.pas에 보시면 그 부분이 나와있는데요..
두가지 문제가 많이 발생한다고 합니다.

첫번째는 컨트롤 위에 컨트롤이 존재하는 형태일 경우 생성 순서의 문제에 의해
발생하는 경우로 소스단 에서 생성 순서대로 재배열 해주시는 방법이구요..
(이 부분은 직접 확인하지 않은...발취한 자료에 있는 내용 입니다.)

두번째는 예전 한델에서 발취한 부분입니다.
(http://www.delphi.co.kr/zboard/view.php?id=tips&page=1&sn1=&divpage=1&sn=off&ss=on&sc=on&keyword=dax&select_arrange=headnum&desc=asc&no=1328)

보시면 자세히 내용히 나와 있지만...간단히 풀어보면..
ActiveX나 ActiveForm을 생성하면 Parking Window를 하나 Windows에 등록(registerClass)을 하게 됩니다.
첫번째 OCX가 로드시 Parking Window를 등록하면 문제가 없지만 두번째가 로드시에
만약 첫번째가 언로드 중이라면 두번째 OCX는 이미 등록되어 있다고 판단하고 처리
루틴에 접근하면 Access violation 에러를 내게 됩니다.
위의 본문에도 나와있지만 해결책의 하나로서 자신만의 Parking Window를 사용하도록
수정하는 것이지요.
델6 까지 이 문제가 존재했던걸로 압니다.
델7에서는 ActiveForm을 건들지 않아 확인하지 못했습니다.


전대식 wrote:
> DAXParkingWindow란
>
> 어떤 윈도우를 말하는 것인가여?
>
> Activex를 제작중인데.. 다음과 같은 에러가 발생해서요.
>
>
> 1. Explorer 부모창에서 자식창을 띄웁니다.
>
> 2. 자식창에서 ActiveX 컨트롤이 있어서 구동됩니다.
>
> 3. 자식창에서 ActiveX를 종료하고 Destroy하는것까지 확인했습니다.
>
> 4. 자식창이 종료된 후에 부모창이 먹통이 되는 현상이 발생합니다.
>
> 에러 원인이 어떤건지 도대체 모르겠습니다.
> 부모창 자체에서 ActiveX를 테스트 해보면 아무 이상이 없는데..
> 팝업(자식창)에서 테스트해보면 이런 현상이 간혹 발생합니다.
>
> 이유를 모르니 답답하기만 합니다.
>
> 위와 같은 원인을 해결하신 분의 고견을 부탁드립니다.
>
> 그럼 수고하세요.



[답변]DAXParkingWindow란 무엇인가여?  
답변 정말 감사드립니다.

위의 방법으로도 수행을 했습니다.
지금 코드도 그렇게 생성이 되어 있구여.. 이젠 DAX Error는 발생하지 않는것 처럼
보입니다만

자식창이 종료된 후에 부모창이 먹통이 되는 현상이 발생합니다.

은 여전히 존재합니다.

이런 원인이 어떤건지 참 궁금합니다.

아시는분은 도움 부탁드립니다.

그럼 오늘도 즐프하세요.. ^^;;;


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

[팁]ActiveX 제작시 DAX 에러가 발생하는 경우중 해결법 하나...  
안녕하신지요...

얼마전에 발견한것이었는데..지금 올립니다.

제가 해결한 방법일뿐이구요. 그래도 가끔은 해당되시는 분들이 계실듯해서...

한국 델파이 개발자 홈페이지에 가시면 팁란에 이광수님의 자세한 설명이 있구요...

지금 말씀드리는 것은 너무나 간단한거라서...

Visual Component 등을 ActiveForm 에 올려 놓으실때 간혹 개발과정중에 화면구성상

맨위로 올라와야 하는 컴포넌트가 그 밑에 깔리는 컴포넌트보다 먼저 생성이 되는 경우

가 있을 수 있습니다. 특히 소스 정리를 하다가도 그렇게 될수도 있구요...

이것을 제일 뒤(바닥)에 있는 것부터 생성하도록 다음부분에서 정리를 해주세요..


type
TMyActiveImgCtrl = class(TActiveForm, IMyActiveImgCtrl, IOleInPlaceActiveObject)
   Bevel1: TBevel;
   Label1: TLabel;
   Bevel2: TBevel;
   Label4: TLabel;
   Label5: TLabel;
   Label7: TLabel;
   CutImg: TImage32;
   OpenPictureDialog1: TOpenPictureDialog;
   Bitmap32List1: TBitmap32List;
   PreImg0: TImage32;
   ~~~~~~생략~~~~~


이부분의 컴포넌트들을 대충 순서대로 정리를 해 주었더니 에러가 사라졌다는...

제가 아직 초보인관계로 자세한 설명은 못하지만 액티브폼위의 비쥬얼컴포넌트들이

상속되는 순서에 있어서 자신의 Parent 가 있는데에도 그보다 먼저 생성되게 되면

에러가 나오는듯 하더군요.. 그냥 일반 어플리케이션에서는 별상관이 없고

ActiveX Form 에서만 그런듯 합니다. 허접한 팁이기는 해도 혹시나 하는 마음에 올립니

다..

즐겁게 코딩하세요...
    
--------------------------------------------------------------------------------


델마당 자료실엔 없길레
한국 델파이 개발자 모임에서 퍼왔습니다.
문제가 된다면 바로 삭제 조치 하겠습니다.
아직도 델7에서 여러 ActiveX를 맹글어 개발하는 관계로
DAX 에러때문에 고생을 많이 했는데 사용하여 보니 별 문제?!가 없더군요 -_-;

----------------------------------------------------------------------------
Delphi 7 VCL Bug-fix Pack

D7VCL.bpg를 열어서 전체 빌드하시면

Packing 디렉토리에 생기는 파일을 델파이 디렉토리에 복사하시면 끝입니다. ^^

1. axctrls.pas

1) access violation해결

2. 한영 전환 문제 해결책 적용

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

사용법을 잘모르시겠다는 메일이 와서 추가합니다.


delphi.co.kr에 자료실에 올린 파일을 받아서 압축을 풀고

D7VCL.bpg 파일을 델파이에서 엽니다.



메뉴에서



Project - Build All Project를 눌러서

전체 프로젝트를 컴파일 합니다.



압축을 푼 디렉토리에서 Packing  디렉토리에 보면 lib, Source 디렉토리가 보입니다.



이 2개 디렉토리를 전체를 선택해서 복사한후



델파이7 설치 디렉토리에 붙여 넣습니다.

(일반적으로 C:\Program File\Boralnd\Delphi7)



이런 후 다시 엑티브 엑스를 컴파일하시면 됩니다.

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

Delphi로 ActiveX 콘트롤이나 ActiveForm을 작성하면 IE상에서
DAX error : Access violation을 만들어 냅니다.

이 에러는 98에서는 발생하는 것을 본적이 없으며,
win2k에서는 아주 가끔, Win Xp에서는 빈번하게 발생합니다.

문제의 원인은 axctrls.pas의 ParkingWindow펑션에서 일어납니다.

소스 코드를 보시면 파킹윈도우를 만들기 위해서 registerclass를 하게 됩니다.
보통 윈도우 클래스는 윈도우를 처리하기 위한 프로시져를 가지는데요.
이게 처음 메모리에 로딩되는 ocx의 것을 사용하게 됩니다.

그런데 ie와 같이 프로세스는 하나이고 빈번하게 ocx가 로딩되고
언로드 되는 과정에서 등록한 클래스의 처리 루틴이 메모리에 로딩되고
다시 떨어질때 문제가 생기는 것으로 보입니다.

즉 2개 이상의 delphi ocx를 사용하는 경우에
ie상에서 새창에 ocx를 띄울 때

1번 ocx가 올라 갈때 는 문제가 없다가
2번 ocx가 올라 갈때 문제가 생깁니다. 이때 1번 ocx가 언로드 중이라면
2번 ocx는 클래스는 레지스트 된것으로 생각하고, 윈도우 proc을 1번
ocx것을 사용하게 되는데 1번 ocx는 메모리에서 언로드 된 상황이라
access violation을 일으키게 됩니다. (에러의 정확한 위치는 CreateWindowEx에서 생기게 됩니다.)

일반 어플리케이션에서는 보통 초기에 모든 ocx 로딩이 끝나고
실행에 들어가는 경우가 많으므로 문제점이 나타나지 않았고,
win xp에 경우는 작업의 스위칭? 문제인지 os의 문제인지
특별히 잘나타나게 됩니다.

문제의 해결책은 간단합니다. 각 ocx가 자신의 parkingwindow처리 class와
proc을 사용하면 됩니다. 다음 소스를 axctrls.pas에 반영하고
소스 컴파일후 lib에 넣어주시면 처리 됩니다.


  1. function ParkingWindow: HWND;   
  2. var  
  3.   TempClass: TWndClass;   
  4.   ParkingName : String;   
  5. begin  
  6.   Result := xParkingWindow;   
  7.   if Result <> 0 then Exit;   
  8.   
  9.   // fix DAX error : accessviolation (win2k, win xp)   
  10.   ParkingName := 'DAXParkingWindow_' +   Format('%p', [@ParkingWindowProc]);   
  11.   
  12.   FillChar(TempClass, sizeof(TempClass), 0);   
  13.   if not GetClassInfo(HInstance, PChar(ParkingName), TempClass) then // fix DAX error : accessviolation (win2k, win xp)   
  14.   begin  
  15.     TempClass.hInstance := HInstance;   
  16.     TempClass.lpfnWndProc := @ParkingWindowProc;   
  17.     TempClass.lpszClassName := PChar(ParkingName); // fix DAX error : accessviolation (win2k, win xp)   
  18.     if Windows.RegisterClass(TempClass) = 0 then  
  19.       raise EOutOfResources.Create(SWindowClass);   
  20.   end;   
  21.   xParkingWindow := CreateWindowEx(WS_EX_TOOLWINDOW, TempClass.lpszClassName, nil,   
  22.      WS_POPUP, GetSystemMetrics(SM_CXSCREEN) div 2,   
  23.      GetSystemMetrics(SM_CYSCREEN) div 20000, HInstance, nil);   
  24.   SetWindowPos(xParkingWindow, 00000, SWP_NOACTIVATE or SWP_NOREDRAW   
  25.      or SWP_NOZORDER or SWP_SHOWWINDOW);   
  26.   Result := xParkingWindow;   
  27. end;  



참고로 axctrls에는 3가지 정도의 문제 점이 있는데요.

1. DAX error : accessvioaltion
2. active x의 스크롤시 화면 깨지는 문제점
3. activeForm에서 OnDestroy의 call안됨입니다.

delphi 6에서는 1번을 제외한 나머지는 수정 된 것으로 보입니다.

from 마형

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

이전의 에러 해결 방법에 이어서 메인 쓰레드가 아닌 창에서
ActiveX 의 에러를 해결 한 방법을 소개합니다.

델파이 7 기준이며 이전 버젼도 적절히 고치면 사용이 가능합니다.

자료실에 업로드하겠습니다.

문제의 원인은 역시 파킹윈도우 인데요.

메인쓰레드에서 파킹 윈도우가 생성되면 문제가 없습니다만.
메인 윈도우가 아닌 gui 쓰레드에서 OCX가 로딩되고
다시 이 컨트롤이 이용되면

2번째 생긴 gui 쓰레드가 종료되면 3번째 gui의 컨트롤이 DAX에러를 일으 킵니다.

문제의 원인은 메인이 아닌 gui쓰레드에서 윈도우가 만들어 지면
정상적인 종료시에도 그 gui에서 생성된 모든 윈도우가 제거 됩니다.

따라서 2번째 3번째 스레드가 사용하던 파킹윈도우가 2번 쓰레드가 제거 되면 윈도우 자체가 파괴되고 이로 인해 3번째 쓰레드의 컨트롤이

에러를 만들어 내게 됩니다.

해결책은 각 쓰레드당 1개의 파킹 윈도우를 만들어 주면 되며, 이러한 방법을 통해서 제가 아는 한에 대해서는 일단 보여지는 에러는 없어지게 됩니다.

참고로 소스의 수정 부분은 bug-fix를 찾아보시면 되며, 한영 전환 문제에 대한 수정부분도 적용했습니다.

개인적으로는 이전에 한 약속을 지키게 되서 기쁘고, 이제는 에러없는 엑티브 엑스를 만들어 낼수 있어서 기쁘네요.

블로그 이미지

유효하지않음

,

9i EXP-00003

Database/Oracle 2008. 10. 8. 13:44

Full Link: http://www.anysql.net/en/oracle/oracle_bug_exp00003.html

    When you use old version of exp to export tables with LOB column from Oracle 9.2.0.5 or higher version, you will get an error "EXP-00003 : no storage definition found for segment .....", actually this is an Oracle bug, you could temporary get it resolved by replace a view "exu9tne", as following:

    Before exporting, run the following SQL under sys:

CREATE OR REPLACE VIEW exu9tne (
tsno, fileno, blockno, length) AS
SELECT ts#, segfile#, segblock#, length
FROM sys.uet$
WHERE ext# = 1
UNION ALL
SELECT * FROM SYS.EXU9TNEB
/

    After exporting, run the following to restore the view definition according to Metalink Notes.

CREATE OR REPLACE VIEW exu9tne (
tsno, fileno, blockno, length) AS
SELECT ts#, segfile#, segblock#, length
FROM sys.uet$
WHERE ext# = 1
블로그 이미지

유효하지않음

,

조치방법: (다음과 같이 조치후 서버 restart)
sqlplus “/as sysdba”
alter system set "_kgl_large_heap_warning_threshold"=8388608 scope=spfile ;
shutdown immediate
startup
 
원인: (Cause 항목 참조)
해당 오류메시지는 Error 가 아닌 Warning 입니다.
이는 shared pool 영역중 libraray cache 영역의 단편화가 심해 Free Memory를 찾는데 오랜 시간이 걸릴 때
위와 같은 오류가 발생합니다.
새로운 트랜잭션이 발생시 SQL의 파싱결과 등이 저장되는 library cache영역에 단편화로 인한 메시지로
10g R2의 메모리 관리 메커니즘에 따른 메시지로 보시면됩니다.
 
 
=======================================================================
Applies to:
Oracle Server - Enterprise Edition - Version:
This problem can occur on any platform.
Symptoms
The following messages are reported in alert.log after 10g Release 2 is installed.
       Memory Notification: Library Cache Object loaded into SGA
       Heap size 2294K exceeds notification threshold (2048K)
Changes
Installed / Upgraded to 10g Release 2
Cause
These are warning messages that should not cause the program
responsible for these errors to fail. 
They appear as a result of new event messaging mechanism
and memory manager in 10g Release 2. The meaning is that the
process is just spending a lot of time in finding free memory
extents during an allocate as the memory may be heavily fragmented.
Real memory messages should be ORA-403x when  a real memory allocation problem
occurs.
Solution
In 10g we have a new undocumented parameter that sets the KGL heap size
warning threshold.   This parameter was not present in 10gR1.
Warnings are written if heap size exceeds this threshold.
  
Set  _kgl_large_heap_warning_threshold  to a reasonable high value or zero
to prevent these warning messages. Value needs to be set in bytes.
If you want to set this to 8192 (8192 * 1024) and are using an spfile:
(logged in as "/ as sysdba")
SQL> alter system set "_kgl_large_heap_warning_threshold"=8388608 scope=spfile ;
SQL> shutdown immediate SQL> startup
SQL> show parameter _kgl_large_heap_warning_threshold
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
_kgl_large_heap_warning_threshold integer 8388608
If using an "old-style" init parameter,
Edit the init parameter file and add
_kgl_large_heap_warning_threshold=8388608
In 10.2.0.2,  the threshold is increased to 50MB after regression tests, so this should be a reasonable and recommended value.
References
블로그 이미지

유효하지않음

,

 

난이도 : 초급

Peter HaggarIBM

2002 년 5 월 01 일
2003 년 1 월 07 일 수정

모든 프로그래밍 언어에는 고유의 이디엄이 있다. 이중 대부분이 유용하다. 문제는 몇몇 이디엄의 경우 원래 표명했던 것이 아니라는 것이 나중에 입증되거나 설명한대로 작동하지 않다는 점이다. 자바에는 많은 유용한 이디엄이 있다. 하지만 결코 사용되어서는 안되는 이디엄도 있다. Double-checked locking이 바로 그것이다. 이글에서는 double-checked locking 이디엄의 근원부터 살펴본다.

Singleton creation pattern은 일반적인 프로그래밍 이디엄이다. 다중 쓰레드와 함께 사용할 때 동기화 유형을 사용해야 한다. 좀더 효율적인 코드를 만들기위한 노력으로 자바 프로그래머들은 코드가 동기화 되는 것을 제한하기위해 Singleton creation pattern과 함께 쓰일 double-checked locking 이디엄을 만들었다. 하지만 자바 메모리 모델에 대한 이해의 부족으로 double-checked locking 이디엄은 작동을 보장할 수 없다. 게다가 작동 실패의 이유는 명확하지 않고 자바 메모리 모델과 밀접하게 연관되어 있다. 때문에, double-checked locking으로 인한 코드 작동 실패의 원인을 검사하기 힘들다. 이 글을 통해 단지 그것이 어디서 고장이 났는지를 이해할 수 있도록 double-checked locking 이디엄을 연구해본다.

Singleton creation 이디엄

double-checked locking 이디엄이 어디서 기원했는지를 이해하려면 일반적인 singleton creation 이디엄을 알아야 한다. (Listing 1):


Listing 1. Singleton creation 이디엄

import java.util.*;
class Singleton
{
  private static Singleton instance;
  private Vector v;
  private boolean inUse;

  private Singleton()
  {
    v = new Vector();
    v.addElement(new Object());
    inUse = true;
  }

  public static Singleton getInstance()
  {
    if (instance == null)          //1
      instance = new Singleton();  //2
    return instance;               //3
  }
}

 

이 클래스의 디자인은 단지 하나의 Singleton 객체가 만들어졌다는 것을 확인시켜주고 있다. 생성자는 private으로 선언되고 getInstance() 메소드는 단지 하나의 객체를 만든다. 이것은 단일 쓰레드 프로그램에 적합하다. 하지만 다중 쓰레드가 개입되면 동기화를 통해서 getInstance() 메소드를 방어해야 한다. getInstance() 메소드가 방어되지 않으면 Singleton 객체의 두 개의 다른 인스턴트를 리턴할 수 있다. getInstance() 메소드를 동시에 호출하고 다음 이벤트를 따라가는 두 개의 쓰레드를 생각해보자:

  1. Thread 1은 getInstance() 메소드를 호출하고 //1에서 그 instance null이라는 것을 결정한다.
  2. Thread 1은 if 블록으로 들어가지만, //2의 라인을 실행하기 전에 thread 2에 선점된다.
  3. Thread 2는 getInstance() 메소드를 호출하고 그 instance가 //1에서 null 이라는 것을 결정한다.
  4. Thread 2는 if 블록으로 들어가서 새로운 Singleton 객체를 만들고 instance 변수를 이 새로운 //2에 있는 새로운 객체에 할당한다.
  5. Thread 2는 //3에 있는 Singleton 객체 레퍼런스를 리턴한다.
  6. Thread 2는 thread 1에 선점된다.
  7. Thread 1는 남겨진 곳에서 부터 시작하고 다른 Singleton 객체가 만들어지는 결과가 된 //2 라인을 실행한다.
  8. Thread 1은 //3에서 이 객체를 리턴한다.

결과는 getInstance() 메소드가 단지 하나의 객체를 만들어야 하는데 두개의 Singleton 객체를 만들었다. 이 문제는 단지 하나의 쓰레드가 한 번에 코드를 실행하도록 getInstance() 메소드를 동기화시켜 수정할 수 있다 (Listing 2):


Listing 2. 쓰레드 방지 getInstance() 메소드

public static synchronized Singleton getInstance()
{
  if (instance == null)          //1
    instance = new Singleton();  //2
  return instance;               //3
}

 

Listing 2의 코드는 getInstance() 메소드로 멀티쓰레드 액세스에 잘 작동한다. 하지만 이것을 분석해보면 동기화는 메소드의 첫 번째 호출에만 필요하다는 것을 깨닫게 된다. 지속적인 호출은 동기화를 필요로하지 않는다. 첫 번째 호출이 //2에서 코드를 실행하는 유일한 호출이기 때문이다. 이 라인은 동기화가 필요한 유일한 라인이다. 모든 다른 호출들은 instance null이 아니라는 것을 결정하고 이것을 리턴한다. 다중 쓰레드는 첫 번째 것을 제외하고는 모든 호출에 대해 일관성 있게 실행할 수 있다. 하지만, 메소드가 synchronized 될 때, 메소드의 모든 호출에 대해 동기화의 대가를 지불해야한다.

이 메소드를 좀더 효율적으로 만들기 위해서 double-checked locking이라는 이디엄이 만들어졌다. 첫 번째 것을 제외한 모든 메소드 호출에 대해 동기화를 피하려는 생각이다. 동기화의 비용은 JVM 과는 다르다. 초기에 이 비용은 매우 높았다. 향상된 JVM이 등장함에 따라, 동기화의 비용은 감소했지만 여전히 synchronized 메소드 또는 블록에 들어가고 나오는 것에 대한 퍼포먼스 패널티는 존재한다. JVM 기술의 발전과 관계없이 프로그래머들은 불필요하게 프로세스 시간을 낭비하기를 결코 원하지 않는다.

Listing 2의 //2 행만이 동기화가 필요하기 때문에, 이것을 동기화 블록으로 래핑한다 (Listing 3):


Listing 3. getInstance() 메소드

public static Singleton getInstance()
{
  if (instance == null)
  {
    synchronized(Singleton.class) {
      instance = new Singleton();
    }
  }
  return instance;
}

 

Listing 3의 코드는 다중 쓰레드에 나타났던 문제와 같다. 두 개의 쓰레드는 instance null이면 동시적으로 if 문 내부에서 얻어질 수 있다. 그리고나서 하나의 쓰레드가 instance를 초기화하기 위해서 synchronized 블록으로 들어간다. 그러는 동안 다른 것들은 블록화된다. 첫 번째 쓰레드가 synchronized 블록을 종료할 때 기다리고 있는 쓰레드가 들어가서 다른 Singleton 객체를 만든다. 두 번째 쓰레드가 synchronized 블록에 들어갈 때, instance이 non-null인지를 검사하지 않는다.

 


위로



Double-checked locking

Listing 3의 문제를 해결하려면 instance를 검사해야한다. double-checked locking 이디엄을 Listing 3에 적용하면 Listing 4의 결과가 나온다.


Listing 4. Double-checked locking 예제

public static Singleton getInstance()
{
  if (instance == null)
  {
    synchronized(Singleton.class) {  //1
      if (instance == null)          //2
        instance = new Singleton();  //3
    }
  }
  return instance;
}

 

double-checked locking 이론은 //2에서의 두번째 체크가 두 개의 다른 Singleton 객체들이 Listing 3에 나타난 것처럼 만들어질 수 없도록 한다는 것이다:

  1. Thread 1은 getInstance() 메소드로 들어간다.
  2. Thread 1은 instance null이기 때문에 //1에 있는 synchronized 블록으로 들어간다.
  3. Thread 1은 thread 2에 선점된다.
  4. Thread 2는 getInstance() 메소드로 들어간다.
  5. Thread 2는 instance가 여전히 null이기 때문에 //1에서 lock 얻기를 시도한다. 하지만 thread 1이 lock을 보유하고 있기 때문에 thread 2는 //1에서 블록한다.
  6. Thread 2는 thread 1에 선점된다.
  7. Thread 1은 실행하고 인스턴스가 //2에서 여전히 null 이기 때문에, Singleton 객체를 만들고 이것의 레퍼런스를 instance에 할당한다.
  8. Thread 1은 synchronized 블록을 종료하고 getInstance() 메소드에서 인스턴스를 리턴한다.
  9. Thread 1은 thread 2에 선점된다.
  10. Thread 2는 //1에서 lock을 얻어서 instance null인지를 점검한다.
  11. instance가 non-null이기 때문에, 두 번째 Singleton 객체는 만들어지지 않고 thread 1에 만들어진것이 리턴된다.

double-checked locking 이론은 완벽하다. 안타깝게도 현실은 그와 반대라는 것이다. double-checked locking과 관련한 문제는 이것이 단일 또는 다중 프로세서 머신에서 작동하는 것을 보장할 수 없다는 점이다.

double-checked locking 실패는 JVM의 버그 때문이 아니고 현재의 자바 플랫폼 메모리 모델 때문이다. 메모리 모델은 "난잡한 작성"을 허용하고 이것이 이디엄이 실패하는 주요 이유이다.

 


위로



out-of-order write

이 문제를 설명하기 위해서, Listing 4의 //3행을 다시한번 살펴보아라. 이 코드는 Singleton 객체를 만들고 객체를 참조하기 위해서 instance 변수를 초기화한다. 이 코드의 문제는 instance 변수가Singleton 생성자의 바디가 실행하기 전에 non-null 이 될 수 있다는 점이다.

이것은 여러분이 가능하다고 생각했던 모든것과 배치가 될 수 있다. 하지만 가능한 현실이다.이것이 어떻게 발생했는지를 설명하기전에 어떻게 이것이 double-checked locking 이디엄을 고장냈는지를 살펴보면서 이러한 현실을 받아들이자:

  1. Thread 1은 getInstance() 메소드로 들어간다.
  2. Thread 1은 //1의 synchronized 블록으로 들어간다. instance null이기 때문이다.
  3. Thread 1은 //3 으로 가서 non-null 인스턴스를 만든다. 생성자가 실행하기 전이다.
  4. Thread 1은 thread 2에 선점된다.
  5. Thread 2는 인스턴스가 null인지를 점검한다. null이 아니기 때문에, thread 2는 instance 레퍼런스를 완전히 만들어졌지만 부분적으로 초기화된 Singleton 객체로 리턴한다.
  6. Thread 2는 thread 1에 선점된다.
  7. Thread 1은 생성자를 실행함으로서 Singleton 객체의 초기화를 완료하고 레퍼런스를 리턴한다.

thread 2는 한 객체를 리턴하는데, 그 객체의 생성자는 실행되지 않았다.

이를 설명해줄 다음의 가상 코드를 살펴보자: instance =new Singleton();

mem = allocate();             //Allocate memory for Singleton object.
instance = mem;               //Note that instance is now non-null, but
                              //has not been initialized.
ctorSingleton(instance);      //Invoke constructor for Singleton passing
                              //instance.

 

Listing 5의 코드를 보자. getInstance() 메소드를 간략하게 나타냈다. "double-checkedness"를 제거했다. instance=new Singleton(); 라인을 JIT 컴파일러가 어떻게 컴파일하는지에만 관심이 있다. 어셈블리 코드에서 생성자가 실행된다는 것을 확인하기 위해 간단한 생성자도 제공했다.


Listing 5. out-of-order write를 표현한 Singleton 클래스

class Singleton
{
  private static Singleton instance;
  private boolean inUse;
  private int val;  

  private Singleton()
  {
    inUse = true;
    val = 5;
  }
  public static Singleton getInstance()
  {
    if (instance == null)
      instance = new Singleton();
    return instance;
  }
}

 

Listing 6에는 getInstance() 메소드의 바디를 위한 Sun JDK 1.2.1 JIT 컴파일러에서 만들어진 어셈블리 코드가 포함되어 있다.


Listing 6. Listing 5 코드에서 만들어진 어셈블리 코드

;asm code generated for getInstance
054D20B0   mov         eax,[049388C8]      ;load instance ref
054D20B5   test        eax,eax             ;test for null
054D20B7   jne         054D20D7
054D20B9   mov         eax,14C0988h
054D20BE   call        503EF8F0            ;allocate memory
054D20C3   mov         [049388C8],eax      ;store pointer in 
                                           ;instance ref. instance  
                                           ;non-null and ctor
                                           ;has not run
054D20C8   mov         ecx,dword ptr [eax] 
054D20CA   mov         dword ptr [ecx],1   ;inline ctor - inUse=true;
054D20D0   mov         dword ptr [ecx+4],5 ;inline ctor - val=5;
054D20D7   mov         ebx,dword ptr ds:[49388C8h]
054D20DD   jmp         054D20B0

 

이 어셈블리 코드는 getInstance() 메소드를 호출하는 테스트 프로그램을 실행하여 만들어졌다. 프로그램이 실행되는 동안 Microsoft Visual C++ 디버거를 실행하고 이것을 자바 프로세스에 붙였다.

어셈블리 코드의 처음 두 개의 행은 049388C8 메모리 로케이션에서 instance 레퍼런스를 eax 로 로딩하고 null을 테스트 한다. 이것은 Listing 5의 첫 행의 getInstance()메소드와 상응한다. 이 메소드가 처음 호출되고 instance null이면 코드는 B9으로 진행된다. BE에 있는 코드는 Singleton 객체용 힙에서 메모리를 할당하여 eax의 메모리에 포인터를 저장한다. C3 eax 에서 포인터를 가져다가 049388C8 메모리 로케이션에 인스턴스 레퍼런스에 저장한다. 결과적으로 인스턴스는 현재 non-null이고 유효한 Singleton 객체를 참조한다. 하지만 이 객체용 생성자는 아직 실행되지 않았고 그것은 double-checked locking이 문제가 있다는 것이다. C8 라인에서,instance 포인터는 역참조되고 ecx에 저장된다. CA D0 행은 true 5 값을 Singleton 객체에 저장하는 인라인 생성자를 나타낸다. C3 행을 실행하고 나서 다른 쓰레드에 의해 이 코드가 인터럽트된다면 생성자를 완료하기 전에 double-checked locking은 실패한다.

모든 JIT 컴파일러가 위와 같은 코드를 생성하는 것은 아니다. 어떤것은 생성자가 실행된 후 바로 인스턴스가 non-null이 되는 코드를 만든다. IBM SDK for Java technology, version 1.3과 Sun JDK 1.3 모두 이와 같은 코드를 만든다. 하지만 이러한 인스턴스에 double-checked locking을 사용해야 된다는 것을 말하는 것은 아니다. 이것이 실패할 수 있는 다른 이유들이 있다. 게다가 어떤 JVM에서 여러분의 코드가 실행될지를 항상 알고있는것은 아니지 않는가? 그리고 JIT 컴파일러는 이 이디엄을 중단시키는 코드를 만들기위해 언제나 변화할 수 있다.

 


위로



Double-checked locking: Take two

현재 double-checked locking 코드가 실행되지 않는다면 다른 코드 버전을 제안하겠다 (Listing 7). out-of-order write 문제를 방지하기 위함이다.


Listing 7. out-of-order write 문제 해결

public static Singleton getInstance()
{
  if (instance == null)
  {
    synchronized(Singleton.class) {      //1
      Singleton inst = instance;         //2
      if (inst == null)
      {
        synchronized(Singleton.class) {  //3
          inst = new Singleton();        //4
        }
        instance = inst;                 //5
      }
    }
  }
  return instance;
}

 

Listing 7의 코드를 보게되면 상황이 우습게 되고있다는 것을 알게된다. 기억해야할 것은 double-checked locking은 간단한 세 라인의 getInstance() 메소드의 동기화를 막을 수단으로 만들어졌다는 것이다. Listing 7의 코드는 손에서 떠났다. 이 코드는 문제를 해결하지 않는다. 천천히 그 이유를 살펴보자.

out-of-order write 문제를 방지하기 위해 시도되었다. 이를 inst 로컬 변수와 두 번째 synchronized 블록을 이용하여 수행한다:

  1. Thread 1 getInstance() 메소드로 들어간다.
  2. instance null이기때문에, thread 1은 //1에서 첫 번째 synchronized 블록으로 들어간다.
  3. 로컬 변수inst instance 값을 가지고 이것은 //2 에서 null이다.
  4. inst null 이기 때문에, thread 1은 //3의 두 번째 synchronized 블록으로 들어간다.
  5. Thread 1은 //4에서 코드 실행을 시작하면서 Singleton 생성자가 실행되기 전에 inst를 non-null로 만든다. (이것이 out-of-order write 문제이다.)
  6. Thread 1은 Thread 2에 선점된다.
  7. Thread 2는 getInstance() 메소드로 들어간다.
  8. instance null이기 때문에, thread 2는 //1에 있는 첫 번째 synchronized 블록으로 들어가는 것을 시도한다. thread 1이 현재 이 lock을 보유하고 있기 때문에, thread 2는 블록된다.
  9. Thread 1은 //4의 실행을 완료한다.
  10. Thread 1은 완전히 생성된 Singleton 객체를 //5의 instance 변수에 할당하고 synchronized 블록 모두를 종료한다.
  11. Thread 1은 instance를 리턴한다.
  12. Thread 2는 실행해서 instance를 //2의 inst에 할당한다.
  13. Thread 2는 instance가 non-null이라는 것을 확인하고 이를 리턴한다.

핵심 라인은 //5 이다. 이 라인은 instance null 이거나 완전히 생성된 Singleton 객체를 참조한다는 것을 확인하도록 되어있다. 문제는 이론과 진실이 직교하며 실행되는 곳에서 발생한다.

Listing 7의 코드는 메모리 모델의 현재 정의 때문에 작동하지 않는다. Java Language Specification (JLS)은 synchronized 블록 안에서 작성된 코드가 synchronized 블록 밖으로 이동하지 못하도록 되어있다. 하지만, synchronized 블록에 없는 코드가 코드가 synchronized 블록 안으로 이동할 수 없다는 것을 뜻하는 것은 아니다.

JIT 컴파일러는 여기에서 최적화 기회를 본다. 최적화는 //4에 있는 코드와 //5 에 있는 코드를 제거하여 이를 조합하여 Listing 8과 같은 코드를 만든다:


Listing 8. Listing 7의 최적화 코드

public static Singleton getInstance()
{
  if (instance == null)
  {
    synchronized(Singleton.class) {      //1
      Singleton inst = instance;         //2
      if (inst == null)
      {
        synchronized(Singleton.class) {  //3
          //inst = new Singleton();      //4
          instance = new Singleton();               
        }
        //instance = inst;               //5
      }
    }
  }
  return instance;
}

 

최적화가 되면 이전과 같은 out-of-order write 문제가 생긴다.

 


위로



volatile

inst 변수와 instance 변수에 volatile 키워드를 사용하는 경우도 있다. JLS (참고자료)에서 volatile이 선언된 변수는 영속성이 있어 재정리 되지 않아야 한다. double-checked locking 과 관련한 문제를 해결하기 위해 volatile을 사용할 때 두 가지 문제가 발생한다:

  • 여기서의 문제는 순차적 영속성에 있지 않다. 코드는 이동되고 재정리 되지 않는다.
  • 많은 JVM이 순차적 영속성을 정확히 고려한 volatile 을 구현하지 않는다.


Listing 9. volatile의 순차적 영속성 

class test
{
  private volatile boolean stop = false;
  private volatile int num = 0;

  public void foo()
  {
    num = 100;    //This can happen second
    stop = true;  //This can happen first
    //...
  }

  public void bar()
  {
    if (stop)
      num += num;  //num can == 0!
  }
  //...
}

 

JLS에 의하면, stop num volatile로 선언되기 때문에, 그들은 순차적으로 영속적이여야 한다. 이는, stop이 언제나 true이면, num 100으로 설정되어야 한다는 것을 의미한다. 하지만, 많은 JVM이 volatile의 순차적 영속성 기능을 구현하지 않기 때문에 이러한 것에 의존할 수 없다. 따라서 thread 1이 foo를 호출하고 thread 2가 bar를 동시에 호출하면, thread 1은 num  100으로 설정되기 전에 stop true로 설정해야한다. 이렇게 되면 thread 2에서 stop true로 설정되고 num은 여전히 0으로 설정된다.

 


위로



솔루션

모든 JVM 구현에서 작동한다는 것을 보장할 수 없기 때문에 어떤 형태로든 double-checked locking은 사용되어서는 안된다. JSR-133은 메모리 모델 관련한 문제를 언급하고 있지만 double-checked locking은 새로운 메모리 모델에서 지원되지 않는다. 따라서 다음 두 가지 옵션이 있다:

  • getInstance() 메소드의 동기화를 수락한다. (Listing 2).
  • 동기화를 그만두고 static 필드를 사용한다.

Option 2는 Listing 10에 나와있다:


Listing 10. static 필드를 이용한 Singleton 구현

class Singleton
{
  private Vector v;
  private boolean inUse;
  private static Singleton instance = new Singleton();

  private Singleton()
  {
    v = new Vector();
    inUse = true;
    //...
  }

  public static Singleton getInstance()
  {
    return instance;
  }
}

 

Listing 10의 코드는 동기화를 사용하지 않고 static getInstance() 메소드에 호출이 있을때까지 Singleton 객체가 만들어지지 않는다는 것을 확실히 하고있다.

 


위로



스트링은 변하지 않는다!

out-of-order writes 문제가 있는 String 클래스와 생성자 실행에 앞서 non-null 이 되는 레퍼런스가 이상할 것이다. 다음 코드를 보자:

private String str;
//...
str = new String("hello");

 

String 클래스는 변하지 않는다. 하지만 out-of-order write 문제가 발생할 수 있는가? 문제는 그럴 수 있다는 것이다. String str로 액세스 하는 두 개의 쓰레드를 생각해보자. 한 쓰레드는 str 레퍼런스가 생성자가 실행하지 않는 곳에서 String 객체를 참조한다는 것을 본다. 사실 Listing 11에는 이러한 것이 발생하는 것을 보여준다. 이 코드는 내가 테스트 한 JVM 로만 고장을 일으킨다는 것을 명심해라. IBM 1.3과 Sun 1.3 JVM은 변하지 않는 String을 만든다


Listing 11. Mutable String 예제

class StringCreator extends Thread
{
  MutableString ms;
  public StringCreator(MutableString muts)
  {
    ms = muts;
  }
  public void run()
  {
    while(true)
      ms.str = new String("hello");          //1
  }
}
class StringReader extends Thread
{
  MutableString ms;
  public StringReader(MutableString muts)
  {
    ms = muts;
  }
  public void run()
  {
    while(true)
    {
      if (!(ms.str.equals("hello")))         //2
      {
        System.out.println("String is not immutable!");
        break;
      }
    }
  }
}
class MutableString
{
  public String str;                         //3
  public static void main(String args[])
  {
    MutableString ms = new MutableString();  //4
    new StringCreator(ms).start();           //5
    new StringReader(ms).start();            //6
  }
}

 

이 코드는 //3의 두 개의 쓰레드에 의해 공유된 String 레퍼런스를 포함하는 //4의 MutableString 클래스를 만든다. //5와 //6라인에 두 개의 개별 쓰레드에 StringCreator StringReader라는 두 개의 객체가 만들어지면서 MutableString 객체에 레퍼런스를 전달한다. StringCreator 클래스는 무한 루프로 들어가고 //1에서 "hello" 값을 가진 String 객체를 만든다. StringReader는 무한 루프로 들어가고 현재 String 객체가 //2에서 "hello" 값을 갖고 있는지를 확인한다. 그렇지 않다면, StringReader 쓰레드는 메시지를 프린팅하고 정지한다. String 클래스는 변하지 않고 이 프로그램에서 어떤 아웃풋도 볼 수 없다.

Sun JDK 1.2.1같은 오래된 JVM 에서 이 코드를 실행하면 out-of-order write 프로그램이 되고 non-immutable String이 된다.

 


위로



요약

singleton의 비싼 동기화를 피하기위해 특별히 천재적인 프로그래머들은 double-checked locking 이디엄을 개발했다. 약한 메모리 모델의 분야를 재정의하는 작업이 진행중이다. 하지만 아무리 새로운 메모리 모델이어도 double-checked locking은 작동하지 않을 것이다. 이 문제에 대한 최상의 솔루션은 동기화를 수락하거나 static field를 사용하는 것이다.

 


위로



참고자료

 


위로



필자소개

Peter Haggar

Peter Haggar는 IBM의 소프트웨어 엔지니어이다. Practical Java Programming Language Guide (Addison-Wesley)의 저자이며 자바 프로그래밍 관련하여 많은 글을 집필했다. 개발 툴, 클래스 라이브러리, OS 등 광범위한 분야에 많은 경험을 갖고 있다.




위로





출처: http://www.ibm.com/developerworks/kr/library/j-dcl.html

블로그 이미지

유효하지않음

,

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의 아스키 문자로 반환한다.

A

【예제】

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

ABACDE의 두번째 A 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* 함수

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

 

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

 

【형식】

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 절과 같은 기능을 사용하면

표현되는 각 컬럼이 하나가 아닌 복수 개의 컬럼으로 정의되는 경우이며

다음 표를 보고 이해하자.

composite column 문의 경우  group by 문의 경우 group by grouping sets(a,b,c)  group by a union allgroup by b union allgroup by c  group by grouping sets(a,b,(b,c))  group by a union allgroup by b union allgroup by b,c  group by grouping sets((a,b,c))  group by a,b,c  group by grouping sets(a,(b),())  group by a union allgroup by b union allgroup by ()  group by grouping sets(a,rollup(b,c))  group by a union allgroup by rollup(b,c)  group by rollup(a,b,c)  group by (a,b,c) union allgroup by (a,b) union allgroup by (a) union allgroup by ()  group by cube(a,b,c)  group by (a,b,c) union allgroup by (a,b) union allgroup by (a,c) union allgroup by (b,c) union allgroup by (a) union allgroup by (b) union allgroup by (c) union allgroup by () 

 

 

 

 

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>

 

블로그 이미지

유효하지않음

,

HTTP Status Code(HTTP 1.1 : RFC 2616)

상태코드는 서버가 요구 메시지를 수신하여 처리한 결과를 알려주는 세 자리의 정수로 된 처리 결과 번호입니다.
첫 번째 자리 숫자는 응답의 종류에 대한 분류 기호이며, 나머지 두 자리 숫자는 일련번호입니다. 현재 첫 번째 자리 숫자에 대해 다섯 가지로 분류하여 쓰고 있습니다.


Informational 1xx

참고 정보로 클라이언트의 요청이 접수되었고 현재 처리하고 있다는 의미입니다.
클라이언트에서 첨부문서(attatched document)를 보내기 전에 요청을 보낼때 Expect헤더에 설정해서 보냅니다. 잠적적인 응답을 표시하며 Status-Line과 선택적인 헤더로 구성되어 있습니다. 이 클래스는 빈 라인으로 종료되고 HTTP/1.0은 어떠한 1xx 상태 코드로 정의하지 않기 때문에 실험적인 상황 이외에 서버는 1xx 응답을 HTTP/1.0 클라이언트에 발송해서는 안됩니다.

100 Continue (계속)
요청된 초기 부분은 접수되었고 클라이언트는 계속해서 요청할 수 있다는 것입니다.
이 잠정적인 응답은 클라이언트에게 응답의 시초 부분이 수신되었으며 서버가 아직 거부하지 않았음을 알리는 데 사용합니다. 클라이언트는 요구의 나머지 부분을 발송하여야 하며 요구가 완료 되었으면 이 응답을 무시해야 합니다. 서버는 요구가 완료된 다음 마지막 응답을 발송합니다.

101 Switching Protocols (프로토콜 변환)
서버는 Upgrade 헤더 필드에 명시된 프로토콜로 교환하기 위한 클라이언트 요청에 따르고 있다는 것을 말합니다.
서버가 이해하였으며 기꺼이 Upgrade 메시지 헤더 필드를 통하여 접속에 사용되고 있는 애플리케이션 규약 변경에 관한 클라이언트의 요구에 따릅니다. 서버는 101 응답을 종료하는 빈 라인 바로 다음 응답 메시지의 Upgrade 헤더 필드가 정의한 규약으로 전환할 것입니다.

규약은 전환하는 것이 유리한 경우에만 전환됩니다. 예를 들어 새로운 버전의 HTTP로 전환하는 것이 이전 버전을 사용하는 것보다 유리하며 해당 기능을 사용하는 자원을 배달할 때 실시간, 동시 규약으로 전환하는 것이 유리합니다.



Success 2xx

요청 받은 것이 성공적으로 처리되었음을 나타냅니다.
이 상태 코드 클래스는 클라이언트의 요구가 성공적으로 수신, 해석 및 접수되었음을 표시합니다.

200 OK
클라이언트의 요청이 성공적이었으며, 서버는 요청한 데이터를 포함하여 응답합니다.
응답과 함께 리턴 되는 정보는 요구에 사용된 method에 달려 있습니다.

    예를 들면:
    GET 요구한 자원에 상응하는 엔터티는 응답에 포함되어 발송됩니다.
    HEAD 요구한 자원에 상응하는 Entity-Header 필드는 Message-Body 없이 응답에 포함되어 발송됩니다.
    POST 처리 결과를 설명 또는 포함하는 엔터티.
    TRACE 수신 서버가 수신한 요구 메시지를 포함하고 있는 엔터티.

201 Created (생성 되었음)
새로운 URI가 만들어질 때마다 사용되며 결과 코드와 함께 새로운 데이터가 위치한 곳을 지정하기 위해 Location 헤더가 서버에 의해 주어집니다.
원서버는 201 상태 코드를 리턴하기 전에 반드시 자원을 생성해야 합니다. 처리가 즉각적으로 수행될 수 없을 때에 서버는 202(Accepted) 응답으로 대신 응해야 합니다.

202 Accepted (접수 되었음)
클라이언트이 요청을 받아들이기만 했을 뿐 아직 완료되지 않은 상태를 나타냅니다.
처리를 위해 응답을 접수하였으나 처리는 완료되지 않았다는 의미로 요구는 엔터티의 처리 과정에서 허용되지 않을 수도 있기 때문에 궁극적으로 처리될 수도 있고 처리되지 않을 수도 있습니다. 이와 같은 동시 작업에서 상태 코드를 재발송하는 설비는 없습니다.

202 응답은 의도적으로 작업을 수행하지 않습니다. 이 응답의 목적은 서버가 사용자 에이전트가 프로세스가 완료될 때까지 서버에 지속적으로 연결되지 않고도 다른 프로세스에 대한 요구(하루에 한 번만 실행되는 배치 지향적인 프로세스일 수도 있습니.)를 접수할 수 있도록 하는 데 있습니다. 이 응답을 리턴하는 엔터티는 상태 점검자(monitor)에 대한 지시자 또는 사용자가 언제 요구가 완료될 수 있는지에 대한 예상 및 요구의 현재 상태에 대한 표시를 포함해야 합니다.

203 Non-Authoritative Information(비 인증 정보)
Entity-Header의 리턴 된 메타 정보는 서버에서 사용할 수 있는 정의 세트가 아니고 지역 또는 제 3 자의 복사본에서 수집한 것입니다.
제시된 세트는 원래 버전의 하부 세트 또는 상위 세트일 수 있습니다. 예를 들어 자원에 대한 지역적 주해 정보를 포함하면 원서버가 알고 있는 메타 정보에 대한 상위 세트를 만들어 낼 수도 있습니다. 이 응답 코드를 사용하는 것은 의무사항이 아니며 응답이203이 아니면 200 (OK)일때만 적합합니다.

204 No Content(내용이 없음)
응답할때 주어지는 헤더이나 응답된 실제 내용이 없다는 뜻입니다.
새로운 문서가 없어서 브라우저에게 이전 문서를 계속 표시하라고 알려주는 것으로 서버가 요구를 완전히 처리 했으나 반송할 새로운 정보가 없다는 것으로 클라이언트가 사용자 에이전트이면 요구를 발송하도록 한 문서 내용을 변경해서는 안 됩니다.

이런 응답을 받는 이유는 웹브라우저가 문서를 보기위해 갱신을 하지 않았기 때문입니다. 이미지맵에서 클라이언트가 이미지의 영역중 사용하지 않거나 공백인 부분을 클릭했을 때를 처리할 때 유용합니다.

205 Reset Content(내용을 지움)
새로운 문서가 없더라도 브라우저에서 창을 초기화하고, 문서를 새로 표시한다는 것입니다.
서버가 요구를 완전히 처리하였으며 사용자 에이전트는 요구를 발송하도록 한 문서의 내용을 지워야합니다. 이 응답은 주로 사용자 입력을 통하여 처리를 위한 입력이 발생하도록 하기 위해 사용합니다. 이 응답 뒤에 입력을 수행한 폼을 지워 사용자가 다른 입력 요구를 쉽게 시작할 수 있게 합니다. 이 응답은 엔터티를 포함해서는 안 됩니다.

웹브라우저가 추가적인 입력을 위해 사용된 트랜잭션을 지우는 것으로 CGI 애플리케이션에서 데이터를 입력받을때 적합합니다.

206 Partial Content(부분적 내용)
서버가 요청된 크기의 데이터를 반환하고 있다는 것입니다.
Range 헤더 지정 요청에 응답하는데 이용됩니다. 이 요구는 반드시 원하는 영역을 표시하는 Range 헤더 필드를 포함해야 합니다. 응답은 이 응답에 포함된 영역을 표시하는 Content-Range 헤더 필드나 각 파트의 Content-Range 필드를 포함하는 multipart/byteranges Content-Type을 포함해야 합니다. multipart/byteranges를 사용하지 않았으면 응답의Content-Length 헤더 필드는 Message-Body로 전송된 OCTET의 실제 숫자와 정확하게 일치해야 합니다.

Range 및 Content-Range 헤더를 지원하지 않는 캐시는 206(Partial Content) 응답을 캐시해서는 안됩니다.



Redirection 3xx

파일들이 이동되었을 때 쓰이며, 이동하는 위치를 나타내는 Location 헤더가 응답에 포함됩니다.
이 상태 코드 클래스는 사용자 에이전트가 요구를 완전히 처리하기 위해서는 추가적인 처리가 필요하다는 것을 표시합니다. 요구되는 처리는 두 번째 요구에 사용된 method가 GET 또는 HEAD일 경우에만 사용자와의 상호작용 없이도 수행될 수 있습니다. 사용자 에이전트는 이러한 방향 재설정이 무한 루프를 표시하는 것이기 때문에 다섯 번 이상 자동적으로 요구 방향 재설정을 해서는 안 됩니다.

300 Multiple Choices (복수 선택)
요청된 문서가 여러곳에 있을때 어떤 문서를 원하는지를 묻는 것입니다.
요구된 자원이 각자 자신 특유의 위치를 가지고 있는 표현 세트 중의 하나와 대응되며 사용자(또는 사용자 에이전트)가 선호하는 표현 방식을 선택하고 요구를 해당 위치로 재설정할 수 있도록 에이전트가 주도하는(agent-driven) 협상 정보가 제공됩니다.

HEAD 요구가 아닌 이상 응답은 사용자 또는 사용자 에이전트가 가장 적합한 것을 선택할 수 있는 자원 특징 및 위의 목록을 포함한 엔터티를 포함합니다. 엔터티 포맷은 Content-Type 헤더 필드가 설정한 media type에 의해 명시됩니다. 사용자 에이전트의 포맷 및 성능에 따라 가장 적합한 선택을 결정하는 것은 자동으로 수행될 수 있습니다. 그러나 이 규격은 이러한 자동 선택의 표준에 대하여 아무런 규정도 하지 않습니다.

서버가 선호하는 표시 방법을 가지고 있으면 Location 필드에 해당 표시 방법에 대한 상세한 URL을 포함해야 합니다. 사용자 에이전트는 Location 필드 값을 이용하여 자동으로 방향을 재설정할 수 있습니다. 이 응답은 별도의 표시가 없는 한 캐시할 수 있습니다.

301 Moved Permanently (영구 이동)
요청된 문서의 위치가 영구적으로 변했음을 나타내는 것입니다.
요구된 자원에 새로운 영구 URI가 할당되었으며 향후 이 자원에 대한 참조는 리턴 된 URI 중 하나를 이용하여 이루어질 수 있습니다. 링크를 편집할 수 있는 능력이 있는 클라이언트는 가능하다면 Request-URI 에 대한 참조를 서버가 리턴한 하나 또는 그 이상의 새로운 참고처로 자동적으로 재링크시켜야 합니다. 다르게 표시되어 있지 않으면 이 응답은 캐시할 수 있습니다.

이 새로운 URL은 응답 메시지의 Location 필드로부터 전달된 것이어야 하는데, HEAD 요구의 경우가 아니라면 응답의 Entity-Body는 새로운 URL에 대한 하이퍼링크를 가진 짤막한 설명문을 갖고 있어야 합니다.

만약 POST 요구에 대한 응답으로 301 상태코드가 수신되면 사용자 에이전트는 사용자로부터 확인을 받지 않은 상태에서 요구 메시지를 자동 방향전환 시켜서는 안 됩니다. 왜냐하면 이것이 요구 메시지를 발생시킨 상황 조건에 대한 변화를 줄 수 있기 때문입니다.

[주] 301 상태코드를 수신한 후에 POST 요구를 자동 방향전환시키면 현재의 어떤 사용자 에이전트는 GET 요구로 바꾸어버리는 오류상황을 만들기도 합니다.

302 Found
요청된 URI는 일시적으로 새로운 URI를 가집니다.
Location 헤더는 새로운 장소를 가리킨다. 만일 이것이 GET 이나 HEAD 메소드에 대한 응답이라면 클라이이언트는 응답을 받자마자 요청을 해결하기 위해 새로운 URI를 사용해야 합니다.

303 See Other(다른 것을 참조)
요구된 자원이 별도의 URI(Location 헤더에 명시한)에 임시로 보관되어 있으며 해당 자원에서 GET method를 사용하여 조회해야 합니다.
이 method는 주로 POST가 활성화한 스크립트의 산출물을 사용자 에이전트가 선택된 자원으로 방향을 재설정할 수 있도록 하기 위해 사용됩니다. 새로운 URI는 처음 요구된 자원에 대한 대체 참고처가 아닙니다. 303 응답은 캐시할 수 없으나 두 번째(재설정된) 요구에 대한 응답은 캐시할 수 있습니다.

GET 또는 HEAD 이외의 요구에 대한 응답에 301 상태 코드가 접수되면 사용자 에이전트는 사용자가 확인하지 않는 한 요구를 발행한 조건을 변경할 수도 있기 때문에 자동적으로 요구의 방향을 재설정해서는 안 됩니다.

304 Not Modified(변경되지 않았음)
브라우저의 캐시에 들어있는 문서가 최신 문서이니 그것을 그대로 사용하라는것을 나타냅니다.
클라이언트가 조건적 GET 요구를 실행했고 접근할 수 있으나 문서가 변경되지 않았으면 서버는 이 상태코드로 응답해야 합니다. 이 응답은 Message-Body를 포함해서는 안 됩니다.

응답은 다음의 헤더 필드를 포함하고 있어야 합니다.

    ? 날짜
    ? ETag 및/또는 Content-Location, 동일한 요구에 대한 200 응답 속에 헤더가 발송되었을 경우
    ? Expires, Cache-Control, 및/또는 Vary, 동일한 변이에 대한 이전 응답 속에 발송된 field-value가 상이할 경우
조건적 GET이 강한 캐시 검증자를 사용했다면 응답은 다른 Entity-Header를 포함해서는 안 됩니다. 그렇지 않으면(조건적 GET이 약한 캐시 검증자를 사용할 때) 응답은 Entity-Header을 포함해서는 안 됩니다. 이렇게 하여 캐시 된 Entity-Body과 갱신된 헤더 사이의 불일치를 방지할 수 있습니다.
304 응답이 현재 캐시 되지 않은 엔터티를 표시할 때 캐시는 이 응답을 무시하고 조건 없이 요구를 반복해야 합니다.
캐시가 수신한 304 응답을 캐시 엔트리의 갱신에 사용한다면 캐시는 응답이 가지고 있는 새로운 필드 값을 반영하기 위해 엔트리를 반드시 갱신해야 한다.
304 응답은 Message-Body를 포함해서는 안되므로 항상 헤더 필드 다음의 첫 공백 라인으로 종료되어야 합니다.

305 Use Proxy(프락시를 사용할 것)
요청된 문서를 프록시를 통해서만 전송 받으라는 것을 나타냅니다.
요구된 자원을 Location 필드에 명시된 프락시를 통하여 접근해야만 합니다. Location 필드가 프락시의URL을 제공합니다. 수신측은 프락시를 통한 요구를 반복할 것으로 기대됩니다.

307 Temporary Redirect(임시 이동)
요청된 URI가 일시적으로 옮겨졌다는 뜻입니다.
Location 헤더가 새로운 장소를 가르킵니다. 이 상태 코드를 받는 즉시, 클라이언트는 요청을 해결하기 위해 새로운 URI를 사용해야 하지만 앞으로 모든 요청들은 이전의 URI를 사용할 것입니다.



Client Error 4xx

클라이언트의 요청이 불안전하며, 클라이언트 요청을 성공시키려면 다른 정보가 필요하다는 것을 말합니다.
상태 코드의 4xx 클래스는 클라이언트가 에러를 발생한 것처럼 보일 경우에 사용됩니다. HEAD 요구에 응답하는 경우를 제외하고는 서버는 임시적이건 영구적이건 에러 상황에 대한 설명을 포함한 엔터티를 포함해야 합니다. 이러한 상태 코드는 모든 요구 method에 적용할 수 있습니다. 사용자 에이전트는 사용자에게 포함된 엔터티를 표시해야 합니다.

[주] 클라이언트가 데이터를 발송한다면 TCP를 사용하는 서버 구현 방식은 서버가 입력 접속을 종료하기 전에 응답을 포함하고 있는 패킷 접수를 확인할 수 있도록 주의해야 합니다. 클라이언트가 접속이 종료된 후에도 계속해서 데이터를 전송한다면 서버의 TCP 스택은 리셋 패킷을 클라이언트에게 발송할 것입니다.
이 리셋 패킷은 HTTP 애플리케이션이 읽거나 해석하기 전에 클라이언트가 확인한 입력 버퍼를 지웁니다.

400 Bad Request(잘못된 요구)
클라이언트의 요청에 문법적인 오류가 있다는 것을 서버가 알아냈다는 것을 의미합니다.
잘못된 형식 때문에 서버가 요구를 이해할 수 없습니다. 클라이언트는 변경 없이 요구를 반복해서는 안 됩니다.

401 Unauthorized (인증되지 않았음)
클라이언트가 잘못된 인증정보를 Authorization 헤더에 넣었음을 나타냅니다.
응답이 사용자 인증을 요구합니다. 이 응답은 요구된 자원에 적용할 수 있는 설명 요구(challenge)를 포함하고 있는 WWW-Authenticate 헤더 필드를 포함하고 있어야 합니다. 클라이언트는 적절한 Authorization 헤더 필드를 가지고 요구를 반복할 수 있습니다. 요구가 벌써 Authorization 증명서를 포함하고 있다면 401 응답은 해당 증명서에 대한 인증이 거절되었음을 표시합니다. 401 응답이 이전 응답과 동일한 설명 요구를 포함하고 있고 사용자 에이전트가 한 번 이상 인증 획득을 시도했다면 해당 엔터티가 관련된 진단 정보를 포함하고 있기 때문에 사용자에게 응답에 표시된 엔터티를 표시해주야 합니다.

402 Payment Required
이 코드는 아직 HTTP로 구현되지 않았습니다. 하지만 언젠가는 서버의 문서를 받아보기 위해 지불이 필요하다는 것을 나타냅니다.

403 Forbidden(금지되었음)
클라이언트의 인증정보에 상관없이 페이지에 대한 접근을 거부한다는 것을 나타냅니다.
서버가 요구를 이해했으나 완료하는 것을 거절하고 있다는 의미로 인증은 적용되지 않으며 요구를 반복될 수 없습니다. 요구 method가 HEAD가 아니고 서버가 왜 요구가 완료되었는지 알리고 싶다면 엔터티 안에 거절한 이유를 기록해야 합니다. 이 상태 코드는 서버가 요구가 거부 사유를 밝히기 원하지 않을 때나 다른 응답을 적용할 수 없을 때 일반적으로 사용됩니다.

404 Not Found(찾을 수 없음)
클라이언트가 요청한 자원에 서버에 없다는 것을 나타냅니다.
서버가 Request-URI와 일치하는 것을 아무것도 발견하지 못했다는 의미로 이러한 상태가 잠정적인지 영구적인지 관한 아무런 표시도 주어지지 않은 경우입니다.

서버가 이 정보를 클라이언트에게 알리고 싶지 않을 경우 상태 코드 403(Forbidden)을 대신 사용할 수 있습니다. 내부적으로 환경을 설정할 수 있는 메커니즘을 통하여 이전의 자원을 영구적으로 사용할 수 없으며 전송 주소가 없다는 것을 알 수 있으면 410(Gone) 상태 코드를 사용합니다.

405 Method Not Allowed(Method를 사용할 수 없음)
Allow 헤더와 함께 클라이언트가 사용한 메소드가 이 URI에 대해 지원되지 않는다는 의미입니다.
Request-Line에 명시된 method를 Request-URI로 확인할 수 있는 자원에서 사용할 수 없습니다.
응답은 요구된 자원에 사용할 수 있는 method의 목록을 포함한 Allow 헤더를 포함해야 합니다.

406 Not Acceptable(접수할 수 없음)
클라이언트가 지정한 URI는 존재하지만 클라이언트가 원하는 형식이 아닙니다.
코드와 함께 서버는 Content-Language, Content-Encoding, Content-Type 헤더를 제공합니다. HEAD 요구가 아닌 이상 응답은 사용자 또는 사용자 에이전트가 가장 적합한 것을 선택할 수 있는 자원 특징 및 위의 목록을 포함한 엔터티를 포함합니다. 엔터티 포맷은 Content-Type 헤더 필드가 설정한 media type에 의해 명시됩니다. 사용자 에이전트의 포맷 및 성능에 따라 가장 적합한 선택을 결정하는 것은 자동으로 수행될 수 있습니다. 그러나 이 규격은 그러한 자동 선택의 표준에 대하여 아무런 규정도 하지 않습니다.

[주] HTTP/1.1 서버는 요구 메시지와 함께 발송된 Accept 헤더에 의해서 접수할 수 없는 응답을 리턴할 수 있게 합니다. 어떤 경우엔 이것이 406 응답을 발송하는 것보다 좋을 수도 있습니다. 사용자 에이전트는 도착하는 응답의 헤더를 검사하여 그것의 접수 여부를 결정하도록 추천합니다. 응답을 접수할 수 없을 때 사용자 에이전트는 잠정적으로 더 이상의 데이터를 수신하지 말아야 하며 추가 행동을 취할 것인지 사용자에게 질의합니다.

407 Proxy Authentication Required(프락시 인증 필요)
이 코드는 401(Unauthorized)과 유사하지만 클라이언트는 먼저 프락시에서 자기 자신을 인증해야 한다는 것을 표시 하는 것으로 proxy 서버로 로그온 한 후에 다시 시도해 봐야 합니다.
프락시는 요구된 자원의 프락시에 적용할 수 있는 설명 요구를 포함하는 Proxy-Authenticate 헤더 필드를 리턴해야 합니다. 클라이언트는 적절한 Proxy-Authorization 헤더 필드와 함께 요구를 반복해야 합니다.

408 Request Timeout(요구 시간 초과)
클라이언트의 모든 요청이 지정한 시간(일반적으로 서버를 구성할때 명시한다) 동안 처리되지 않았음을 의미합니다.
서버는 네트워크를 끊습니다. 클라이언트가 서버가 기다리도록 준비한 시간 내에 요구를 만들어 낼 수 없는 경우며 클라이언트는 나중에 변경 없이 요구를 반복할 수 있습니다.

409 Conflict(충돌)
다른 요청이나 서버의 구성과 충돌이 있음을 나타냅니다.
충돌에 대한 정보는 응답되는 데이터의 일부로 반환됩니다. 이 코드는 사용자가 충돌을 해결하고 요구를 재전송할 수 있을 것으로 기대할 수 있는 상황에서만 사용할 수 있습니다. 응답 본문은 사용자가 충돌의 원인을 인지할 수 있도록 충분한 정보를 포함해야 합니다. 이상적으로는 응답 엔터티가 사용자 또는 사용자 에이전트가 문제를 해결할 수 있을 정도의 충분한 정보를 포함할 수 있을 것입니다. 그러나 가능하지 않을 수도 있으며 필수 사항은 아닙니다.

충돌은 PUT 요구에 대한 응답으로 발생할 가능성이 높습니다. 버전 관리를 사용하고 있고 PUT 요구를 하는 엔터티가 이전 요구(제 3 자)가 작성한 요구와 충돌되는 자원에 대한 변경 사항을 포함하고 있다면 서버는 409 응답을 사용하여 요구를 완료할 수 없음을 표시해야 합니다. 이 경우 응답 엔터티는 응답 Content-Type이 규정한 형식으로 두 버전 사이의 차이점 목록을 포함해야 합니다.

410 Gone (내용물이 사라졌음)
요청된 문서가 사라지고, 새로운 주소는 알 수 없다는 것을 나타냅니다.
요구된 자원이 서버에 더 이상 존재하지 않으며 전송 주소를 알 수 없는 경우입니다. 이 조건은 영구적인 것으로 간주해야 합니다. 링크를 편집할 기능이 있는 클라이언트는 사용자 인증 후의 Request-URI에 대한 참고는 삭제해야 합니다. 서버가 그 조건이 영구적인지 여부를 알 수 없거나 결정할 시설이 없으면 상태 코드 401(Unauthorized)을 대신 사용해야 합니다. 다르게 표시되지 않는 한 이 응답은 캐시할 수 있습니다.

410 응답은 주로 수신측에게 자원을 의도적으로 사용할 수 없게 하였고 서버의 소유주가 해당 자원에 대한 원격 링크를 제거하고자 한다는 것을 알림으로써 웹 유지 작업을 지원하기 위해 사용됩니다. 이러한 일은 제한된 시간, 선전용 서비스 및 서버의 사이트에서 더 이상 일하지 않는 개인에게 소속된 자원에서 공통적으로 발생할 수 있습니다. 영구적으로 사용할 수 없는 모든 자원을 "사라진" 것으로 표시하거나 특정 시간 동안 표시를 유지할 필요는 없습니다.

411 Length Required(길이가 필요함)
서버가 규정된 Content-Length 없는 요구 접수를 거부하였다는 의미로 요구 메시지 내의 Message-Body의 길이를 포함하는 유효한 Content-Length 헤더 필드를 추가한다면 클라이언트는 요구를 반복할 수 있습니다.

412 Precondition Failed(사전 조건 충족 실패)
하나 또는 그 이상의 Request-Header에 명시된 조건에 의해 요청을 평가하여 false값을 가지는 경우입니다. 이 응답 코드는 클라이언트가 현재 자원의 메타 정보에 사전 조건을 부여할 수 있게 하여 의도하지 않는 자원에 요구 method를 적용하는 것을 방지합니다.

413 Request Entity Too Large(요구 엔터티가 너무 큼)
서버는 실제 본문이 너무 커서 요청을 처리할 수 없다는 것을 의미합니다.
요구 엔터티가 서버가 처리할 수 있거나 처리하려는 것보다 크기 때문에 서버가 요구 처리를 거부하는 경우로 서버는 클라이언트가 계속적으로 요구하는 것을 방지하기 위하여 연결을 종료합니다.

조건이 잠정적이면 서버는 Retry-After 헤더 필드를 포함하여 조건이 잠정적이며 얼마 후에 클라이언트가 재시도할 것인지를 표시합니다.

414 Request-URI Too Long(Request -URI가 너무 김)
서버는 요청된 URI가 너무 커서 요청을 처리할 수 없다는 것을 의미합니다.
Request-URI가 서버가 해석할 수 있는 것보다 크기 때문에 서버가 요구 처리를 거부하는 경우로 이처럼 드문 조건은 클라이언트가 부적절하게 질의 정보가 긴 POST 요구를 GET 요구로 변환했을때, 클라이언트가 방향 재설정의 URL "블랙 홀"로 빠졌을 때(방향이 재설정된 URL 접두사가 자신의 접미사를 지칭할 때), Request-URI를 읽거나 조작하는 고정-길이 버퍼를 사용하는 몇몇 서버에 존재하는 보안의 허점을 이용하려는 클라이언트로부터 서버가 공격을 받을 때만 발생하는 것 같습니다.

415 Unsupported Media Type(지원되지 않는 media type)
서버는 실제 본문이 지원되지 않는 형식이라 처리할 수 없다는 의미입니다.
요구의 엔터티가 요구 받은 method의 자원이 지원하지 않는 포맷으로 구성되어 있기 때문에 요구처리를 거부하였다는 의미입니다.

416 Requested range not satisfiable
서버는 어떤 유효한 값도 포함하지 않은 Range 헤더를 찾아냈습니다.
추가로 If-Range헤더는 없어졌습니다.

417 Expectation Failed
Exept헤더에서 명시된 조건은 만족될 수 없습니다.



Server Error 5xx

서버가 에러를 발생시켰으며 요구를 처리할 능력이 없음을 인지한 경우를 표시합니다. HEAD 요구에 응답하는 때를 제외하고는 서버는 에러 상황에 대한 설명및 에러가 잠정적인지 영구적인지에 관한 상황 설명을 포함하는 엔터티를 포함해야 합니다. 사용자 에이전트는 포함된 모든 엔터티를 사용자에게 표시하여야 한다. 이러한 응답 코드는 모든 요구 method에 적용할 수 있습니다.

500 Internal Server Error(서버 내부 에러)
서버의 일부(예를 들어 CGI 프로그램)가 멈추었거나 설정에서 오류(잘못된 결과나 적절하지 않은 헤더를 생성시키는 경우)가 나타났음을 의미합니다.

501 Not Implemented(구현되지 않았음)
클라이언트의 요청된 행위가 서버에서 수행할 수 없음을 의미합니다.
이것은 서버가 요구 method를 인지할 수 없고 어떠한 자원을 사용해도 지원할 수 없을 때 적절한 응답입니다.

502 Bad Gateway(불량 게이트웨이)
서버(또는 프락시)가 다른 서버(또는 프록시)로 부터의 응답이 적절하지 않음을 의미합니다.
게이트웨이나 프락시 역할을 수행하는 서버가 요구를 완료하려는 시도에서 접근한 업스트림(upstream) 서버로부터 유효하지 않은 응답을 수신했을 경우입니다.

503 Service Unavailable(서비스를 사용할 수 없음)
서비스를 일시적으로 제공할 수 없으나, 앞으로 복구된다는 의미입니다.
서버가 현재 잠정적인 오버로딩(overloading)이나 서버의 유지 작업 때문에 요구를 처리할 수 없다는 것으로 이것이 잠정적인 상황이며 얼마 후에는 완화될 수 있다는 것입니다. 알 수 있다면 지연 시간 길이를 Retry-After 헤더에 표시할 수 있습니다. 아무런 Retry-After 정보가 없으면 클라이언트는 500 응답을 처리하는 것처럼 응답을 처리해야 합니다.

[주] 503 상태 코드가 있다는 것이 서버가 오버로드 되었을 때 이것을 반드시 사용해야 된다는것을 의미하지 않습니다. 어떤 서버는 단순히 접속을 거부하고자 합니다.

504 Gateway Timeout(게이트웨이 시간 초과)
게이트웨이나 프락시 역할을 수행하는 서버가 시간 내에 요구를 완료하려는 시도에서 접근한 업스트림(upstream) 서버로부터 응답을 수신하지 못했을 경우입니다.

게이트웨이나 프락시의 시간이 경과했다는 것만 빼고는 408(Request time-out)과 같습니다.

505 HTTP Version Not Supported(지원되지 않는 HTTP 버전)
서버가 요구 메시지에서 사용된 HTTP 규약 버전을 지원하지 않거나 지원하기를 거부했다는 의미입니다.
서버는이 에러 메시지 이외에는 클라이언트가 사용하는 동일한 주요 버전을 사용하여 요구를 완료할 의사나 능력이 없음을 표시합니다. 응답은 왜 해당 버전이 지원되지 않으며 서버가 어떤 규약을 지원하는가를 설명하는 엔터티를 포함해야 합니다.



블로그 이미지

유효하지않음

,