如何克服 CLOB 空间不足 - ORA-06502: PL/SQL: numeric or value error
Posted
技术标签:
【中文标题】如何克服 CLOB 空间不足 - ORA-06502: PL/SQL: numeric or value error【英文标题】:how to overcome CLOB run out of space - ORA-06502: PL/SQL: numeric or value error 【发布时间】:2014-03-27 04:55:13 【问题描述】:我有一个场景,我将字符串附加到一个 clob。我遇到的问题是,一旦 CLOB 达到一定大小,如果我尝试将更多内容附加到 clob,我会得到 ORA-06502: PL/SQL: numeric or value 错误。我认为它的大小已经用完了,但我不知道如何解决这个问题(即指定如何使 clob 更大)。
谁能帮帮我。
这就是我声明我的 CLOB 的方式...
LP_xml_result CLOB;
DBMS_LOB.CREATETEMPORARY(
lob_loc => LP_xml_result
, cache => true
, dur => dbms_lob.call
);
DBMS_LOB.OPEN(
lob_loc => LP_xml_result
, open_mode => DBMS_LOB.LOB_READWRITE
);
然后我像这样插入它......
PROCEDURE lob_append(i_string IN VARCHAR2)
IS
BEGIN
dbms_lob.append(LP_xml_result,LP_LineFeed || i_string);
END lob_append;
谢谢
【问题讨论】:
它会超过 4GB 吗? 从 Oracle 11 开始,LOB 可以最大为(4 GB - 1) * DB_BLOCK_SIZE
,即 8TB 到 128TB。 4GB 是 Oracle 10 之前的限制
我查看了 Oracle 文档,发现了两个可能的问题。当您打开一个 LOB 时,您还必须关闭它。但是,打开/关闭 LOB 不是强制性的 - 无需尝试即可。而不是创建一个临时 LOB 尝试LP_xml_result := EMPTY_CLOB()
【参考方案1】:
当您执行LP_LineFeed || i_string
时,它会隐式转换为VARCHAR2
,因此您有32K 的限制。
这样做:
PROCEDURE lob_append(i_string IN VARCHAR2)
IS
BEGIN
dbms_lob.append(LP_xml_result,LP_LineFeed);
dbms_lob.append(LP_xml_result,i_string);
END lob_append;
关于打印到 HTP 的问题,前段时间我遇到了同样的问题,这是我的解决方案:
chunkSize CONSTANT INTEGER := 5000;
pos NUMBER;
BEGIN
IF LENGTH(CLOB_VAL) > chunkSize THEN
LOOP
Htp.prn(SUBSTR(CLOB_VAL, pos, chunkSize));
pos := pos + chunkSize;
EXIT WHEN pos > LENGTH(CLOB_VAL);
END LOOP;
ELSE
Htp.prn(CLOB_VAL);
END IF;
【讨论】:
你的临时 CLOB 的范围是CALL
,你有没有尝试其他方法,例如SESSION
?
感谢您的帮助。我实际上发现它与我使用 htp.print 打印 clob 有关。显然,如果 clob 超过一定长度,您就不能一次写出它的全部内容。我从这个网站得到了线索...ddoracle.blogspot.com.au/2006/11/print-clob-to-web.html。这解决了我的问题以上是关于如何克服 CLOB 空间不足 - ORA-06502: PL/SQL: numeric or value error的主要内容,如果未能解决你的问题,请参考以下文章
oracle中LOBSEGMENT类型存储的clob的内容过大,如何清除clob字段内容。释放表空间!
在顺序栈中,如果存放元素的数组空间不足,如何增加内存空间,可以直接修改数组大小么
ORA-06550、PLS-00103、ORA-06512 函数