powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Преобразование varchar2 в blob
19 сообщений из 19, страница 1 из 1
Преобразование varchar2 в blob
    #39320453
julat21
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем, привет. Подскажите, пожалуйста, выход со следующей ситуации.
PROCEDURE build(TASKID NUMBER) IS
buf_buf1 varchar2(32767);
buf_buf2 varchar2(32767);
buf_buf3 varchar2(32767);
id_1 number;
name_1 varchar(100);
money_1 number;
bl1 blob;
bl2 blob;
bl3 blob;

begin
for i in (select id, name, money from table_one)
loop
id_1:= i.id;
name_1:=name;
money_1 :=money;

if i.id=1 then buf_buf1:=buf_buf1||id_1|| chr(9) || name_1 || chr(9)||money_1|| chr(10);
end if;

if i.id=2 then buf_buf2:=buf_buf2||id_1|| chr(9) || name_1 || chr(9)||money_1|| chr(10);
end if;

if i.id=3 then buf_buf3:=buf_buf3||id_1|| chr(9) || name_1 || chr(9)||money_1|| chr(10);
end if;
end loop;
Как здесь преобразовать buf_buf1 в bl1 или может есть способ переменные сразу добавлять в bl1
end;
...
Рейтинг: 0 / 0
Преобразование varchar2 в blob
    #39320454
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
varchar2 - текстовый тип
BLOB - бинарный

Падеж падежей. Т.ч. или вместо BLOB - CLOB или явное преобразование (hextoraw или какой нибудь явный cast). IMHO
...
Рейтинг: 0 / 0
Преобразование varchar2 в blob
    #39320456
julat21
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev, мне всеравно какой тип. Мне на выходе надо blob, так как этот blob передается в следующую процедуру и из этого blob строится excel файл с java функциями.
...
Рейтинг: 0 / 0
Преобразование varchar2 в blob
    #39320487
Zloxa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Преобразование varchar2 в blob
    #39320490
Баньте тему сразу. Через день разбора синтаксических плс- и ора- и прочего говножуйства все равно придется закрывать.
...
Рейтинг: 0 / 0
Преобразование varchar2 в blob
    #39320494
julat21
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Zloxa,
ничего не найду необходимого мне.
...
Рейтинг: 0 / 0
Преобразование varchar2 в blob
    #39320496
julat21
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
срачи прилетели, вместо помощи, начинаете лить....
...
Рейтинг: 0 / 0
Преобразование varchar2 в blob
    #39320500
julat21
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
create or replace function clob_to_blob (p_clob_in in clob)
return blob
is
v_blob blob;
v_offset integer;
v_buffer_varchar varchar2(32000);
v_buffer_raw raw(32000);
v_buffer_size binary_integer := 32000;
begin
--
if p_clob_in is null then
return null;
end if;
--
DBMS_LOB.CREATETEMPORARY(v_blob, TRUE);
v_offset := 1;
FOR i IN 1..CEIL(DBMS_LOB.GETLENGTH(p_clob_in) / v_buffer_size)
loop
dbms_lob.read(p_clob_in, v_buffer_size, v_offset, v_buffer_varchar);
v_buffer_raw := utl_raw.cast_to_raw(v_buffer_varchar);
dbms_lob.writeappend(v_blob, utl_raw.length(v_buffer_raw), v_buffer_raw);
v_offset := v_offset + v_buffer_size;
end loop;
return v_blob;
end clob_to_blob;

вот преобразует clob в blob, а мне надо varchar в blob
...
Рейтинг: 0 / 0
Преобразование varchar2 в blob
    #39320504
Фотография AlexFF__|
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
julat21,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
declare
  v_raw     raw(100);
  v_res     varchar2(100) := 'whoiamboneheadornot';
  v_blob    blob;
  v_amount  int := 8;
begin
  v_raw := utl_raw.cast_to_raw( v_res );
  dbms_lob.createtemporary( v_blob, false );
  dbms_lob.writeappend( v_blob, utl_raw.length(v_raw), v_raw );
  -----------------------------
  dbms_lob.read( v_blob, v_amount, 7, v_raw );
  dbms_output.put_line( utl_raw.cast_to_varchar2( v_raw ) );
  dbms_lob.freetemporary( v_blob );
end;
/
...
Рейтинг: 0 / 0
Преобразование varchar2 в blob
    #39320506
julat21
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexFF__|, золотой человек. Спасибо, большое.
...
Рейтинг: 0 / 0
Преобразование varchar2 в blob
    #39320556
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
declare
  v_blob blob;
begin
  v_blob := utl_raw.cast_to_raw('whoiamboneheadornot');
  dbms_output.put_line(utl_raw.cast_to_varchar2(utl_raw.substr(v_blob,7,8)));
end;
/
bonehead

PL/SQL procedure successfully completed.

SQL> 



SY.
...
Рейтинг: 0 / 0
Преобразование varchar2 в blob
    #39320562
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Коллеги, это все здорово, но при трансформации *char->Blob надо бы как-то про целевой encoding не забывать, мало ли с каким database_characterset придется столкнуться... а то и вообще N-тип подсунут :)
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
declare
  v_blob blob;
begin
  v_blob := utl_raw.cast_to_raw('whoiamboneheadornot');
  dbms_output.put_line(utl_raw.cast_to_varchar2(utl_raw.substr(v_blob,7,8)));
  v_blob := utl_raw.cast_to_raw(N'whoiamboneheadornot');
  dbms_output.put_line(utl_raw.cast_to_varchar2(utl_raw.substr(v_blob,7,8)));
end;
/
...
Рейтинг: 0 / 0
Преобразование varchar2 в blob
    #39320595
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, согласен. Правильнее использовать SUBSTR а не UTL_RAW.SUBSTR который считает позицию длину в байтах:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SQL> declare
  2    v_blob blob;
  3  begin
  4    v_blob := utl_raw.cast_to_raw(N'whoiamboneheadornot');
  5    dbms_output.put_line(utl_raw.cast_to_nvarchar2(utl_raw.substr(v_blob,7,8)));
  6    dbms_output.put_line(substr(utl_raw.cast_to_nvarchar2(v_blob),7,8));
  7  end;
  8  /
iamb
bonehead

PL/SQL procedure successfully completed.

SQL> 



SY.
...
Рейтинг: 0 / 0
Преобразование varchar2 в blob
    #39320624
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SYДа, согласен. Правильнее использовать SUBSTR а не UTL_RAW.SUBSTR который считает позицию длину в байтах
Вообще я имел ввиду convert и to_char либо "translate using char_cs", чтобы понимать, в какой кодировке лежат данные в blob :)
...
Рейтинг: 0 / 0
Преобразование varchar2 в blob
    #39320647
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousВообще я имел ввиду convert и to_char либо "translate using char_cs", чтобы понимать, в какой кодировке лежат данные в blob :)

Зачем? Разве-что BLOB передается вне базы - но тогда convert пусть там и делают если у них charset не совпадает.

SY.
...
Рейтинг: 0 / 0
Преобразование varchar2 в blob
    #39320649
SYесли у них charset не совпадаетчтобы узнать "не совпадает", надо знать кодировку переданного извне блоба.
Соответственно выгрузка либо должна содержать указание кодировки через дополнительные атрибуты. Либо кодировка должна быть оговоренно-фиксированной независимо от кодировки исходной БД.
В любом случае кому-то решать вопрос с перекодированием или надеяться, что кодировки баз никогда не поменяются.
...
Рейтинг: 0 / 0
Преобразование varchar2 в blob
    #39320751
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SYРазве-что BLOB передается вне базы - но тогда convert пусть там и делают если у них charset не совпадает.
А зачем вообще люди складывают тексты именно в B lob?
Праальна, чтобы исключить применение к готовому тексту трансляции кодировки, применяемых при передаче между сервером и клиентом.
А зачем исключать?
Ну чтобы что-то не сломалось. Например:
- текст содержит метаданные о собственной кодировке (XML)
- текст предназначен для передачи контрагенту в определенной кодировке, причем независимо от кодировок клиентов, работающих с БД.

Так вот.
В предложенном решении текст ляжет в BLOB в одной из двух кодировок - char_cs или nchar_cs базы.
Это довольно стабильно и даже в большинстве случаев достаточно.
Но не переносимо.

Потому при оформлении в код следует сделать две вещи:

1. применить to_char() к входному текстовому параметру (описанному как characterset any_cs).
Бред? Нет, не бред.
Oracle рекомендует для преобразования из nchar_cs в char_cs вместо ansi-шного translate(... using char_cs)
Это разрешит проблему с кодировкой при передаче на вод N-типов.

2. Перед кастованием в raw применить convert с указанием только целевой кодировки, которую хотим видеть в blob (src characterset oracle и так знает - если выполнен п.(1)).

тогда можно быть уверенным, что блоб сформирован корректно и данные лежат в предсказуемой кодировке.
...
Рейтинг: 0 / 0
Преобразование varchar2 в blob
    #39321019
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousА зачем вообще люди складывают тексты именно в B lob?
Праальна, чтобы исключить применение к готовому тексту трансляции кодировки, применяемых при передаче между сервером и клиентом.


Так я и говорил - "Разве-что BLOB передается вне базы". Кроме того, я бы делал convert не в Oracle а на mid-tier который знает:

a) charset клиента
б) charset базы

SY.
...
Рейтинг: 0 / 0
Преобразование varchar2 в blob
    #39321044
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SYТак я и говорил - "Разве-что BLOB передается вне базы". Кроме того, я бы делал convert не в Oracle а на mid-tier который знает:

a) charset клиента
б) charset базы

SY.
А зачем оно вообще в blob хранить, если в пределах базы? Геморрой один.
mid-tier - неудачное решение, поскольку данные о кодировке строки, сохраненной в blob, утеряны в момент сохранения - см. пример с N-типом.
Восстанавливать эти данные по косвенным признакам (charset базы) - неудачное решение, если эти данные можно сохранить в момент формирования blob.
Тем более, что кода-то там...
cast_to_raw(convert(to_char(:src_string),:target_charset))
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Преобразование varchar2 в blob
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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