将NCLOB转换为Unicode/HEX/BASE64

将NCLOB转换为Unicode/HEX/BASE64,unicode,character-encoding,base64,hex,oracle12c,Unicode,Character Encoding,Base64,Hex,Oracle12c,我的Oracle 12c数据库字符集是WE8ISO8859P1 我有一个列为NCLOB的表,并希望提取3种不同编码的数据 BASE64 十六进制 统一码 我试着写一些函数,输出是正确的,但是为什么在编码字符串中出现新行呢 请在下面查找该函数的详细信息 WITH FUNCTION EncodeBASE64(InClearChar IN CLOB) RETURN CLOB IS dest_lob BLOB; lang_context INTEGER :=

我的Oracle 12c数据库字符集是WE8ISO8859P1

我有一个列为NCLOB的表,并希望提取3种不同编码的数据

BASE64 十六进制 统一码 我试着写一些函数,输出是正确的,但是为什么在编码字符串中出现新行呢

请在下面查找该函数的详细信息

        WITH 
  FUNCTION EncodeBASE64(InClearChar IN  CLOB) RETURN CLOB IS

    dest_lob BLOB;  
    lang_context INTEGER := DBMS_LOB.DEFAULT_LANG_CTX;
    dest_offset INTEGER := 1;
    src_offset INTEGER := 1;
    read_offset INTEGER := 1;
    warning INTEGER;
    ClobLen INTEGER := DBMS_LOB.GETLENGTH(InClearChar);

    amount INTEGER := 1440; -- must be a whole multiple of 3
    -- size of a whole multiple of 48 is beneficial to get NEW_LINE after each 64 characters 
    buffer RAW(1440);
    res CLOB := EMPTY_CLOB();

     BEGIN

    IF InClearChar IS NULL OR NVL(ClobLen, 0) = 0 THEN 
        RETURN NULL;
    ELSIF ClobLen <= 24000 THEN
        RETURN UTL_RAW.CAST_TO_VARCHAR2(UTL_ENCODE.BASE64_ENCODE(UTL_RAW.CAST_TO_RAW(InClearChar)));
    END IF;
    -- UTL_ENCODE.BASE64_ENCODE is limited to 32k/(3/4), process in chunks if bigger    

    DBMS_LOB.CREATETEMPORARY(dest_lob, TRUE);
    DBMS_LOB.CONVERTTOBLOB(dest_lob, InClearChar, DBMS_LOB.LOBMAXSIZE, dest_offset, src_offset, 
    DBMS_LOB.DEFAULT_CSID, lang_context, warning);
    LOOP
        EXIT WHEN read_offset >= dest_offset;
        DBMS_LOB.READ(dest_lob, amount, read_offset, buffer);
        res := res || UTL_RAW.CAST_TO_VARCHAR2(UTL_ENCODE.BASE64_ENCODE(buffer));       
        read_offset := read_offset + amount;
    END LOOP;
    DBMS_LOB.FREETEMPORARY(dest_lob);
    RETURN res;

    END EncodeBASE64;
    FUNCTION castToHex(InClearChar IN  NCLOB) RETURN CLOB IS

    dest_lob BLOB;  
    lang_context INTEGER := DBMS_LOB.DEFAULT_LANG_CTX;
    dest_offset INTEGER := 1;
    src_offset INTEGER := 1;
    read_offset INTEGER := 1;
    warning INTEGER;
    ClobLen INTEGER := DBMS_LOB.GETLENGTH(InClearChar);

    amount INTEGER := 1440; -- must be a whole multiple of 3
    -- size of a whole multiple of 48 is beneficial to get NEW_LINE after each 64 characters 
    buffer RAW(1440);
    res CLOB := EMPTY_CLOB();

BEGIN

    IF InClearChar IS NULL OR NVL(ClobLen, 0) = 0 THEN 
        RETURN NULL;
    ELSIF ClobLen <= 24000 THEN
        RETURN RAWTOHEX(UTL_RAW.CAST_TO_RAW(InClearChar));
    END IF;
    -- UTL_ENCODE.BASE64_ENCODE is limited to 32k/(3/4), process in chunks if bigger    

    DBMS_LOB.CREATETEMPORARY(dest_lob, TRUE);
    DBMS_LOB.CONVERTTOBLOB(dest_lob, InClearChar, DBMS_LOB.LOBMAXSIZE, dest_offset, src_offset, 
    DBMS_LOB.DEFAULT_CSID, lang_context, warning);
    LOOP
        EXIT WHEN read_offset >= dest_offset;
        DBMS_LOB.READ(dest_lob, amount, read_offset, buffer);
        res := res || RAWTOHEX(buffer);       
        read_offset := read_offset + amount;
    END LOOP;
    DBMS_LOB.FREETEMPORARY(dest_lob);
    RETURN res;

    END castToHex;
   
SELECT EncodeBASE64('uživaÄ Ê Í Õ Ø A B C D Etele, kteří temp in the town  A B C D Etele, kteří') as encodedBASE64
from dual;
输出 encodedBASE64->dcW+aXZhw4Qgw4ogw40gw5Ugw5ggQSBCIEMgRCBFdGVsZSwga3RlxZnDrSB0ZW1w IGluIHRoZSB0b3duICBBIEIgQyBEIEV0ZWxlLCBrdGXFmcOt

问题1-当我使用此encodedBASE64 online转换为字符串时,它正确返回文本,但为什么即使我删除新行输出,编码字符串中仍存在新行


问题2-如何将此字符串转换为unicode格式,请帮助

ISO-8859-1 Latin-1/西欧中未定义字符Ź、ž、ř,但ISO-8859-2 Latin-2/东欧中未定义字符。不幸的是,对于像Õ这样的字符,Ø是有效的反关系。请改用。@JosefZ这在我使用SQLPLUS时有效,可能是windows NLS设置不正确,现在的问题是,当我从表列中提取数据时,它给了我不正确的数据。请回答问题并在您的数据库中共享不正确的数据。@JosefZ已完成,已更新