PL/SQL:只有在while循环中执行DBMS_LOB.copy()时才会出现数字或值错误



要求将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

最新更新