如何将长文本转换为Oracle 11G中的UTF8?

发布于 2025-02-10 01:07:59 字数 473 浏览 1 评论 0原文

我有大约20000年的大文字,需要转换为UTF8。

select convert('large text','UTF8') from dual

我有错误:

ora-01704:字符串字面太长

尝试此获取另一个错误,

declare 
    v_hugetxt varchar2(32767);
begin    
    v_hugetxt:='huge text'
    select convert(v_hugetxt,'UTF8') into v_hugetxt
                 from dual;
end;

我会收到错误

ORA-01460:未完成或不合理的转换请求提示· 不兼容的字符集可能会导致ORA-01460

I have large text around 20000 I need convert to UTF8.

select convert('large text','UTF8') from dual

I get error:

ORA-01704: string literal too long

Try this get another error

declare 
    v_hugetxt varchar2(32767);
begin    
    v_hugetxt:='huge text'
    select convert(v_hugetxt,'UTF8') into v_hugetxt
                 from dual;
end;

I get error

ORA-01460: unimplemented or unreasonable conversion requested tips ·
Incompatible character sets can cause an ORA-01460

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

终弃我 2025-02-17 01:07:59

我找到了解决方案,但起作用
参考

create or replace function v_blobtoclob(v_blob_in in blob) return clob is
    
      v_file_clob    clob;
      v_file_size    integer := dbms_lob.lobmaxsize;
      v_dest_offset  integer := 1;
      v_src_offset   integer := 1;
      v_blob_csid    number := dbms_lob.default_csid;
      v_lang_context number := dbms_lob.default_lang_ctx;
      v_warning      integer;
      v_length       number;
    
    begin
    
      dbms_lob.createtemporary(v_file_clob, true);
    
      dbms_lob.converttoclob(v_file_clob,
                             v_blob_in,
                             v_file_size,
                             v_dest_offset,
                             v_src_offset,
                             v_blob_csid,
                             v_lang_context,
                             v_warning);
    
      return v_file_clob;
    
    exception
      when others then
        dbms_output.put_line('Error found');
      
    end;

    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;

declare 
    v_hugetxt clob; 
    v_hugetxt2 blob; 
    v_hugetxt3 clob; 
    offset int;
    clobsize number;    
begin    
    v_hugetxt:='huge text';    
    select bnf.clob_to_blob(v_hugetxt,'UTF8') into v_hugetxt2 from dual;   
    select bnf.v_blobtoclob(v_hugetxt2) into v_hugetxt3 from dual;
    dbms_output.put_line('Print CLOB');
    offset:=1;
    loop  
      exit when offset > dbms_lob.getlength(v_hugetxt3);  
      dbms_output.put_line(dbms_lob.substr(v_hugetxt3, 255, offset));  
      offset := offset + 255;  
    end loop;   
    DBMS_OUTPUT.PUT_LINE('clob  out = ' || v_hugetxt3);
end;

仅供

I found solution but worked
FYI

create or replace function v_blobtoclob(v_blob_in in blob) return clob is
    
      v_file_clob    clob;
      v_file_size    integer := dbms_lob.lobmaxsize;
      v_dest_offset  integer := 1;
      v_src_offset   integer := 1;
      v_blob_csid    number := dbms_lob.default_csid;
      v_lang_context number := dbms_lob.default_lang_ctx;
      v_warning      integer;
      v_length       number;
    
    begin
    
      dbms_lob.createtemporary(v_file_clob, true);
    
      dbms_lob.converttoclob(v_file_clob,
                             v_blob_in,
                             v_file_size,
                             v_dest_offset,
                             v_src_offset,
                             v_blob_csid,
                             v_lang_context,
                             v_warning);
    
      return v_file_clob;
    
    exception
      when others then
        dbms_output.put_line('Error found');
      
    end;

    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;

declare 
    v_hugetxt clob; 
    v_hugetxt2 blob; 
    v_hugetxt3 clob; 
    offset int;
    clobsize number;    
begin    
    v_hugetxt:='huge text';    
    select bnf.clob_to_blob(v_hugetxt,'UTF8') into v_hugetxt2 from dual;   
    select bnf.v_blobtoclob(v_hugetxt2) into v_hugetxt3 from dual;
    dbms_output.put_line('Print CLOB');
    offset:=1;
    loop  
      exit when offset > dbms_lob.getlength(v_hugetxt3);  
      dbms_output.put_line(dbms_lob.substr(v_hugetxt3, 255, offset));  
      offset := offset + 255;  
    end loop;   
    DBMS_OUTPUT.PUT_LINE('clob  out = ' || v_hugetxt3);
end;

That's it

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文