存储过程如下: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
请各位达人指教 解决立即给分
(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
请各位达人指教 解决立即给分
客户端可以执行,但也是存取服务器上的数据。
以下操作最好在服务器上执行
一、使用存储过程(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
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;