oracle 利用UTL_FILE包操作文件

摘录自:http://www.cnblogs.com/pinbo/

前几天做了用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;

你可能感兴趣的:(oracle)