我有一个CLOB字段的查询,我希望以UTF8格式返回她的值。如果字段是varchar,则下一个查询可以正常工作,但如果它是CLOB则不返回正确的UTF8字符串。
select convert(field, 'AL32UTF8', 'WE8ISO8859P15') from table;
如何从查询中的CLOB返回UTF8字符串?
答案 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;