在Oracle中存储Image
						
				
		
		
				
						
						
				 
		
				
						    学习一下如何在Oracle中存储图片、影像等大文件。是从Tom那里搬过来的代码,真的是深入浅出啊,能把复杂的问题弄简单。好了废话不多说了,直接上代码。
				
				
						注意:后面那段是用于直接输出html代码在网页展现的脚本。
				
		
		
				
						
						
				 
		
				
						
						
				 
		
				
						SQL> create table demo
  2  ( id        int primary key,
  3    theBlob   blob
  4  )
  5  /
				
		
		
				
						
						
				 
		
				
						Table created.
				
		
		
				
						
						
				 
		
				
						
						
				 
		
				
						SQL> create or replace directory my_files as 'D:\TEST\Image';
				
		
		
				
						
						
				 
		
				
						Directory created.
				
		
		
				
						
						
				 
		
				
						
						
				 
		
				
						SQL> declare
  2      l_blob    blob;
  3      l_bfile   bfile;
  4  begin
  5      insert into demo values ( 1, empty_blob() )
  6      returning theBlob into l_blob;
  7
  8      l_bfile := bfilename( 'MY_FILES', 'af73.jpg' );
  9      dbms_lob.fileopen( l_bfile );
10
11      dbms_lob.loadfromfile( l_blob, l_bfile,
12                             dbms_lob.getlength( l_bfile ) );
13
14      dbms_lob.fileclose( l_bfile );
15  end;
16  /
				
		
		
				
				 
		
				
						PL/SQL procedure successfully completed.
				
		
		
				
						
						
				 
		
				
						
								--done
						
				
		
		
				
						
						
				 
		
				
						
						
				 
		
				
						
						
				 
		
				
						 
				
		
		
				
				
						--Now here is the package that can retrieve the pdf (or anything for that matter.  Just 
--keep adding procedures that are named after the file type like .doc, .pdf, .xls and so 
--on.  Some browsers really want the extension in the URL to be "correct")
						
				
		
		
				
						SQL> create or replace package image_get
  2  as
  3      procedure gif( p_id in demo.id%type );
  4  end;
  5  /
				
		
		
				
				 
		
				
						Package created.
				
		
		
				
				 
		
				
						SQL>
SQL> create or replace package body image_get
  2  as
  3
  4  procedure gif( p_id in demo.id%type )
  5  is
  6      l_lob   blob;
  7      l_amt   number default 30;
  8      l_off   number default 1;
  9      l_raw   raw(4096);
10  begin
11      select theBlob into l_lob
12        from demo
13       where id = p_id;
14       -- make sure to change this for your type!
15      owa_util.mime_header( 'image/gif' );
16
17          begin
18             loop
19                dbms_lob.read( l_lob, l_amt, l_off, l_raw );
20
21                -- it is vital to use htp.PRN to avoid
22                -- spurious line feeds getting added to your
23                -- document
24                htp.prn( utl_raw.cast_to_varchar2( l_raw ) );
25                l_off := l_off+l_amt;
26                l_amt := 4096;
27             end loop;
28          exception
29             when no_data_found then
30                NULL;
31          end;
32  end;
33
34  end;
35  /
				
		
		
				
				 
		
				
						Package body created.
				
		
		
				
						
						
				 
		
				
						
						
				 
		
				
						
						
				 
		
				
						    注:以上脚本涉及到的系统包有:DBMS_LOB | OWA_UTIL | UTL_RAW | HTP
				
		
		
				
						
						
				 
		
				
						        UTL_RAW might not be installed on your database.  It is part of replication. 
				
		
		
				
						        If you do not have it installed, simply:
				
		
		
				
						        o cd $ORACLE_HOME/rdbms/admin
        o find the two files with "raw" in their name (eg: ls *raw*)
        o using svrmgrl connect as INTERNAL OR SYS -- only these users, no one else can successfully install UTL_RAW
        o run the .sql and then the .plb file
				
		
		
				
						
						
				 
		
				
						    系统包使用方法可查看《PLSQL Packages and Types Reference》