Выполнение команд ОС в Oracle

Определяется IP адрес сервера. Вычисляются IP адреса для копирования по сети. Генерируются BATники в директории Oracla (BCP_DIR). Создается и запускается JOB, который запускает BATники. После завершения задания удаляются BATники и JOB. Пример создания директории: CREATE OR REPLACE DIRECTORY BCP_DIR AS ‘D:\bcp’;

create or replace procedure P_R_SEND_TASK as

sHOST_ADDRESS varchar(15);
sBAT_TXT varchar2(1000);
sBCP_DIRNAME constant varchar2(200) := 'BCP_DIR';
sDIR_BCP varchar2(200) := 'D:\bcp';
sBAT_NAME1 varchar(20) := 'SendTask.bat';
sBAT_NAME2 varchar(20) := 'test1.bat';

function IP_PLUS(ip_string in varchar2, iNUM in integer) return varchar2 is
d1 integer;
d2 integer;
d3 integer;
q1 varchar2(3);
q2 varchar2(3);
q3 varchar2(3);
q4 varchar2(3);
v8 varchar2(15);
begin
-- 1. parse the input, e.g. '203.30.237.2'
d1 := INSTR(ip_string, '.'); -- first dot
d2 := INSTR(ip_string, '.', 1, 2); -- second dot
d3 := INSTR(ip_string, '.', 1, 3); -- third dot
q1 := SUBSTR(ip_string, 1, d1 - 1); -- e.g. '203'
q2 := SUBSTR(ip_string, d1 + 1, d2 - d1 - 1); -- e.g. '30'
q3 := SUBSTR(ip_string, d2 + 1, d3 - d2 - 1); -- e.g. '237'
q4 := SUBSTR(ip_string, d3 + 1); -- e.g. '2'
q4 := q4 + iNUM;
v8 := q1 || '.' || q2 || '.' || q3 || '.' || q4;
return v8;
end IP_PLUS;

procedure CREATE_BAT(sNAME in varchar2, sTXT in varchar2) as
F1 UTL_FILE.FILE_TYPE;
begin
F1 := UTL_FILE.FOPEN(sBCP_DIRNAME, sNAME, 'W', 4048);
UTL_FILE.PUT_LINE(file => F1, buffer => sTXT);
UTL_FILE.fclose(file => F1);
end CREATE_BAT;

procedure DELETE_FILE(sFILENAME in varchar2) as
begin
begin
UTL_FILE.FREMOVE(sBCP_DIRNAME, sFILENAME);
exception
when others then
null;
end;
end DELETE_FILE;

procedure DROP_JOB as
begin
begin
dbms_scheduler.drop_job('SEND_TASK_JOB', TRUE);
exception
when others then
null;
end;
end DROP_JOB;

procedure CREATE_JOB as
begin
DROP_JOB;
begin
dbms_scheduler.create_job('SEND_TASK_JOB',
job_action => sDIR_BCP || '\' ||
sBAT_NAME1 || ' > null',
job_type => 'executable',
enabled => false,
auto_drop => false);
end;
end CREATE_JOB;

begin

sHOST_ADDRESS := utl_inaddr.get_host_address;

sBAT_TXT := '@echo off
SetLocal EnableExtensions enabledelayedexpansion
chcp 866 >nul
SET LOGFILE=SendTask.log
cd /d ' || sDIR_BCP || '
echo %date% %time% Копирование задачи >> %LOGFILE%
copy ' || sBAT_NAME2 || ' \\' || IP_PLUS(sHOST_ADDRESS, 1) ||
'\Tasks\run\ /y 1>>%LOGFILE% 2>>&1';

CREATE_BAT(sBAT_NAME1, sBAT_TXT);

sBAT_TXT := '@echo off
echo test1 > test1.log';

CREATE_BAT(sBAT_NAME2, sBAT_TXT);

CREATE_JOB;
begin
DBMS_SCHEDULER.RUN_JOB('SEND_TASK_JOB');
exception
when others then
null;
end;

DELETE_FILE(sBAT_NAME1);
DELETE_FILE(sBAT_NAME2);
DROP_JOB;

end P_R_SEND_TASK;