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