Posted
Filed under Linux

[원문] - http://cafe.naver.com/webdori.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=1028

* 개요
이 문서는 80포트만이 열린 네트워크 환경에서 아파치(80포트)와 톰캣(8080포트)을 동시에 서비스 하기 위한


방법을 설명하고 있습니다.


* 시스템사항
Operating System: Centos5
Webserver: Apache 2.2.2
JDK: JDK 6.0
Servlet Container: Tomcat 6.0.18
Tomcat Connector: Jakarta Tomcat Connector mod_jk (not mod_jk2)

* 기본폴더
apache2 : /usr/local/apache
tomcat_home : /usr/local/tomcat
java_home : /usr/local/java
mod_jk : /usr/lib/apache/modules/mod_jk.so

* 설정 순서

1. mod_jk 설치
2. workers.properties 파일 만들기
3. 톰캣의 server.xml 수정
4. httpd.conf 수정
5. 가상호스팅
6. classpath 설정

* 설정설명
1. mod_jk 설치 및 tomcat_native 설치

1.1 mod_jk 설치

http://www.apache.org/dist/tomcat/tomcat-connectors/jk/source/jk-1.2.28/tomcat-connectors-1.2.28-src.tar.gz  을 다운 받아

압축을 푼다.

# cd tomcat-connectors-1.2.28-src
# ./configure --with-apxs=/usr/local/apache/bin/apxs
# make
# make install

1.2 tomcat_native 설치

fedora에서 apr관련 라이브러리 설치(apr-devel)

yum install apr*

tomcat-native.tar.gz 파일을 tomcat 디렉토리에서 찾아 압축을 푼다.

./configure --with-apr=/usr/bin/apr-1-config --with-java-home=/usr/local/java --with-ssl=yes --prefix=/usr/local/tomcat
make
make install

2. workeers.properties 파일 만들기

# vi /usr/local/apache/conf/workers.properties

#아래의 두 설정의 경로는 자신에 맞게 수정합니다.
workers.tomcat_home=/usr/local/tomcat
workers.java_home=/usr/local/java

ps=/

#아래 반복되는 worker1 대신 다른 이름도 상관없습니다.
worker.list=worker1

worker.worker1.port=8009
worker.worker1.host=localhost
worker.worker1.type=ajp13
worker.worker1.lbfactor=1

worker.loadbalancer.type=lb
worker.loadbalancer.balanced_workers=worker1

worker.inprocess.type=jni

3. 톰캣의 server.xml 수정
톰캣/conf/server.xml 에 아래의 코드를 추가합니다.

# vi /usr/local/tomcat/conf/server.xml


Server 태그 바로 아래쪽에 Listener 태그가 적힌곳에 추가하면 됩니다.
modjk와 workersConfig의 경로에 주의해서 자신에 맞게 수정합니다.

<Listener className="org.apache.jk.config.ApacheConfig" modJk="/usr/local/apache/modules/mod_jk.so" workersConfig="/usr/local/apache/conf/workers.properties" />

톰캣을 재시작 합니다.

# /etc/init.d/tomcat restart


에러없이 재시작 되면 아래와 같은 파일이 생성됩니다.
/usr/local/tomcat/conf/auto/mod_jk.conf

4. httpd.conf 수정
/usr/local/apache/httpd.conf 설정 파일에 아래의 코드를 추가합니다. 항상 경로에 신중하세요.


# vi /usr/local/apache/httpd.conf

# Load mod_jk module
# Update this path to match your modules location
#LoadModule jk_module /usr/local/apache/modules/mod_jk.so

# Where to find workers.properties
# update this path to match your conf directory location
JkWorkersFile /usr/local/apache/conf/workers.properties

# Where to put jkshared Memory
JkShmFile /usr/local/apache/logs/mod_jk.shm

# where to put jk logs
JkLogFile /usr/local/apache/logs/mod_jk.log

# Set the jk log level [debug/error/info]
JkLogLevel info

JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
JkRequestLogFormat "%w %V %T"

파일을 저장하고 아파치를 재시작 합니다.
브라우저에서 http://127.0.0.1로 접속했을때 톰캣 페이지가 보이면 연동된 것입니다.

5. 가상호스팅
아파치, 톰캣 각각의 가상호스팅 설정에 대해서 자세히 다루지는 않겠습니다.
아파치, 톰캣 두개의 가상호스팅 설정이 일치해야 연동에 문제가 없습니다.

아파치의 가상호스팅

<VirtualHost *:80>
   DocumentRoot /home/test/public_html
   ServerName test.co.kr
   ServerAlias www.test.co.kr
   JkMount  /*.jsp worker1
   JkMount  /*.do worker1

   JkMount  /servlet/* worker1
</VirtualHost>

톰캣의 가상호스팅(server.xml)

# vi /usr/local/tomcat/conf/server.xml

아래 구문을 추가한다.

<Host name="www.test.co.kr" appBase="/home/test/public_html"
            unpackWARs="true" autoDeploy="true"
            xmlValidation="false" xmlNamespaceAware="false">
</Host>

# cd /usr/local/tomcat/conf/Catalina

# mkdir www.test.co.kr

# cd www.test.co.kr

가상호스트 설정파일을 만든다.
# vi ROOT.xml

아래 내용을 ROOT.xml에 작성한다.
<?xml version='1.0' encoding='utf-8'?>
<Context path="/" docBase="" crossContext="false" reloadable="true" debug="0" />

tomcat 재시작
apache 재시작

6. classpath 설정

가상호스트의 WEB-INF를 인식하지 못하는 경우 /usr/local/tomcat/bin/setclasspath.sh 파일을 아래와 같이 수정

CLASSPATH= 구문 대신 아래 코드를 추가 입력한다.

CLASSPATH="$CLASSPATH:$CATALINA_HOME/lib/el-api.jar:$CATALINA_HOME/lib/servlet-api.jar:$CATALINA_HOME/lib/jsp-api.jar"

home_root='/home'
cd $home_root

for home_name in $(ls)
    do
        if [ -d "$home_root/$home_name/public_html/WEB-INF/classes" ] ; then
           CLASSPATH="$CLASSPATH:$home_root/$home_name/public_html/WEB-INF/classes"
        fi
        if [ -d "$home_root/$home_name/public_html/WEB-INF/lib" ] ; then
           CLASSPATH="$CLASSPATH:$home_root/$home_name/public_html/WEB-INF/lib"
        fi
done

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$CATALINA_HOME/lib
export LD_LIBRARY_PATH

class.jsp 파일을 다음과 같이 작성하여 classpath 확인

<%@page contentType="text/html; charset=euc-kr"%>
<%=System.getProperty("java.class.path")%>

2010/07/12 18:27 2010/07/12 18:27
Posted
Filed under Linux
  • [원문] - http://choris.springnote.com/pages/1097288

    리눅스 톰켓설치시 8080포트 열기

    방화벽에서 8080 포트를 열어준다. (방화벽 설정 > 사용자 설정 > 그 외의 포트 > 맨끝에 8080:tcp 추가 > 확인 > 확인 > 종료)

    ]# setup
  • 웹 브라우져로 확인한다.

    http://(설치한 IP주소 또는 도메인):8080/
  • 2010/07/12 17:32 2010/07/12 17:32
    Posted
    Filed under Htm&Javascript
    [원문]  - http://www.tizag.com/javascriptT/javascriptconfirm.php

    <html>
    <head>
    <script type="text/javascript">
    <!--
    function confirmation() {
    var answer = confirm("Leave tizag.com?")
    if (answer){
    alert("Bye bye!")
    window.location = "http://www.google.com/";
    }
    else{
    alert("Thanks for sticking around!")
    }
    }
    //-->
    </script>
    </head>
    <body>
    <form>
    <input type="button" onclick="confirmation()" value="Leave Tizag.com">
    </form>
    </body>
    </html>
    2010/07/12 00:41 2010/07/12 00:41
    Posted
    Filed under Htm&Javascript
    [원문] http://www.omnibuscode.com/zeroboard/zboard.php?id=seeyou_programing_javascript&page=3&sn1=&divpage=1&sn=off&ss=on&sc=on&select_arrange=hit&desc=asc&no=93

    < script language="javascript" type="text/javascript" >
        if (AC_FL_RunContent == 0) {
            alert("This page requires AC_RunActiveContent.js.");
        } else {
            AC_FL_RunContent(
                'codebase', '
    http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0',
                'width', '200',
                'height', '220',
                'src', 'leftflash',
                'quality', 'high',
                'pluginspage', '
    http://www.macromedia.com/go/getflashplayer',
                'align', 'middle',
                'play', 'true',
                'loop', 'true',
                'scale', 'showall',
                'wmode', 'opaque',   << 중요한 부분
                'devicefont', 'false',
                'id', 'movieClip01',
                'bgcolor', '#FFFFFF',
                'name', 'movieClip01',
                'menu', 'true',
                'allowFullScreen', 'false',
                'allowScriptAccess','sameDomain',
                'movie', 'leftflash',
                'salign', ''
                ); //end AC code
        }
    < /script >

    레이어 팝업뛰울때 다음과 같이 옵션 값을 지정 한다.
    'wmode', 'opaque',

    2010/07/10 02:34 2010/07/10 02:34
    Posted
    Filed under Action Script
    http://www.actionscript.org/forums/showthread.php3?t=115705

    class
    com.lib.data.holder.map.HashMap
    {
       
        public var keys:Array;
        public var values:Array;
        //
        public function HashMap(source)
        {
            super();
            this.keys = new Array();
            this.values = new Array();
            this.populate(source);
        }
        public function populate(source)
        {
            if (source)
            {
                for (var i in source)
                {
                    this.put(i, source[i]);
                }
            }
        }

        public function containsKey(key)
        {
            return (this.findKey(key) > -1);
        }
        public function containsValue(value)
        {
            return (this.findValue(value) > -1);
        }
        public function getKeys(Void)
        {
            return (this.keys.slice());
        }
        public function getValues(Void)
        {
            return (this.values.slice());
        }
        public function get(key)
        {
            return (values[this.findKey(key)]);
        }
        public function put(key, value)
        {
            var oldKey;
            var theKey = this.findKey(key);
            if (theKey < 0)
            {
                this.keys.push(key);
                this.values.push(value);
            }
            else
            {
                oldKey = values[theKey];
                this.values[theKey] = value;
            }
            return (oldKey);
        }
        public function putAll(map)
        {
            var theValues = map.getValues();
            var theKeys = map.getKeys();
            var max = keys.length;
            for (var i = 0; i < max; i = i - 1)
            {
                this.put(theKeys[i], theValues[i]);
            }
        }
        public function clear(Void)
        {
            this.keys = new Array();
            this.values = new Array();
        }
        public function remove(key)
        {
            var theKey = this.findKey(key);
            if (theKey > -1)
            {
                var theValue = this.values[theKey];
                this.values.splice(theKey, 1);
                this.keys.splice(theKey, 1);
                return (theValue);
            }
        }
        public function size(Void)
        {
            return (this.keys.length);
        }
        public function isEmpty(Vois)
        {
            return (this.size() < 1);
        }
        public function findKey(key)
        {
            var index = this.keys.length;
            while(this.keys[--index] !== key && index > -1)
            {
            }
            return(index);
        }
        public function findValue(value)
        {
            var index = this.values.length;
            while(this.values[--index] !== value && index > -1)
            {
            }
            return (index);
        }
    }


    ##사용방법##
    import com.lib.data.holder.map.*;

    /* Add John to your `contact` list */
    var myContacts:HashMap = new HashMap();
    myContacts.put("John", new HashMap());

    /* Get John, and add a `contacts` list */
    var contact:HashMap = myContacts.get("John");
    contact.put("contacts", new HashMap());

    /* Add Johns contacts to the list */
    var theContacts:HashMap = contact.get("contacts");
    theContacts.put(0, "Mary");
    theContacts.put(1, "Alex");
    theContacts.put(2, "Julie");

    /* Is Alex a contact of John? */
    var isContact = myContacts.get("John").get("contacts").containsValue("Alex");
    if (isContact) trace("Alex is contact of John");
    else trace("Alex is Not a contact of John");

    /* Is Mark a contact of John? */
    var isContact = myContacts.get("John").get("contacts").containsValue("Mark");
    if (isContact) trace("Mark is contact of John");
    else trace("Mark is Not a contact of John");


    2010/07/09 17:21 2010/07/09 17:21
    Posted
    Filed under Linux
    [원문] http://cspark.net/1976490 



    분산시스템에서 업로드 파일폴더는 하나를 공용으로 사용하기 위해서 심볼릭 링크를 사용했다.
    명령어는 간단하다.

    사용법: ln [-f|n] [-s] 소스 [목표]
    또는 ln [-f|n] [-s] 소스1 ... 소스N 디렉토리

    /home/upload폴더를 /data/common/upload 폴더에 링크를 걸고 싶다면 아래와 같이 하면된다.
    ex) ln -s /data/common/upload /home/upload

    삭제 할 경우
    rm (링크명<-- 디렉토리 명) 실제 파일은 삭제 되지 않으며 링크만 제거 된다.

    2010/07/06 22:10 2010/07/06 22:10
    Posted
    Filed under asp,asp.net

    [원문] : http://wiz.pe.kr/80

    책을 보면서 ASP.NET page의 이벤트 순서를 간단하게 정리를 해봤습니다.
    이벤트의 순서를 알면 ASP.NET을 이용해 개발하는 패턴을 이해 할 수 있습니다.

    이벤트의 큰 흐름은 아래와 같이 간단합니다.

    가. 요청 페이지의 이전 상태값을 읽는다.
    나. 요청 페이지의 변화된 값을 읽는다.
    다. 변화된 값에 대한 처리를 한다. (사용자의 구현부분)
    라. 변화된 값을 저장 한다.


    asp.net page의 이벤트 발생 순서

    사용자 삽입 이미지

    1. 클라이언트의 페이지 요청
    클라이언트는 함은 IE뿐 아니라 모바일 기기와 같이 asp.net페이지에 접근하는 모든 장비를 말합니다.

    2. Initialize :  ASP.NET Framework 에서 클라이언트 요청을 처리하기 위해 Init 이벤트를 보내서 OnInit() 메소드를 호출 합니다. 대부분 이 단계에서 객체를 생성합니다.

    3. Load View State
    : 컨트롤의 Viewstate 값을 읽어들일때 발생합니다. 포스트백 되는 경우 PostBack된 ViewState 값을 읽어드립니다. LoadViewState()를 사용해 사용자 코드를 추가 할 수 있습니다.

    4. Process PostBack Data
    : System.Web.UI.IPostBackDataHandler 인터페이스를 구현하는 컨트롤에서 PostBack 데이터를 해석할 때 발생하게 됩니다. LoadPostData() 메서드를 통해 오버라이딩을 할 수 있습니다.

    5. Load
    : 컨트롤 트리에서 컨트롤에 접근 할 수 있는 최초의 이벤트라고 할 수 있습니다. 컨트롤들의 초기화가 이루어진다. 컨트롤에 대한 설정을 여기에서 구현하시면 됩니다.

    6. Send PostBack Change Notifications
    : 포스트백 된 데이터가 변경되었을 경우 발생하는 이벤트로 System.Web.UI.IPostBackDataHandler 인터페이스에서 상속 받았고, RaisePostDataChangedEvent() 메소드를 이용해 오버라이딩 가능합니다.

    7. Handle PostBack Events
    : 클라이언트에서 PostBack 이벤트를 발생시킨 컨트롤에 대응하는 메소드 호출 하는 단계 입니다. 각 이벤트에 대한 처리를 구현하면 됩니다.

    8. Prerender
    : 런더링 하기전에 발생하는 이벤트입니다. 컨트롤에 대한 접근할 수 있는 마지막 단계로 결과를 출력을 하기전에 최종적으로 처리해야 할 내용을 구현하면 됩니다.

    9. Save State
    : 컨트롤들의 상태와 설정값을 ViewState에 저장 할 때 발생 합니다. SaveViewState() 메서드를 오버라이드해서 사용자의 처리내용을 구현할 수 있습니다.

    10. Render
    : 클라이언트에 출력할 내용으로 변경 할 때 발생 합니다. 여기에서 만들어진 데이터가 클라이언트로 보내집니다. Render() 메소드를 통해 오버라이딩 할 수 있습니다.

    11. Dispose
    : 사용했던 모든 리소스를 제거 할때 발생 합니다. Dispose() 메소드를 오버라이딩 해서 추가로 제거 할 리소스를 제거하면 됩니다.


    저장한 값과 변경된 값을 비교해 사용자의 액션을 처리 하는 단순한 로직을 반복함으로서 구성이 됩니다.

    2010/07/04 02:58 2010/07/04 02:58
    Posted
    Filed under ORACLE

    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 컬럼

    2010/06/29 17:41 2010/06/29 17:41
    Posted
    Filed under ORACLE
     [원문] http://develop.sunshiny.co.kr/122

    ※ Oracle 오라클 DECODE 함수

    - 특정 컬럼의 값을 기준으로 마치 IF문을 사용하는 것과 같은 효과를 내는 함수
    - 해당 컬럼의 값이 'A'이면 지정한 특정한 값을 출력하고, 'B'이면 또 다른 값을 출력
    - 기본값을 정해서 조건을 만족하지 않는 경우의 출력 제어 가능

    - 구문
    DECODE(expr, search, result, default)
    -- expr과 각 search 값을 비교하녀 같으면 result 값을 반환, 다르면 default 값을 반환

    # 사원 번호(DEPTNO)에 따른 인상 급여

    SELECT ENAME, DEPTNO, SAL,
        DECODE(DEPTNO
        ,10, SAL*1.05
        ,20, SAL*1.1
        ,30, SAL*1.15
        ,SAL)AS "인상급여"
    FROM EMP;

    ENAME, DEPTNO, SAL, 인상급여
    ----------------------------
    SMITH   20    800   880
    ALLEN   30    1600   1840
    WARD    30    1250    1437.5
    JONES   20    2975   3272.5
    MARTIN  30    1250  1437.5
    BLAKE   30    2850   3277.5
    CLARK   10    2450   2572.5
    SCOTT   20    3000   3300
    KING    10    5000    5250
    TURNER  30    1500  1725
    ADAMS   20    1100   1210
    JAMES   30    950     1092.5
    FORD    20    3000    3300
    MILLER  10    1300  1365



    # 직업 이름(JOB)에 따라 새로운 직업명을 변형

    SELECT ENAME, JOB,
            DECODE(JOB
        ,'ANALYST', '분석가'
        ,'CLERK', '점원'
        ,'MANAGER','관리자'
        ,'SALESMAN', '영업사원'
        ,'PRESIDENT', '사장님')AS NEW_JOB
    FROM EMP;

    ENAME,     JOB,      NEW_JOB
    -----------------------------
    SMITH   CLERK         점원
    ALLEN   SALESMAN      영업사원
    WARD    SALESMAN      영업사원
    JONES   MANAGER       관리자
    MARTIN  SALESMAN      영업사원
    BLAKE   MANAGER       관리자
    CLARK   MANAGER       관리자
    SCOTT   ANALYST       분석가
    KING    PRESIDENT     사장님
    TURNER  SALESMAN      영업사원
    ADAMS   CLERK         점원
    JAMES   CLERK         점원
    FORD    ANALYST       분석가
    MILLER  CLERK         점원


    참고 사이트 : http://stillrabbit.blogspot.com/2008/02/oracle-decode-tip.html

    decode 문은 일반적으로 값을 치환하는데 쓰입니다.

    * 컬럼 1개를 여러개의 값으로 비교할경우..
    col1 의 값이 1,2,3 인경우 각각 'ONE', 'TWO', 'THREE' 로 변환하고자 한다면,

    decode(col1, 1, 'ONE', 2, 'TWO', 3, 'THREE', 'MANY')

    1,2,3 이 아닌경우는 'MANY' 가 되겠죠...

    * 컬럼 여러개를 한개의 값으로 비교할경우

    decode(2, col1, 'col1 is TWO', col2, 'col2 is TWO', null)

    * 단방향 범위를 비교하는경우
    만약 25 보다 큰경우엔 25 만 리턴하고 작은경우엔 해당컬럼의 값을
    리턴하고자 한다면,

    decode(sign(col1-25), -1, col1, 25)

    처럼 사용하면 되겠죠.

    * 다차원 통계에 응용(group by 와 조합)
    그룹 아이디별로 합산하는 쿼리는 일반적으로 아래와같습니다.


    select grp_id, sum(score)
    from GRP_SCORE_TB
    group by grp_id

    만약..그룹별로 총계를 내고, 그룹별 총계 합산한 총합산을 내고싶다면?
    다음과같이 카티션 곱을 응용하고, decode로 선택적인 그룹핑을 해주시면
    됩니다.


    select MAX(decode(gubun, 1, grp_id, '총계')),
    sum(score)
    from GRP_SCORE_TB
    cross join (select level as gubun from dual connect by level < 3)
    group by gubun, decode(gubun, 1, grp_id, null)

    이려면,


    a001 200
    a004 122
    a003 27
    총계 347

    과 같은 결과를 낼수 있습니다.

    ※ 몇가지 예로 decode 의 활용을 알아보았습니다. 이외에도 order by 등에도
    사용하면, 위의 group by 에 사용한것처럼, 선택적인 sorting 이 이루어지게
    이용될수도 있습니다.

    2010/06/29 17:33 2010/06/29 17:33