SET SERVEROUTPUT ON DECLARE vs_str VARCHAR2 ( 100 ); vb_blob BLOB; buff RAW ( 32000 ); buffer_size INTEGER : = 0 ; -- 追加 vr_temp_raw RAW ( 1024 ); vn_temp_raw_length INTEGER ; vs_from_str IN VARCHAR2 ; vn_temp NUMBER ( 10 ); vn_from_number IN NUMBER ; BEGIN -- 必须先插入一个空的blob INSERT INTO test_blob_t(f_name,f_blob) VALUES ( ' zhang ' ,empty_blob()); SELECT f_blob INTO vb_blob FROM test_blob_t WHERE f_name = ' zhang ' FOR UPDATE ; -- 1、写字符串进blob,从第一个位置开始 -- 将字符串写入raw中 buff : = UTL_RAW.CAST_TO_RAW(vs_str); buffer_size : = UTL_RAW.length(buff); DBMS_OUTPUT.put_line(buffer_size); -- 将raw中的数据从偏移量1开始,buffer_size个字节的数据写到blob中 DBMS_LOB.write(vb_blob,buffer_size, 1 ,buff); -- 2、追加字符串到blob中 -- 将字符串写入raw中 vr_temp_raw : = UTL_RAW.CAST_TO_RAW(vs_from_str); vn_temp_raw_length : = UTL_RAW.length(vr_temp_raw); -- 将raw中的内容追加到blob中,默认从上次blob的结束位置,写入vn_temp_raw_length个字节 DBMS_LOB.writeappend(ib_to_blob,vn_temp_raw_length,vr_temp_raw); -- 3、追加数值到blob中 -- 转换成十六进制 vn_temp : = LPAD( RTRIM ( LTRIM (TO_CHAR(vn_from_number, ' xxxxxxxx ' ))), 8 , ' 0 ' ); -- 将十六进制的数据写入raw中 vr_temp_raw : = HEXTORAW(vn_temp); vn_temp_raw_length : = UTL_RAW.length(vr_temp_raw); -- 将raw中的内容追加到blob中,默认从上次blob的结束位置,写入vn_temp_raw_length个字节 DBMS_LOB.writeappend(ib_to_blob,vn_temp_raw_length,vr_temp_raw); END ; /