• oracle中Blob、Clob、Varchar之间的互相转换


    以下是oracle中Blob、Clob、Varchar之间的互相转换(都是百度找的,亲测可用)

    Blob转Varchar2:

    CREATE OR REPLACE FUNCTION blob_to_varchar (blob_in IN BLOB)
    RETURN VARCHAR2
    IS
    
    v_varchar VARCHAR2(4000);
    v_start PLS_INTEGER := 1;
    v_buffer PLS_INTEGER := 4000;
    
    BEGIN
     --select userenv('LANGUAGE') into g_nls_db_char from dual; 
    
     if DBMS_LOB.GETLENGTH(blob_in) is null then
            return empty_clob();
     end if;
    
     DBMS_OUTPUT.put_line('TEST:' || CEIL(DBMS_LOB.GETLENGTH(blob_in)));
    
     --DBMS_LOB.CREATETEMPORARY(v_clob, TRUE);
    
     FOR i IN 1..CEIL(DBMS_LOB.GETLENGTH(blob_in) / v_buffer)
     LOOP
    --如果乱码了就需要调整字符集了 --select userenv('language') from dual 查看数据库编码
     v_varchar := UTL_RAW.CAST_TO_VARCHAR2(utl_raw.convert(DBMS_LOB.SUBSTR(blob_in, v_buffer, v_start),'SIMPLIFIED CHINESE_CHINA.ZHS16GBK', 'SIMPLIFIED CHINESE_CHINA.ZHS16GBK'));
    
     --DBMS_LOB.WRITEAPPEND(v_clob, LENGTH(v_varchar), v_varchar);
    
     v_start := v_start + v_buffer;
     END LOOP;
    
     --DBMS_OUTPUT.put_line(v_varchar);
    
     RETURN v_varchar;
    
    end blob_to_varchar;

    Blob转Clob:

    CREATE OR REPLACE FUNCTION blob_to_clob (blob_in IN BLOB)
    RETURN CLOB
    IS
    v_clob CLOB;
    v_varchar VARCHAR2(4000);
    v_start PLS_INTEGER := 1;
    v_buffer PLS_INTEGER := 4000;
    g_nls_db_char varchar2(60);
    BEGIN
     select userenv('LANGUAGE') into g_nls_db_char from dual;
    
     if DBMS_LOB.GETLENGTH(blob_in) is null then
            return empty_clob();
     end if;
    
     DBMS_OUTPUT.put_line('TEST:' || CEIL(DBMS_LOB.GETLENGTH(blob_in)));
    
     DBMS_LOB.CREATETEMPORARY(v_clob, TRUE);
    
     FOR i IN 1..CEIL(DBMS_LOB.GETLENGTH(blob_in) / v_buffer)
     LOOP
    --如果乱码了,就需要调整字符集了 select userenv('language') from dual --查看数据库编码
     v_varchar := UTL_RAW.CAST_TO_VARCHAR2(utl_raw.convert(DBMS_LOB.SUBSTR(blob_in, v_buffer, v_start),'SIMPLIFIED CHINESE_CHINA.ZHS16GBK','SIMPLIFIED CHINESE_CHINA.ZHS16GBK'));
    
     DBMS_LOB.WRITEAPPEND(v_clob, LENGTH(v_varchar), v_varchar);
    
     v_start := v_start + v_buffer;
     END LOOP;
    
     --DBMS_OUTPUT.put_line(v_varchar);
    
     RETURN v_clob;
    
    end blob_to_clob;

    Clob转Blob:

    CREATE OR REPLACE FUNCTION Clob_To_Blob (b IN CLOB default empty_clob())
       RETURN BLOB
    -- typecasts BLOB to CLOB (binary conversion)
    IS
       res            BLOB;
       b_len          number  := dbms_lob.getlength(b) ;
       dest_offset1   NUMBER  := 1;
       src_offset1    NUMBER  := 1;
       amount_c       INTEGER := DBMS_LOB.lobmaxsize;
       blob_csid      NUMBER  := DBMS_LOB.default_csid;
       lang_ctx       INTEGER := DBMS_LOB.default_lang_ctx;
       warning        INTEGER;
    BEGIN
    
    
       if  b_len  > 0  then
       DBMS_LOB.createtemporary (res, TRUE);
       DBMS_LOB.OPEN (res, DBMS_LOB.lob_readwrite);
       DBMS_LOB.convertToBlob (res,
                               b,
                               amount_c,
                               dest_offset1,
                               src_offset1,
                               blob_csid,
                               lang_ctx,
                               warning
                              );
     else
       select   empty_blob()  into  res  from  dual ;
      end if ;
       RETURN res;
    END Clob_To_Blob;

    Clob转Varchar2 : to_char(CLOB)

    Varchar2转Clob 自动隐式转化;

    Varchar2转Blob:调用 Clob_To_Blob();

    
    
  • 相关阅读:
    【小程序】onLaunch异步,首页onLoad先执行
    【Dart】生成固定长度随机数
    从单片机到系统之--uboot启动arm linux
    (四)添加yaffs2文件系统支持
    (三)修改内核大小,适配目标板Nand flash分区配置
    (二)linux内核准备及编译
    (一)arm交叉编译工具链准备
    socket 接收和发送缓冲区
    多线程及多进程部分概念汇总
    嵌入式开发环境搭建(一) 虚拟机实现桥接Ethernet网口 并且通过WIFI进行NAT联网
  • 原文地址:https://www.cnblogs.com/heyt/p/11454351.html
Copyright © 2020-2023  润新知