关于CLOB字段 感觉很不错,收过来

dbms_lob包(一) 2012-12-11 10:22:19

分类: Oracle

    最近在工作中因数据较大,用到了CLOB字段,oracle提供了专门处理LOB字段的包 DBMS_LOB。我的理解:oracle中的Package类似于面向对象语言中的Class,而Package中的函数及过程类似于CLASS中的方法,只不过函数是有返回值,而过程是void型无返回值的。
    现以CLOB为例将该包用到的几个过程总结并记录如下:
先说明一些参数,
dest_lob: 需写入的CLOB型参数
amount:   写入dest_lob时字符长度
offset:   偏移量,从第offset个位置开始写入字符
source:   写入dest_lob的字符串
--获取dest_lob的字符长度
dbms_lob.getlength(dest_lob);
dbms_lob.createtemporary(dest_lob,TRUE);
没完全明白它的作用是什么,oracle文档解释为:This procedure creates a temporary BLOB or CLOB and its corresponding index in your default temporary tablespace.因为在调试过程中发现这样的写法: dest_lob := null;似乎不起作用,我一般用它来清空dest_lob,另外还有一个用来清空LOB字段的方法,那就是empty_clob(), updat t set col= empty_clob(); 但当它用来清空变量 dest_lob := empty_clob(); 仍然也不起作用。不得已只好用 dbms_lob.createtemporary(dest_lob,TRUE);来清空数据。在定义dest_lob变量后还不能直接身其写入数据,必须调用 dbms_lob.createtemporary(dest_lob,TRUE);进行初始化,否则会提示错误: ORA-06502: PL/SQL: numeric or value error: invalid LOB locator specified: ORA-22275(请高人指点:) )
--从source中取amount个字符写入到dest_lob,原dest_lob被覆盖
DBMS_LOB.WRITE(dest_lob,amount,offset,source);
  1. SQL> DECLARE
  2.   2 v_clob CLOB;
  3.   3      v_amount INT;
  4.   4      v_offset INT;
  5.   5      v_char VARCHAR2(100);
  6.   6 BEGIN
  7.   7     v_char := 'Chinese中国人';
  8.   8     v_offset := 1;
  9.   9     v_amount := LENGTH(v_char);
  10. 10
  11. 11 dbms_lob.createtemporary(v_clob,TRUE);
  12. 12     dbms_lob.write(v_clob,v_amount,v_offset,v_char);
  13. 13     dbms_output.put_line(v_clob||' 字符长度:'||dbms_lob.getlength(v_clob)||' 字节长度:'||LENGTHB(to_char(v_clob)));
  14. 14
  15. 15 END;
  16. 16 /

  17. Chinese中国人 字符长度:10 字节长度:13
--将source追加到dest_lob之后
DBMS_LOB.APPEND(dest_lob,source);

  1. SQL> DECLARE
  2.   2 v_clob CLOB;
  3.   3      v_amount INT;
  4.   4      v_offset INT;
  5.   5      v_char VARCHAR2(100);
  6.   6 BEGIN
  7.   7     v_char := 'Chinese中国人';
  8.   8     v_offset := 1;
  9.   9     v_amount := LENGTH(v_char);
  10. 10
  11. 11     dbms_lob.createtemporary(v_clob,TRUE);
  12. 12     FOR i IN 1..2 LOOP
  13. 13         dbms_lob.append(v_clob,v_char);
  14. 14         dbms_output.put_line(v_clob||' 字符长度:'||dbms_lob.getlength(v_clob)||' 字节长度:'||LENGTHB(to_char(v_clob)));
  15. 15 END LOOP;
  16. 16 END;
  17. 17 /

  18. Chinese中国人 字符长度:10 字节长度:13
  19. Chinese中国人Chinese中国人 字符长度:20 字节长度:26
--从source中取amount个字符追加到dest_lob结尾
dbms_lob.writeappend(dest_lob,amount,source);

  1. SQL> DECLARE
  2.   2 v_clob CLOB;
  3.   3      v_amount INT;
  4.   4      v_offset INT;
  5.   5      v_char VARCHAR2(100);
  6.   6 BEGIN
  7.   7     v_char := 'Chinese中国人';
  8.   8     v_offset := 1;
  9.   9     v_amount := 7;
  10. 10
  11. 11     dbms_lob.createtemporary(v_clob,TRUE);
  12. 12     FOR i IN 1..2 LOOP
  13. 13         dbms_lob.writeappend(v_clob,v_amount,v_char);
  14. 14         dbms_output.put_line(v_clob||' 字符长度:'||dbms_lob.getlength(v_clob)||' 字节长度:'||LENGTHB(to_char(v_clob)));
  15. 15 END LOOP;
  16. 16 END;
  17. 17 /

  18. Chinese 字符长度:7 字节长度:7
  19. ChineseChinese 字符长度:14 字节长度:14
dbms_lob.append与dbms_lob.writeappend的区别在于,writeappend多了一个amount参数,可以设置一次写入字符数,而append只能将源字符串一次全部写入。
最后说明下offset的作用。从下面的示例中可以看出,写入dest_lob时是从第offset个位置写入的,最后dest_lob长度 = 字符串长度 + (offset-1)

  1. SQL> DECLARE
  2.   2 v_clob CLOB;
  3.   3 v_amount INT;
  4.   4 v_offset INT;
  5.   5 v_char VARCHAR2(100);
  6.   6 BEGIN
  7.   7 v_char := 'Chinese中国人';
  8.   8 v_offset := 2;
  9.   9 v_amount := 7;
  10. 10
  11. 11 dbms_lob.createtemporary(v_clob,TRUE);
  12. 12 dbms_lob.write(v_clob,v_amount,v_offset,v_char);
  13. 13 dbms_output.put_line(v_clob||' 字符长度:'||dbms_lob.getlength(v_clob)||' 字节长度:'||LENGTHB(to_char(v_clob)));
  14. 14
  15. 15 END;
  16. 16 /

  17. Chinese 字符长度:8 字节长度:8


  18. SQL>
  19. SQL> DECLARE
  20.   2 v_clob CLOB;
  21.   3 v_amount INT;
  22.   4 v_offset INT;
  23.   5 v_char VARCHAR2(100);
  24.   6 BEGIN
  25.   7 v_char := 'Chinese中国人';
  26.   8 v_offset := 5;
  27.   9 v_amount := 10;
  28. 10
  29. 11 dbms_lob.createtemporary(v_clob,TRUE);
  30. 12 dbms_lob.write(v_clob,v_amount,v_offset,v_char);
  31. 13 dbms_output.put_line(v_clob||' 字符长度:'||dbms_lob.getlength(v_clob)||' 字节长度:'||LENGTHB(to_char(v_clob)));
  32. 14
  33. 15 END;
  34. 16 /

  35.     Chinese中国人 字符长度:14 字节长度:17

-- The End --
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值