第一日:
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以上稍小点的图片就ORA-03113: 通信通道的文件结束如果几百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
坏男孩 阅读(4175)
评论(26) 编辑 收藏 所属分类:
ORACLE篇章 、
DELPHI