ORA-01704 错误,插入长度超过 4000 个字符的字符串

Posted

技术标签:

【中文标题】ORA-01704 错误,插入长度超过 4000 个字符的字符串【英文标题】:ORA-01704 error, insert string longer than 4000 chars 【发布时间】:2011-09-06 02:43:35 【问题描述】:

我正在使用 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的查询插入?

【问题讨论】:

触发器不是解决方案...请出示您的php源代码并插入... 【参考方案1】:

要插入一个大的 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); 

【讨论】:

【参考方案2】:

oracle 中的CLOB 支持2GB 的字符数据。

其他列,例如 varchar2 ,仅支持 4000。

我认为在您的情况下,不是 CLOB 被填充并出现问题,而是您尝试填充的另一列达到了限制。

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

希望这会有所帮助, 亚历克斯

【讨论】:

以上是关于ORA-01704 错误,插入长度超过 4000 个字符的字符串的主要内容,如果未能解决你的问题,请参考以下文章

ora 01704 字符串文字太长

ORA-01704: 字符串文字太长,插入语句SQL中,报这样的错误?怎么解决?

JAVA中操作CLOB大对象 ,提示ORA-01704字符串文字太长

oracle 导出超长Clob字段insert语句执行报字段过长的问题解决方案

今天犯了个常识错误

CLOB 列和 SQL 插入文件