oracle 利用UTL_FILE包操作文件

前几天做了用oracle写对表增加,修改时的触发器,触发器内容为每日生成本地文本文件,文件内容为增加、修改表的数据,以便自动上传到服务器上同步数据。

首先要在本地建立生成文件的目录,这个目录可以设置成oracle的目录变量对应起来,而且要用管理员账号登录赋予对这个目录的读写权限,否则会报错,对目录或文件操作错误等信息;然后就可以写触发器了,思路为如果当天没有生成文件,即建立文件,并写入文件表头信息,下面紧跟着写数据信息,如果存在该文件,就直接写数据。

create or replace trigger tr_test  after insert or update or delete on bd_test  for each row
declare
   Out_File    UTL_FILE.FILE_TYPE;
   DataHead    varchar2(80);
   --DataLine    varchar2(80);
   FileName    varchar2(80);
   --vNewLine VARCHAR2(250);
   opertype  varchar2(500);
   msg varchar2(500);
   file_exist BOOLEAN;
   file_length NUMBER(10,2);
   block_size BINARY_INTEGER;
 
   begin
   FileName:='JiFang_'||to_char(sysdate,'yyyy.mm.dd')||'.txt'; 
   utl_file.fgetattr('TESTDIR',FileName,file_exist,file_length, block_size);
  
   IF file_exist  THEN
     Out_File:=UTL_FILE.fopen('TESTDIR',FileName,'a'); 
   else      
      Out_File:=UTL_FILE.fopen('TESTDIR',FileName,'a');--W为覆盖
      DataHead:='ID'||'名称'||'机房位置' || '地址' ||'x坐标'||'Y坐标'||'操作';
       IF utl_file.is_open(Out_File) THEN
          UTL_FILE.put_line(Out_File,DataHead); 
       END IF;
   END IF;  
         IF utl_file.is_open(Out_File) THEN    
             case
                 when inserting then
                  opertype:='INSERT';
                   msg:=:new.id||:new.MINGCHENG||:new.JIAFANGDANWEI||:new.DIZHI||:new.X||:new.Y||opertype;
                 when updating THEN
                 opertype:='UPDATE';
                 msg:=:new.id||:new.MINGCHENG||:new.JIAFANGDANWEI||:new.DIZHI||:new.X||:new.Y||opertype;
                 when DELETING THEN
                 opertype:='DELETE';
                 msg:=:old.id||:old.MINGCHENG||:old.JIAFANGDANWEI||:old.DIZHI||:old.X||:old.Y||opertype; 
             end case;  

    UTL_FILE.put_line(Out_File,msg);            
         END IF;      
       utl_file.fclose(Out_File);    
end tr_test;

另外,查看和修改utl_file_dir参数命令,修改后要重新启动数据库。

show parameter utl_file_dir
alter system set utl_file_dir = 'D:\test' scope=spfile;

授权目录操作权限,管理员账户操作。

create or replace directory BLOBDIR as 'D:\PIC';
grant read,write on directory BLOBDIR to sharedb;
GRANT EXECUTE ON utl_file TO sharedb;
select * from ALL_DIRECTORIES;


posted @ 2010-11-19 15:10  anny0320  阅读(4308)  评论(0编辑  收藏  举报