Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Oracle > Запись в файл на клиенте.


Автор: VIAcom 1.7.2005, 16:47
Понятно, почему нельзя писать куды угодно на сервак, а только в отведенное место, но вот почему я не могу писать на свою собственную машину, на клиента тобишь smile

Например я хочу скинуть текстовый файлик - отчет к себе на винчестер, а не на винт сервера, с которого инфу кстати еще не факт, что посмотреть сможешь ...

И еще вопрос можно ли читать файлы с клиента? Я работал только с UTL_FILE ... может есть еще пакеты?

Заранее спасибо.

Автор: LSD 1.7.2005, 19:50
Цитата(VIAcom @ 1.7.2005, 17:47)
Например я хочу скинуть текстовый файлик - отчет к себе на винчестер, а не на винт сервера, с которого инфу кстати еще не факт, что посмотреть сможешь ...

Так в чем проблема? Берешь из клиентского приложения и скидываешь данные на винт. Или ты хочешь чтобы сервер тебе лез на клиентскую машину и создавал на ней файлы?


Цитата(VIAcom @ 1.7.2005, 17:47)
И еще вопрос можно ли читать файлы с клиента? Я работал только с UTL_FILE ... может есть еще пакеты?

Есть еще позможность использовать хранимые процедуры на Java, там возможностей будет побольше.

Автор: VIAcom 4.7.2005, 08:31
Клиентская программа - Парус, оа уже есть и мне ее переписывать низя ... поэтому мне только через сервак на клиент писать, но может Парус и может какнить писать, просто я об этом не знаю пока smile

Java - это хорошо, но беда в том, что я ее только понимаю а писать тольком не могу, только примитив, ибо не знаю ни функций ни классов. Примерчик какойнить не хитрый бы ....

Автор: igon 4.7.2005, 14:39
Цитата
поэтому мне только через сервак на клиент писать

Напиши собственного клиента, если нельзя типа plug-in к Парусу прикрутить.
Запись на клиента по инициативе сервера (push-технология?) будет, ИМХО, существенно сложнее, если клиентов много, каждому нужно свое и по своему расписанию.

Автор: VIAcom 4.7.2005, 15:41
igon
Цитата
Напиши собственного клиента

Предлагаешь Парус переписать? smile

Автор: LSD 4.7.2005, 20:13
Цитата(VIAcom @ 4.7.2005, 16:41)
Предлагаешь Парус переписать?

Вовсе нет. На серваке пишется процедура которая предоставляет данные в нужном виде, на клиенте программа которая записывает эти данные в файл.
Пакет UTL_FILE позволяет работать с локальной файловой системой, локальные диски + диски подключенные через NFS. У Java возможности побольше но не намного. Так что единственый нормальный выход это клиент, или модифицировать парусовский или писать отдельный для данного случая.

Автор: VIAcom 5.7.2005, 08:21
LSD
Нет не пойдет, даже если написать отдельнуюб прогу на Дельфи, ее вызывать никто не будет, т.к. заказчику совершенно невозможно открывать еще что то акромя Паруса, и уж тем более в нем работать. Эта схмема сложной получается чересчур.
Но там есть обходной маневр в самом Парусе, правда уж больно "обходной" и не хочется его юзать ...

Спасибо за ответ.

Автор: igon 5.7.2005, 18:05
Цитата
я (==заказчик?) хочу скинуть текстовый файлик - отчет к себе на винчестер

но для меня
Цитата
совершенно невозможно открывать еще что то акромя Паруса, и уж тем более в нем работать.

Хм, типа "по щучьему велению"? smile
Вариант:
В .bat файл прописываешь
1. Запуск собственно Паруса
2. Запуск Дельфи программы (as service?), которая по timeout (расписанию) обращается к серверу за отчетом и по получении "пищит" (как в аське): "У Вас новый отчет!!!"
Иконку Паруса перенаправляешь на .bat файл
Вариант:
Дельфи программа стартует при запуске компьютера.
"Работать" с такой Дельфи программой вовсе не обязательно - все настройки по умолчанию, на рабочем столе только файл (иконка) с отчетом. Не так все это и сложно. ИМХО smile

Автор: VIAcom 6.7.2005, 08:26
Цитата

Хм, типа "по щучьему велению"? smile

Нет не по веленью, а из хранимой процедуры, вызов которых в Парусе вполне возможен.

Все другое не окупиться ИМХО.

Автор: LSD 7.7.2005, 00:07
Чтобы из хранимки записать в файл, локальная ФС клиента должна быть подключенна к серверу, или через NFS для *nix систем, или через сетевые шары для Windows систем. Вы готовы пойти на такое? И реализуемо ли это, технически?
Если да, то я могу написать подобную процедерку.

Автор: VIAcom 8.7.2005, 15:27
Что там как возможно у аказчика я не знаю, я не их сис. админ. Но если такое возможно и это не слишком хитро, то почему нет, сразу скажу, что затруднять себя специальным написанием процедуры не имеет, думаю, смысла. Хотя я очень приятно удивлен и польшен оказанному вниманию.

Что такого дикого в записи на клиент с сервера, может я чегото недопонимаю, но серевер разве не должен видет расшаренные папки, или это дурная практика чреватая снижением производительности/безопасности. Я не специалист по сетям и в этом чесно говоря плохо разбираюсь.

Автор: LSD 11.7.2005, 12:07
 Итак запись на клиентскую машину.
1. Создаем Java class
Код
create or replace and compile java source named write_to_client as
import java.io.FileOutputStream;
import java.io.InputStream;
import java.sql.*;

public class NetWrite
{
  private static final char FILE_SEPARATOR = '\\';
  private static final byte[] buffer = new byte[1024];

  public static void writeToFile(String machineName, String directory, String file, Blob data) throws Exception
  {
    StringBuffer fileName = new StringBuffer(50);
    fileName.append(FILE_SEPARATOR).append(FILE_SEPARATOR);
    fileName.append(machineName).append(FILE_SEPARATOR);
    fileName.append(directory).append(FILE_SEPARATOR);
    fileName.append(file).append(FILE_SEPARATOR);
    FileOutputStream out = new FileOutputStream(fileName.toString());
    InputStream in = data.getBinaryStream();
    int read = 0;
    while( (read = in.read(buffer)) > 0)
      out.write(buffer, 0, read);
    in.close();
    out.close();
  }
}
/

2. Создаем процедуру на PL/SQL
Код
create or replace procedure WRITE_CLIENT(mashine varchar2, directory varchar2, file varchar2, data blob) as
language java name 'NetWrite.writeToFile(java.lang.String, java.lang.String, java.lang.String, java.sql.Blob)';

3. Выдаем разрешения на запись в файл
Код
begin
  -- Call the procedure
  sys.dbms_java.grant_permission('PUBLIC', 'java.io.FilePermission', '\\workstation1\temp\*', 'read,write');
end;
/

4. Проверяем
Код
declare 
  bin_data blob;
begin
  select photo_data into bin_data from photos where id = 'D490AA09AEF3424A9AEEFAAC638B283E';
  write_client('workstation1', 'temp', 'data.bin', bin_data);
end;
/

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)