2011-09-06 89 views
1

我正在使用PHP将数据插入Oracle数据库。有一个数据类型为CLOB的表字段,但它允许插入多达4000个字符。我在Google上搜索了一下,发现PL/SQL可以向CLOB字段插入超过4000个字符。然后我打算使用Oracle触发器来解决我的问题。我的计划是用PLSQL插入替换PHP插入查询。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,只支持4000

我觉得你的情况,它不是被填补,有一个问题,它的另一列是您要填充CLOB到达极限。

在上面的插入命令中插入3列,我不认为所有的都是CLOB。

希望这有助于 亚历

相关问题