Oracle的Lob大对象操作
1 --创建有大对象字段的一张表 2 create table test001 3 ( 4 fname varchar2(50), 5 content blob 6 ) 7 8 select * from dba_users; 9 10 select * from test001 11 12 --(一)..准备插入大对象 13 --1. 创建文件存放目录(让Oracle管理,该目录) 14 create or replace directory test_dir 15 as 16 'e:\Pictures'; 17 18 --2.可以将该目录授权给其他用户访问 19 grant read,write on directory test_dir to scott; 20 21 --(二).准备将大对象,存放在test001表中 22 declare 23 tempimg blob;--定义临时变量存放数据 24 tempdir bfile := bfilename('TEST_DIR','Azul.jpg');--非常重要:所有数据都是大写存放的 25 begin 26 insert into test001 values ('first.jpg',empty_blob()) returning content into tempimg; 27 28 --使用内置的包,给tempimg写入数据 29 dbms_lob.fileopen(tempdir);--打开指定文件 30 dbms_lob.loadfromfile(tempimg,tempdir,dbms_lob.getlength(tempdir)); 31 dbms_lob.fileclose(tempdir);--关闭文件 32 33 dbms_output.put_line('恭喜你,终于成功了!!!'); 34 35 commit; 36 end ; 37 38 select * from test001 39 40 select * from dba_directories 41 42 43 --将Blob对象,写成磁盘文件 44 declare 45 l_file utl_file.file_type;--定义写入磁盘文件的类型和格式 46 l_buffer raw(32767);--定义缓冲区大小 47 l_amount binary_integer := 3276; --每次位移个数 48 l_pos int :=1;--开始位置 49 l_blob blob;--临时数据存放 50 l_blob_len int;--总长度 51 begin 52 select content into l_blob from test001; --将数据库中的数据,存放在blob变量中 53 54 --获取blob文件的长度 55 l_blob_len := dbms_lob.getlength(l_blob); 56 57 --准备写入磁盘文件 58 l_file := utl_file.fopen('TEST_DIR','HHAHAHAHAHAHAHAHAAHA.JPG','wb'); 59 60 --写入数据 61 while l_pos<l_blob_len loop 62 dbms_lob.read(l_blob,l_amount,l_pos,l_buffer); 63 utl_file.put_raw(l_file,l_buffer,true); 64 l_pos := l_pos + l_amount; 65 end loop; 66 67 utl_file.fclose(l_file); 68 dbms_output.put_line('恭喜,恭喜。。。。文件写成功!'); 69 end; 70 71 72 /* 73 文本大对象的写入和读取(clob)。 74 */ 75 --写入文本文件第一种方式 76 declare 77 tempimg clob;--定义临时变量存放数据 78 tempdir bfile := bfilename('TEST_DIR','DIV3.html');--非常重要:所有数据都是大写存放的 79 amount int:=dbms_lob.getlength(tempdir); 80 src_offset int:=1; 81 dest_offset int:=1; 82 csid int:=0; 83 lc int:=0; 84 warning int; 85 begin 86 insert into test002 values ('第四个文本文件',empty_clob()) returning content into tempimg; 87 88 --使用内置的包,给tempimg写入数据 89 dbms_lob.fileopen(tempdir);--打开指定文件 90 91 dbms_lob.loadclobfromfile(tempimg,tempdir,amount,dest_offset,src_offset,csid,lc,warning); 92 93 dbms_lob.fileclose(tempdir);--关闭文件 94 95 dbms_output.put_line('恭喜你,终于成功了!!!'); 96 97 commit; 98 end ; 99 100 --写入文本文件第二种方式(通过异常判断文件结束的) 101 declare 102 filecontent clob; 103 input_file utl_file.file_type; 104 buffer varchar2(2000); 105 l_pos int := 1; 106 amount int; 107 begin 108 insert into test002 values ('第二个文本数据',empty_clob()) returning content into filecontent; 109 --打开磁盘文件 110 input_file := utl_file.fopen('TEST_DIR','DIV3.html','r'); 111 112 loop 113 utl_file.get_line(input_file,buffer); 114 115 --获取每次读取的长度 116 amount:=length(buffer);--每次写入的字符长度 117 118 exit when amount<=0; 119 120 dbms_lob.write(filecontent,amount,l_pos,buffer); 121 122 l_pos:=l_pos+amount; 123 124 end loop; 125 126 utl_file.fclose(input_file); 127 128 dbms_output.put_line('文件写入完毕!'); 129 130 exception 131 when no_data_found then 132 dbms_output.put_line('数据已经读取完毕了!'); 133 utl_file.fclose(input_file); 134 end; 135 136 137 select * from test002 138 139 140 141 142 --读取表中的数据,到文件 143 declare 144 src clob; 145 outfile utl_file.file_type; 146 length integer; 147 buffer varchar2(8000); 148 begin 149 select content into src from test002 where fname='第四个文本文件'; 150 151 length := dbms_lob.getlength(src); 152 153 dbms_lob.read(src,length,1,buffer); 154 155 --打开磁盘文件 156 outfile := utl_file.fopen('TEST_DIR','hahahahhahahahah.html','w',8000); 157 158 utl_file.put(outfile,buffer);--写入数据 159 160 utl_file.fclose(outfile); --关闭指针 161 162 dbms_output.put_line('文件已经写入完毕!'); 163 end;