2008년 6월 27일 금요일

정규표현식

1. 반복 메타 문자

* : 0회이상 반복
+ : 1회이상 반복
? : 0회 혹은 1회
{m} : m회 반복
{m,n} : m회 부터 n회까지 반복

2. 매칭 메타문자

. : 줄바꿈 문자를 제외한 모든 문자와 매치
^ : 문자열의 시작과 매치, [] 메타 기호안에서는 반대의 문자열
$ : 문자열의 마지막과 매치, [] 메타 기호안에서는 순수한 $문자로 매치
[] : 문자 집합, - 는 범위
| : or
() : 그룹으로 묶음

3. 이스케이프 기호

\\ : 역슬래쉬 문자
\d : 모든 숫자와 매치 [0-9]
\D : 숫자가 아닌 문자와 매치 [^0-9]
\s : 화이트 스페이스 문자와 매치 [\t\n\r\f\v]
\S : 화이트 스페이스 문자가 아닌 것과 매치 [^\t\n\r\f\v]
\w : 숫자 또는 문자와 매치 [a-zA-Z0-9]
\W : 숫자 또는 문자가 아닌것과 매치 [^a-zA-Z0-9]
\b : 단어의 경계를 표시, 영문자 혹은 숫자의 연속 문자열로 가정
\B : \b의 반대로 단어의 경계가 아님을 표시

4. 최소 매칭을 위한 정규식

*? : *와 같으나 문자열을 최소로 매치
+? : +와 같으나 문자열을 최소로 매치
?? : ?와 같으나 문자열을 최소로 매치
{m,n}? : {m,n}과 같으나 문자열을 최소로 매치

열혈강의 파이썬 정규식에서 발췌.

oracle query tip

oralce desc script

select a.COLUMN_NAME, '\t'), nvl(decode(A.NULLABLE,'N', 'NO', 'YES'), a.DATA_TYPE||'('||DECODE(a.DATA_TYPE,'NUMBER',a.DATA_PRECISION, a.DATA_LENGTH)||')', b.COMMENTS,
from   USER_TAB_COLUMNS a, USER_COL_COMMENTS b
where  a.TABLE_NAME = 'TEST'
and a.TABLE_NAME = b.TABLE_NAME
and    a.COLUMN_NAME = b.COLUMN_NAME
ORDER BY a.TABLE_NAME, COLUMN_ID

oracle table script

SELECT  DBMS_METADATA.GET_DDL('TABLE',TABLE_NAME,OWNER)
DBMS_METADATA.GET_DEPENDENT_DDL('INDEX',TABLE_NAME,OWNER),
DBMS_METADATA.GET_DEPENDENT_DDL('COMMENT',TABLE_NAME,OWNER)
FROM DBA_TABLES
WHERE OWNER = 'OWNER'
AND TABLE_NAME = 'TEST'

perl로 스트립트를 만드는데 table script는 lob관련 에러가 났다.
oracle connect 후에 추가한다.

$dbh->{LongReadLen} = 512 * 1024;
$dbh->{LongTruncOk} = 1;

그리고 Wide character in print 관련 warnning은
binmode STDOUT, ':utf8';
를 추가하면된다.

2008년 2월 25일 월요일

ubuntu8.04 oracle 10g

ubuntu 8.04 server에 oracle 10g를 설치하는 자료이다.

모든 작업은 admin권한으로 작업한다.

기본 필요한 패키지 설치
# apt-get install gcc binutils libaio1 lesstif2 lesstif2-dev make rpm libc6 libstdc++5 build-essential

원격 설치 관련

# apt-get install xlibs xbase-clients xterm

Redhat system 처럼 보이게 하는 작업

# ln -s /usr/bin/awk /bin/awk
# ln -s /usr/bin/rpm /bin/rpm
# ln -s /usr/bin/basename /bin/basename
# ln -s /etc /etc/rc.d  
# ln -s /lib/libgcc_s.so.1 /lib/libgcc_s.so 
# for i in 0 1 2 3 4 5 6 S ; do ln -s /etc/rc$i.d /etc/rc.d/rc$i.d ; done

oracle 계정 생성
# groupadd oinstall
# groupadd dba
# groupadd nobody
# useradd -g oinstall -G dba -p passwd -d /u01/oracle oracle
# useradd -g nobody nobody

create directory and set permissions
# mkdir -p /u01/oracle
# mkdir -p /u02/oradata
# chown -R oracle:oinstall /u01 /u02
kernel parameter /etc/sysctl.conf에 추가
# fs.file-max = 65535
# kernel.shmall = 2097152
# kernel.shmmax = 2147483648
# kernel.shmmni = 4096
# kernel.sem = 250 32000 100 128
# net.ipv4.ip_local_port_range = 1024 65535
# net.core.rmem_default = 1048576
# net.core.rmem_max = 1048576
# net.core.wmem_default = 262144
# net.core.wmem_max = 262144
/etc/security/limits.conf 추가
* soft nproc 2047
* hard nproc 16384
* soft nofile 1024
* hard nofile 65536
/etc/pam.d/login, /etc/pam.d/su 추가
session required /lib/security/pam_limits.so
변경 사항 적용
# sysctl -p
/etc/profile 추가
export ORACLE_BASE=/u01/oracle
export ORACLE_HOME=$ORACLE_BASE/product/10gr2
export ORACLE_SID=SID
export PATH=$PATH:$ORACLE_HOME/bin
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
export SHLIB_PATH=$ORACLE_HOME/lib:$ORACLE_HOME/jlib:/usr/lib
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib:$ORACLE_HOME/jdbc/lib
export CLASSPATH=$ORACLE_HOME/lib/classgen.jar:$ORACLE_HOME/jdbc/lib:
oracle 계정으로 실행
$ ./runInstaller -ignoreSysPrereqs
위와 같이 했을때 아무 문제없이 설치되었다. :)

2008년 2월 1일 금요일

oracle perl

cpan에서 oracle 관련된 module source를 다운로드 받는다.

# perl -MCPAN -e shell

~~~ 처음 접속하니깐 어쩌구 저쩌구 많이 나온다.

cpan> get DBD::Oracle
cpan> quit

DBD::Oracle 관련된 소스가 ~/.cpan/build/DBD-Oracle-1.20/ 밑에 주르륵 생겼다.

perl Makefile.PL
make; make install

ex)

#!/usr/bin/perl

use strict;
use warnings;
use DBI;

my $dbh = DBI->connect("dbi:Oracle:host=host;sid=sid_value", $userid, $passwd);

my $sth = $dbh->prepare("SELECT * FROM tab") or die "Impossible de preparer la requette: " . $dbh->errstr;

$sth->execute() or die "Impossible d'exécuter la requette: " . $sth->errstr;

while ( my @data = $sth->fetchrow_array()) {
  print "$data[0]\t$data[1]\n";
}

if ($sth->rows == 0) {
  print "Table vide\n";
}

$sth->finish;
$dbh->disconnect;

정상적으로 table 정보를 출력하면 된다.

2008년 1월 10일 목요일

oracle nls_lang

케릭터셋 오류발생

증상 :

터미널이나 기타 툴을 이용해서 로그인을 하면 로그인은 되지만 한글관련해서는 깨져서 나옴.

select * from v$nls_parameters;

기존 오라클 서버의 NLS_CHARACTERSET이 WE8MSWIN1252로 설정되어 있었다.

우선

select convert('a', 'WE8MSWIN1252', 'AL32UTF8') from dual; 

로 변경 가능한 character set인지 확인한다.

이상없으면 DBA 권한으로

update sys.props$ set value$ = 'AL32UTF8' where name = 'NLS_CHARACTERSET'

쿼리를 실행시킨다. 이때 잘못된 값을 넣게 되면 oracle 자체가 구동이 안될 수 도 있기 때문에 commit 전에 select로 꼭 확인을 해야한다.

update props$ set value$='AL32UTF8' where name='NLS_NCHAR_CHARACTERSET';

확인.

select * from sys.props$ where name='NLS_NCHAR_CHARACTERSET';

오라클 재 가동후에 이런 증상이 나왔다.

SQLPLUS 로 로그인하면 정상적으로 로그인되는데 sqldeveloper에서 로그인하려면

ORA-06552: PS/SQL: Compilation unit analysis terminated
ORA-06553: PLS-553: character set name is not recognized

위의 에러가발생하면서 로그인은 정상적으로 된다.


이때 작업 할 내용은 다음 쿼리를 실행 DBA 로 실행한다.

SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER SYSTEM ENABLE RESTRICTED SESSION;
ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
ALTER SYSTEM SET AQ_TM_PROCESSES=0;
ALTER DATABASE OPEN;
COL VALUE NEW_VALUE CHARSET
SELECT VALUE FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER='NLS_CHARACTERSET';
COL VALUE NEW_VALUE NCHARSET
SELECT VALUE FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER='NLS_NCHAR_CHARACTERSET';
ALTER DATABASE CHARACTER SET INTERNAL_USE &CHARSET;
ALTER DATABASE NATIONAL CHARACTER SET INTERNAL_USE &NCHARSET;
SHUTDOWN IMMEDIATE;
STARTUP;
SHUTDOWN IMMEDIATE;
STARTUP;

sqldevelopment 재 시작 한 후에는 오라클 에러나 한글이 깨지지 않고 정상적으로 사용 가능하다.

참조 url : http://database.sarange.net/