SQL> declare
  2    clob_size pls_integer;
  3    the_clob  clob;
  4    max_size  pls_integer:=400;
  5    amount_to_read pls_integer;
  6    offset pls_integer:=1;
  7    vbuf  varchar2(400):=null;
  8  begin
  9    select document into the_clob from doc
 10    where doc_id=1;
 11    dbms_lob.open(the_clob,dbms_lob.lob_readonly);
 12    clob_size:=dbms_lob.getlength(the_clob);
 13    amount_to_read:=least(max_size,clob_size);
 14    dbms_lob.read(the_clob,amount_to_read,offset,vbuf);
 15    dbms_lob.close(the_clob);
 16    dbms_output.put_line(replace(vbuf,chr(10),'-'));
 17  end;
 18  /
declare
*
第 1 行出现错误:
ORA-06502: PL/SQL: 数字或值错误 :  字符串缓冲区太小
ORA-06512: 在 "SYS.DBMS_LOB", line 759
ORA-06512: 在 line 14
若再次运行,还会出现以下错误请高手指教,该怎么改?SQL> /
declare
*
第 1 行出现错误:
ORA-22293: LOB 已在同一个事务处理中打开
ORA-06512: 在 "SYS.DBMS_LOB", line 710
ORA-06512: 在 line 11
请高手指教,该怎么改?

解决方案 »

  1.   

    vbuf  varchar2(400):=null; 
    这个缓冲区定义的太小了,你一次性读取太多了如果这个缓冲区就定义400大小,那么你读一次大小就不能超过400,然后不停的循环读取dbms_lob.read(the_clob,400,offset,vbuf); 
      

  2.   

     amount_to_read:=least(max_size,clob_size); max_size  pls_integer:=400;
    不是已经决定了小于400了吗?
    究竟该怎么改啊?
      

  3.   

    把 vbuf  varchar2(400):=null; 
    改成 vvbuf  varchar2(400):= ''试试
      

  4.   

    把它改成4000可以了,大于文件的字节数。
    但输出的怎么是乱码?我文件是sql语句
      

  5.   

    dbms_output.put_line(replace(vbuf,chr(10),'-')); 乱码可能是这里有问题,window文件系统中,除了有 chr(10)外,还有chr(13) (回车换行),所以要一起替换掉
      

  6.   


    max改成多少了,也是4000么,