簡體   English   中英

ORA-01704錯誤,插入的字符串超過4000個字符

[英]ORA-01704 error, insert string longer than 4000 chars

我正在使用PHP將數據插入Oracle數據庫。 有一個數據類型為CLOB的表字段,但它最多可插入4000個字符。 我在Google上做了一些搜索,發現PL / SQL可以在CLOB字段中插入4000多個字符。 然后,我計划使用Oracle觸發器解決我的問題。 我的計划是用PLSQL插入替換PHP插入查詢。

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來忽略查詢插入?

要插入較大的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); 
}

oracle中的CLOB支持2GB的字符數據。

其他列(例如varchar2)僅支持4000。

我認為在您的情況下,不是CLOB填充並出現問題,而是您嘗試填充的另一列達到極限。

在上面的插入命令中,您將插入3列,但我認為所有這些都不是CLOB。

希望這會有所幫助,Alex

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM