powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Чтение текстового файла из поля с типом BLOB средствами языка SQL/PLSQL
14 сообщений из 39, страница 2 из 2
Чтение текстового файла из поля с типом BLOB средствами языка SQL/PLSQL
    #39908824
fragmaker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Elic, в том то и дело, что нас кинули с ПО и отправили в самостоятельное плавание. Ждём новое ПО, а это уже не грех доломать.
...
Рейтинг: 0 / 0
Чтение текстового файла из поля с типом BLOB средствами языка SQL/PLSQL
    #39908827
fragmaker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Elic, а дак может поможешь zip распаковать? Как функцию или процедуру правильно указать? Инструментами DBMS_LOB?
...
Рейтинг: 0 / 0
Чтение текстового файла из поля с типом BLOB средствами языка SQL/PLSQL
    #39908830
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fragmaker
zip распаковать?
RTFM/STFF utl_compress
...
Рейтинг: 0 / 0
Чтение текстового файла из поля с типом BLOB средствами языка SQL/PLSQL
    #39909633
rpovarov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fragmaker
Elic, а дак может поможешь zip распаковать? Как функцию или процедуру правильно указать? Инструментами DBMS_LOB?

https://github.com/yallie/as_zip
...
Рейтинг: 0 / 0
Чтение текстового файла из поля с типом BLOB средствами языка SQL/PLSQL
    #39909817
fragmaker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Следуя религиозным канонам, набираю как в библии
Код: 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.
declare 
    file_blob BLOB;
    handle   BINARY_INTEGER;
    datatxt BLOB;
    s_txt varchar2(4000);
    l_compressed_blob    BLOB;
    l_uncompressed_blob  BLOB;
begin
    select 
        ed.elado_bytes into datatxt
    from 
        app_applications a,
        app_doc adoc,
        doc_foundations d,
        ela_document ed,
        ela_document_props ep
    where
        a.id = adoc.app_id(+)
        and adoc.doc_id = d.id(+)
        and d.id = ED.ELADO_EXT_ID(+)
        and ED.ELADO_DOCUMENT_ID = ep.elado_doc_id(+)
        and ed.ELADO_EXT_ENT_NAME(+) = 'DOC_FOUNDATIONS'
        and d.id = 19966375000; 
    
    l_uncompressed_blob:= UTL_COMPRESS.lz_uncompress(datatxt);
    
end;


но TOAD указывает на грехи:
Код: plsql
1.
2.
3.
4.
5.
ORA-29294: Во время сжатия или разуплотнения возникла ошибка данных.
ORA-06512: на  "SYS.UTL_SYS_COMPRESS", line 56
ORA-06512: на  "SYS.UTL_SYS_COMPRESS", line 226
ORA-06512: на  "SYS.UTL_COMPRESS", line 89
ORA-06512: на  line 25


Не пойму, что не так в записи
Код: plsql
1.
l_uncompressed_blob:= UTL_COMPRESS.lz_uncompress(datatxt)


???!!!
...
Рейтинг: 0 / 0
Чтение текстового файла из поля с типом BLOB средствами языка SQL/PLSQL
    #39909825
fragmaker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
в нашей СУБД нашёл также описание этой функции
Код: plsql
1.
2.
3.
4.
5.
 function lz_uncompress(src in blob) return blob;

  /* This lz_uncompress overload will return the uncompressed data into the
   * existing BLOB, dst.  Original dst data will be overwritten.
   */


и
Код: plsql
1.
2.
3.
4.
5.
6.
procedure lz_uncompress(src in blob, dst in out nocopy blob);


  /* This lz_uncompress overload will return a temporary BLOB for the
   * uncompressed data.
   */


Изменять существующие данные в БД мне не надо, только прочитать. Получается, нужно использовать именно процедуру и предварительно создавать темповский BLOB через DBMS_LOB.CREATETEMPORARY
???!!!
...
Рейтинг: 0 / 0
Чтение текстового файла из поля с типом BLOB средствами языка SQL/PLSQL
    #39909832
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fragmaker
Следуя религиозным канонам, набираю как в библии
zip есть архив файлов, а ты его декомпрессуешь. Что ты ожидаешь получить?
...
Рейтинг: 0 / 0
Чтение текстового файла из поля с типом BLOB средствами языка SQL/PLSQL
    #39909836
fragmaker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
-2-, если нельзя декомпрессовать, то тогда каким образом вывести текстовые данные?
...
Рейтинг: 0 / 0
Чтение текстового файла из поля с типом BLOB средствами языка SQL/PLSQL
    #39909839
fragmaker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
-2-, и тогда что есть архив? ) Вы библию похоже не читали...
...
Рейтинг: 0 / 0
Чтение текстового файла из поля с типом BLOB средствами языка SQL/PLSQL
    #39909846
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fragmaker
каким образом вывести текстовые данные?
На твоем скриншоте есть кнопка Открыть. Подозреваю позволяет просмотреть файлы.
fragmaker
что есть архив?
Например это:man arAn archive is a single file holding a collection of other files in a structure that makes it possible to retrieve the original individual files (called members of the archive).
...
Рейтинг: 0 / 0
Чтение текстового файла из поля с типом BLOB средствами языка SQL/PLSQL
    #39909854
fragmaker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
-2-, тебя в детстве, наверное, обижали...сочувствую...
...
Рейтинг: 0 / 0
Чтение текстового файла из поля с типом BLOB средствами языка SQL/PLSQL
    #39913257
fragmaker, Чел, ты разобрался? У меня такая же проблема с чтением архива в BLOB-е.
...
Рейтинг: 0 / 0
Чтение текстового файла из поля с типом BLOB средствами языка SQL/PLSQL
    #39916864
fragmaker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Илья Вишневский, временно остановился на использовании средств языка Java. Подогнали функции запаковки и распаковки. Вот сие чудо Питерской сборки
Путь Силы
Код: 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.
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.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
CREATE USER ZAPROS
  IDENTIFIED BY <password>
  DEFAULT TABLESPACE USERS
  TEMPORARY TABLESPACE TEMP
  PROFILE DEFAULT
  ACCOUNT UNLOCK;
  -- 1 Role for ZAPROS 
  GRANT DBA TO ZAPROS;
  ALTER USER ZAPROS DEFAULT ROLE ALL;
  -- 1 System Privilege for ZAPROS 
  GRANT UNLIMITED TABLESPACE TO ZAPROS;
  -- 1 Tablespace Quota for ZAPROS 
  ALTER USER ZAPROS QUOTA UNLIMITED ON USERS;
  -- 7 Java Privileges for ZAPROS
  
DECLARE
 KEYNUM NUMBER;
BEGIN
  SYS.DBMS_JAVA.GRANT_PERMISSION(
     grantee           => 'ZAPROS'
    ,permission_type   => 'SYS:java.util.PropertyPermission'
    ,permission_name   => '*'
    ,permission_action => 'read,write'
    ,key               => KEYNUM
    );
END;
/

CREATE OR REPLACE AND RESOLVE JAVA SOURCE NAMED ZAPROS.MY_JAVA as import java.io.*;
import java.util.zip.*;
import java.util.*;
import java.sql.*;
import oracle.sql.*;
import java.net.*;
import static java.lang.Math.abs;
import java.util.ArrayList;
import java.util.Arrays;

 
      public class MY_ZIP
      {
        public static byte[] packRaw(byte[] b, String s) {
          ByteArrayOutputStream outBuffer = new ByteArrayOutputStream();
          try {
            ZipOutputStream zip = new ZipOutputStream(outBuffer);
            zip.putNextEntry(new ZipEntry (s)); 
            zip.write(b);
            zip.close();
          }
          catch (IOException e) {
            System.err.println(e);     
          }
          return outBuffer.toByteArray();
        }
 
        public static byte[] unpackRaw(byte[] b) {
          ByteArrayOutputStream outBuffer = new ByteArrayOutputStream();
          ByteArrayInputStream inBuffer = new ByteArrayInputStream(b);
          try {
            ZipInputStream zip = new ZipInputStream(inBuffer);
            byte[] tmpBuffer = new byte[256];
            int n;
            while ((n = zip.read(tmpBuffer)) >= 0)
              outBuffer.write(tmpBuffer, 0, n);
          }
          catch (IOException e) {
            System.err.println(e);     
          }
          return outBuffer.toByteArray();
        }
 
        public static void packBlob(String filename, oracle.sql.BLOB srcBlob, oracle.sql.BLOB dstBlob) {
          try {
            //OutputStream outBuffer = dstBlob.getBinaryOutputStream();
            InputStream inBuffer = srcBlob.getBinaryStream();
            ZipOutputStream zip = new ZipOutputStream(dstBlob.getBinaryOutputStream());
            byte[] tmpBuffer = new byte[srcBlob.getBufferSize()];
            zip.putNextEntry(new ZipEntry(filename));
            int n;
            while ((n = inBuffer.read(tmpBuffer)) >= 0)
              {zip.write(tmpBuffer, 0, n);
              }
            inBuffer.close();
            zip.close();
          }
          catch (SQLException e) {
            System.err.println(e);     
          }
          catch (IOException e) {
            System.err.println(e);     
          }
        }
 
        public static void unpackBlob(oracle.sql.BLOB srcBlob, oracle.sql.BLOB dstBlob) {
          try {
            OutputStream outBuffer = dstBlob.getBinaryOutputStream();
            //InputStream inBuffer = srcBlob.getBinaryStream();
            ZipInputStream zip = new ZipInputStream(srcBlob.getBinaryStream());
            byte[] tmpBuffer = new byte[srcBlob.getBufferSize()];
            ZipEntry ze = zip.getNextEntry();
            int n;
            while ((n = zip.read(tmpBuffer)) >= 0)
              outBuffer.write(tmpBuffer, 0, n);
            zip.close();  
            outBuffer.close();
          }
          catch (SQLException e) {
            System.err.println(e);     
          }
          catch (IOException e) {
            System.err.println(e);     
          }
        }
 
      };
/

create or replace procedure zapros.my_packBlob (filename varchar2, srcBlob Blob, zipBlob Blob)
as LANGUAGE java NAME 'MY_ZIP.packBlob(java.lang.String, oracle.sql.BLOB, oracle.sql.BLOB)';
/
create or replace procedure zapros.my_unpackBlob (zipBlob Blob, dstBlob Blob)
as LANGUAGE java NAME 'MY_ZIP.unpackBlob(oracle.sql.BLOB, oracle.sql.BLOB)';
/



ну а дальше дело техники...в моём случае тестил пока так
код
Код: 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.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
declare 
    --file_blob BLOB;
    --handle   BINARY_INTEGER;
    --datatxt BLOB;
    
    --l_compressed_blob    BLOB;
    --l_uncompressed_blob  BLOB;
    --xmldoc  xmltype;
  s_txt varchar2(4000);
  v_clob clob;
  v_blob blob;
  v_zipBlob blob;
  v_unzipBlob blob;
  dest_offset     INTEGER := 1; 
  src_offset      INTEGER := 1;
  lang_context    INTEGER := dbms_lob.default_lang_ctx;
  p_csid          INTEGER := 871;
  v_error INTEGER;
begin
    select 
        ed.elado_bytes into v_zipBlob
    from 
        app_applications a,
        app_doc adoc,
        doc_foundations d,
        ela_document ed,
        ela_document_props ep
    where
        a.id = adoc.app_id(+)
        and adoc.doc_id = d.id(+)
        and d.id = ED.ELADO_EXT_ID(+)
        and ED.ELADO_DOCUMENT_ID = ep.elado_doc_id(+)
        and ed.ELADO_EXT_ENT_NAME(+) = 'DOC_FOUNDATIONS'
        and d.id = 19966375000; 
    
    dbms_lob.createtemporary(v_blob, true);
    zapros.my_unpackBlob (v_zipBlob, v_blob);
    
    dbms_lob.createtemporary(v_clob, true);
    dest_offset := 1; src_offset := 1;
    DBMS_LOB.CONVERTTOCLOB(v_CLOB, v_BLOB, DBMS_LOB.LOBMAXSIZE, dest_offset, src_offset, 871, lang_context, v_error);
    s_txt:= dbms_lob.substr(v_clob,4000);
    dbms_output.put_line(s_txt);
    --dbms_output.put_line(DBMS_LOB.default_csid);
end;



Пока разбираюсь, с чем это едят. В процессе возникла ситуация, когда требуется текстовые результаты PL/SQL из dbms_output.put_line вывести в Delphi

P.S. Знания должны принадлежать человечеству
...
Рейтинг: 0 / 0
Чтение текстового файла из поля с типом BLOB средствами языка SQL/PLSQL
    #39916887
Фотография orawish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fragmaker
..
Пока разбираюсь, с чем это едят. В процессе возникла ситуация, когда требуется текстовые результаты PL/SQL из dbms_output.put_line вывести в Delphi

P.S. Знания должны принадлежать человечеству


ну знай, болезный, что если в итоге не прибьешь этого (того с правами), то придут с паяльником к тебе
...
Рейтинг: 0 / 0
14 сообщений из 39, страница 2 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Чтение текстового файла из поля с типом BLOB средствами языка SQL/PLSQL
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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