Declare
  l_Clob Clob;
  L1     Varchar2(32767);
Begin
  For i In 1 .. 20000 Loop
    l_Clob := l_Clob || '哈哈';
  End Loop;
  Dbms_Output.Put_Line(Dbms_Lob.Getlength(l_Clob));
  L1 := Dbms_Lob.Substr(l_Clob, 9000, 1);
  Dbms_Output.Put_Line(Lengthb(L1));
End;这样我得到的L1是24573,我用的UTF8,一个汉字3个字节。肯定是赋了8191个,这个是什么问题?请兄弟们帮看下,另我的数据库是默认配置,db_cache_size为0,db_block_size = 8192,谢谢

解决方案 »

  1.   

    Dbms_Output.Put_Line(Lengthb(L1));为24573
     
      

  2.   

    运行太久了,我得到的结果是
    40000
    18000
    和预想的一样我的字符集编码select   lengthb('汉')   from   dual;得到的是一个汉字2个字节
      

  3.   

    我的数据库创建时是默认配置,任何地方没修改。我用其他数据库就能截大于8191的字符,而我的这是这个样呵,我运行需要4秒而varchar2 变量所能接受的是32766的赋值,UTF8的话应该是每次只能截10800个汉字左右
      

  4.   

    UTF8貌似就是有此问题,我看asktom上也有人问这问题
    你google dbms_lob.substr 8191就出来了
      

  5.   

    http://forums.oracle.com/forums/thread.jspa?threadID=644735
    倒,怎么我的9I确没有这个BUG?
    呵呵,,和版本关系很大啊,看来....我的就的慢很多,要121秒
      

  6.   

    这晕阿我装的是10.2.0.1.0 这个版本,这个bug如何修复?
      

  7.   

    我把NLS_CHARACTERSET 和NLS_NCHAR_CHARACTERSET 从AL32UTF8 和AL16UTF16全修改为UTF8
    Dbms_Output.Put_Line(Lengthb(l_Var)); 得到30000,正常了Declare
      l_Clob Clob;
      l_Var  Varchar2(32767);
    Begin
      For i In 1 .. 20000 Loop
        l_Clob := l_Clob || '哈哈';
      End Loop;
      l_Var := Dbms_Lob.Substr(l_Clob, 10000, 1);
      Dbms_Output.Put_Line(Lengthb(l_Var));
      Dbms_Output.Put_Line(Dbms_Lob.Getlength(l_Clob));
    End;