[Logo] Форум ПАРУС
FILE_BUFFER и BLOB  XML
Индекс форума » 8.хх PL/SQL
Автор Сообщение
BUZIKOV_E_N
Пользователь
[Avatar]

Зарегистрирован: 20.11.2012 11:22:04
Сообщений: 250
От: Бузиков Евгений
Оффлайн

Где-то с конца того года в таблице FILE_BUFFER появились поля BDATA типа blob и RUN_CMD. Кто-нибудь пробовал с ее помощью загружать бинарные файлы в Парус через Обмен->Импорт?
Распишу задачу подробнее. Есть загрузка госконтрактов через XML, скачаных с zakupki.gov.ru. Пользователь качает архив, распаковывает и скармливает Парусу. Но есть одно рабочее место на ADSL-соединении, и для него загрузка 10-20 мегабайтных XML-файлов занимает примерно полчаса. Для них хотелось бы сделать загрузку ZIP и распаковывать уже на сервере. То есть процедура исходя из значения параметра либо парсит поле DATA (clob) сразу, либо берет поле BDATA (blob), распаковывает, преобразует в clob и потом уже парсит. Но поле BDATA приходит пустым. Может я что не так делаю?

Фрагмент процедуры

Это сообщение было изменено 1 раз. Последнее изменение было в 31.05.2013 16:51:46

[Email]
KLARIST
Пользователь
[Avatar]

Зарегистрирован: 02.11.2012 18:46:44
Сообщений: 403
От: Андрей Васильев
Оффлайн

"Обмен"->"Импорт" загружает из DBF
"Обмен"->"Импорт из файла..." загружает CLOB поле FILE_BUFFER.DATA
BLOB поле появились для реализации пользовательских отчётов с типом "бинарный"
З.Ы. BLOB можно использовать с помощью своей пользовательской процедуры, которая будет иметь входной параметр типа BLOB

Это сообщение было изменено 1 раз. Последнее изменение было в 03.06.2013 10:27:36

[Email] [ICQ]
BUZIKOV_E_N
Пользователь
[Avatar]

Зарегистрирован: 20.11.2012 11:22:04
Сообщений: 250
От: Бузиков Евгений
Оффлайн

Ну с "Обмен"->"Импорт из файла..." - это я ошибся, но суть вы поняли.
То есть BLOB пока работает только на выгрузку?

PS. Загрузка через "Импорт из файла..." - это единственный способ грузить несколько файлов за один раз. Если я ошибаюсь, поправьте.

Это сообщение было изменено 1 раз. Последнее изменение было в 03.06.2013 14:30:22

[Email]
MAXKEM
Новичок
[Avatar]

Зарегистрирован: 02.11.2012 20:10:12
Сообщений: 62
Оффлайн

Люди подскажите как сделать чтобы загрузить данные из всех файлов в директории?
Директорию можно взять в FILE_BUFFER.FILENAME.
Сделал чтобы загружался файл из FILE_BUFFER.DATA (тип CLOB файлы текстовые).
Пользователю выбирать 60 файлов в день и загружать их по одному не очень приятно, можно какой нибудь файл пропустить.

ПС:1) как получить список файлов в директории?
2) как получить содержание файла указывая его путь и имя?

Это сообщение было изменено 1 раз. Последнее изменение было в 23.12.2016 12:00:29

[Email] [WWW] [Yahoo!] aim icon [MSN] [ICQ]
PSYDIAMOND
Пользователь
[Avatar]

Зарегистрирован: 30.10.2013 12:04:55
Сообщений: 614
От: Михаил Малыхин
Оффлайн

MAXKEM wrote:Люди подскажите как сделать чтобы загрузить данные из всех файлов в директории?
Директорию можно взять в FILE_BUFFER.FILENAME.
Сделал чтобы загружался файл из FILE_BUFFER.DATA (тип CLOB файлы текстовые).
Пользователю выбирать 60 файлов в день и загружать их по одному не очень приятно, можно какой нибудь файл пропустить.

ПС:1) как получить список файлов в директории?
2) как получить содержание файла указывая его путь и имя?

а через пользовательские приложения не хотите?
[Email]
EVGENIY_N
Пользователь
[Avatar]

Зарегистрирован: 29.10.2012 19:37:16
Сообщений: 265
Оффлайн

Согласен, когда-то делал через пользовательское приложение - сначала все файлы склеиваются в один, а потом уже он загружается в БД.
BUZIKOV_E_N
Пользователь
[Avatar]

Зарегистрирован: 20.11.2012 11:22:04
Сообщений: 250
От: Бузиков Евгений
Оффлайн

Можно еще грузить все файлы одним архивом, распаковать через PKG_JAVA_TOOLS.ZIP_ARRAY_DECOMPRESS и потом обрабатывать. Тогда можно процедурой обойтись.
[Email]
MAGISTR_JODA
Пользователь

Зарегистрирован: 30.10.2012 19:16:48
Сообщений: 264
Оффлайн

Если есть КОР, то можно сделать действие "Стандартный файловый импорт", который позволяет загрузить несколько файлов. Правда данные попадают в поле data, которое clob , но используя dbms_lob.converttoblob получается вполне себе нормальный blob.

Кстати проверил: Обмен-Импорт из файла тоже поддерживает загрузку сразу нескольких файлов. Я попробовал выделить через shift 32 файла и все нормально загрузилось.
Только данные попадают в clob поле. Сделать из него blob можно вот таким кодом

Это сообщение было изменено 2 раз. Последнее изменение было в 23.12.2016 17:34:11

[Email] [WWW] [ICQ]
MAXKEM
Новичок
[Avatar]

Зарегистрирован: 02.11.2012 20:10:12
Сообщений: 62
Оффлайн

Из книги Тома Кайта :
Генерация списка файлов каталога

Пакет UTL_FILE, который мы уже несколько раз использовали по ходу изложения, хорошо справляется с чтением и записью текстовых файлов. Очень часто, однако, необходимо обработать все файлы в указанном каталоге. Этого пакет не позволяет сделать. Для получения списков файлов каталога нет встроенных методов ни в SQL, ни в PL/SQL. На Java его очень легко получить. Вот как это делается:

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

Необходим следующий фрагмент Java-кода:

Я решил использовать SQLJ, чтобы сократить программу. Подключение к базе данных уже выполнено, поэтому реализация с помощью интерфейса JDBC потребовала лишь нескольких дополнительных строк кода. Но с помощью препроцессора SQLJ выполнять SQL-операторы в Java так же просто, как и в PL/SQL. Теперь, конечно же, необходимо создать спецификацию вызова:

Прежде чем запускать эту процедуру, следует учесть еще один нюанс. Необходимо предоставить процедуре право делать то, что она должна — читать список файлов каталога. В данном случае я обладаю правами администратора базы данных, поэтому могу предоставить соответствующие привилегии сам себе, но обычно приходится обращаться с соответствующим запросом к администратору. Если помните, во введении к этой главе я писал:

"... Java-код всегда работает с правами владельца ПО Oracle, поэтому хранимая процедура на Java при предоставлении соответствующих привилегий может переписать файл параметров инициализации сервера, INIT.ORA (или другие, еще более важные файлы, например файлы данных)."
Сервер Oracle защищается от этого следующим образом: для выполнения небезопасных действий необходимо явно получить соответствующую привилегию. Попытавшись использовать эту процедуру до получения необходимых привилегий, мы получим следующее сообщение об ошибке:

Поэтому предоставим себе право получать список файлов в соответствующем каталоге:


У меня же выводит после последней операции:

Что не так?
[Email] [WWW] [Yahoo!] aim icon [MSN] [ICQ]
TIRED_NICK
Пользователь

Зарегистрирован: 04.03.2013 15:47:18
Сообщений: 365
Оффлайн

Вы предоставили доступ на чтение к папке c:\temp, а вываливается ошибка на C:\test\SB.

По-моему, для доступа к дочерним каталогам в dbms_java.grant_permission должно быть 'c:\temp\-'
REDKNIGHT
Пользователь

Зарегистрирован: 24.01.2013 11:49:17
Сообщений: 388
От: Андрей Захаров
Оффлайн

Еще стоит учитывать, что пути можно использовать только те, которые видны на самом сервере базы данных.
Если предполагается использовать эту функцию на стороннем компьютере - get_dir_list не поможет.
[Email]
MAGISTR_JODA
Пользователь

Зарегистрирован: 30.10.2012 19:16:48
Сообщений: 264
Оффлайн

MAGISTR_JODA wrote:Если есть КОР, то можно сделать действие "Стандартный файловый импорт", который позволяет загрузить несколько файлов. Правда данные попадают в поле data, которое clob , но используя dbms_lob.converttoblob получается вполне себе нормальный blob.

Не знаю была ли раньше, но в релизе от октября 2016 года в КОРе есть галка "Двоичные данные". Если она стоит, то данные попадают в поле bdata и тогда велосипед приведенный выше становится не нужен.
[Thumb - 2017-01-26_171731.png]
 Имя файла 2017-01-26_171731.png [Disk] Скачать
 Описание Описание отсутствует
 Размер файла 20 Kbytes
 Загружено:  0 раз(а)

[Email] [WWW] [ICQ]
 
Индекс форума » 8.хх PL/SQL
Перейти: