存储过程如下:create or replace procedure insertyxhd_scan
(l_hd_incode in integer,
i_fl in integer,
i_xh in integer,
dt_scan in  date,
s_scaner  in varchar2,
im_scan   in  blob,
   LOC out blob      )
as
begininsert into yxhd_scan
(
l_hd_incode,
i_fl,
i_xh,
dt_scan,
s_scaner,
im_scan
)
VALUES

l_hd_incode
,i_fl
,i_xh
,dt_scan
,s_scaner
,im_scan
          );
       
end;插入代码如下:
 OracleConnection ImageConn = new OracleConnection("Data Source=orcl;Persist Security Info=True;User ID=yxgjjuser;Password=yixin");
        ImageConn.Open();
        OracleTransaction OracleTrans = ImageConn.BeginTransaction();//修正Blob型数据一定要使用事务  
        OracleCommand ImageComm = new OracleCommand("insertyxhd_scan", ImageConn);        ImageComm.Transaction = OracleTrans;        ///
        OracleLob tempLob = CreateTempLob(ImageComm);
        ImageComm.CommandType = CommandType.StoredProcedure;
        ImageComm.Parameters.Clear();
        ImageComm.Parameters.Add("l_hd_incode", OracleType.Int32, 20);
        ImageComm.Parameters["l_hd_incode"].Value = 12;        ImageComm.Parameters.Add("i_fl", OracleType.Int32, 20);
        ImageComm.Parameters["i_fl"].Value = 1;        ImageComm.Parameters.Add("i_xh", OracleType.Int32, 20);
        ImageComm.Parameters["i_xh"].Value = 2;        ImageComm.Parameters.Add("dt_scan", OracleType.DateTime, 20);
        ImageComm.Parameters["dt_scan"].Value = new DateTime(2009, 1, 1);
        ImageComm.Parameters.Add("s_scaner", OracleType.NVarChar, 20);
        ImageComm.Parameters["s_scaner"].Value = "TeamLead";
        ImageComm.Parameters.Add("im_scan", OracleType.Blob);        string imageFileLocation = PersonImage.PostedFile .FileName;
        FileInfo fi = new FileInfo(imageFileLocation);
        FileStream fs = fi.OpenRead();
        byte[] imageData = new byte[fs.Length];
        fs.Read(imageData, 0, System.Convert.ToInt32(imageData.Length));
        tempLob.BeginBatch(OracleLobOpenMode.ReadWrite);
        tempLob.Write(imageData, 0, imageData.Length);
        tempLob.EndBatch();        ImageComm.Parameters["im_scan"].Value = tempLob;
        fs.Close();
        ImageComm.ExecuteNonQuery();
        OracleTrans.Commit(); public OracleLob CreateTempLob(OracleCommand cmd)
    {     
        //cmd.CommandText = "DECLARE A "  +"Blob ; " +
        //             "BEGIN " +
        //                "DBMS_LOB.CREATETEMPORARY(A, FALSE,0); " +
        //                ":cur_OUT := A; " +
        //             "END;";
        cmd.CommandText = "DECLARE A Blob ; " +
                "BEGIN " +
                   "DBMS_LOB.CREATETEMPORARY(A, FALSE,DBMS_LOB.CALL); " +
                   ":LOC := A; " +
                "END;";        //Bind the LOB as an output parameter.
        OracleParameter p = cmd.Parameters.Add("LOC", OracleType.Blob);
        p.Direction = ParameterDirection.Output;        //Execute (to receive the output temporary LOB).
        cmd.ExecuteNonQuery();        //Return the temporary LOB.
        return (OracleLob)p.Value;
    }   执行这句ImageComm.ExecuteNonQuery()时 出现下面错误
ORA-06550: line 1, column 95:
PLS-00103: Encountered the symbol "(" when expecting one of the following:   begin case declare end exception exit for goto if loop mod
   null pragma raise return select update while with
   <an identifier> <a double-quoted delimited-identifier>
   <a bind variable> << close current delete fetch lock insert
   open rollback savepoint set sql execute commit forall merge
   <a single-quoted SQL string> pipe
   <an alternatively-quoted SQL string>
The symbol "case" was substituted for "(" to continue.
ORA-06550: line 1, column 207:
PLS-00103: Encountered the symbol ";" when expecting one of the following:   * & = - + < / > at in is mod remainder not rem when
   <an exponent (**)> <> or != or ~= >= <= <> and or like
   between overlaps || multiset member SUBMULTIS
请各位达人指教  解决立即给分

解决方案 »

  1.   

     使用存储过程(PL/SQL)向数据库中存取BLOB对象——图片新一篇: Add a custom tool to the web mapping application注:仅存储和读取服务器上的数据
    客户端可以执行,但也是存取服务器上的数据。
    以下操作最好在服务器上执行
    一、使用存储过程(PL/SQL)向数据库中存储BLOB对象
    以下存储过程用于向数据库加载BLOB对象
    1.创建directory并授权
    关于Directory可以参考: Using Create directory & UTL_FILE in Oracle
    C:\>sqlplus "/ as sysdba"
     
    SQL*Plus: Release 10.1.0.3.0 - Production on Tue Apr 26 07:11:51 2005
     
    Copyright (c) 1982, 2004, Oracle.  All rights reserved.
     
     
    Connected to:
    Oracle Database 10g Enterprise Edition Release 10.1.0.3.0 - Production
    With the Partitioning, Oracle Label Security, OLAP and Data Mining options
     
    SQL> create user eygle identified by eygle default tablespace users;
     
    User created.
     
    SQL> grant connect ,resource,dba to eygle;
     
    Grant succeeded.
     
    SQL> connect / as sysdba
    Connected.
    SQL> create or replace directory BLOBDIR as 'D:\oradata\Pic';
     
    Directory created.
     
    SQL> grant read on directory BLOBDIR to eygle;
     
    Grant succeeded.
     
    SQL>
     2.创建测试表
    SQL> connect eygle/eygle
    Connected.
    SQL> CREATE TABLE eygle_blob (
      2  fid    number,
      3  fname       varchar2(50),
      4  fdesc  varchar2(200),
      5  fpic        BLOB)
      6  /
     
    Table created.
     
    SQL>
    SQL> create sequence S_EYGLE_SEQ
      2  start with 1
      3  increment by 1
      4  /
     
    Sequence created.
     
    SQL>
     
     
    3.创建存储过程
    SQL> CREATE OR REPLACE PROCEDURE eygle_load_blob (pfname VARCHAR2,pdesc varchar2)
      2  IS
      3  src_file BFILE;
      4  dst_file BLOB;
      5  lgh_file BINARY_INTEGER;
      6  BEGIN
      7     src_file := bfilename('BLOBDIR', pfname);
      8
      9     INSERT INTO eygle_blob (fid,fname,fdesc,fpic)
     10     VALUES (S_EYGLE_SEQ.Nextval,pfname,pdesc,EMPTY_BLOB())
     11     RETURNING fpic INTO dst_file;
     12
     13     SELECT fpic INTO dst_file
     14     FROM eygle_blob  WHERE fname = pfname FOR UPDATE;
     15
     16     dbms_lob.fileopen(src_file, dbms_lob.file_readonly);
     17     lgh_file := dbms_lob.getlength(src_file);
     18     dbms_lob.loadfromfile(dst_file, src_file, lgh_file);
     19
     20    UPDATE eygle_blob  SET fpic = dst_file
     21    WHERE fname = pfname;
     22
     23    dbms_lob.fileclose(src_file);
     24    commit;
     25  END eygle_load_blob;
     26  /
     
    Procedure created.
     
    SQL> col segment_name for a30
    SQL> select segment_name,segment_type,bytes/1024/1024 from dba_segments where owner='EYGLE';
     
    SEGMENT_NAME                   SEGMENT_TYPE       BYTES/1024/1024
    ------------------------------ ------------------ ---------------
    SYS_IL0000050545C00004$       LOBINDEX                     .0625
    SYS_LOB0000050545C00004$      LOBSEGMENT                   .0625
    EYGLE_BLOB                     TABLE                        .0625
     
     4.加载Blob对象 
    SQL> exec eygle_load_blob('ShaoLin.jpg','少林寺-康熙手书');
     
    PL/SQL procedure successfully completed.
     
    SQL> select segment_name,segment_type,bytes/1024/1024 from dba_segments where owner='EYGLE';
     
    SEGMENT_NAME                   SEGMENT_TYPE       BYTES/1024/1024
    ------------------------------ ------------------ ---------------
    SYS_IL0000050545C00004$       LOBINDEX                     .0625
    SYS_LOB0000050545C00004$      LOBSEGMENT                       4
    EYGLE_BLOB                     TABLE                        .0625
     
    SQL> exec eygle_load_blob('DaoYing.jpg','倒映');
     
    PL/SQL procedure successfully completed.
     
    SQL> select segment_name,segment_type,bytes/1024/1024 from dba_segments where owner='EYGLE';
     
    SEGMENT_NAME                   SEGMENT_TYPE       BYTES/1024/1024
    ------------------------------ ------------------ ---------------
    SYS_IL0000050545C00004$       LOBINDEX                     .0625
    SYS_LOB0000050545C00004$      LOBSEGMENT                       7
    EYGLE_BLOB                     TABLE                        .0625
     
     
    SQL> col fname for a20
    SQL> col fdesc for a30
    SQL> select fid,fname,fdesc,dbms_lob.getlength(fpic) siz from eygle_blob;
     
           FID FNAME                FDESC                                 SIZ
    ---------- -------------------- ------------------------------ ----------
             1 ShaoLin.jpg          少林寺-康熙手书                   1768198
             2 DaoYing.jpg          倒映                              2131553
     
     
    D:\oradata\Pic>ls -l
    -rwxrwxrwa   1 gqgai           None            2131553 Apr 19 10:12 DaoYing.jpg
    -rwxrwxrwa   1 gqgai           None            1768198 Apr 19 10:12 ShaoLin.jpg
     通过以上方式,我们可以很容易的把大对象存储到数据库中。
    二、使用PL/SQL从数据库中读取BLOB对象
    1.确认现有对象
    SQL> col fdesc for a30
    SQL> select fid,fname,fdesc from eygle_blob;
     
           FID FNAME                                              FDESC
    ---------- -------------------------------------------------- ------------------------------
             1 ShaoLin.jpg                                        少林寺-康熙手书
             2 DaoYing.jpg                                        倒映
     2.创建存储Directory
    SQL> connect / as sysdba
    Connected.
    SQL> create or replace directory BLOBDIR as 'D:\oradata\Pic';
     
    Directory created.
     
    SQL>
    SQL> grant read,write on directory BLOBDIR to eygle;
     
    Grant succeeded.
     
    SQL>
     
     
    3.创建存储过程
    SQL> connect eygle/eygle
    Connected.
    SQL>
    SQL> CREATE OR REPLACE PROCEDURE eygle_dump_blob (piname varchar2,poname varchar2) IS
      2    l_file      UTL_FILE.FILE_TYPE;
      3    l_buffer    RAW(32767);
      4    l_amount    BINARY_INTEGER := 32767;
      5    l_pos       INTEGER := 1;
      6    l_blob      BLOB;
      7    l_blob_len  INTEGER;
      8  BEGIN
      9    SELECT FPIC
     10    INTO      l_blob
     11    FROM      eygle_blob
     12    WHERE  FNAME = piname;
     13
     14    l_blob_len := DBMS_LOB.GETLENGTH(l_blob);
     15    l_file := UTL_FILE.FOPEN('BLOBDIR',poname,'wb', 32767);
     16
     17    WHILE l_pos < l_blob_len LOOP
     18      DBMS_LOB.READ (l_blob, l_amount, l_pos, l_buffer);
     19      UTL_FILE.PUT_RAW(l_file, l_buffer, TRUE);
     20      l_pos := l_pos + l_amount;
     21    END LOOP;
     22
     23    UTL_FILE.FCLOSE(l_file);
     24
     25  EXCEPTION
     26    WHEN OTHERS THEN
     27      IF UTL_FILE.IS_OPEN(l_file) THEN
     28        UTL_FILE.FCLOSE(l_file);
     29      END IF;
     30      RAISE;
     31  END;
     32  /
     
    Procedure created.
     4.取出数据
    SQL> host ls -l d:\oradata\Pic
    total 7618
    -rwxrwxrwa   1 gqgai           None            2131553 Apr 19 10:12 DaoYing.jpg
    -rwxrwxrwa   1 gqgai           None            1768198 Apr 19 10:12 ShaoLin.jpg
     
    SQL> exec eygle_dump_blob('ShaoLin.jpg','01.jpg')
     
    PL/SQL procedure successfully completed.
     
    SQL> host ls -l d:\oradata\Pic
    total 11072
    -rwxrwxrwa   1 Administrators  SYSTEM          1768198 Apr 26 07:16 01.jpg
    -rwxrwxrwa   1 gqgai           None            2131553 Apr 19 10:12 DaoYing.jpg
    -rwxrwxrwa   1 gqgai           None            1768198 Apr 19 10:12 ShaoLin.jpg
     
    SQL>
    SQL> exec eygle_dump_blob('DaoYing.jpg','02.jpg')
     
    PL/SQL procedure successfully completed.
     
    SQL> host ls -l d:\oradata\Pic
    total 15236
    -rwxrwxrwa   1 Administrators  SYSTEM          1768198 Apr 26 07:16 01.jpg
    -rwxrwxrwa   1 Administrators  SYSTEM          2131553 Apr 26 07:19 02.jpg
    -rwxrwxrwa   1 gqgai           None            2131553 Apr 19 10:12 DaoYing.jpg
    -rwxrwxrwa   1 gqgai           None            1768198 Apr 19 10:12 ShaoLin.jpg
     
     
      
      

  2.   

    --存储图片
    declare
    f bfile;
    b blob;begin
      insert into a (img) values(empty_blob()) return img into b;
      --T为目录对像
      f :=bfilename('T','a.jpg');
      dbms_lob.open(f,dbms_lob.file_readonly);
      dbms_lob.loadfromfile(b,f,dbms_lob.getlength);
      dbms_lob.close(f);
    end;----- SQL> create or replace directory tt as 'f:\xt';Directory createdSQL> grant read on directory tt to scott; create table img(img blob);
     declare
      f bfile;
      b blob;
      begin
        insert into img(img) values(empty_blob())return img into b;
        f:=bfilename('TT','a.jpg');
        dbms_lob.open(f,dbms_lob.file_readonly);
        --dbms_lob.loadfromfile(b,f,dbms_lob.getlength());
        dbms_lob.loadfromfile(b,f,dbms_lob.getlength(f));
        dbms_lob.close(f);
      end;
      ------------------图片读入数据库----------------------
     SQL> create or replace directory tt as 'f:\xt';Directory createdSQL> grant read on directory tt to scott; create table img(img blob);
     declare
      f bfile;
      b blob;
      begin
        insert into img(img) values(empty_blob())return img into b;
        f:=bfilename('TT','a.jpg');
        dbms_lob.open(f,dbms_lob.file_readonly);
        dbms_lob.loadfromfile(b,f,dbms_lob.getlength(f));
        dbms_lob.close(f);
      end;
      --------------------
    -----从数据库中读图片出来--
      SQL> conn sys/sys@newer as sysdba;
    Connected to Oracle9i Enterprise Edition Release 9.2.0.1.0 
    Connected as SYSSQL> create or replace directory ff as 'f:\';Directory createdSQL> grant read ,write on directory ff to scott;Grant succeeded
    declare
     l_file UTL_FILE.file_type;
     l_buffer raw(32767);
     l_amount binary_integer :=32767;
     l_pos integer :=1;
     l_blob blob;
     l_blob_len integer;
     begin
       select img into l_blob from img;
       l_blob_len :=dbms_lob.getlength(l_blob);
       l_file :=Utl_File.fopen('FF','xt.jpg','wb',32767);
       while l_pos < l_blob_len
        loop
          dbms_lob.read(l_blob,l_amount,l_pos,l_buffer);
          Utl_File.put_raw(l_file,l_buffer,true);
          l_pos :=l_pos+l_amount;
        end loop;
       
        Utl_File.fclose(l_file);
     end;
      

  3.   

    呵呵,灵感来了,自己搞出来了,没有使用CreateTempLob取值,关键是blob字段的赋值,呵呵