powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Чтение из zip файла в поле типа BLOB
20 сообщений из 20, страница 1 из 1
Чтение из zip файла в поле типа BLOB
    #39913327
Есть таблица с полем типа BLOB. В нем хранятся zip файлы(там csv).
Необходимо их распаковать и записать в clob.

Но проблемы начались с распаковки. Если руками сохранить zip-файл из blob-а - проблем нет, все ок. То есть архив не поломанный.

Пробовал системным пакетом
Код: plsql
1.
b2:= UTL_Compress.LZ_Uncompress(b1);



Ругается:
ORA-29294: Во время сжатия или разуплотнения возникла ошибка данных.
ORA-06512: на "SYS.UTL_SYS_COMPRESS", line 60
ORA-06512: на "SYS.UTL_SYS_COMPRESS", line 230
ORA-06512: на "SYS.UTL_COMPRESS", line 89


Тут ответа не нашел.


Тут
тоже как то без ответа вопрос остался.
java source-ы которые я находил - не работали, ну или я что то делал не так.

Код: plsql
1.
select * from NLS_DATABASE_PARAMETERS


NLS_RDBMS_VERSION 12.1.0.2.0NLS_NCHAR_CONV_EXCP FALSENLS_LENGTH_SEMANTICS BYTENLS_COMP BINARYNLS_DUAL_CURRENCY $NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZRNLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZRNLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AMNLS_TIME_FORMAT HH.MI.SSXFF AMNLS_SORT BINARYNLS_DATE_LANGUAGE AMERICANNLS_DATE_FORMAT DD-MON-RRNLS_CALENDAR GREGORIANNLS_NUMERIC_CHARACTERS .NLS_NCHAR_CHARACTERSET AL16UTF16NLS_CHARACTERSET AL32UTF8NLS_ISO_CURRENCY AMERICANLS_CURRENCY $NLS_TERRITORY AMERICANLS_LANGUAGE AMERICAN


Хотелось бы по существу.
Поиском 2 дня пользуюсь по данному вопросу. Информации крайне мало. Прошу писать людей, которые сталкивались с данной проблемой.

Готов проставиться тому, кто поможет в решении проблемы. г. Москва.
...
Рейтинг: 0 / 0
Чтение из zip файла в поле типа BLOB
    #39913332
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Илья ВишневскийТо есть архив не поломанный.

Но ты же понимаешь, что ZIP файл это совсем не LZ-compressed поток?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Чтение из zip файла в поле типа BLOB
    #39913333
Dimitry Sibiryakov

Илья ВишневскийТо есть архив не поломанный.

Но ты же понимаешь, что ZIP файл это совсем не LZ-compressed поток?..


Ну да, я уже начал подозревать.
Тогда остается Java.
...
Рейтинг: 0 / 0
Чтение из zip файла в поле типа BLOB
    #39913346
MazoHist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Илья Вишневский

Тогда остается Java.

Формат zip-файла известен, можно обойтись и без оной.
PS в текущих архивах количество файлов разное или один архив - один csv?
...
Рейтинг: 0 / 0
Чтение из zip файла в поле типа BLOB
    #39913350
MazoHist
Илья Вишневский

Тогда остается Java.

Формат zip-файла известен, можно обойтись и без оной.
PS в текущих архивах количество файлов разное или один архив - один csv?


Там строго 1 файл.
Формат csv.
Имя может быть разное.

Содержание
7789XXXXXXXX636|500|20190924|20190929
7789XXXXXXX2386|500|20190924|20190929
7789XXXXXXXX857|500|20190924|20190929
7789XXXXXXXX392|500|20190924|20190929
7789XXXXXXXX498|500|20190924|20190929
77890XXXXXXX748|500|20190924|20190929
...
Рейтинг: 0 / 0
Чтение из zip файла в поле типа BLOB
    #39913354
MazoHist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Илья Вишневский,

это смотрели?
...
Рейтинг: 0 / 0
Чтение из zip файла в поле типа BLOB
    #39913356
MazoHist,

Да смотрел. Но это не мой случай.
...
Рейтинг: 0 / 0
Чтение из zip файла в поле типа BLOB
    #39913364
iehf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Илья Вишневский, пользуюсь таким кодом. Работает, вроде, нормально.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
import java.lang.*;
import oracle.sql.*;
import java.io.*;
import java.util.zip.*;

public class LobCompressor2 {

public static void compress(BLOB slob, String slobName, BLOB blob) throws Exception {
InputStream in=slob.getBinaryStream();
//ZipOutputStream z=new ZipOutputStream(blob.getBinaryOutputStream());
ZipOutputStream z=new ZipOutputStream(blob.setBinaryStream(0));

byte[] buffer=new byte[slob.getBufferSize()];
z.putNextEntry(new ZipEntry((new File(slobName)).getName()));
int cnt;
while ((cnt=in.read(buffer))!=-1) {
z.write(buffer,0,cnt);
}
z.closeEntry();
in.close();
z.close();
}

public static void compress2(BLOB slob1, String slob1Name, BLOB slob2, String slob2Name, BLOB blob) throws Exception {
InputStream in1=slob1.getBinaryStream();
InputStream in2=slob2.getBinaryStream();
//ZipOutputStream z=new ZipOutputStream(blob.getBinaryOutputStream());
ZipOutputStream z=new ZipOutputStream(blob.setBinaryStream(0));

  // add first
byte[] buffer1=new byte[slob1.getBufferSize()];
z.putNextEntry(new ZipEntry((new File(slob1Name)).getName()));
int cnt1;
while ((cnt1=in1.read(buffer1))!=-1) {
z.write(buffer1,0,cnt1);
}
z.closeEntry();
in1.close();

  // add second
byte[] buffer2=new byte[slob2.getBufferSize()];
z.putNextEntry(new ZipEntry((new File(slob2Name)).getName()));
int cnt2;
while ((cnt2=in2.read(buffer2))!=-1) {
z.write(buffer2,0,cnt2);
}
z.closeEntry();
in2.close();

z.close();
}

// decompress file from gzip archive
public static void decompress(BLOB slob, BLOB outblob ) throws Exception {

OutputStream    out  = outblob.getBinaryOutputStream();
GZIPInputStream z    = new GZIPInputStream(slob.getBinaryStream());

byte[] buffer=new byte[1024];

int cnt;
while ((cnt=z.read(buffer))!=-1) {
out.write(buffer,0,cnt);
}
z.close();
out.close();
}

// Decompresses file with .xml extention from zip archive
public static void decompress2(BLOB sblob, BLOB outblob) throws Exception {

  OutputStream out = outblob.getBinaryOutputStream();

  ZipInputStream zis = new ZipInputStream(sblob.getBinaryStream());
  
  byte[] buffer = new byte[1024];
  
  ZipEntry zipEntry = zis.getNextEntry();
  
       while (zipEntry != null) {
           
            if (zipEntry.getName().matches(".*.xml")) {
              int len;
              while ((len = zis.read(buffer)) > 0) {
                  out.write(buffer, 0, len);
              }
              out.close();
            }
            zipEntry = zis.getNextEntry();
        }
        zis.closeEntry();
        zis.close();
}

}
;


обертка:
Код: plsql
1.
2.
3.
create or replace procedure blob_decompress2(p_slob blob, p_blob blob)
as language java
name 'LobCompressor2.decompress2(oracle.sql.BLOB, oracle.sql.BLOB)';
...
Рейтинг: 0 / 0
Чтение из zip файла в поле типа BLOB
    #39913513
iehf,

Огромное спасибо!
Сегодня потестирую и напишу о результатах.
...
Рейтинг: 0 / 0
Чтение из zip файла в поле типа BLOB
    #39913520
iehf,

Что я делаю не так.

1. Создал JAVA SOURCE

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
CREATE OR REPLACE AND COMPILE JAVA SOURCE NAMED "ZipClob"
AS 

import java.lang.*;
import oracle.sql.*;
import java.io.*;
import java.util.zip.*;

public class ZipClob_dev {

public static void decompress_zip(BLOB sblob, BLOB outblob) throws Exception {

  OutputStream out = outblob.getBinaryOutputStream();

  ZipInputStream zis = new ZipInputStream(sblob.getBinaryStream());

  byte[] buffer = new byte[1024];

  ZipEntry zipEntry = zis.getNextEntry();

       while (zipEntry != null) {

            if (zipEntry.getName().matches(".*.csv")) {
              int len;
              while ((len = zis.read(buffer)) > 0) {
                  out.write(buffer, 0, len);
              }
              out.close();
            }
            zipEntry = zis.getNextEntry();
        }
        zis.closeEntry();
        zis.close();
}
}



2. Создал обертку
Код: plsql
1.
2.
3.
create or replace procedure blob_decompress_zip(p_slob blob, p_blob blob)
as language java
name 'ZipClob_dev.decompress_zip(oracle.sql.BLOB, oracle.sql.BLOB)';



3. Пытаюсь вызвать
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
declare 
  p_s blob;
  p_b blob;
  
 BEGIN
      select bl into p_s from t1 where id=276046; 
      blob_decompress_zip(p_s, p_b);
      update t1 set bl_=p_b where id=276046; 
      commit;
 END; 



Код: plaintext
1.
2.
3.
4.
5.
6.
ORA-29532: вызов Java прерван неустановленным исключением Java: java.lang.NullPointerException
ORA-06512: на  "USR_IVISHNESKIY.BLOB_DECOMPRESS_ZIP", line 1
ORA-06512: на  line 7
29532. 00000 -  "Java call terminated by uncaught Java exception: %s"
*Cause:    A Java exception or error was signaled and could not be
           resolved by the Java code.
*Action:   Modify Java code, if this behavior is not intended.


Может вопрос глупый, но я с JAVA в Oracle не особо работал.
...
Рейтинг: 0 / 0
Чтение из zip файла в поле типа BLOB
    #39913524
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Илья Вишневский
я с JAVA в Oracle не особо работал.
И не надо было начинать.
...
Рейтинг: 0 / 0
Чтение из zip файла в поле типа BLOB
    #39913630
iehf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Илья Вишневский,

не инициализирован выходной lob-локатор. Так должно сработать:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
declare 
  p_s blob;
  p_b blob;
  
 BEGIN
      dbms_lob.createtemporary(p_b,true);
      select bl into p_s from t1 where id=276046 for update; -- здесь надо так
      blob_decompress_zip(p_s, p_b);
      update t1 set bl_=p_b where id=276046; 
      commit;
     dbms_lob.freetemporary(p_b);
 END; 
...
Рейтинг: 0 / 0
Чтение из zip файла в поле типа BLOB
    #39913651
iehf
Илья Вишневский,

не инициализирован выходной lob-локатор. Так должно сработать:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
declare 
  p_s blob;
  p_b blob;
  
 BEGIN
      dbms_lob.createtemporary(p_b,true);
      select bl into p_s from t1 where id=276046 for update; -- здесь надо так
      blob_decompress_zip(p_s, p_b);
      update t1 set bl_=p_b where id=276046; 
      commit;
     dbms_lob.freetemporary(p_b);
 END; 



Заработало!
Мужик, c меня магарыч. Стучись
...
Рейтинг: 0 / 0
Чтение из zip файла в поле типа BLOB
    #39913738
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iehf
не инициализирован выходной lob-локатор. Так должно сработать:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
declare 
  p_s blob;
  p_b blob;
  
 BEGIN
      dbms_lob.createtemporary(p_b,true);
      select bl into p_s from t1 where id=276046 for update; -- здесь надо так
      blob_decompress_zip(p_s, p_b);
      update t1 set bl_=p_b where id=276046; 
      commit;
     dbms_lob.freetemporary(p_b);
 END; 

for update нужен, но как раз вместо createtemporary для записи.
...
Рейтинг: 0 / 0
Чтение из zip файла в поле типа BLOB
    #39913786
iehf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-,
для вызова blob_decompress_zip(p_s, p_b) нужен ненулевой локатор для p_b. Как он связан с for update?
...
Рейтинг: 0 / 0
Чтение из zip файла в поле типа BLOB
    #39913838
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iehf
Как он связан с for update?
Записи лоба в таблицу предваряется select for update, update returning или insert returning. create temporary и последующий update лишние.
...
Рейтинг: 0 / 0
Чтение из zip файла в поле типа BLOB
    #39913841
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
+ EMPTY_LOB()

AFAIK
...
Рейтинг: 0 / 0
Чтение из zip файла в поле типа BLOB
    #39913894
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-Записи лоба в таблицу предваряется select for update, update returning или insert returning.

Только если лоб не пишется сам в себя, как в данном случае.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Чтение из zip файла в поле типа BLOB
    #39913968
iehf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

-2-Записи лоба в таблицу предваряется select for update, update returning или insert returning.

Только если лоб не пишется сам в себя, как в данном случае.

Так он сам в себя и не пишется.
...
Рейтинг: 0 / 0
Чтение из zip файла в поле типа BLOB
    #39914007
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iehfТак он сам в себя и не пишется.

А, подчёркивания-то я и не заметил. Тогда, конечно, можно получать два локатора с for
update и не мучить временный tablespace.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Чтение из zip файла в поле типа BLOB
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]