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;