Oracle数据库中使用dbms_lob.converttoclob和dbms_lob.converttoblob转换blob、clob大对象类型总结

这几天开发的时候刚好涉及到了大对象类型(lob),之前在这方面做的功课也少,接触的也不多,学习了一段时间以后,本来打算总结成一篇文章发在博客中的,结果发现有关大对象的知识点还真多,比如大对象类型的类型及其适用情况、dbms_lob包等等,为了避免篇幅太大,就分开来总结了,本文主要总结Oracle数据库中使用dbms_lob.converttoclob和dbms_lob.converttoblob转换blob、clob大对象类型的方法。

blob类型和clob类型是大对象中比较常用的两种类型,它们的一个共同点是对象数据存储在数据库中,不像bfile类型是存储在文件系统中。由于blob和clob的转换可以是双向的,所以下面分别从这两个方向总结:

(1)blob -> clob

由blob类型转换成clob类型,主要是要依靠dbms_lob.converttoclob方法,下面直接根据代码来看:

DECLARE
  l_blob        BLOB;
  l_clob        CLOB;
  n_dest_offset INTEGER := 1;
  n_src_offset  INTEGER := 1;
  cv_dest_cs CONSTANT VARCHAR2(30) := 'ZHS16GBK';
  p_src_cs   CONSTANT VARCHAR2(30) := 'UTF8'; -- 假设当前编码是UTF8
  n_lang_ctx INTEGER := dbms_lob.default_lang_ctx;
  n_warning  VARCHAR(3000);
BEGIN
  -- 指定lob定位器
  SELECT t.c_blob
    INTO l_blob
    FROM test01 t
   WHERE t.c_id = 1;
  -- 建立临时lob
  dbms_lob.createtemporary(l_clob,
                           FALSE,
                           dbms_lob.session);
  -- 输出lob的长度
  dbms_output.put_line(dbms_lob.getlength(l_blob));
  -- 假如编码不一致,转换lob的编码,convertblob是自己编写的函数
  IF cv_dest_cs != p_src_cs THEN
    l_blob := convertblob(l_blob,
                          p_src_cs,
                          cv_dest_cs);
  END IF;
  -- 转换blob到clob
  dbms_lob.converttoclob(l_clob,
                         l_blob,
                         dbms_lob.lobmaxsize,
                         n_dest_offset,
                         n_src_offset,
                         nls_charset_id(cv_dest_cs),
                         n_lang_ctx,
                         n_warning);
  -- 输出lob的长度
  dbms_output.put_line(dbms_lob.getlength(l_clob));
END;

(2)clob -> blob

由clob类型转换成blob类型,主要是要依靠dbms_lob.converttoblob方法,下面直接根据代码来看:

DECLARE
  l_blob        BLOB;
  l_clob        CLOB;
  n_dest_offset INTEGER := 1;
  n_src_offset  INTEGER := 1;
  cv_dest_cs CONSTANT VARCHAR2(30) := 'ZHS16GBK';
  n_lang_ctx INTEGER := dbms_lob.default_lang_ctx;
  n_warning  VARCHAR(3000);
BEGIN
  -- 指定lob定位器
  SELECT t.c_clob
    INTO l_clob
    FROM test01 t
   WHERE t.c_id = 1;
  -- 建立临时lob
  dbms_lob.createtemporary(l_blob,
                           FALSE,
                           dbms_lob.session);
  -- 输出lob的长度
  dbms_output.put_line(dbms_lob.getlength(l_clob));
  -- 转换clob到blob
  dbms_lob.converttoclob(l_blob,
                         l_clob,
                         dbms_lob.lobmaxsize,
                         n_dest_offset,
                         n_src_offset,
                         nls_charset_id(cv_dest_cs),
                         n_lang_ctx,
                         n_warning);
  -- 输出lob的长度
  dbms_output.put_line(dbms_lob.getlength(l_blob));
END;

注意,代码中用到的自定义的convertblob()函数可以参见博客中《收藏的一段oracle数据库中blob类型按指定编码转换为blob、clob、字符串类型的代码》这篇博文。

本文标题:Oracle数据库中使用dbms_lob.converttoclob和dbms_lob.converttoblob转换blob、clob大对象类型总结

本文链接:http://yedward.net/?id=160

本文版权归作者所有,欢迎转载,转载请以文字链接的形式注明文章出处。

相关文章