第一日:
1.建立数据表
create table aaa(id varchar2(9) not null,img blob);
2.存储过程
create or replace procedure pro_upd(
sid in string,
bblob in blob default empty_blob())
is
lobloc blob;
vlength integer;
begin
insert into aaa(id,img) values(sid,empty_blob());
if (bblob is not null) then
select img into lobloc from aaa where id = sid for update;
vlength := dbms_lob.getlength(bblob);
dbms_lob.open(lobloc,dbms_lob.lob_readwrite);
dbms_lob.copy(lobloc,bblob,vlength);
end if;
commit;
exception
when others then
rollback;
end;
3.程序代码
用的odac的oraquery
orqry1.sql.text := 'call pro_upd(:id,:bblob)';
orqry1.params.parambyname('id').value := '123';
orqry1.params.parambyname('bblob').loadfromfile('d:\work\照片上传\pic\005.jpg',ftblob);
orqry1.execsql;
目的:就是把图片上传到数据库,结果4k一下的可以成功上传;4k以上稍小点的图片就如果几百k就会报ora-12571错误;经过两天的努力发现的一个规律!
继续找原因。。。。。。
第二日
8月18日问题终于得到解决,但是存储过程和调用都经过了改变!
with orstrdprc1 do begin
storedprocname := 'pro_upd';
preparesql; // receive parameters
randomize;
parambyname('sid').asstring := inttostr(random(1000));
parambyname('bblob').paramtype := ptinput; // to transfer lob data to oracle
parambyname('bblob').asorablob.loadfromfile('d:\work\照片上传\pic\10000027_005.jpg');
execute;
end;
这样可以了,但是要求
--这个存储过程得到了解决
create or replace procedure pro_upd(
sid in string,
bblob out blob)
is
begin
insert into aaa(id,img) values(sid,empty_blob())
returning img into bblob;
end;
继续前进,看看原来的存储过程什么原因不可以!
总结:lob 文件4k以内的内容放到表段,其他的放到blob的表空间!
插入时,首先要插入empty_blob,然后select for update!这样才能更新blob字段
另外如果是存储过程,则注意参数,想下面的一样:
bblob out blob
这样才能得到blob字段的定位器;;;更新内容!
但是现在还不知道 bblob in blob 这种方式下如何修改,上传图片
第三天:
经过3天的努力寻找,终于找到了完美的凯发天生赢家一触即发官网的解决方案居然就是一句话的问题,完全可以解决 in blob的问题了
temporarylobupdate := true;
加一句就好了
到此在存储过程里面解决上传blob的问题解决完毕。
到此可以圆满结束,明天的合同就签了。
注意文章转载注明出处:http://blogjava.net/badboyryan
posted on 2007-08-17 01:36
坏男孩 阅读(4076)
评论(26) 所属分类:
oracle篇章 、
delphi