mysql 存储过程 blob,通过存储过程来上传文件大于4kBLOB

第一日:

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 坏男孩 阅读(3892) 评论(26)  编辑  收藏 所属分类: ORACLE篇章 、DELPHI

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值