- CREATE OR REPLACE PROCEDURE INVHL_UPDATE_BLOB_DATA(p_table_name IN VARCHAR2,--表名
- p_blob_field_name IN VARCHAR2,--blob列名
- p_where_condition IN VARCHAR2,--主键
- p_id IN VARCHAR2,--id
- p_blob_data IN blob)--数据
- /*表名table_name,
- clob字段名field_name
- 确定要更新唯一记录的where条件p_where_condition
- 传入的字符串变量P_clob_data*/
- IS
- v_lobloc BLOB;--目标blob字段
- v_blob_data blob;--作为接收参数的字段,参数变量不能直接拿来赋值
- v_amount BINARY_INTEGER;--总长度
- v_query_string VARCHAR2(1000);--sql语句
- v_sub_length binary_integer;--一次读取的最大长度,不超过32766
- v_sub_blob blob;--一次读取的子串
- offset binary_integer;--游标
- BEGIN
- v_amount := LENGTH(p_blob_data);
- v_blob_data := p_blob_data;
- v_sub_length := 32766;
- offset :=1;
- v_query_string := 'SELECT ' || p_blob_field_name || ' FROM ' ||
- p_table_name || ' WHERE ' || p_where_condition ||'='||p_id||
- ' FOR UPDATE';
- dbms_output.put_line(v_query_string);
- --initialize buffer with data to be inserted or updated
- EXECUTE IMMEDIATE v_query_string--执行sql语句,将目标字段锁住,并且将目标字段赋值给v_lobloc,以待后续的操作
- INTO v_lobloc;
- --from pos position, write 32766 varchar2 into lobloc
- if v_amount > v_sub_length then
- while offset < v_amount loop --当游标小于最大值时,继续循环
- DBMS_LOB.read(p_blob_data, v_sub_length, offset,v_sub_blob);--把读到的内容放到v_sub_blob中
- DBMS_LOB.writeappend(v_lobloc, length(v_sub_blob), v_sub_blob);--写入v_lobloc,该变量已经在之前和sql语句绑定
- offset:=length(v_sub_blob)+offset;--游标移动
- end loop;
- else
- DBMS_LOB.writeappend(v_lobloc, v_amount, v_blob_data);--若是小于32766直接写入
- end if;
- commit;
- EXCEPTION
- WHEN OTHERS THEN
- ROLLBACK;
- END;
以上就是通用版的存储过程,根据表名、blob字段名、主键名称、当前id,源数据就可以实现将源数据存入目标字段的功能。需要注意以下几点:
1,源数据必须也是blob类型的,如果你需要将其他类型比如是varchar2存入,那么就把参数改了,过程之中也要做相应的更改,主要是类型。
2,DBMS_LOB.writeappend这个方法是用来追加的方法,也就是不会清空目标字段,而是直接把源数据追加到目标字段的末尾。如果是要覆盖之前的数据,就要在执行该过程之前进行一次update操作,如:
- update jforum_posts_text pt set pt.post_text = EMPTY_BLOB() where pt.post_id = 8817;
也就是把一个空数据插入到目标字段中,这样就实现了清空目标字段,然后在执行该过程,就实现了覆盖的功能。注意一点,执行update语句时别忘了where子句,否则所有的记录都被清空了。
3,当该过程被用在触发器中时(一般也是用在这里面),就要注意,触发器不允许用commit和rollback这样的语句,要去掉之后重新编译。
经过半下午的摸索,这个过程才基本可以满足要求,欢迎大家伙给予指教,能多多改进该过程,使其更具灵活性。
引用自XINFEI0803的博客:http://blog.youkuaiyun.com/xinfei0803/article/details/8660074