Aqui na empresa temos uma rotina assim:
Selecionar tudo
Procedure exec_gera_arquivo_coletor Is
--
v_alert alert;
v_opcao Number;
--
v_tipo_so Varchar2(100) := get_application_property(operating_system);
v_comando Varchar2(2000);
v_nome_arq Varchar2(100);
v_mensagem Varchar2(2000);
v_dir_saida Varchar2(4000) := '';
v_dir_bkp Varchar2(4000) := '';
v_dir_tmp Varchar2(4000) := 'coletor';
--
Procedure executarcomando(cmd Varchar2, ignorarerro Boolean Default False) Is
Begin
host(cmd);
If Not form_success
And Not ignorarerro Then
sesi_msg('Erro ao executar o comando: ' || cmd, 'E', False);
Raise form_trigger_failure;
End If;
End;
--
Begin
--
-- Busca dados dos parametros
v_dir_saida := srs_busca_comando_fnc('PAT_SD_COL', 'PAT');
v_dir_bkp := srs_busca_comando_fnc('PAT_BK_COL', 'PAT');
v_dir_tmp := Trim(v_dir_saida) || Trim(v_dir_tmp);
--
-- Testa se é WEB
If upper(v_tipo_so) Like 'WIN%' Then
sesi_msg('Módulo disponivel apenas para WEB', 'E', True);
End If;
--
--Gera um sub-diretório para guardar os arquivos temporários
executarcomando('mkdir -p ' || v_dir_tmp);
--
--Se por acaso o diretório por algum erro contiver arquivos então
--apaga todo o conteúdo do diretório temporário
executarcomando('rm -f ' || v_dir_tmp || '/*.*');
--Altera o cursor para uma ampulheta
set_application_property(cursor_style, 'BUSY');
--Gera os arquivos para carregar o coletor e coloca no
--diretório temporário
v_mensagem := exec_gera_registros_inventario(p_gps_codigo => :gps_codigo,
p_cat_codigo => :cat_codigo,
p_cct_codigo => :cct_codigo,
p_los_codigo => :los_codigo,
p_str_codigo => :str_codigo,
p_complemento => :complemento,
p_dir => v_dir_saida,
p_dir_tmp => v_dir_tmp,
p_tipo_inventario => :tipo_inventario,
p_quebrar_ccusto => :quebrar_ccusto,
p_e_dr => :e_dr);
exec_sleep(999999);
If v_mensagem != 'ZERO' Then
--Gera o nome do arquivo zip usando
v_nome_arq := 'Pat' || to_char(Sysdate, 'yyyymmddhh24miss') || '.zip';
--Compacta os arquivos
executarcomando('zip -lj ' || v_dir_tmp || '/' || v_nome_arq || ' ' ||
v_dir_tmp || '/*.*');
--Baixar arquivo Zip do serividor
v_comando := srs_busca_comando_fnc('DW_PAT_COL', 'PAT');
web.show_document(v_comando || v_dir_tmp || '/' || v_nome_arq, '_blank');
--Mensagem para o usuário
sesi_msg(v_mensagem, 'I', False);
--Move o arquivo zip para o diretório de backup
executarcomando('mv ' || v_dir_tmp || '/' || v_nome_arq || ' ' ||v_dir_bkp);
--Remove os arquivos do diretório temporário
executarcomando('rm -f ' || v_dir_tmp || '/*.*');
--Remove o diretório temporário
executarcomando('rmdir ' || v_dir_tmp);
--
Else
--Mensagem para o usuário
sesi_msg('Não foram gerados dados para o arquivo.', 'I', False);
End IF;
--Salvar os dados
:system.message_level := 10;
Commit;
:system.message_level := 0;
--
:p_dados_gerados := 'S';
--
set_application_property(cursor_style, 'DEFAULT');
Exception
When Others Then
set_application_property(cursor_style, 'DEFAULT');
sesi_msg('Ocorreu um erro ao processar os registros.' || chr(10) ||Sqlerrm,'E',False);
End;
Esta rotina gera um arquivo e o zipa então questiona ao usuário onde ele deseja salvar o arquivo.
Selecionar tudo
executarcomando('zip -lj ' || v_dir_tmp || '/' || v_nome_arq || ' ' ||v_dir_tmp || '/*.*');
"Possivelmente" o comando para unzip deve ser "unzip"+ algum complemento