2011-09-06 1 views
1

PHP를 사용하여 Oracle 데이터베이스에 데이터를 삽입하고 있습니다. CLOB 데이터 유형이있는 테이블 필드가 있지만 최대 4000 자까지 삽입 할 수 있습니다. Google에서 약간의 검색을 수행했으며 PL/SQL이 CLOB 필드에 4000 자 이상을 삽입 할 수 있음을 확인했습니다. 그런 다음 Oracle Trigger를 사용하여 문제를 해결할 계획입니다. PHP INSERT 쿼리를 PLSQL 삽입으로 대체합니다.ORA-01704 오류, 4000 자 이상의 문자열 삽입

create or replace 
TRIGGER EXTEND_CLOB 
BEFORE INSERT ON T_SESSIONS 
for each row 
BEGIN 
    insert into t_sessions (id,data,expires) values (:new.id, :new.data, :new.expires); 
END; 

이 트리거는 작동하지만 2 개의 레코드를 삽입합니다 (PHP를 한 번 트리거). PHP에 의해 쿼리 삽입을 무시할 수 있습니까?

+7

트리거는 해결책이 아니다 ... 당신의 PHP 소스 코드를 표시하고 삽입하십시오 ... – Yahia

답변

0

큰 clob을 삽입하려면 일반적으로 두 단계를 수행해야합니다.

테이블에 빈 clob을 삽입하고 코드에 clob 설명자를 반환 한 다음 해당 설명자에 기록하는 삽입 기능이 있습니다.

나는 PHP 코더가 아니지만 다른 언어로이 패턴을 사용했다.

몇 가지 검색을했는데 필요한 코드는 대략 아래와 같습니다 (PHP 환경 설정이 없으므로 테스트하지 않았습니다).

$conn = OCILogon('myusername', 'mypassword', 'mydatabase'); 


// Assumes a file has been uploaded you want to insert into a CLOB column 

$lob = OCINewDescriptor($conn, OCI_D_LOB); 
$stmt = OCIParse($conn, 'INSERT INTO MYCLOBTAB (C1, C2) VALUES('.$myid . ', EMPTY_CLOB()) RETURNING C2 INTO :C2'); 
OCIBindByName($stmt, ':C2', &$lob, -1, OCI_B_CLOB); 
OCIExecute($stmt, OCI_DEFAULT); 

// The function $lob->savefile(...) reads from the uploaded file. 
// If the data was already in a PHP variable $myv, the 
// $lob->save($myv) function could be used instead. 
if ($lob->savefile($_FILES['lob_upload']['tmp_name'])) { 
    OCICommit($conn); 
} 
0

oracle의 CLOB는 2GB의 문자 데이터를 지원합니다.

다른 열은, 예를 들어 VARCHAR2를 들어, 해당이 한계에 도달 나는 당신의 경우, 작성하고 채울하려고하는 문제가, 그 다른 열이 도착은하지 CLOB 생각

4000을 지원합니다 .

위의 삽입 기호에서 3 열에 삽입하고 있으며, 모두 CLOB라고 생각하지 않습니다. 이 도움이

희망, 알렉스

관련 문제