blob_to_clob and cob_to_blob and long_to_blob

CREATE OR REPLACE FUNCTION blob_to_clob (blob_in IN BLOB) RETURN CLOB
    AS
    v_clob    CLOB;
    v_varchar VARCHAR2(32767);
    v_start PLS_INTEGER := 1;
    v_buffer PLS_INTEGER := 32767;
    tmp_num number;
    BEGIN
        DBMS_LOB.CREATETEMPORARY(v_clob, TRUE);
        tmp_num := CEIL(DBMS_LOB.GETLENGTH(blob_in) / v_buffer);
        if tmp_num > 0 then --防止传入的BLOB为NULL或长度为0时引发错误
          FOR i IN 1..tmp_num
          LOOP
            v_varchar := UTL_RAW.CAST_TO_VARCHAR2(DBMS_LOB.SUBSTR(blob_in, v_buffer, v_start));
            DBMS_LOB.WRITEAPPEND(v_clob, LENGTH(v_varchar), v_varchar);
             v_start := v_start + v_buffer;
          END LOOP;
        end if;
        RETURN v_clob;
    END blob_to_clob;

 

 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

 

create or replace function c2b( c IN CLOB) return BLOB
IS
      pos       PLS_INTEGER  := 1;
      buffer    RAW( 32767 );
      res       BLOB;
      lob_len   PLS_INTEGER  := DBMS_LOB.getLength( c );
    BEGIN
      DBMS_LOB.createTemporary( res, TRUE );
      DBMS_LOB.OPEN( res, DBMS_LOB.LOB_ReadWrite );
 
      LOOP
        buffer := UTL_RAW.cast_to_raw( DBMS_LOB.SUBSTR( c, 16000, pos ) );
 
        IF UTL_RAW.LENGTH( buffer ) > 0 THEN
          DBMS_LOB.writeAppend( res, UTL_RAW.LENGTH( buffer ), buffer );
        END IF;
 
        pos := pos + 16000;
        EXIT WHEN pos > lob_len;
      END LOOP;
 
      RETURN res; -- res is OPEN here
    END c2b;

 

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

 

 

CREATE   OR   REPLACE   FUNCTION   CONVERTTOBLOB(SRC   IN   LONG)   RETURN   BLOB   IS  
          D_OFFSET       INTEGER   :=   1;  
          S_OFFSET       INTEGER   :=   1;  
          B_CSID           NUMBER   :=   0;  
          LANG_C           INTEGER   :=   0;  
          WARN               INTEGER   :=   0;  
          LEN                 INTEGER   :=   0;  
          B                     BLOB;  
      BEGIN  
          DBMS_LOB.CREATETEMPORARY(LOB_LOC   =>   B,   CACHE   =>   TRUE);  
          LEN   :=   DBMS_LOB.GETLENGTH(TO_CLOB(SRC));  
          DBMS_LOB.CONVERTTOBLOB(DEST_LOB           =>   B,  
                                                        SRC_CLOB           =>   TO_CLOB(SRC),  
                                                        AMOUNT               =>   LEN,  
                                                        DEST_OFFSET     =>   D_OFFSET,  
                                                        SRC_OFFSET       =>   S_OFFSET,  
                                                        BLOB_CSID         =>   B_CSID,  
                                                        LANG_CONTEXT   =>   LANG_C,  
                                                        WARNING             =>   WARN);  
          RETURN   B;  
      EXCEPTION  
          WHEN   OTHERS   THEN  
              DBMS_OUTPUT.PUT_LINE(SQLERRM);  
      END;  
  /  

你可能感兴趣的:(C++,c,cache,C#)