| |
----------------------------------------------------------------------
---------- -----
table 모양
----------------------------------------------------------------------
---- -----------
create table b(
a long row
);
--------------------------------------------------------------- -----------------------
insert 부분
----------------------------------------------------------------------
---- ------------
//DB Connetion 부분은 설명 생략
private DBConnectionManager connMgr;
Connection con ;
connMgr = DBConnectionManager.getInstance();
try{
String szCode = "한글이 들어 있는 2000byte 이상의 string";
Reader abc = new StringReader(szCode);
PreparedStatement ps = con.prepareStatement("insert into b (a) values (?)");
//binary형태로 DB에 insert
ps.setCharacterStream(1, abc, szCode.length());
ps.executeUpdate()
ps.close
}
catch( SQLException e )
{
out.println("다음 이유로 입력이 취소 되었습니다.\n"+e.toString());
}
connMgr.freeConnection("oracle",con);
----------------------------------------------------------------------
------- -----------
fetch 부분
----------------------------------------------------------------------
---- --------------
import javax.servlet.*;
import javax.servlet.http.*;
import java.lang.*;
import neo.db.*;
import java.sql.*;
import java.util.*;
import java.io.*;
public class test extends HttpServlet
{
Connection con ;
private DBConnectionManager connMgr;
public void init(ServletConfig conf) throws ServletException {
super.init(conf);
}
public void doGet ( HttpServletRequest req , HttpServletResponse res) throws IOException
{
connMgr = DBConnectionManager.getInstance();
res.setContentType("text/html; charset=ksc5601");
PrintWriter out = res.getWriter();
con = connMgr.getConnection("oracle");
Statement stmt = null;
ResultSet rs = null;
try{
stmt = con.createStatement();
rs = stmt.executeQuery("select a from b ");
rs.next();
// byte 형태로 DB의 data를 받아 String으로 변환
String x= new String(rs.getBytes(1),0);
//string을 한글로 코딩
out.println(han(x.toString()));
stmt.close();
rs.close();
}catch ( SQLException e )
{
out.println(e);
}
connMgr.freeConnection("oracle",con);
}
public String han(String Unicodestr) throws UnsupportedEncodingException
{
if( Unicodestr == null)
return null;
return new String(Unicodestr.getBytes("8859_1"),"KSC5601");
}
}
8.0 버전에서는 context option을
8i 버전에서는 InterMedia Text 옵션을 설정을 해주어야 합니다.
이 자료는 context option설치 후 사용을 위해 필요한 사항과, 실제 사용방법에 대한 기본적인 사항들을 기술하였다. 그리고 별첨에는 각 version별 초기화 방법을 정리하였다.
1. parameter 설정
(1) $ORACLE_HOME/dbs directory내의 init.ora file내에
TEXT_ENABLE = TRUE로 지정되어야 한다.
이때, 는 환경변수에 지정된 ORACLE_SID에 해당하는
값으로, ORA7인 경우가 많다.
(2) open_cursors를 약 2000정도로 크게 지정한다.
2. one step query와 two step query사용방법
~ (5)은 one step query와 two step query모두 동일하다.
(1) ctxsrv -user ctxsys/ctxsys -log ctx.log &
이 context server process는 하나만 실행시키기 보다는 context option을 사용하게 되는 user수만큼 띄우는 것이 performance에 좋다.
또는 ctxctl을 수행시킨 후 start n (여기에서 n은 context server의 갯수)으로 실행하여도 된다.
(2) context option을 사용할 사용자에게 다음과 같은 role에 대한 권한을 부여한다.
sqlplus ctxsys/ctxsys
sql> grant ctxapp to username;
3) pl/sql에서 때때로 role을 통해 부여받은 권한을 인식하지 못하는 경우가 있으므로 다음과 같이 명시적으로 권한을 부여한다.
sqlplus ctxsys/ctxsys
sql> grant execute on ctx_query to username;
sql> grant execute on ctx_ddl to username;
(4) sqlplus username/password
sql> exec ctx_ddl.create_policy('policy_name', 'table_name.column_name',
lexer_pref=>'CTXSYS.KOREAN');
* 이때 policy_name은 임의의 이름을 지정하면 된다.
** primary key가 두개 이상의 column으로 구성되어 있다면,
textkey=>’pk1,...,pkn’으로 지정한다.
즉 pk1, pk2 column으로 primary key가 구성되었다면
exec ctx_ddl.create_policy('policy_name', 'table_name.column_name', textkey=>‘pk1,pk2’, lexer_pref=>'CTXSYS.KOREAN');
*** composite textkey인 경우 table의 primary key를 구성하는 column이 16개까지만 가능하다.
(5) exec ctx_ddl.create_index('policy_name');
여기에서 policy_name은 create_plicy에서 생성한 policy_name을 지정한다.
(6)-1 1 step query방법(stored procedure내에 사용하는 것은 불가능)
다음과 같이 where절에 contains라는 새로운 연산자를 이용하여 query한다.
예를 들어,
select * from table_name
where contains(column_name, '찾고자_하는_형태소') > 0;
(6)-2 2 step query방법
a. 먼저 다음과 같은 result table을 만든다.
create table ctx_result
(textkey varchar2(64),
textkey2 varchar2(64),
...
textkeyn varchar2(64),
score number,
conid number);
* 이때, primary key를 구성하는 column의 갯수만큼 textkey가 필요하므로 primary key가 하나의 column으로 구성되어 있다면 위의 ctx_result table의 구성 중 textkey2 ~ textkeyn은 빼고 textkey, score, conid, 3개의 column으로 result table을 만들면 된다.
** primary key column의 data type이 varchar2가 아니고 number라 하더라도 textkey는 무조건 varchar2(64)로 잡도록 한다.
*** conid는 하나의 result table을 여러 query가 공유하는 경우, query를 구별하여 주기 위한 것이다.
b. 위에서 만든 result table을 이용하여 다음과 같이 두 단계의 query를 수행한다.
exec ctx_query.contains('policy_name', '찾고자_하는_형태소', 'ctx_result');
select score, primary_key, column_name
from table_name, result_name
where table_name.pk = ctx_result.textkey
and table_name.pk2 = ctx_result.textkey2
...
and table_name.pkn = ctx_result.textkeyn
order by score desc;
위의 query는 primary key를 구성하는 column이 라고 가정할 경우의 query문이며, primary key가 하나의 column으로 이루어졌다면
and table_name.pk2 = ctx_result.textkey2
...
and table_name.pkn = ctx_result.textkeyn
부분은 불필요하다.
별첨------------------------------------------------------------------
------ -
ConText 초기화 방법
context option사용 중 기존 사용중인 policy, index등을 모두 없애고 새로 초기화해야하는 필요가 생길 수 있다. 버젼별로 초기화 방법은 조금씩 다르며 다음과 같다.
1. ConText 2.0.4, 2.0.6 의 초기화(Oracle 7.3.3, 8.0.3)
$(SQLPLUS) ctxsys/ctxsys @dr0drp
$(SQLPLUS) sys/$(SYSPW) @drdpsyst
$(SQLPLUS) sys/$(SYSPW) @drcrsyst CTXSYS CTXSYS
(CTX_TABLESPACE) (CTX_TEMP_TABLESPACE)
$(SQLPLUS) CTXSYS/CTXSYS @dr0inst.sql
$(SQLPLUS) sys/$(SYSPW) @drsys.sql
2. ConText 2.3.4 의 초기화(Oralce 7.3.4, 8.0.4)
$(SQLPLUS) ctxsys/ctxsys @dr0drop
$(SQLPLUS) sys/$(SYSPW) @drdpsyst
$(SQLPLUS) sys/$(SYSPW) @drcrsyst CTXSYS CTXSYS
(CTX_TABLESPACE)
$(CTX_TEMP_TABLESPACE)
$(SQLPLUS) CTXSYS/CTXSYS @dr0inst.sql
$(SQLPLUS) CTXSYS/CTXSYS @drgus.sql
3. ConText 2.4.5 의 초기화(Oracle 8.1)
$(SQLPLUS) ctxsys/ctxsys @dr0drop
$(SQLPLUS) sys/$(SYSPW) @drdpsyst
$(SQLPLUS) sys/$(SYSPW) @drcrsyst CTXSYS CTXSYS
(CTX_TABLESPACE)
$(CTX_TEMP_TABLESPACE)
$(SQLPLUS) CTXSYS/CTXSYS @dr0inst.sql
$(SQLPLUS) CTXSYS/CTXSYS @drgus.sql
$(SQLPLUS) CTXSYS/CTXSYS @drlngset.sql .
Oracle8i InterMedia Text 초기화 방법
====================================
InterMedia Text는 Oracle8i의 Universal Installer에 의해 자동으로
설치되기는 하지만 여러 가지 이유로 Manual하게 다시 설치할 수 있다.
Installer에 의해 자동으로 설치된 경우에, InterMedia Text를 관리하는
유저인 ctxsys user는 default로 system tablespace로 생성되는 데,
manual한 설치 과정을 통해서 다른 tablespace를 설정할 수 있다.
InterMedia Text는 Oracle8i의 External Procedure기능을 이용하여
데이터베이스 커널과 접목되었다. 그래서 InterMedia Text를 잘 실행하기
위해서는 Net8 configuration을 설정해야 한다.
* InterMedia Text 초기화 방법
1. 기존의 ctxsys user를 drop한다.
$ cd $ORACLE_HOME/ctx/admin
$ sqlplus ctxsys/ctxsys @dr0drop.sql
$ sqlplus sys/sys_password @dr0dsys.sql
2. 새로 ctxsys user를 생성한다.
Oracle8i 이전에는 관리자 유저를 ctxsys 외에 유저가 원하는 이름으로
생성이 가능했지만, Oracle8i부터는 ctxsys user로만 가능하다.
이 script 뒤에 오는 첫번째 입력 값은 ctxsys user의 password이고,
두번째는 ctxsys user의 default tablespace, 세번째는 temporary
tablespace이다. ctxsys user의 default tablespace의 크기는 원활한
수행을 위해 약 30M이상을 권장한다.
$ sqlplus sys/sys_password @dr0csys.sql ctxsys context temp
3. Default object 생성
$ sqlplus ctxsys/ctxsys @dr0inst.sql
/home/app/oracle/product/8.1.5/ctx/lib/libctxx8.so
-------------------------------------------------
위와 같이 $ORACLE_HOME/ctx/lib/libctxx8.so에 해당하는 절대 path를
지정해야 한다.
* on HP
HP의 경우 libctxx8.so 가 아니고 libctxx8.sl 로 지정해야 한다.
* on NT
sqlplus 를 ctxsys user로 접속한 후 다음과 같이 실행한다.
@dr0inst.sql Driver:oracle_home\bin\oractxx8.dll
(oractxx8.dll file이름은 절대 path로 입력한다.)
$ sqlplus ctxsys/ctxsys @defaults/drdefko.sql
drdefko.sql file은 default로 한글 lexer를 생성하기 위해서 실행한다.
* Net*8 설정방법
InterMedia Text를 사용하기 위해서는 Net8이 설정되어 있어야 하며,
이를 위해서 listener.ora와 tnsnames.ora file의 내용을 수정해야 한다.
1. IPC listener address설정
listener.ora file에 External procedure를 위한 listener를 설정한다.
- 설정 안된 경우
LISTENER =
(ADDRESS_LIST =
(ADDRESS =
(PROTOCOL=tcp)(HOST=Krhp1)(PORT=1521)
)
)
- 설정 한 경우
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL=IPC)(KEY=EXTPROC0))
)
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL=tcp)(HOST=Krhp1)(PORT=1521))
)
)
)
EXTPROC0의 마지막 값은 zero이며 이는 default값이다. 만일 서버에
여러 개의 database가 설치되어 있다면 ipc의 key값을 다르게 주어야 한다.
2. SID(System Identifier)설정
External procedure의 사용을 위한 SID설정을 위해 listener.ora file의
SID_LIST_LISTENER을 수정한다.
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC
....
....
(SID_DESC =
(SID_NAME=PLSExtProc)
(ORACLE_HOME=/hom1/app/oracle/product/8.1.5)
(PROGRAM=extproc)
)
)
3. Service Name Description설정
tnsnames.ora file에 service name을 다음과 같이 추가한다.
extproc_connection_data =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL=IPC)(KEY=EXTPROC0))
)
(CONNECT_DATA =
(SID=PLSExtProc)
(PRESENTATION =RO)
)
)
4. Listener 설정의 확인
$ lsnrctl serv
LSNRCTL for Solaris: Version 8.1.5.0.0 - Production on 04-OCT-99
16:35:24
(c) Copyright 1998 Oracle Corporation. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC0)))
Services Summary...
PLSExtProc has 1 service handler(s)
DEDICATED SERVER established:0 refused:0
LOCAL SERVER
ORA815 has 1 service handler(s)
DEDICATED SERVER established:0 refused:0
LOCAL SERVER
The command completed successfully
* 사용방법
1. InterMedia Text 사용자 생성
$ sqlplus system/manager
SQL> create user ctxdemo identified by ctxdemo
default tablespace users
temporary tablespace temp;
SQL> grant connect, resouce, ctxapp to ctxdemo;
2. InterMedia Text의 인덱스 생성과 사용
SQL> create table documents
( docu_id number primary key, text varchar2(1000) );
SQL> insert into documents values(1,'DB마케팅 고객만족 이끈다');
SQL> insert into documents values(2,'리눅스시장 판도변화 조짐');
SQL> commit;
SQL> create index docu_text on documents(text)
indextype is ctxsys.context;
-> index생성시에 ORA-28575 ERROR가 발생하면 Net8 설정의 문제이다.
SQL> select * from documents where contains(text,'변화') > 0;
DOCU_ID TEXT
--------- -----------------------------------
2 리눅스시장 판도변화 조짐
SQL> select * from documents where contains(text,'DB') > 0
DOCU_ID TEXT
--------- -----------------------------------
1 DB마케팅 고객만족 이끈다
한국 Oracle에서 받은 자료입니다.
|