Oracle的建立文件

1.建立目錄(須要在服務器上建立對應的目錄)
create or replace directory testdir as '/u01/software/test';
2.給用戶受權(這裏可能會有問題,找不到xxx用戶,須要建立用戶)
grant read,write on directory testdir to xxx;
3.寫入文件腳本web

declare
  filehandle utl_file.file_type; --句柄
begin
  filehandle := utl_file.fopen('TESTDIR', 'hello.txt', 'w'); --打開文件
  utl_file.put_line(filehandle, 'Hello World!');
  utl_file.fclose(filehandle); --關閉句柄
end;

暫存另外一份腳本服務器

create or replace procedure get_test_blob(i_id varchar2) is
  l_file     utl_file.file_type;
  l_filename varchar2(300);
  v_modules varchar2(3000);
  v_classes varchar2(3000);
  v_proc    varchar2(3000);
  v_sysdate varchar2(3000);
  v_count   number;
begin
  l_filename := to_char(sysdate, 'yyyymmdd') || i_id ||'.sh';
  l_file     := utl_file.fopen('TESTDIR', l_filename, 'w');
  dbms_output.put_line('===OPEN OK===' || l_filename);
  dbms_output.put_line('#!/bin/sh');
  utl_file.put_line(l_file, '#!/bin/sh'); --寫入文件

  v_sysdate := to_char(sysdate, 'yyyymmdd') || i_id;
  v_modules := '/u01/srm/prod/' || v_sysdate || '/webapp/webRoot/';
  v_classes := '/u01/srm/prod/' || v_sysdate ||
               '/webapp/webRoot/WEB-INF/classes/';
  v_proc    := '/u01/srm/prod/' || v_sysdate || '/jobRunner/';

  dbms_output.put_line('mkdir -p /u01/srm/prod/' || v_sysdate ||
                       '/webapp/webRoot/modules');
  dbms_output.put_line('mkdir -p /u01/srm/prod/' || v_sysdate ||
                       '/webapp/webRoot/WEB-INF/classes');

  utl_file.put_line(l_file,
                    'mkdir -p /u01/srm/prod/' || v_sysdate ||
                    '/webapp/webRoot/modules');
  utl_file.put_line(l_file,
                    'mkdir -p /u01/srm/prod/' || v_sysdate ||
                    '/webapp/webRoot/WEB-INF/classes');
  select count(*) into v_count from h3c_test_pro_proc;
  if v_count > 0 then
    dbms_output.put_line('mkdir -p /u01/srm/prod/' || v_sysdate ||
                         '/jobRunner');
    utl_file.put_line(l_file,
                      'mkdir -p /u01/srm/prod/' || v_sysdate ||
                      '/jobRunner');
  end if;

  dbms_output.put_line('#screen');
  utl_file.put_line(l_file, '#screen');
  for rec in (select distinct trim(h.screen_path) screen_path
                from h3c_test_pro_screen h) loop
    --複製某個目錄下的文件
    if rec.screen_path like '%.screen' or rec.screen_path like '%.svc' then
      dbms_output.put_line('mkdir -p ' || v_modules ||
                           substr(rec.screen_path,
                                  1,
                                  instr(rec.screen_path,
                                        '/',
                                        1,
                                        length(rec.screen_path) -
                                        length(replace(rec.screen_path,
                                                       '/',
                                                       '')))));
    
      dbms_output.put_line('cp -rn /u01/srm/webapp/webRoot/' ||
                           rec.screen_path || ' ' || v_modules ||
                           rec.screen_path);
    
      utl_file.put_line(l_file,
                        'mkdir -p ' || v_modules ||
                        substr(rec.screen_path,
                               1,
                               instr(rec.screen_path,
                                     '/',
                                     1,
                                     length(rec.screen_path) -
                                     length(replace(rec.screen_path, '/', '')))));
      utl_file.put_line(l_file,
                        'cp -rn /u01/srm/webapp/webRoot/' ||
                        rec.screen_path || ' ' || v_modules ||
                        rec.screen_path);
      --複製文件夾
    else
      dbms_output.put_line('mkdir -p ' || v_modules || rec.screen_path);
      dbms_output.put_line('cp -rn /u01/srm/webapp/webRoot/' ||
                           rec.screen_path || ' ' || v_modules ||
                           substr(rec.screen_path,
                                  1,
                                  instr(rec.screen_path,
                                        '/',
                                        1,
                                        length(rec.screen_path) -
                                        length(replace(rec.screen_path,
                                                       '/',
                                                       '')) - 1)));
      utl_file.put_line(l_file,
                        'mkdir -p ' || v_modules || rec.screen_path);
      utl_file.put_line(l_file,
                        'cp -rn /u01/srm/webapp/webRoot/' ||
                        rec.screen_path || ' ' || v_modules ||
                        substr(rec.screen_path,
                               1,
                               instr(rec.screen_path,
                                     '/',
                                     1,
                                     length(rec.screen_path) -
                                     length(replace(rec.screen_path, '/', '')) - 1)));
    end if;
  end loop;
  dbms_output.put_line('#bm');
  utl_file.put_line(l_file, '#bm');
  for rec in (select distinct trim(h.bm_path) bm_path from h3c_test_pro_bm h) loop
    if rec.bm_path like '%.bm' then
      dbms_output.put_line('mkdir -p ' || v_classes ||
                           replace(substr(rec.bm_path,
                                          1,
                                          instr(replace(rec.bm_path,
                                                        '.bm',
                                                        ''),
                                                '.',
                                                -1) - 1),
                                   '.',
                                   '/'));
      dbms_output.put_line('cp -rn /u01/srm/webapp/webRoot/WEB-INF/classes/' ||
                           replace(replace(rec.bm_path, '.bm', ''),
                                   '.',
                                   '/') || '.bm' || ' ' || v_classes ||
                           replace(replace(rec.bm_path, '.bm', ''),
                                   '.',
                                   '/') || '.bm');
      utl_file.put_line(l_file,
                        'mkdir -p ' || v_classes ||
                        replace(substr(rec.bm_path,
                                       1,
                                       instr(replace(rec.bm_path, '.bm', ''),
                                             '.',
                                             -1) - 1),
                                '.',
                                '/'));
      utl_file.put_line(l_file,
                        'cp -rn /u01/srm/webapp/webRoot/WEB-INF/classes/' ||
                        replace(replace(rec.bm_path, '.bm', ''), '.', '/') ||
                        '.bm' || ' ' || v_classes ||
                        replace(replace(rec.bm_path, '.bm', ''), '.', '/') ||
                        '.bm');
    
    else
      dbms_output.put_line('mkdir -p ' || v_classes ||
                           replace(rec.bm_path, '.', '/'));
      dbms_output.put_line('cp -rn /u01/srm/webapp/webRoot/WEB-INF/classes/' ||
                           replace(rec.bm_path, '.', '/') || ' ' ||
                           v_classes ||
                           substr(rec.bm_path,
                                  1,
                                  instr(rec.bm_path, '.', 1) - 1));
      utl_file.put_line(l_file,
                        'mkdir -p ' || v_classes ||
                        replace(rec.bm_path, '.', '/'));
      utl_file.put_line(l_file,
                        'cp -rn /u01/srm/webapp/webRoot/WEB-INF/classes/' ||
                        replace(rec.bm_path, '.', '/') || ' ' || v_classes ||
                        substr(rec.bm_path,
                               1,
                               instr(rec.bm_path, '.', 1) - 1));
    end if;
  end loop;
  dbms_output.put_line('#proc');
  utl_file.put_line(l_file, '#proc');
  for rec in (select distinct trim(h.bm_path) proc_path
                from h3c_test_pro_proc h) loop
    if rec.proc_path like '%.bm' or rec.proc_path like '%.proc' then
      dbms_output.put_line('mkdir -p ' || v_proc ||
                           substr(rec.proc_path,
                                  1,
                                  instr(rec.proc_path,
                                        '/',
                                        1,
                                        length(rec.proc_path) -
                                        length(replace(rec.proc_path,
                                                       '/',
                                                       '')))));
    
      dbms_output.put_line('cp -rn /u01/srm/jobRunner/' || rec.proc_path || ' ' ||
                           v_proc || rec.proc_path);
      utl_file.put_line(l_file,
                        'mkdir -p ' || v_proc ||
                        substr(rec.proc_path,
                               1,
                               instr(rec.proc_path,
                                     '/',
                                     1,
                                     length(rec.proc_path) -
                                     length(replace(rec.proc_path, '/', '')))));
      utl_file.put_line(l_file,
                        'cp -rn /u01/srm/jobRunner/' || rec.proc_path || ' ' ||
                        v_proc || rec.proc_path);
    end if;
  end loop;

  dbms_output.put_line('===EXPORT OK===');

  utl_file.fclose(l_file);

exception
  when utl_file.invalid_path then
    --無效的路徑
    dbms_output.put_line('===INVALID_PATH===' || i_id);
    raise;
  when utl_file.invalid_mode then
    --無效的打開模式
    dbms_output.put_line('===INVALID_MODE===' || i_id);
    raise;
  when utl_file.invalid_operation then
    --無效的操做,文件打開錯誤會報這個異常,通常來講都是超長或打開方式byte型和非byte型
    dbms_output.put_line('===INVALID_OPERATION===' || i_id);
    raise;
  when utl_file.invalid_maxlinesize then
    --無效的最大長度,varchar2最大4000,raw最大32676,超過回報這個異常,因此通常要進行循環操做
    dbms_output.put_line('===INVALID_MAXLINESIZE===' || i_id);
    raise;
  when utl_file.access_denied then
    --拒絕進入指定路徑,多是受權問題
    dbms_output.put_line('===ACCESS_DENIED===' || i_id);
    raise;
  when utl_file.invalid_filehandle then
    --文件處理錯誤,不常見
    dbms_output.put_line('===INVALID_FILEHANDLE===' || i_id);
    raise;
  when utl_file.write_error then
    --寫入錯誤,處理該異常最好的方式是將要寫入的文件簡單化,而後找準錯誤緣由
    dbms_output.put_line('===WRITE_ERROR===' || i_id);
    raise;
  when no_data_found then
    --select時候未找到數據,不是utl_file的異常
    dbms_output.put_line('===NO_DATA_FOUND===' || i_id);
    utl_file.fclose(l_file);
    raise;
  when others then
    if utl_file.is_open(l_file) then
      utl_file.fclose(l_file);
      raise;
    end if;
  
end get_test_blob;
相關文章
相關標籤/搜索