要求将clob对象复制到另一个clob对象。由于源clob对象很大,我最初得到一个"数字或值错误"。因此,我决定在while循环中执行复制函数,在一次循环中将复制的数量打破为2000,如下所示
temp := 0;
WHILE temp < 10000 LOOP
DBMS_LOB.COPY(DEST_DOC, SRC_DOC, 2000, length(DEST_DOC) + 1, temp + 1);
temp := temp + 2000;
END LOOP;
仅用于示例目的。理想情况下,它应该是SRC_DOC的大小。但这会抛出同样的错误。尽管没有循环的语句远远超过10000(或任何数字)
DBMS_LOB.COPY(DEST_DOC, SRC_DOC, 2000, length(DEST_DOC) + 1, 10000 + 1)
不会抛出任何错误,并按预期工作。我被困在这上面好几天了。如果有人能提供一个解决方案,我将不胜感激。SRC_DOC的总大小为7,80,876.
您可能在复制操作中使用了错误的lob定位符。按照以下几行(当然,sql语句可能是多余的,这取决于您的上下文代码):
declare
l_dest_doc CLOB;
l_src_doc CLOB;
begin
select <whatever> into l_src_doc from <wherever>;
dbms_lob.createtemporary(l_dest_doc, false);
dbms_lob.append(l_dest_doc, l_src_doc);
insert into <trgtable> ( ..., <trgcolumn>, ...) values ( ..., l_dest_doc, ...);
end;
我不认为你得到错误,因为原始对象的大小。一般来说,如果没有文档中提到的限制,我们应该假设可以使用任何合理的大小。
例如,下面这行对于1M大小的对象很有效:
dbms_lob.copy(dest_doc, src_doc, length(src_doc));
我的建议是DEST_DOC
的LOB定位器可能还没有初始化。复制前运行dbms_lob.createtemporary(dest_doc,true);
能解决问题吗?
还请提供错误的ORA编号及其全文。
更新:
请提供导致错误的可运行代码。下面的代码在10.2
上为我工作declare
SRC_DOC clob := rpad('*',20000,'*');
DEST_DOC clob := rpad('-',10,'-');
temp number;
begin
dbms_output.put_line('src_doc:'||length(src_doc)||'; dest_doc:'||length(dest_doc));
temp := 0;
WHILE temp < 10000 LOOP
DBMS_LOB.COPY(DEST_DOC, SRC_DOC, 2000, length(DEST_DOC) + 1, temp + 1);
temp := temp + 2000;
END LOOP;
dbms_output.put_line('src_doc:'||length(src_doc)||'; dest_doc:'||length(dest_doc));
end;
结果是
src_doc:20000; dest_doc:10
src_doc:20000; dest_doc:10010
但是,如果我将DEST_DOC
声明更新为简单的DEST_DOC clob;
,我会得到以下错误:
ORA-06502: PL/SQL: numeric or value error: invalid LOB locator specified: ORA-22275