powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Oracle APEX [игнор отключен] [закрыт для гостей] / Медленная работа APEX_WEB_SERVICE.BLOB2CLOBBASE64
7 сообщений из 7, страница 1 из 1
Медленная работа APEX_WEB_SERVICE.BLOB2CLOBBASE64
    #39877439
Mr_Frost
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Коллеги, новая задачка, не можем найти причину, выручайте!

В таблице в столбце blob хранится файл pdf, размер 1,1Мб.
Нужно получить из него base64.

Делаю:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
declare
 c clob;
 b blob;
begin
 select f.content
  into b
  from files f
  where f.id = 1;
 c :=  APEX_WEB_SERVICE.BLOB2CLOBBASE64(b);
end;



Работает почти ДЕСЯТЬ секунд!

делали по-другому

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
declare
 c clob;
 b blob;
begin
 select APEX_WEB_SERVICE.BLOB2CLOBBASE64(f.content)
  into с
  from files f
  where f.id = 1;
end;



результат тот же. Ждем совет!
...
Рейтинг: 0 / 0
Медленная работа APEX_WEB_SERVICE.BLOB2CLOBBASE64
    #39877450
SvDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mr_Frost,

utl_encode.base64_encode должен быть слегка побыстрее.
...
Рейтинг: 0 / 0
Медленная работа APEX_WEB_SERVICE.BLOB2CLOBBASE64
    #39877456
Mr_Frost
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SvDev, делали, не помогло, те же самые 10 сек

пример ф-ции

Код: 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.
FUNCTION BLOB_TO_BASE64_NOAPEX (p_blob_in BLOB) RETURN CLOB IS
 v_clob clob;
 v_result clob;
 v_offset integer;
 v_chunk_size binary_integer := (48 / 4) * 3;
 v_buffer_varchar varchar2(48);
 v_buffer_raw raw(48);
 v_LENGHT NUMBER(9);
BEGIN
 if p_blob_in is null then
  return null;
 end if;
 dbms_lob.createtemporary(v_clob, true);
 v_offset := 1;
 v_LENGHT := dbms_lob.getlength(p_blob_in);
 for i in 1 .. ceil(v_LENGHT / v_chunk_size) loop
  dbms_lob.read(p_blob_in, v_chunk_size, v_offset, v_buffer_raw);
  v_buffer_raw := utl_encode.base64_encode(v_buffer_raw);
  v_buffer_varchar := utl_raw.cast_to_varchar2(v_buffer_raw);
  dbms_lob.writeappend(v_clob, length(v_buffer_varchar), v_buffer_varchar);
  v_offset := v_offset + v_chunk_size;
 end loop;

 v_result := v_clob;
 dbms_lob.freetemporary(v_clob);
 return v_result;
END BLOB_TO_BASE64_NOAPEX;
...
Рейтинг: 0 / 0
Медленная работа APEX_WEB_SERVICE.BLOB2CLOBBASE64
    #39878105
Mr_Frost
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если кому-то интересно, то ускорили в 10 раз.
Ф-ция возвращает clob, и это долго.
Переписали код, превратили функцию в процедуру, которая возвращает clob через out nocopy параметр, стало работать 1 сек.

procedure BLOB_TO_BASE64 (i_blob in blob, io_clob in out nocopy clob) ...
...
Рейтинг: 0 / 0
Медленная работа APEX_WEB_SERVICE.BLOB2CLOBBASE64
    #39881497
Фотография Есть вопрос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mr_FrostЕсли кому-то интересно, то ускорили в 10 раз.
Ф-ция возвращает clob, и это долго.
Переписали код, превратили функцию в процедуру, которая возвращает clob через out nocopy параметр, стало работать 1 сек.

procedure BLOB_TO_BASE64 (i_blob in blob, io_clob in out nocopy clob) ...

Интересно...
...
Рейтинг: 0 / 0
Медленная работа APEX_WEB_SERVICE.BLOB2CLOBBASE64
    #39882175
SvDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mr_Frost,

Не воспроизводится (полагаю, влияет железо / версия)

Код: 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.
124.
create table blob_test( blob_content blob );

-- генерируем 1 МБ случайных данных
declare
   v_clob        clob;
   v_blob        blob;
   v_dest_offset integer := 1;
   v_src_offset  integer := 1;
   v_warn        integer;
   v_ctx         integer := dbms_lob.default_lang_ctx;
begin
   for idx in 1..1000
   loop
     v_clob := v_clob || dbms_random.string('x', 1000);
   end loop;
   dbms_lob.createtemporary( v_blob, false );
   dbms_lob.converttoblob(v_blob,
                          v_clob,
                          dbms_lob.lobmaxsize,
                          v_dest_offset,
                          v_src_offset,
                          dbms_lob.default_csid,
                          v_ctx,
                          v_warn);
   insert into blob_test (blob_content)
   values (v_blob);
   
   commit;
end;
/

set timing on

-- вариант 1
declare

  l_clob clob;
  l_blob blob;

  FUNCTION BLOB_TO_BASE64_NOAPEX (p_blob_in BLOB) 
  RETURN CLOB 
  IS
   v_clob clob;
   v_result clob;
   v_offset integer;
   v_chunk_size binary_integer := (48 / 4) * 3;
   v_buffer_varchar varchar2(48);
   v_buffer_raw raw(48);
   v_LENGHT NUMBER(9);
  BEGIN
   if p_blob_in is null then
    return null;
   end if;
   dbms_lob.createtemporary(v_clob, true);
   v_offset := 1;
   v_LENGHT := dbms_lob.getlength(p_blob_in);
   for i in 1 .. ceil(v_LENGHT / v_chunk_size) loop
    dbms_lob.read(p_blob_in, v_chunk_size, v_offset, v_buffer_raw);
    v_buffer_raw := utl_encode.base64_encode(v_buffer_raw);
    v_buffer_varchar := utl_raw.cast_to_varchar2(v_buffer_raw);
    dbms_lob.writeappend(v_clob, length(v_buffer_varchar), v_buffer_varchar);
    v_offset := v_offset + v_chunk_size;
   end loop;

   v_result := v_clob;
   dbms_lob.freetemporary(v_clob);
   return v_result;
  END BLOB_TO_BASE64_NOAPEX;
  
begin
  select blob_content into l_blob
  from blob_test;
  
  l_clob := BLOB_TO_BASE64_NOAPEX(l_blob);
  dbms_output.put_line( dbms_lob.getlength(l_clob) );
end;
/

-- вариант 2
declare

  l_clob clob;
  l_blob blob;

  procedure BLOB_TO_BASE64_NOAPEX (p_blob_in BLOB, io_clob in out nocopy clob) 
  IS
   --v_clob clob;
   --v_result clob;
   v_offset integer;
   v_chunk_size binary_integer := (48 / 4) * 3;
   v_buffer_varchar varchar2(48);
   v_buffer_raw raw(48);
   v_LENGHT NUMBER(9);
  BEGIN
   if p_blob_in is null then
    return ;
   end if;
   dbms_lob.createtemporary(io_clob, true);
   v_offset := 1;
   v_LENGHT := dbms_lob.getlength(p_blob_in);
   for i in 1 .. ceil(v_LENGHT / v_chunk_size) loop
    dbms_lob.read(p_blob_in, v_chunk_size, v_offset, v_buffer_raw);
    v_buffer_raw := utl_encode.base64_encode(v_buffer_raw);
    v_buffer_varchar := utl_raw.cast_to_varchar2(v_buffer_raw);
    dbms_lob.writeappend(io_clob, length(v_buffer_varchar), v_buffer_varchar);
    v_offset := v_offset + v_chunk_size;
   end loop;

   --io_clob := v_clob;
   --v_result := v_clob;
   --dbms_lob.freetemporary(v_clob);
   --return v_result;
  END BLOB_TO_BASE64_NOAPEX;
  
begin
  select blob_content into l_blob
  from blob_test;
  
  BLOB_TO_BASE64_NOAPEX(l_blob,l_clob);
  dbms_output.put_line( dbms_lob.getlength(l_clob) );
end;
/

drop table blob_test;

...
Рейтинг: 0 / 0
Медленная работа APEX_WEB_SERVICE.BLOB2CLOBBASE64
    #39892217
Mr_Frost
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SvDev, возможно, спасибо
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Oracle APEX [игнор отключен] [закрыт для гостей] / Медленная работа APEX_WEB_SERVICE.BLOB2CLOBBASE64
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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