天天看點

oracle截取位元組數,如何擷取CLOB的位元組數?

還是沒有找得可以直接判斷CLOB的位元組數的函數,

不過如下的方法也許可以對你有用

[php]

SQL> select id, cc from clob_test;

ID CC

---------- --------------------------------------------------------------------------------

1 1你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你?

2 2我我我我我我我我我我我我我我我我我我我我我我我我我我我我我我我我我我我我我我我?

3 3他他他他他他他他他他他他他他他他他他他他他他他他他他他他他他他他他他他他他他他?

3 rows selected

--clob_test中的三條記錄中, 1有1000個"你"字, 2有2000個"我"字, 3有3000個"他"字

SQL> --如果隻有一條記錄, 可以這樣

SQL> select id, sum(lenb) as lenb

2    from (select t.id,

3                 lengthb(dbms_lob.substr(t.cc, 1000, (level - 1) * 1000 + 1)) as lenb

4            from (select * from clob_test where id = 1) t

5          connect by level <= ceil(dbms_lob.getlength(t.cc) / 1000))

6   group by id

7  /

ID       LENB

---------- ----------

1       3001

1 row selected

SQL> --如果是多條, 可以這樣

SQL> select id, sum(lenb) as lenb

2    from (

3  select t.id, b.lev, lengthb(dbms_lob.substr(t.cc, 1000, (b.lev-1)*1000+1)) as lenb

4    from (select level as lev from dual connect by level<=100) b,

5         (select id, ceil(dbms_lob.getlength(cc) / 1000) as times from clob_test) a,

6         clob_test t

7   where a.id=t.id and a.times>=b.lev

8   )

9   group by id

10  /

ID       LENB

---------- ----------

1       3001

2       6001

3       9001

3 rows selected

[/php]

但是你要注意最後一句sql中的connect by level<=100, 我在這裡設了100, 但是實際clob可以存放4G的資料, 按照1000個字元來分段, 如果考慮4g的話, level後面的值就大了

但是如果那個值大了, 整個sql執行就會變得很慢,

希望你的實際資料中沒有太大的資料, 如果有, 那需要另想辦法了