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;
/