Пт Авг 05, 2011 15:43 Re: Как заархивировать *.DBF файл и отправить его через e-ma
Полезность: Нет оценки
lioness пишет:
Добрый день. Нужно создать DBF файл , который должен быть отправлен через ИБСО на некий электронный адрес в формате .zip(arj)
Заранее спасибо.
В пакете STDIO есть функция ZIP. как с ней работать можно наверное в коде системы поискать. Я нашел только это:
Код:
....
-- зазиповываем
v_file_name := '0' || to_char(sysdate, 'HH24MISS') || '.zip';
if stdio.zip(v_post_path || v_DS || 'tounix' || v_DS || v_file_name, v_path || '/*.*') = 0 then
-- проверяем наличие файла-ярлыка, содержащего имя zip-файла, если нет, то создаем его
if [RCLI_47]::[POST].File(v_post_path || v_DS || 'tounix' || v_DS || v_HeadBank_PB_NUM || '.x') then
-- открываем для записи в конец файла
v_file_1 := stdio.open(v_post_path || v_DS || 'tounix', v_HeadBank_PB_NUM || '.x', 'a');
stdio.put_line(v_file_1, v_file_name, true, null, stdio.DOSTEXT);
-- закрываем файл
stdio.close(v_file_1);
else
-- создаем файл-ярлык
v_file_1 := stdio.open(v_post_path || v_DS || 'tounix', v_HeadBank_PB_NUM || '.x', 'w');
-- записываем строку с именем файла
stdio.put_line(v_file_1, v_file_name, true, null, stdio.DOSTEXT);
-- закрываем файл
stdio.close(v_file_1);
--end if;
-- создаем файл-флаг
-- формируем имя файла
v_file_name := 'x' || v_HeadBank_PB_NUM || '.f';
-- путь к формируемым на сервере файлам
v_path := v_post_path || v_DS || 'flags';
-- флаг
v_file_1 := stdio.open(v_path, v_file_name, 'w');
-- закрываем файл
stdio.close(v_file_1);
else
pragma error('Ошибка при архивировании файлов');
end if;
.....
В доке написано следующее:
Цитата:
function ZIP (arcname in string, dirname in string) return integer;
выполняет ZIP команду, возвращает >= 0 в случае успеха, иначе код ошибки < 0,
arcname, dirname - параметры команды..
ну а далее, я так понимаю скормить файл библиотеки работы с почтой и все. _________________ всегда есть как минимум 2 выхода
запускаем арм "Администратор доступа"
В нем Системные справочники->Профили
В выпадающем списке выбираем DEFAULT
В табличке ищем что-то со значением zip или pkzip
если нету, создаем новый, например, такой
Имя: FIO_ZIP_CMD
Значение: /usr/bin/zip -j % %
вместо параметра (имени файла) вставляем %, каждый % - это новый параметр
Название должно быть в виде FIO_<команда>_CMD
Далее вызов из pl/plus-кода такой:
Код:
declare
v$err number;
v$file varchar2(32767); -- файл .dbf
v$arch varchar2(32767); -- файл .zip
begin
v$err := stdio.run('FIO_ZIP_CMD', v$arch, v$file);
if v$err < 0 then
dbms_output.put_line(stdio.error_message(v$err));
end if;
end;
А по почте можно пересылать используя runtime.smtp_mail
Ребята спасибо за ответ.
Но , мне наш администратор сказал , что так как Оракл развернут на линексе , данные функции не прокатят. То есть ед. вариант писать свой пакет для линекса.
Я просто совсем не знаю Линекс
Ребята спасибо за ответ.
Но , мне наш администратор сказал , что так как Оракл развернут на линексе , данные функции не прокатят. То есть ед. вариант писать свой пакет для линекса.
Я просто совсем не знаю Линекс
Странно.. на мой взгляд пакеты Оракл должны работать на любой ОС. хотя может есть какие либо нюансы в работе с файловой системой..
Хотя при нормально настроеном FIO довелось поработать и с AIX и с Linux и с HP-UX и Windows Server (от 2003 R2 до 2008).. особых проблем не наблюдалось. _________________ всегда есть как минимум 2 выхода
Ребята спасибо за ответ.
Но , мне наш администратор сказал , что так как Оракл развернут на линексе , данные функции не прокатят. То есть ед. вариант писать свой пакет для линекса.
Я просто совсем не знаю Линекс
Ребята спасибо за ответ.
Но , мне наш администратор сказал , что так как Оракл развернут на линексе , данные функции не прокатят. То есть ед. вариант писать свой пакет для линекса.
Я просто совсем не знаю Линекс
Да-да. У всех катят, у него не катят. У меня даже на винде все работает.
В Администраторе доступа есть команда FIO_CHMOD_CMD? Значит, все прокатит. Нужно сделать по аналогии.
Единственный вариант - знать больше администратора и находить общий язык - установить архиватор zip по указанному пути, дать тебе адрес и порт smtp-сервера и т.п.
Поговори с администратором, пусть создаст для тебя пользователя, с которым ты сможешь поиграться на сервере, пусть не на боевом.
Найди в указанном /usr/bin или /usr/local/bin файл zip и поэкспериментируй с ним.
stdio.run предназначен как раз для запуска Shell-овских команд/ исполняемых файлов.
Здравствуйте.
понимаю, что тема уже старая, но возникла необходимость архивировать файл на серваке и у меня.
Автор темы не выложил решения, что меня огорчает, поэтому прошу помочь мне с описанием того, что написал Random.
Я проверил в профиле дефолтном эту настройку FIO_ZIP_CMD.
Нашел пример подобной операции дистрибутивной на схеме. и пробую вот что:
закинул в корень диска файл test_00.txt
и запускаю скриптец (пишу пока на pl/sql, чтобы не тупить с операцией)
Код:
declare
i integer;
x varchar2(2000):='';
err integer;
begin
i := ibs.rtl.open;
DBMS_OUTPUT.ENABLE;
x:=x||ibs.Z$SYSTEM_PARAMS_GET.GET_EXECUTE(NULL,'SYSTEM_PARAMS','PATH',null);
err := ibs.stdio.run('FIO_ZIP_CMD','test_00.txt',x||' -m');
DBMS_OUTPUT.PUT_LINE('*'||x||'*'||err||'*');
end;
архив, с таким именем (как 2ой параметр) на сервере не создается. в чем подвох? пожалуйста помогите.
в err передается 768
1 параметр путь с названием архива
2 параметр путь с названием файла
+
путь должент быть не точка '.' а браться из 'FIO_HOME_DIR'
я собственно говоря взял пример из дистрибутива.
мне не очень понятно, я должен архив создать, чтобы в него засунуть файл чтоли? в чем тогда смысл архивации?
а FIO_HOME_DIR - это, из доки не путь, а "Префикс имен каталогов настроек FIO (FIO_ROOT_DIR, FIO_BASE_DIR)."
к сожалению мне теперь вообще не понятно что это ))
Ещё можно использовать ::[RUNTIME].[ZIP], эта библиотека позволяет работать с ZIP-архивами средствами Oracle и PL+, а не средствами ОС. Пример использования можно посмотреть в ::[OOXML].[XL].
Ещё можно использовать ::[RUNTIME].[ZIP], эта библиотека позволяет работать с ZIP-архивами средствами Oracle и PL+, а не средствами ОС. Пример использования можно посмотреть в ::[OOXML].[XL].
да я смотрел ее уже. Она использует то, что я как раз и написал.
Собственно, сейчас у меня полный ступор:
в профиле дефолта настройка FIO_ZIP_CMD имеет значение /usr/bin/zip -j % %
настройка FIO_HOME_DIR имеет значение /u/tools/fio
Т.е. если следовать совету Alkov'а, то я должен написать что-то типа:
Код:
declare
i integer;
err integer;
begin
i := ibs.rtl.open;
DBMS_OUTPUT.ENABLE;
err := ibs.stdio.run('FIO_ZIP_CMD'
,'.\test_arch' --этого файла на серваке нет (это ж типа архив)
,'.\test_00.txt' --этот файл на серваке есть
);
DBMS_OUTPUT.PUT_LINE('*'||err||'*');
end;
однако, результат в таком виде = *3072*, и архив не создался.
вопрос - почему? что я не так написал?
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
Домен cftclub.ru не связан с ЗАО "Центр Финансовых Технологий" и ни в коей мере не нарушает авторских и иных прав
Владелец может не разделять мнения Участников и не несет ответственности за их публикации
Powered by phpBB