Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Чтение из zip файла в поле типа BLOB / 20 сообщений из 20, страница 1 из 1
13.01.2020, 17:28
    #39913327
Чтение из zip файла в поле типа BLOB
Есть таблица с полем типа 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
13.01.2020, 17:37
    #39913332
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение из zip файла в поле типа BLOB
Илья ВишневскийТо есть архив не поломанный.

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

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

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


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

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

Формат zip-файла известен, можно обойтись и без оной.
PS в текущих архивах количество файлов разное или один архив - один csv?
...
Рейтинг: 0 / 0
13.01.2020, 18:25
    #39913350
Чтение из zip файла в поле типа BLOB
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
13.01.2020, 18:29
    #39913354
MazoHist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение из zip файла в поле типа BLOB
Илья Вишневский,

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

Да смотрел. Но это не мой случай.
...
Рейтинг: 0 / 0
13.01.2020, 19:09
    #39913364
iehf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение из zip файла в поле типа BLOB
Илья Вишневский, пользуюсь таким кодом. Работает, вроде, нормально.
Код: 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
14.01.2020, 10:22
    #39913513
Чтение из zip файла в поле типа BLOB
iehf,

Огромное спасибо!
Сегодня потестирую и напишу о результатах.
...
Рейтинг: 0 / 0
14.01.2020, 10:40
    #39913520
Чтение из zip файла в поле типа BLOB
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
14.01.2020, 10:47
    #39913524
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение из zip файла в поле типа BLOB
Илья Вишневский
я с JAVA в Oracle не особо работал.
И не надо было начинать.
...
Рейтинг: 0 / 0
14.01.2020, 13:25
    #39913630
iehf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение из zip файла в поле типа BLOB
Илья Вишневский,

не инициализирован выходной 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
14.01.2020, 14:00
    #39913651
Чтение из zip файла в поле типа BLOB
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
14.01.2020, 15:26
    #39913738
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение из zip файла в поле типа BLOB
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
14.01.2020, 16:21
    #39913786
iehf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение из zip файла в поле типа BLOB
-2-,
для вызова blob_decompress_zip(p_s, p_b) нужен ненулевой локатор для p_b. Как он связан с for update?
...
Рейтинг: 0 / 0
14.01.2020, 17:24
    #39913838
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение из zip файла в поле типа BLOB
iehf
Как он связан с for update?
Записи лоба в таблицу предваряется select for update, update returning или insert returning. create temporary и последующий update лишние.
...
Рейтинг: 0 / 0
14.01.2020, 17:31
    #39913841
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение из zip файла в поле типа BLOB
+ EMPTY_LOB()

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

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

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

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

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

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


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