我正在使用PHP将数据插入Oracle数据库。有一个数据类型为CLOB的表字段,但它允许插入最多4000个字符。我在Google上进行了一些搜索,发现PL / SQL可以向CLOB字段插入超过4000个字符。然后我计划使用Oracle Trigger来解决我的问题。我的计划是用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的查询插入?
答案 0 :(得分: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);
}
答案 1 :(得分:0)
oracle中的CLOB支持2GB的字符数据。
其他列(例如varchar2)仅支持4000。
我认为在你的情况下,它不是被填充并且有问题的CLOB,它正在尝试填充的另一个列达到限制。
在上面的插入命令中,您插入了3列,我认为并不是所有都是CLOB。
希望这有帮助, 亚历