侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

精通Oracle10编程SQL(16)使用LOB对象

数据库  /  管理员 发布于 3年前   137

/* *使用LOB对象 */--LOB(Large Object)是专门用于处理大对象的一种数据类型,其所存放的数据长度可以达到4G字节--CLOB/NCLOB用于存储大批量字符数据,BLOB用于存储大批量二进制数据,而BFILE则存储着指向OS文件的指针/* *综合实例 */--建立表空间 --#指定区尺寸为128k,如不指定,区尺寸默认为64k CREATE TABLESPACE EAS_D_HAIYA_STANDARD DATAFILE '/oracleDB/oradata/db/EAS_D_HAIYA_STANDARD.ORA' SIZE 500M;-- UNIFORM SIZE 128k; DROP TABLESPACE EAS_D_HAIYA_STANDARD INCLUDING CONTENTS AND DATAFILES;--建立临时表空间 CREATE TEMPORARY TABLESPACE EAS_T_HAIYA_STANDARD TEMPFILE '/oracleDB/oradata/db/EAS_T_HAIYA_STANDARD.ORA' SIZE 50M;DROP TABLESPACE EAS_T_HAIYA_STANDARD INCLUDING CONTENTS AND DATAFILES;--创建用户并指定表空间create user haiya identified by kingdee       default tablespace EAS_D_HAIYA_STANDARD          temporary tablespace EAS_T_HAIYA_STANDARD;drop user haiya cascade;--建立表空间(这样建立表空间才能不报错) Create tablespace EAS_D_HAIYA_STANDARD Datafile '/oracleDB/oradata/db/EAS_D_HAIYA_STANDARD.ORA' size 10000M reuse autoextend on next 2M maxsize unlimited;       Create temporary tablespace EAS_T_HAIYA_STANDARD TEMPFILE '/oracleDB/oradata/db/EAS_T_HAIYA_STANDARD.ORA' size 500M reuse autoextend on next 1M maxsize unlimited;create user haiya Identified by kingdee Default tablespace EAS_D_HAIYA_STANDARD temporary tablespace EAS_T_HAIYA_STANDARD Quota unlimited on EAS_D_HAIYA_STANDARD;--给用户赋DBA权限grant dba to haiya;revoke dba from haiya;Grant create session,create table,create procedure,create sequence,create trigger,create view,SELECT ANY DICTIONARY to haiya;--之后操作以haiya用户登录--一.查询ORACLE SERVER端的字符集select userenv('language') from dual;select * from nls_database_parameters;--来源于props$,表示数据库的字符集--查询客户端字符集环境select * from nls_instance_parameters;--来源于v$parameter,表示客户端的字符集的设置,可能是参数文件,环境变量或者是注册表--查询oracle client端的字符集--在windows平台下,就是注册表里面相应OracleHome的NLS_LANG。还可以在dos窗口里面自己设置,--比如: set nls_lang=AMERICAN_AMERICA.ZHS16GBK--这样就只影响这个窗口里面的环境变量。   --在unix平台下,就是环境变量NLS_LANG.$echo $NLS_LANGAMERICAN_AMERICA.ZHS16GBK--如果检查的结果发现server端与client端字符集不一致,请统一修改为同server端相同的字符集。--二.修改server端字符集(不建议使用)       --1.关闭数据库--SQL>SHUTDOWN IMMEDIATE --2.启动到Mount--SQL>STARTUP MOUNT;--SQL>ALTER SYSTEM ENABLE RESTRICTED SESSION;--SQL>ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;--SQL>ALTER SYSTEM SET AQ_TM_PROCESSES=0;--SQL>ALTER DATABASE OPEN;--SQL>ALTER DATABASE CHARACTER SET ZHS16GBK;--SQL>ALTER DATABASE national CHARACTER SET ZHS16GBK;--SQL>SHUTDOWN IMMEDIATE;--SQL>STARTUP--注意:如果没有大对象,在使用过程中进行语言转换没有什么影响,(切记设定的字符集必须是ORACLE支持,不然不能start) 按上面的做法就可以。 --若出现‘ORA-12717: Cannot ALTER DATABASE NATIONAL CHARACTER SET when NCLOB data exists’ 这样的提示信息,--要解决这个问题有两种方法--1. 利用INTERNAL_USE 关键字修改区域设置,--2. 利用re-create,但是re-create有点复杂,所以请用internal_use--SQL>SHUTDOWN IMMEDIATE;--SQL>STARTUP MOUNT EXCLUSIVE;--SQL>ALTER SYSTEM ENABLE RESTRICTED SESSION;--SQL>ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;--SQL>ALTER SYSTEM SET AQ_TM_PROCESSES=0;--SQL>ALTER DATABASE OPEN;--SQL>ALTER DATABASE NATIONAL CHARACTER SET INTERNAL_USE UTF8;--SQL>SHUTDOWN immediate;--SQL>startup;--如果按上面的做法做,National charset的区域设置就没有问题--1.使用CLOB数据类型--创建CLOB_TABLE表如出现超出表空间的空间限量的错误,应重新创建表空间并如上用户--以haiya用户登录CREATE TABLE CLOB_TABLE(  id NUMBER(3) PRIMARY KEY,  remark CLOB    --remark:备注 );INSERT INTO CLOB_TABLE(id) VALUES(1);  --remark列没有定位器,并且没有数据INSERT INTO CLOB_TABLE VALUES(2,'ID2'); --remark列有定位器,并且有数据INSERT INTO CLOB_TABLE VALUES(3,empty_clob());--remark含有定位器,但是没有数据select * from clob_table for update;--检索定位器的值:DECLAREmyLob CLOB; BEGIN  SELECT remark INTO myLob FROM CLOB_TABLE WHERE id=1; --1,2或者3  IF myLob IS NULL THEN    DBMS_OUTPUT.PUT_LINE('myLob IS NULL');  ELSE    DBMS_OUTPUT.PUT_LINE(myLob );  END IF;END;--修改id为1的remark列,使其具有定位器:UPDATE CLOB_TABLE SET remark=empty_clob() WHERE id=1;--向CLOB列追加数据DECLAREmyLob CLOB;buffer VARCHAR2(20) := '这是第一次追加的内容';amount INT;offset INT;BEGIN  --要想能够修改LOB数据,必须指定FOR UPDATE子句   SELECT remark INTO myLob FROM CLOB_TABLE WHERE id=2 FOR UPDATE ;  amount:=LENGTH( buffer );  --获取追加文本的长度   offset:=DBMS_LOB.GETLENGTH (myLob)+1;  --获取定位器引用的LOB数据的 长度   DBMS_LOB.WRITE(myLob,amount,offset, buffer );-- 向CLOB列追加数据,每次最大追加32767字节。要注意必须先存在定位器才能追加数据,否则会出现invalid LOB locator specified: ORA-22275错误。   --DBMS_LOB.WRITEAPPEND(myLob,amount, buffer );--使用这个函数不用考虑offset参数 END;--读取CLOB数据DECLAREmyLob CLOB;text VARCHAR2(40);amount INT;offset INT;BEGIN  SELECT remark INTO myLob FROM CLOB_TABLE WHERE id=2;  amount:=15;  offset:=3;  --从LOB数据中的第三个字符开始读取共读取15个字符放入到text变量   DBMS_LOB.READ(myLob,amount,offset,text);  DBMS_OUTPUT.PUT_LINE(text);END;--2.使用BFILE数据类型CREATE DIRECTORY TestDir as 'D:\TestDir'; --注意此语句不会在操作系统上创建文件夹--创建含有BFile数据类型的列,并插入数据CREATE TABLE BFILE_TABLE(ID NUMBER PRIMARY KEY,remark BFILE);--插入数据insert into bfile_table(id) values(1);update bfile_table set remark=BFILENAME('TESTDIR','1.txt');insert into bfile_table(id,remark) values(2,bfilename('TESTDIR','2.doc'));--注意:BFILE数据类型指向的文件,即可以是文本文件,也可以是二进制文件。--而且BFILE数据类型不能通过SELECT语句直接查看其内容--将BFile文件的内容读取到CLOB列(前提是BFile文件是文本文件)DECLAREsrc   BFILE;des   CLOB;amount    INT;src_offset INT :=1;des_offset INT :=1;csid INT :=850;lc   INT :=0;warning INT;BEGIN  SELECT remark INTO src FROM BFile_TABLE WHERE id=1;  SELECT remark INTO des FROM CLOB_TABLE WHERE id=1 FOR UPDATE ;  DBMS_LOB.FILEOPEN(src,DBMS_LOB.FILE_READONLY);  amount:=DBMS_LOB.GETLENGTH(src);  DBMS_OUTPUT.PUT_LINE(amount);  DBMS_LOB.LOADCLOBFROMFILE (des,src,amount,des_offset,src_offset,csid,lc,warning);  DBMS_LOB.CLOSE(src);END;--3.使用BLOB数据类型--创建带有BLOB列的表并插入数据CREATE TABLE BLOB_TABLE( id NUMBER(3), remark BLOB);INSERT INTO BLOB_TABLE VALUES(1,EMPTY_BLOB());select * from blob_table;--将文件内容插入到BLOB列:DECLAREsrc   BFILE;des   BLOB;amount    INT;src_offset INT :=1;des_offset INT :=1;csid INT :=0;lc   INT :=0;warning INT;BEGIN  src:=BFILENAME('TESTDIR','1.txt');  SELECT remark INTO des FROM BLOB_TABLE WHERE id=1 FOR UPDATE;  DBMS_LOB.FILEOPEN(src,DBMS_LOB.FILE_READONLY);  amount:=DBMS_LOB.GETLENGTH(src);  DBMS_OUTPUT.PUT_LINE(amount);  DBMS_LOB.LOADBLOBFROMFILE (des,src,amount,des_offset,src_offset);  DBMS_LOB.CLOSE(src);END;--DBMS_LOB包--过程APPENDDECLARE   dest_lob CLOB;   src_lob CLOB;BEGIN   src_lob:='中国';   dest_lob:='你好,';   dbms_lob.append(dest_lob,src_lob);   dbms_output.put_line(dest_lob);END;--过程CLOSE:关闭已经打开的LOB,它不仅适用于CLOB/NCLOB和BLOB类型,也适用于BFILE类型--语法如下:DBMS_LOB.CLOSE(lob_loc IN OUT NOCOPY BLOB/CLOB/BFILE);--函数COMPARE--注意,该函数只能用于比较同类型的LOB变量--语法如下:--DBMS_LOB.COMPARE(lob_1 in BLOB/CLOB/BFILE,lob_2 in BLOB/CLOB/BFILE,amount in integer:=4294967295,offset_1 in integer:=1,offset_2 in integer:=1) return integer;--lob_1用于指定第一个LOB变量,lob_2用于指定第二个LOB变量,amount用于指定字符个数(CLOB)或字节个数(BLOB),offset_1用于指定第一个LOB的起始比较位置,offset_2用于指定第二个LOB的起始比较位置。--如果比较结果相同,则返回0,如果比较结果不同,则返回一个非0的整数。DECLARE   dest_lob CLOB;   src_lob CLOB;BEGIN   src_lob:='中国';   dest_lob:='&content';   if dbms_lob.compare(src_lob,dest_lob)=0 then      dbms_output.put_line('内容相同');   else      dbms_output.put_line('内容不同');   end if;END;--过程COPY--该过程用于将源LOB变量的部分或全部内容复制到目标LOB变量中,它只适用于内部LOB类型(CLOB/NCLOB/BLOB),而不适用于BFILE类型--语法如下:--DBMS_LOB.COPY(dest_lob in out NOCOPY BLOB/CLOB/NCLOB,src_lob in BLOB/CLOB/NCLOB,amount in integer,dest_offset in integer:=1,src_offset in integer:=1,src_offset in integer:=1);--dest_offset用于指定要复制到目标LOB变量的起始位置,src_offset用于指定源LOB变量中开始复制的起始位置。DECLARE   dest_lob clob;   src_lob clob;   amount int;BEGIN   src_lob:='中国';   dest_lob:='你好,';   amount:=dbms_lob.getlength(src_lob);   dbms_lob.copy(dest_lob,src_lob,amount,3);   dbms_output.put_line(dest_lob);END;--过程CREATETEMPORARY--建立临时LOB,只适用于内部LOB类型(BLOB/CLOB/NCLOB),但不适用于BFILE类型。--当执行该过程建立临时LOB时,ORACLE会将该临时LOB建立在用户的临时表空间中--语法如下--DBMS_LOB.CREATETEMPORARY(lob_loc in out NOCOPY BLOB/CLOB/NCLOB,cache in boolean,dur in pls_integer:=10);--lob_loc用于指定LOB定位符,cache用于指定是否要将LOB读取到缓冲区,dur用于指定何时清除临时LOB(10:会话结束清除临时LOB,12:调用结束清除临时LOB)DECLARE   src_lob CLOB;begin   dbms_lob.createtemporary(src_lob,true);end;--过程ERASE--用于删除LOB变量的全部内容或部分内容,只适用于内部LOB类型(BLOB/CLOB/NCLOB),而不适用于BFILE类型DECLARE   src_lob clob;   offset int;   amount int;begin   src_lob:='欢迎使用PL/SQL编程指南';   amount:=10;   offset:=5;   dbms_lob.erase(src_lob,amount,offset);   dbms_output.put_line(src_lob);end;--过程FILECLOSE--用于关闭已经打开的BFILE定位符所指向的OS文件DBMS_LOB.fileclose(file_loc in out NOCOPY bfile);--过程FILECLOSEALL--用于关闭当前会话已经打开的所有BFILE文件DBMS_LOB.filecloseall;--函数FILEEXISTS--用于确定BFILE定位符所指向的OS文件是否存在DBMS_LOB.fileexists(file_loc in bfile) return integer;--如果文件存在,则返回1,如果文件不存在,则返回0--以system用户登录,给当前用户赋创建directory的权限grant create any directory to haiya;grant drop any directory to haiya;--(删除权限)--以haiya用户登录,创建一个目录create or replace directory bfile_data as 'D:\';DECLARE   file1 BFILE;begin   --创建bfile locator,使用bfilename函数,directory是大小写敏感的,一定要大写   file1:=bfilename('BFILE_DATA','README.DOC');   if dbms_lob.fileexists(file1) = 0 then      dbms_output.put_line('文件不存在');   else      dbms_output.put_line('文件存在');   end if;end;--过程FILEGETNAME--用于取得BFILE定位符所对应的目录别名和文件名DECLARE   dir_alias varchar2(20);   filename varchar2(50);   file_loc bfile;begin   select remark into file_loc from BFILE_TABLE where id = &id;   dbms_lob.filegetname(file_loc,dir_alias,filename);   dbms_output.put_line('目录别名:'||dir_alias);   dbms_output.put_line('文件名:'||filename);end;--函数FILEISOPEN--用于确定BFILE所对应的OS文件是否已经打开--如果文件已经被打开,则返回1,如果文件没有被打开,则返回0DECLARE   file1 BFILE;BEGIN   file1:=bfilename('TESTDIR','2.doc');   if dbms_lob.fileisopen(file1)=0 then      dbms_output.put_line('文件未打开');   else      dbms_output.put_line('文件已经打开');   end if;END;--过程FILEOPEN--用于打开BFILE所对应的OS文件--注意,OS文件只能以只读方式打开DECLARE   file1 BFILE;BEGIN   file1:=bfilename('TESTDIR','2.doc');   if dbms_lob.fileexists(file1) = 1 then      dbms_lob.fileopen(file1);      dbms_output.put_line('文件已经被打开');   end if;   dbms_lob.fileclose(file1);END;--过程FREETEMPORARY--用于释放在默认临时表空间中的临时LOBDECLARE   src_lob clob;begin   dbms_lob.createtemporary(src_lob,true);   src_lob:='中华人民共和国';   dbms_lob.freetemporary(src_lob);end;--函数GETCHUNKSIZE--当建立包含CLOB列或BLOB列的表时,通过指定CHUNK参数可以指定操纵LOB需要分配的字节数(该值是数据块尺寸的整数倍),如果不指定该参数,其--默认值为数据块的尺寸。通过使用函数GETCHUNKSIZE,可以取得CHUNK参数对应的值DECLARE   src_lob clob;   chunksize int;begin   src_lob:='中华人民共和国';   chunksize:=dbms_lob.getchunksize(src_lob);   dbms_output.put_line('CHUNK尺寸:'||chunksize);end;--函数GETLENGTH--用于取得LOB数据的实际长度,不仅适用于CLOB和BLOB类型,也适用于BFILE类型DECLARE   file1 bfile;   length int;begin   file1:=bfilename('TESTDIR','2.doc');   length:=dbms_lob.getlength(file1);   dbms_output.put_line('文件长度:'||length);end;--函数INSTR--用于返回特定样式数所据在LOB中从某偏移位置开始第n次出现时的具体位置,它不仅适用于BLOB和CLOB类型,也适用于BFILE类型DECLARE   src_lob clob;   location int;   offset int;   occurence int;begin   src_lob:='中国,中国,伟大的中国';   offset:=2;   occurence:=2;   location:=dbms_lob.instr(src_lob,'中国',offset,occurence);   dbms_output.put_line('从第'||offset||'字符开始,中国第'||occurence||'次出现的具体位置:'||location);end;--函数ISOPEN--用于确定LOB是否已经被打开,适用于BLOB、CLOB和BFILE类型--如果LOB已经被打开,则返回1,否则返回0DECLARE  src_lob clob;begin  src_lob:='中国,中国,伟大的中国';  if dbms_lob.isopen(src_lob)=0 then     dbms_lob.open(src_lob,1);  end if;  dbms_lob.close(src_lob);end;--函数ISTEMPORARY--用于确定LOB定位符是否为临时LOBdeclare   src_lob clob;begin   if dbms_lob.istemporary(src_lob) = 1 then      dbms_output.put_line('已经是临时LOB');   else      dbms_output.put_line('临时LOB需要建立');      dbms_lob.createtemporary(src_lob,true);   end if;   dbms_lob.freetemporary(src_lob);end;--过程LOADFROMFILE--用于将BFILE的部分或者全部内容复制到目标LOB变量(CLOB或者BLOB)中--注意:当使用该过程将BFILE数据装载到CLOB中时,不会进行字符集转换,因此要确保BFILE数据与数据库具有相同字符集,否则装载后的数据为乱码DECLARE   src_lob bfile;   dest_lob clob;   amount int;begin   src_lob:=bfilename('TESTDIR','1.txt');   dbms_lob.createtemporary(dest_lob,true);   dbms_lob.fileopen(src_lob,0);   amount:=dbms_lob.getlength(src_lob);   dbms_output.put_line('amount:'||amount);   dbms_lob.loadfromfile(dest_lob,src_lob,amount);   dbms_lob.fileclose(src_lob);   dbms_lob.freetemporary(dest_lob);end;--过程LOADBLOBFROMFILE--用于将BFILE数据装载到BLOB中,并且在装载后可以取得新的偏移位置DECLARE   src_lob bfile;   dest_lob blob;   amount int;   src_offset int:=1;   dest_offset int:=1;begin   src_lob:=bfilename('TESTDIR','1.txt');   dbms_lob.createtemporary(dest_lob,true);   dbms_lob.fileopen(src_lob,0);   amount:=dbms_lob.getlength(src_lob);   dbms_lob.loadblobfromfile(dest_lob,src_lob,amount,dest_offset,src_offset);   dbms_lob.fileclose(src_lob);   dbms_lob.freetemporary(dest_lob);   dbms_output.put_line('新的偏移位置:'||dest_offset);end;--过程LOADCLOBFROMFILE--用于将BFILE数据装载到CLOB中,当使用该过程装载数据到CLOB中时,可以指定字符集ID号,并进行字符集转换。--因此,建议在装载BFILE数据到CLOB中时使用该过程DECLARE   src_lob bfile;   dest_lob clob;   amount int;   src_offset int:=1;   dest_offset int:=1;   csid int:=0;   lc int:=0;   waring int;begin   src_lob:=bfilename('TESTDIR','1.txt');   dbms_lob.createtemporary(dest_lob,true);   dbms_lob.fileopen(src_lob,0);   amount:=dbms_lob.getlength(src_lob);   dbms_lob.loadclobfromfile(dest_lob,src_lob,amount,dest_offset,src_offset,csid,lc,waring);   dbms_lob.fileclose(src_lob);   dbms_output.put_line(dest_lob);   dbms_lob.freetemporary(dest_lob);end;--过程OPEN--用于在打开LOB时指定LOB的读写模式:只读(dbms_lob.lob_readonly)、读写(dbms_lob.lob_readwrite)DECLARE   src_lob clob;   v1 varchar2(100):='中华人民共和国';   amount int;begin   amount:=length(v1);   dbms_lob.createtemporary(src_lob,true);   dbms_lob.open(src_lob,dbms_lob.lob_readwrite);   dbms_lob.write(src_lob,amount,1,v1);   dbms_lob.close(src_lob);   dbms_output.put_line(src_lob);   dbms_lob.freetemporary(src_lob);end;--过程READ--用于将LOB数据读取到绊缓冲区中,不仅适用于BLOB和CLOB,也适用于BFILEDECLARE   src_lob clob:='伟大的中国';   amount int;   buffer varchar2(200);   offset int:=1;begin   amount:=dbms_lob.getlength(src_lob);   dbms_lob.open(src_lob,dbms_lob.lob_readonly);   dbms_lob.read(src_lob,amount,offset,buffer);   dbms_output.put_line(buffer);   dbms_lob.close(src_lob);end;--函数SUBSTR--用于返回LOB中从指定位置开始的部分内容,不仅适用于BLOB和CLOB,也适用于BFILEDECLARE   src_lob clob:='中国,中国,伟大的中国';   amount int;   v1 varchar2(200);   offset int;begin   amount:=10;   offset:=4;   v1:=dbms_lob.substr(src_lob,amount,offset);   dbms_output.put_line(v1);end;--过程TRIM--用于截断LOB内容到指定长度,只适用于BLOB和CLOB,不适用于BFILEDECLARE   src_lob clob:='中国,中国,伟大的中国';   amount int;begin   amount:=5;   dbms_lob.trim(src_lob,amount);   dbms_output.put_line(src_lob);end;--过程WRITE--用于将缓冲区数据写入到LOB中的特定位置,只适用于BLOB和CLOB,而不适用于BFILEDECLARE   src_lob clob:='我的祖国';   amount int;   offset int;   buffer varchar2(100):=',伟大的中国';begin   offset:=dbms_lob.getlength(src_lob)+1;   amount:=length(buffer);   dbms_lob.write(src_lob,amount,offset,buffer);   dbms_output.put_line(src_lob);end;--过程WRITEAPPEND--用于将缓冲区数据写入到LOB尾部,只适用于BLOB和CLOB,而不适用于BFILEDECLARE   src_lob clob:='我的祖国';   amount int;   buffer varchar2(100):=',伟大的中国';begin   amount:=length(buffer);   dbms_lob.writeappend(src_lob,amount,buffer);   dbms_output.put_line(src_lob);end;--访问LOB--访问CLOB--建立包含CLOB列的表CREATE TABLE lob_example1(id number(6) primary key,name varchar2(10),resume clob);--初始化CLOB列insert into lob_example1 values(1,'王鸣',empty_clob());insert into lob_example1 values(2,'马丽',empty_clob());commit;select * from lob_example1;--更新CLOB列的数据DECLARE  lob_loc CLOB;  text varchar2(200);  amount int;  offset int;begin  select resume into lob_loc from lob_example1 where id=&id for update;  offset:=DBMS_LOB.getlength(lob_loc)+1;  text:='&resume';  amount:=length(text);  dbms_lob.write(lob_loc,amount,offset,text);  commit;end;select * from lob_example1;--读取CLOB列的内容--第6个字符开始的所有字符DECLARE   lob_loc clob;   buffer varchar2(200);   amount int;   offset int;BEGIN     SELECT resume into lob_loc from lob_example1 where id=&id;     offset:=6;     amount:=dbms_lob.getlength(lob_loc);     dbms_lob.read(lob_loc,amount,offset,buffer);     dbms_output.put_line(buffer);END;--将文本文件内容写入到CLOB列DECLARE   lobloc CLOB;   fileloc bfile;   amount int;   src_offset int:=1;   dest_offset int:=1;   csid int:=0;   lc int:=0;   warning int;BEGIN   fileloc:=bfilename('TESTDIR','马丽.txt');   DBMS_LOB.fileopen(fileloc,0);   amount:=dbms_lob.getlength(fileloc);   select resume into lobloc from lob_example1 where id=2 for update;   dbms_lob.loadclobfromfile(lobloc,fileloc,amount,dest_offset,src_offset,csid,lc,warning);   dbms_lob.fileclose(fileloc);   commit;END;select * from lob_example1;--将CLOB列内容写入到文本文件--下面将RESUME列的内容写入到文本文件d:\testDir\a.txt中为例,说明将CLOB列的内容写入到文本文件的方法DECLARE   lobloc clob;   amount int;   offset int:=1;   buffer varchar2(2000);   handle utl_file.file_type;begin   select resume into lobloc from lob_example1 where id=&id;   amount:=dbms_lob.getlength(lobloc);   dbms_lob.read(lobloc,amount,offset,buffer);   handle:=utl_file.fopen('TESTDIR','a.txt','w',2000);   utl_file.put_line(handle,buffer);   utl_file.fclose(handle);end;--访问BLOB--建立包含BLOB列的表--当在表中定义存放大批量二进制数据(例如图形/图象数据)的列时,应该选择BLOB类型CREATE TABLE lob_example2(id number(6) primary key,name varchar2(10),photo blob);--初始化BLOB列INSERT INTO lob_example2 values(1,'王鸣',empty_blob());insert into lob_example2 values(2,'马丽',empty_blob());commit;select * from lob_example2;--将二进制文件内容写入BLOB列DECLARE    lobloc blob;    fileloc bfile;    amount int;    src_offset int:=1;    dest_offset int:=1;begin    select photo into lobloc from lob_example2 where id=&id for update;    fileloc:=bfilename('TESTDIR','&filename');    dbms_lob.fileopen(fileloc,0);    amount:=dbms_lob.getlength(fileloc);    dbms_lob.loadblobfromfile(lobloc,fileloc,amount,dest_offset,src_offset);    dbms_lob.fileclose(fileloc);    commit;end;--读取BLOB列数据--因为BLOB列中存放着二进制数据,所以当读取其数据时应该使用RAW变量接收其数据--读取BLOB列的数据可以使用包DBMS_LOB的过程READ来完成declare   lobloc blob;   buffer raw(20000);   amount int;   offset int:=1;begin   select photo into lobloc from lob_example2 where id=&id;   amount:=dbms_lob.getlength(lobloc);   dbms_output.put_line(amount);   dbms_lob.read(lobloc,amount,offset,buffer);end;select * from lob_example2;--将BLOB列的内容写入到二进制文件DECLARE   lobloc blob;   amount int;   offset int:=1;   buffer raw(2000);   handle utl_file.file_type;begin   select photo into lobloc from lob_example2 where id=&id;   amount:=dbms_lob.getlength(lobloc);   dbms_lob.read(lobloc,amount,offset,buffer);   handle:=utl_file.fopen('TESTDIR','a.bmp','w',1000);   utl_file.put_raw(handle,buffer);   utl_file.fclose(handle);end;--访问BFILE--建立包含BFILE列的表CREATE TABLE lob_example3(id number(6) primary key,name varchar2(10),resume bfile);--初始化BFILE列insert into lob_example3 values(1,'王鸣',bfilename('TESTDIR','王鸣.jpg'));insert into lob_example3 values(2,'马丽',bfilename('TESTDIR','马丽.jpg'));commit;select * from lob_example3;--读取BFILE列的内容DECLARE   buffer RAW(2000);   amount int;   offset int;   lobloc bfile;begin   select resume into lobloc from lob_example3 where id=&id;   dbms_lob.fileopen(lobloc,0);   amount:=dbms_lob.getlength(lobloc);   offset:=1;   dbms_lob.read(lobloc,amount,offset,buffer);   dbms_lob.fileclose(lobloc);end;

 


  • 上一条:
    精通Oracle10编程SQL(15)使用对象类型
    下一条:
    精通Oracle10编程SQL(17)使用ORACLE系统包
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • mysql5.7中实现分区表及分区where in查询示例及分区分表对比浅析(0个评论)
    • mysql中sql_mode的各模式浅析(0个评论)
    • 预处理之SQL参数化查询是如何防止SQL注入的浅析(0个评论)
    • 使用Navicat把mysql5.7版本的数据库导入至mysql8.1版本中流程步骤(0个评论)
    • 在mysql中设置表字段中COLLATE、CHARSET详解(0个评论)
    • 近期文章
    • ChatGPT再出新功能,推出插件功能,能联网、搜索了(0个评论)
    • 在go语言中使用GoPDF包把html生成PDF文件示例(0个评论)
    • 在go语言中创建和解析(读取)符号链接示例(0个评论)
    • ubuntu 22.04系统中报错:Python 3.6 is no longer supported by the Python core team...解决方式(0个评论)
    • Laravel 10.4版本发布(0个评论)
    • mysql5.7中实现分区表及分区where in查询示例及分区分表对比浅析(0个评论)
    • nginx + vue配置实现同域名下不同路径访问不同项目(0个评论)
    • 在laravel框架中的5个HTTP客户端技巧分享(0个评论)
    • 在go语言中使用FFmpeg库实现PCM音频文件编码为mp3格式文件流程步骤(0个评论)
    • gopacket免安装Pcap实现驱动层流量抓包流程步骤(0个评论)
    • 近期评论
    • 博主 在

      2023年国务院办公厅春节放假通知:1月21日起休7天中评论 @ xiaoB 你只管努力,剩下的叫给天意;天若有情天亦老,..
    • xiaoB 在

      2023年国务院办公厅春节放假通知:1月21日起休7天中评论 会不会春节放假后又阳一次?..
    • BUG4 在

      你翻墙过吗?国内使用vpn翻墙可能会被网警抓,你需了解的事中评论 不是吧?..
    • 博主 在

      go语言+beego框架中获取get,post请求的所有参数中评论 @ t1  直接在router.go文件中配就ok..
    • Jade 在

      如何在MySQL查询中获得当月记录中评论 Dear zongscan.com team, We can skyroc..
    • 2017-06
    • 2017-08
    • 2017-09
    • 2017-10
    • 2017-11
    • 2018-01
    • 2018-05
    • 2018-10
    • 2018-11
    • 2020-02
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-08
    • 2020-09
    • 2021-02
    • 2021-04
    • 2021-07
    • 2021-08
    • 2021-11
    • 2021-12
    • 2022-02
    • 2022-03
    • 2022-05
    • 2022-06
    • 2022-07
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-03
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客