如何在Oracle查询中将CLOB转换为UTF8?

时间:2017-10-24 15:56:42

标签: oracle utf-8 clob

我有一个CLOB字段的查询,我希望以UTF8格式返回她的值。如果字段是varchar,则下一个查询可以正常工作,但如果它是CLOB则不返回正确的UTF8字符串。

select convert(field, 'AL32UTF8', 'WE8ISO8859P15') from table;

如何从查询中的CLOB返回UTF8字符串?

2 个答案:

答案 0 :(得分:2)

使用DBMS_LOB.CONVERTTOBLOB。

来自oracle文档:

  

Oracle不鼓励在当前使用CONVERT函数   Oracle数据库发布。 CONVERT的返回值有一个字符   数据类型,因此它应该在数据库字符集中或在   国家字符集,具体取决于数据类型。任何   dest_char_set不是这两个字符集之一   不支持的。 ...

如果在字符集中需要像CLOB这样的字符数据类型,而不是数据库的设置,则应将其转换为BLOB。 这是DBMS_LOB.CONVERTTOBLOB的用武之地。

如果需要一个返回BLOB的函数,则必须将CONVERTTOBLOB包装到您自己的函数中。 例如:

CREATE OR REPLACE FUNCTION clob_to_blob (p_clob CLOB, p_charsetname VARCHAR2)
   RETURN BLOB
AS
   l_lang_ctx      INTEGER := DBMS_LOB.default_lang_ctx;
   l_warning       INTEGER;
   l_dest_offset   NUMBER := 1;
   l_src_offset    NUMBER := 1;
   l_return        BLOB;
BEGIN
   DBMS_LOB.createtemporary (l_return, FALSE);
   DBMS_LOB.converttoblob (
      l_return,
      p_clob,
      DBMS_LOB.lobmaxsize,
      l_dest_offset,
      l_src_offset,
      CASE WHEN p_charsetname IS NOT NULL THEN NLS_CHARSET_ID (p_charsetname) ELSE DBMS_LOB.default_csid END,
      l_lang_ctx,
      l_warning);

   RETURN l_return;
END;

这允许查询:

SELECT clob_to_blob (field, 'UTF8') FROM t;

要获取字符集名称支持的值列表,请使用:

SELECT *
  FROM v$nls_valid_values
 WHERE parameter = 'CHARACTERSET'

答案 1 :(得分:1)

使用dbms_lob包

例如

select convert(dbms_lob.substr(field,dbms_lob.getlength(field), **0**), 
              'AL32UTF8',
              'WE8ISO8859P15') 
from table;

修正了它:

 select convert(dbms_lob.substr(field,dbms_lob.getlength(field)),
              'AL32UTF8',
              'WE8ISO8859P15') 
 from table;