보통 구분자로 이루어진 가변적인 문자열을 행으로 변환할 경우 Table타입 Function을 만들어 사용한다.
그러나.. 순수하게 SQL만으로도 같은 기능을 구현할 수 있었다..
간만에 삽질을 했더니.. 역시 생각을 바꾸면 답은 나오기 마련인듯..


SELECT DECODE(LENGTH(TXT), 0, TXT, SUBSTR(TXT, INSTR(TXT, ',', 1, ROWNUM)+1, (INSTR(TXT, ',', 1, ROWNUM+1)-2)-(INSTR(TXT, ',', 1, ROWNUM)-1))) AS SLIPT_DATA
  FROM (SELECT ','||'A,BB,CCC,DDDD,GGG,EE,F'||',' AS TXT FROM DUAL) X, COPY_T Y
 WHERE Y.NO <= LENGTH(X.TXT) - LENGTH(REPLACE(X.TXT, ',', '')) - 1

Tag : InStr, Oracle, Query, split, SQL

[oracle] Cent OS 5.2에 oracle 10g 설치..

Posted 2008/11/07 00:13 by K티
[ Cent OS 5.2 준비 ]

Gnome과 KDE 환경을 둘 다 설치한다. KDE 환경에서 오라클 설치를 권장된다고 한다.


[ Oracle 10g 환경 ]

1. 추가 패키지 설치

☞ 설치되지 않은 패키지를 확인하여 설치한다.
# rpm -qa setarch make glibc libaio compat-libstdc++-33 compat-gcc-34 gcc libXp openmotif compat-db

☞ 아래 패키지는 각자에 맞게 설치한다.
# yum install compat-libstdc++-33 compat-gcc-34 gcc libXp openmotif compat-db

2. 시스템 설정

☞ CentOS를 redhat-4로 수정한다.
# vi /etc/redhat-release

☞ limits.conf 파일에 아래와 같이 설정한다.
# vi /etc/security/limits.conf
* soft nproc 2047
* hard nproc 16384
* soft nofile 1024
* hard nofile 65536

☞ sysctl 파일에 아래와 같이 설정하되, 기존의 kernel.shmmax는 주석처리한다.
# vi /etc/sysctl.conf
kernel.shmmax = 2147483648
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
fs.file-max = 65536
net.ipv4.ip_local_port_range = 1024 65000
net.core.rmem_default=262144
net.core.rmem_max=262144
net.core.wmem_default=262144
net.core.wmem_max=262144

☞ 아래 명령을 실행하여 설정값만 나오면 정상이다.
# /sbin/sysctl -p

☞ login 파일에 아래의 내용을 설정한다.
# vi /etc/pam.d/login
session required /lib/security/pam_limits.so

3. 기타 설정

10201_database_linux32.zip를 ~밑으로 끌어다 놓는다.(host pc에서 guest pc로 복사) 만약 복사 메시지가 떳음에도 불구하고 해당 폴더에 10201_database_linux32.zip파일이 없을 경우 /tmp/VMwareDnD폴더를 살펴본다.
# cd /tmp/VMwareDnD/
# cd 18bde2b1/
위 폴더는 ls로 확인 후 들어간다.
# mv 10201_database_linux32.zip ~


[ Oracle 10g 설치 ]

1. Oracle 유저 생성

# groupadd oinstall
# groupadd dba
# groupadd oper
# useradd -g oinstall -G dba oracle
# passwd oracle
# mkdir -p /u01/app/oracle/product/10.2.0/db_1
# chown -R oracle.oinstall /u01
# mkdir -p /data/oradata
# chown -R oracle.oinstall /data/oradata/
# su - oracle

2. 환경변수 설정

☞ .bash_profile를 아래를 참고하여 설정한다.
### for Oracle 10g ###
TMP=/tmp; export TMP
TMPDIR=$TMP; export TMPDIR
ORACLE_BASE=/u01/app/oracle; export ORACLE_BASE
ORACLE_HOME=$ORACLE_BASE/product/10.2.0/db_1; export ORACLE_HOME
ORACLE_SID=orcl; export ORACLE_SID
ORACLE_TERM=xterm; export ORACLE_TERM
PATH=/usr/sbin:$PATH; export PATH
PATH=$ORACLE_HOME/bin:$PATH; export PATH
export DISPLAY=:0.0

3. 설치 스크립트

# vi /etc/hosts
  - 네트워크 체킹을 위해 설정한다.(자신의 환경에 맞게 설정)
# xhost + localhost
# su - oracle
$ unzip 10201_database_linux32.zip
$ cd database/
$ unset LANG
  - 설치 시 한글이 깨지거나 보이지 않으면 영문으로 설치한다.
$ ./runInstaller

4. 설치

1) Select Installation Method
  - Advanced Installation 선택한다.
2) Specify Inventory directory and credentials
3) Select Installation Type
  - Product Languages -> Language Selection에서 Korean을 추가한다.
4) Specify Home Details
5) Product-Specific Prerequisite Checks
  - Network Configuration requirements에서 Not executed가 뜬다. 일단 무시한다. 무시하고 설치해도 일단 서비스는 잘 뜬다. 나중에 확인이 필요하다.
6) Select Configuration Option
7) Select Database Configuration
8) Specify Database Configuration Options
  - Global Database Name과 SID를 orcl로 지정한다.(각자에 맞게 세팅)
  - Database Character Set을 Unicode standard UTF-8 AL32UTF8로 선택한다.
  - 그리고 Create database with sample schemas를 체크하도록 한다.
9) Select Database Management Option
10) Specify Database Storage Option
  - File System을 /data/oradata로 지정한다.(각자에 맞게 세팅)
11) Specify Database Schema Passwords
  - Use the same password for all the accounts로 모든 계정에 동일한 패스워드를 적용한다.(각자에 맞게 세팅)
12) Install
13) Database Configuration Assistant
14) Execute Configuration scripts
     # cd /u01/app/oracle/oraInventory/
     # ./orainstRoot.sh
     # cd /u01/app/oracle/product/10.2.0/db_1/
     # ./root.sh
15) End of Installation


[ Oracle 10g 설정 ]

1. 환경변수 추가설정

$ cd ~
$ vi .bash_profile
export ORACLE_HOME=$ORACLE_BASE/product/10.2.0/db_1
export PATH=$PATH:$ORACLE_HOME/bin
export LD_LIBRARY_PATH=$ORACLE_HOME/lib


[ 기타 ]

1. 리스너 기본 명령
$ lsnrctl start
$ lsnrctl stop

2. iSQL*Plus 기본 명령
$ isqlplusctl start
$ isqlplusctl stop

3. Enterprise Manager 기본 명령
$ emctl start dbconsole
$ emctl stop dbconsole

4. 서비스 자동 시작 설정
# vi /etc/rc.d/rc.local
# for Oracle 10g
su - oracle -c '/u01/app/oracle/product/10.2.0/db_1/bin/lsnrctl start'
su - oracle -c '/u01/app/oracle/product/10.2.0/db_1/bin/dbstart'
su - oracle -c '/u01/app/oracle/product/10.2.0/db_1/bin/isqlplusctl start'
# vi /etc/oratab
orcl:/u01/app/oracle/product/10.2.0/db_1:N에서 끝에 N을 Y로 수정한다.

Tag : 10G, centOS, Oracle, oracle10g, oracle설치, 리눅스, 오라클, 오라클설치

[util] taskbar shuffle..

Posted 2008/11/06 14:44 by K티
작업표시줄을 맘대로 이동가능케 해주는 프로그램..



[출처] http://nerdcave.webs.com/taskbarshuffle.htm


[첨부파일]

Tag : shuffle, taskbar, 작업표시줄

[etc] Album Cover.. Link..

Posted 2008/11/06 13:14 by K티

http://coverholic.com/

http://cover.zzlzzl.net/

http://www.discogs.com/home

http://www.maniadb.com/main.asp

http://www.sangarecords.co.kr/shop/

Tag : Album, Cover, coverflow

[util] WinMerge..

Posted 2008/11/04 13:07 by K티
소스비교툴인 WinMerge.. 장점이라면.. 탐색기내에서 파일을 선택하여 비교할 수 있다는 것..


[출처] http://winmerge.org/


[첨부파일]


Tag : Compare, merge, WinMerge, 병합, 소스비교

[util] 화면상에 띄우는 자..

Posted 2008/11/04 12:55 by K티
간혹 윈도우의 창사이즈 같은 것을 계산할려고 할때 불편함이 있다..

첨부된 screen ruler를 실행하여 계산하고자 하는 대상 위에 올려놓고 드래그질을 해주면 보다 쉽게 사이즈를 구할 수 있다..

또한 픽셀, 밀리미터, 센티미터로 설정이 가능하다~




[첨부파일]

Tag : ruler, 스크린, , 화면사이즈

[oracle] autotrace 설정..

Posted 2008/11/04 01:53 by K티
Explain plan만큼이나 중요한 autotrace..

설정은 간단하다.. 반드시 설정하여 양심있는 시클을 작성할 수 있는 환경을 만들어 주자~


- sys계정으로 접속

- plustrace 생성(plustrace.sql 파일에서 grant select on v_$session to plustrace; 부분이 없다면 추가해주자..)
[ for Unix, Linux ]
SQL> @$ORACLE_HOME/sqlplus/admin/plustrce.sql
[ for windows ]
SQL> @$ORACLE_HOME\sqlplus\admin\plustrce.sql

- plustrace 권한부여
SQL> GRANT plustrace TO 계정명;


- 해당계정으로 접속하여.. 아래 시클로 plustrace 권한 확인!

SQL> select * from user_role_privs;

- 해당계정에 plan_table이 없는 경우에만 아래 스크립트 실행
[ for Unix, Linux ]
SQL> @$ORACLE_HOME/rdbms/admin/utlxplan.sql
[ for windows ]
SQL> @$ORACLE_HOME\rdbms\admin\utlxplan.sql

- 실제로 autotrace를 셋팅한후 테스트해본다.
SQL> set autotrace on;


-----------------------------------------------------------------------------------
※ plan_table도 있고 plustrace 권한도 있는데..
set autotrace on; 실행시 아래와 같은 에러가 난다면..

SP2-0618: Cannot find the Session Identifier.  Check PLUSTRACE role is enabled
SP2-0611: Error enabling STATISTICS report

sys계정으로 접속해서 아래 두줄을 실행한다.
SQL> grant connect,resource to 계정명 identified by 암호;
SQL> grant plustrace to 계정명;

저작자 표시

Tag : autotrace, Oracle, plustrace, 오라클

[javascript] prototype기반 StringUtil..

Posted 2008/11/03 12:48 by K티

/******************************
 * StringUtil.js
 * @description : 문자열 관련 함수 js
 * @author : KEI
 * @version : 1.0
 * @since
******************************/


/**
 * 정규식에 쓰이는 특수문자를 찾아서 escape 한다.
 * @return 특수문자가 escape된 문자열
 */
String.prototype.meta = function() {
var str = this;
var result = '';
for(var i = 0; i < str.length; i++) {
if((/([\$\(\)\*\+\.\[\]\?\\\^\{\}\|]{1})/).test(str.charAt(i))) {
result += str.charAt(i).replace((/([\$\(\)\*\+\.\[\]\?\\\^\{\}\|]{1})/), "\\$1");
} else {
result += str.charAt(i);

}
}
return result;
}

/**
 * 정규식에 쓰이는 특수문자를 찾아서 escape하여 반환한다.
 * @return 특수문자가 escape된 문자열
 */
String.prototype.remove = function(pattern) {
return (pattern == null) ? this : eval("this.replace(/[" + pattern.meta() + "]/g, \"\")");
}

/**
 * 문자열이 대상 문자열과 동일한 값인지의 여부를 반환한다.
 * @param tagetStr - 비교대상 문자열
 * @return 동일값 여부
 */
String.prototype.eq = function(tagetStr) {
return (tagetStr != null && typeof(tagetStr) != 'undefined' && this == tagetStr);
}

/**
 * 문자열이 대상 문자열과 다른 값인지의 여부를 반환한다.
 * @param tagetStr - 비교대상 문자열
 * @return 다른값 여부
 */
String.prototype.neq = function(tagetStr) {
return !this.eq(tagetStr);
}

/**
 * 문자열이 숫자형인지의 여부를 반환한다.
 * @param exceptChar - 추가 허용할 문자
 * @return 숫자형여부
 */
String.prototype.isNum = function(exceptChar) {
return (/^[0-9]+$/).test(this.remove(exceptChar)) ? true : false;
}

/**
 * 문자열을 숫자형으로 캐스팅한다.
 * @return 캐스팅된 숫자
 */
String.prototype.toNum = function() {
if(this.isNum()) {
return Number(this);
} else {
return -1;
}
}

/**
 * 문자열을 3자리마다 콤마를 찍어서 반환한다.
 * @return 콤마가 첨가된 문자열
 */
String.prototype.money = function() {
var num = this.trim();
while((/(-?[0-9]+)([0-9]{3})/).test(num)) {
num = num.replace((/(-?[0-9]+)([0-9]{3})/), "$1,$2");
}
return num;
}

/**
 * 문자열의 byte 길이를 반환한다.
 * @return 문자열의 byte 길이
 */
String.prototype.getByte = function() {
var cnt = 0;
for (var i = 0; i < this.length; i++) {
if (this.charCodeAt(i) > 127) {
cnt += 2;
} else {
cnt++;
}
}
return cnt;
}

/**
 * 문자열이 지정한 최소길이 이상인지의 여부를 반환한다.
 * @param minLen - 최소길이
 * @return 최소길이 이상인지의 여부
 */
String.prototype.isMin = function(minLen) {
return this.length >= minLen;
}

/**
 * 문자열이 지정한 최대길이 이하인지의 여부를 반환한다.
 * @param maxLen - 최대길이
 * @return 최대길이 이하인지의 여부
 */
String.prototype.isMax = function(maxLen) {
return this.length <= maxLen;
}

/**
 * 문자열이 지정한 최소바이트수 이상인지의 여부를 반환한다.
 * @param minByte - 최소바이트수
 * @return 최소바이트수 이상인지의 여부
 */
String.prototype.isMinByte = function(minByte) {
return this.getByte() >= minByte;
}

/**
 * 문자열이 지정한 최대바이트수 이하인지의 여부를 반환한다.
 * @param maxByte - 최대바이트수
 * @return 최대바이트수 이하인지의 여부
 */
String.prototype.isMaxByte = function(maxByte) {
return this.getByte() <= maxByte;
}

/**
 * 문자열이 영문인경우  대문자로 치환한다.
 * @return 대문자로 치환된 문자열
 */
String.prototype.upper = function() {
return this.toUpperCase();
}

/**
 * 문자열이 영문인경우  소문자로 치환한다.
 * @return 소문자로 치환된 문자열
 */
String.prototype.lower = function() {
return this.toLowerCase();
}

/**
 * 문자열 좌우 공백을 제거한다.
 * @return 좌우 공백 제거된 문자열
 */
String.prototype.trim = function() {
return this.replace(/^\s+/g, '').replace(/\s+$/g, '');
}

/**
 * 문자열 좌 공백을 제거한다.
 * @return 좌 공백 제거된 문자열
 */
String.prototype.ltrim = function() {
return this.replace(/(^\s*)/, "");
}

/**
 * 문자열 우 공백을 제거한다.
 * @return 우 공백 제거된 문자열
 */
String.prototype.rtrim = function() {
return this.replace(/(\s*$)/, "");
}

/**
 * 문자열에서 모든 교체할 문자열을 대체 문자열로 치환한다.
 * @param pattnStr - 찾을 문자열
 * @param chngStr - 대체 문자열
 * @return 치환된 문자열
 */
String.prototype.replaceAll = function(pattnStr, chngStr) {
var retsult = "";
var trimStr = this.replace(/(^\s*)|(\s*$)/g, "");

if(trimStr && pattnStr != chngStr) {
retsult = trimStr;
while(retsult.indexOf(pattnStr) > -1) {
retsult = retsult.replace(pattnStr, chngStr);
}
}
return retsult;
}

/**
 * 문자열을 거꾸로 치환한다.
 * @return 거꾸로 치환된 문자열
 */
String.prototype.reverse = function() {
var result = '';

for(var i=this.length-1; i>-1; i--) {
result += this.substring(i, i+1);
}
return result;
}

/**
 * 지정한 길이만큼 원본 문자열 왼쪽에 패딩문자열을 채운다.
 * @param len - 채울 길이
 * @param padStr - 채울 문자열
 * @return 채워진 문자열
 */
String.prototype.lpad = function(len, padStr) {
var result = '';
var loop = Number(len) - this.length;
for(var i=0; i<loop; i++) {
result += padStr.toString();
}
return result + this;
}

/**
 * 지정한 길이만큼 원본 문자열 오른쪽에 패딩문자열을 채운다.
 * @param len - 채울 길이
 * @param padStr - 채울 문자열
 * @return 채워진 문자열
 */
String.prototype.rpad = function(len, padStr) {

var result = '';
var loop = Number(len) - this.length;
for(var i=0; i<loop; i++) {
result += padStr.toString();
}
return this + result;
}

/**
 * 문자열이 공백이나 널인지의 여부를 반환한다.
 * @return 공백이나 널인지의 여부
 */
String.prototype.isBlank = function() {
var str = this.trim();
for(var i = 0; i < str.length; i++) {
if ((str.charAt(i) != "\t") && (str.charAt(i) != "\n") && (str.charAt(i)!="\r")) {
return false;
}
}
return true;
}

/**
 * 문자열이 영어만으로 구성되어 있는지의 여부를 반환한다.
 * @param exceptChar - 추가 허용할 문자
 * @return 영어만으로 구성되어 있는지의 여부
 */
String.prototype.isEng = function(exceptChar) {
return (/^[a-zA-Z]+$/).test(this.remove(exceptChar)) ? true : false;
}

/**
 * 문자열이 숫자와 영어만으로 구성되어 있는지의 여부를 반환한다.
 * @param exceptChar - 추가 허용할 문자
 * @return 숫자와 영어만으로 구성되어 있는지의 여부
 */
String.prototype.isEngNum = function(exceptChar) {
return (/^[0-9a-zA-Z]+$/).test(this.remove(exceptChar)) ? true : false;
}

/**
 * 문자열이 한글만으로 구성되어 있는지의 여부를 반환한다.
 * @param exceptChar - 추가 허용할 문자
 * @return 한글만으로 구성되어 있는지의 여부
 */
String.prototype.isKor = function(exceptChar) {
return (/^[가-힣]+$/).test(this.remove(exceptChar)) ? true : false;
}

/**
 * 문자열이 숫자와 한글만으로 구성되어 있는지의 여부를 반환한다.
 * @param exceptChar - 추가 허용할 문자
 * @return 숫자와 한글만으로 구성되어 있는지의 여부
 */
String.prototype.isKorNum = function(exceptChar) {
return (/^[0-9가-힣]+$/).test(this.remove(exceptChar)) ? true : false;
}

/**
 * 문자열이 영문과 한글만으로 구성되어 있는지의 여부를 반환한다.
 * @param exceptChar - 추가 허용할 문자
 * @return 영문과 한글만으로 구성되어 있는지의 여부
 */
String.prototype.isEngKor = function(exceptChar) {
return (/^[a-zA-Z가-힣]+$/).test(this.remove(exceptChar)) ? true : false;
}

/**
 * 이메일 주소의 유효성 여부를 반환한다.
 * @return 유효성 여부
 */
String.prototype.isEmail = function() {
      return (/\w+([-+.]\w+)*@\w+([-.]\w+)*\.[a-zA-Z]{2,4}$/).test(this.trim());
}

/**
 * 전화번호의 유효성 여부를 반환한다.
 * @param dlm - 구분자(default : '-')
 * @return 유효성 여부
 */
String.prototype.isPhone = function(dlm) {
var arg = dlm != null && typeof(dlm) != 'undefined' && dlm.neq('') ? dlm : '-';
return eval("(/(02|0[3-9]{1}[0-9]{1})" + arg + "[1-9]{1}[0-9]{2,3}" + arg + "[0-9]{4}$/).test(this)");
}

/**
 * 휴대폰번호 유효성 여부를 반환한다.
 * @param dlm - 구분자(default : '-')
 * @return 유효성 여부
 */
String.prototype.isMobile = function(dlm) {
var arg = dlm != null && typeof(dlm) != 'undefined' && dlm.neq('') ? dlm : '-';
return eval("(/01[016789]" + arg + "[1-9]{1}[0-9]{2,3}" + arg + "[0-9]{4}$/).test(this)");
}

/**
 * 날짜의 유효성 여부를 반환한다.
 * @return 유효성 여부
 */
String.prototype.isDate = function() {
var result = false;
if(this.length == 8 && this.isNum()) {
var y = Number(this.substring(0, 4));
var m = Number(this.substring(4, 6));
var d = Number(this.substring(6, 8));
var inDate = new Date(y, m-1, d);
result = (Number(inDate.getFullYear()) == y && Number(inDate.getMonth()+1) == m && Number(inDate.getDate()) == d);
}
return result;
}

/**
 * 파일의 확장자를 구하여 반환한다.
 * @return 확장자
 */
String.prototype.ext = function() {
return (this.indexOf(".") < 0) ? "" : this.substring(this.lastIndexOf(".") + 1, this.length);    
}




[첨부파일]

저작자 표시

Tag : javascript, Prototype, string, stringutil, 자바스크립트, 프로토타입

[oracle] 달력 시클..

Posted 2008/11/03 12:31 by K티
그냥 문득 생각나는 김에 예전에 짜놨던 달력 쿼리...


SELECT MAX(DECODE(DOW, 1, DD, NULL)) AS "일"
      ,MAX(DECODE(DOW, 2, DD, NULL)) AS "월"
      ,MAX(DECODE(DOW, 3, DD, NULL)) AS "화"
      ,MAX(DECODE(DOW, 4, DD, NULL)) AS "수"
      ,MAX(DECODE(DOW, 5, DD, NULL)) AS "목"
      ,MAX(DECODE(DOW, 6, DD, NULL)) AS "금"
      ,MAX(DECODE(DOW, 7, DD, NULL)) AS "토"
  FROM (
        SELECT NO AS DD
              ,TO_CHAR(TO_DATE(TO_CHAR(NVL(TO_DATE(:vtoday), SYSDATE), 'YYYYMM')||NO_1), 'D') AS DOW
              ,CEIL((NO + 7 - TO_CHAR(TO_DATE(TO_CHAR(NVL(TO_DATE(:vtoday), SYSDATE), 'YYYYMM')||NO_1), 'D')) / 7) AS WEEK
          FROM COPY_T
         WHERE NO <= TO_CHAR(LAST_DAY(NVL(TO_DATE(:vtoday), SYSDATE)), 'DD')
       )
 GROUP BY WEEK
 ORDER BY WEEK;

Tag : Oracle, SQL, 달력, 오라클

아이팟 터치 2세대..

Posted 2008/11/02 16:26 by K티
예전부터 출시일만 기다리고 있다가.. 10월 7일.. 코엑스 A#에서 판매하기 시작하던 첫날..

So Cool~ 하게 삭스와 함께 업어왔던 아이팟 터치 2세대..

미리 주문했던 인크레더블 보호필름은 우체국에서 꼼작을 안해서.. 퇴근 후 직접 우체국까지 가서 수령해서 붙였었다..ㅋㅋ









Tag : IPod touch, 삭스, 아이팟터치 2세대, 인크레더블