EMPTY_BLOB() -> EMPTY_CLOB()
OCI_B_BLOB -> OCI_B_CLOB
이것만 바꾸어주면 CLOB도 잘됩니다.
그런데 이리저리 보면 CLOB에서 한글이 안된다는 경우가 있는데 이에 대해서는 정확히 모르겠군요. (레드햇을 쓰는데 /etc/rc.d/init.d/httpd 에 오라클 환경변수를 설정해서 시작하도록 하고 있습니다. 아파치 환경변수와 관련해서 문제가 생길수도 있거든요.) 저도 Redhat 6.2, Oracle 8i(816), PHP4에서 CLOB으로 지금 테스팅 잘되고 있는데요. 참고로 clob 등 대규모 텍스트 문자열도 context 기능, 8i버전에서는 Intermedia (context) 기능 이용하여 색인을 만들면 검색 속도 죽입니다. 이에 대해서는 오라클 테크니컬 블레틴에 잘 나와있습니다. 거기서 context로 검색하면 웬만한건 다 테스팅 가능합니다. 단지 사용자 정의사전을 추가하려면 윈도우나 솔라리스용에서 사전을 추가하거나 수정해서 리눅스로 옮겨야죠. 저도 이 부분 테스팅중.
아래에 blob에서 자료 가져와 clob에 넣는 스크립트 하나 넣어두죠.
php 입니다. 참고로 clob에 텍스트 자료 넣을 경우 ' 를 ''로 바꾸어주어야 입력시 에러가 나지 않습니다. 아래 소스에 주석이 되어 있지요.
(아래는 실행시간이 너무 오래 걸려서 웹에서는 timeout이 나서 쉘상에서 실행시키는 것입니다)
#!/usr/bin/php4 -q
<?
$sec = 0;
set_time_limit($sec);
$lists[start] = time();
// 자료 가져올 db 연결
$con = OCILogon("love","love","taejun_db");
$sql = "SELECT id, title, content FROM mylove WHERE paperdate between '01-JAN-95' AND TO_DATE('31-DEC-01') + .99999";
$que = OCIParse($con,$sql);
$lists[exec] = time();
OCIExecute($que,OCI_DEFAULT);
// 입력할 db 연결
$oci[con2] = OCILogon("demo","demo","taejun_test");
$i=0;
while(OCIFetchInto($que,&$art))
{
// 오라클에서 ' 를 '' 로 바꾸어야 입력시 에러가 나지 않음
$art[1]=ereg_replace("'","''",$art[1]);
$text= $art[2]->load() ;
# 새로운 빈 descriptor LOB/FILE (LOB가 default)를 초기화
$clobid = OCINewDescriptor($oci[con2], OCI_D_LOB);
# :article 이라는 호스트변수선언
# blob filed에는 EMPTY_BLOB()를 지정하여 먼저 비워 놓는다.
$oci[sql] = "INSERT INTO documents VALUES (seq_inc.NEXTVAL, $art[0],'$art[1]',EMPTY_CLOB()) return text into :article";
$oci[que2] = OCIParse($oci[con2],$oci[sql]);
# 선언된 호스트변수와 $lob를 바인딩
OCIBindByName($oci[que2],":article",&$clobid,-1,OCI_B_CLOB);
OCIExecute($oci[que2],OCI_DEFAULT);
# 바인딩 되어진 $lob 변수에 BLOB에 들어갈 내용을 삽입.
$clobid->save($text);
$clobid->free();
OCICommit($oci[con2]);
$i +=1;
}
// 자료입력한 db 연결 해제
OCIFreeStatement($oci[que2]);
OCILogOff($oci[con2]);
// 자료가져온 db 연결 해제
OCIFreeStatement($que);
OCILogoff($con);
$lists[end] = time();
# db parsing time
$exetime = $lists[exec] - $lists[start];
# db query executed time
$retime = $lists[end] - $lists[exec];
# db sql total time
$sqltime = $lists[end] - $lists[start];
echo "$i 건 가져옴.<p>";
echo "<p>
start - parse Time : $exetime 초
exec - end Time : $retime 초
start - end Time : $sqltime 초
";
?>
|