Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / IBM DB2, WebSphere, IMS, U2, etc Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 blob to char  [new]
wwwlz-grand
Member

Откуда:
Сообщений: 44
Всем привет! Есть база на DB2, есть поле с blob, внутри не xml и не картинки/pdf, а простой текст.

Как мне прочитать, что там написано? Гуглил очень долго, поэтому просьба просто написать пример.

Пробовал так:
 select  cast(pole as varchar(30000)) from user.table;

в данному случае выводится blob.
 SELECT BLOB(pole CONCAT ':  ') CONCAT TOPOGRAPHIC_MAP
     FROM user.table
     WHERE TOPOGRAPHIC_MAP LIKE BLOB('%Pellow Island%');

тут выдает ошибку ""TOPOGRAPHIC_MAP" недопустимо в контексте, где оно используется.. SQLCODE=-206, SQLSTATE=42703, DRIVER=3.63.108"
SELECT 
  XMLCAST (
    XMLPARSE (
      DOCUMENT CAST (
        MY_CLOB_DATA AS BLOB
      ) 
      PRESERVE WHITESPACE
    ) as XML
  ) 
FROM 
MY_TABLE

Тут вылетает ошибка, что xml битая
8 апр 16, 11:29    [19031632]     Ответить | Цитировать Сообщить модератору
 Re: blob to char  [new]
wwwlz-grand
Member

Откуда:
Сообщений: 44
Неужто никто не знает?
11 апр 16, 17:43    [19044038]     Ответить | Цитировать Сообщить модератору
 Re: blob to char  [new]
CawaSPb
Member

Откуда: Питер/Москва/Wroclaw
Сообщений: 998
wwwlz-grand
Неужто никто не знает?

Мало информации.

Покажите результат:
describe table user.table;
describe table MY_TABLE;
(или соответствующие CREATE TABLE statements)

В случае PARSE, надо полагать XML битая. Или с точки зрения кодировки, или ещё как.
Выполните в отдельном каталоге:
db2 "export to MY_TABLE.csv of del modified by LOBSINFILE  select * from MY_TABLE"
Запостите результат (если каких закрытых данных не содержит).

PS Но за LIKE '%xxx%' (да ещё с BLOB'ами!) нужно, конечно, ...ругать.
11 апр 16, 18:18    [19044148]     Ответить | Цитировать Сообщить модератору
 Re: blob to char  [new]
Mark Barinstein
Member

Откуда: Москва
Сообщений: 4853
wwwlz-grand,

Добрый день.

Если в блобе текст в кодировке базы, то:
select xmlserialize(xmlquery('$D/doc/text()' passing xmlparse(document blob('<doc>')||t.b||blob('</doc>')) as "D") as clob(100))
from table(values blob('привет, мир')) t(b);
11 апр 16, 18:25    [19044174]     Ответить | Цитировать Сообщить модератору
 Re: blob to char  [new]
wwwlz-grand
Member

Откуда:
Сообщений: 44
CawaSPb
wwwlz-grand
Неужто никто не знает?

Мало информации.

Покажите результат:
describe table user.table;
describe table MY_TABLE;
(или соответствующие CREATE TABLE statements)

В случае PARSE, надо полагать XML битая. Или с точки зрения кодировки, или ещё как.
Выполните в отдельном каталоге:
db2 "export to MY_TABLE.csv of del modified by LOBSINFILE  select * from MY_TABLE"
Запостите результат (если каких закрытых данных не содержит).

PS Но за LIKE '%xxx%' (да ещё с BLOB'ами!) нужно, конечно, ...ругать.

выполняю
describe table esbdb2user.failedeventdetail

Выходит ошибка "Обнаружен неправильный элемент "esbdb2user" после текста "describe table ". Список возможных правильных элементов: "JOIN".. SQLCODE=-104, SQLSTATE=42601, DRIVER=3.63.108"

db2 "export to MY_TABLE.csv of del modified by LOBSINFILE  select * from esbdb2user.failedeventdetail"

Обнаружен неправильный элемент "END-OF-STATEMENT" после текста "r.failedeventdetail"".  Список возможных правильных элементов: "JOIN <joined_table>".. SQLCODE=-104, SQLSTATE=42601, DRIVER=3.63.108
12 апр 16, 10:58    [19045949]     Ответить | Цитировать Сообщить модератору
 Re: blob to char  [new]
wwwlz-grand
Member

Откуда:
Сообщений: 44
Mark Barinstein
wwwlz-grand,

Добрый день.

Если в блобе текст в кодировке базы, то:
select xmlserialize(xmlquery('$D/doc/text()' passing xmlparse(document blob('<doc>')||t.b||blob('</doc>')) as "D") as clob(100))
from table(values blob('привет, мир')) t(b);

Подскажите, пожалуйста, где тут указывать наименование таблицы, а где колонки

P.s. в DB2 я нуль
12 апр 16, 11:05    [19045988]     Ответить | Цитировать Сообщить модератору
 Re: blob to char  [new]
Mark Barinstein
Member

Откуда: Москва
Сообщений: 4853
wwwlz-grand,

Вместо:
from table(values blob('привет, мир')) t(b)
для таблицы my_table с полем b типа blob:
from my_table t;

Если имя поля другое, то, соответственно, заменить t.b на t.my_column.
12 апр 16, 12:08    [19046424]     Ответить | Цитировать Сообщить модератору
 Re: blob to char  [new]
wwwlz-grand
Member

Откуда:
Сообщений: 44
Mark Barinstein
wwwlz-grand,

Вместо:
from table(values blob('привет, мир')) t(b)
для таблицы my_table с полем b типа blob:
from my_table t;

Если имя поля другое, то, соответственно, заменить t.b на t.my_column.

select xmlserialize(xmlquery('$D/doc/text()' passing xmlparse(document blob('<doc>')||t.message||blob('</doc>')) as "D") as clob(100))
from esbdb2user.failedeventdetail t

В документе XML обнаружен недопустимый символ или символ, непредставимый в кодировке документа.. SQLCODE=-16103, SQLSTATE=2200M, DRIVER=3.63.108
12 апр 16, 12:35    [19046631]     Ответить | Цитировать Сообщить модератору
 Re: blob to char  [new]
wwwlz-grand
Member

Откуда:
Сообщений: 44
Запрос

select xmlserialize(xmlquery('$D/doc/text()' passing xmlparse(document blob('<doc>')||t.b||blob('</doc>')) as "D") as clob(100))
from table(values blob('привет, мир')) t(b);

обрабатывается без ошибок, выводит "привет, мир"
12 апр 16, 12:39    [19046661]     Ответить | Цитировать Сообщить модератору
 Re: blob to char  [new]
Mark Barinstein
Member

Откуда: Москва
Сообщений: 4853
wwwlz-grand
select xmlserialize(xmlquery('$D/doc/text()' passing xmlparse(document blob('<doc>')||t.message||blob('</doc>')) as "D") as clob(100))
from esbdb2user.failedeventdetail t

В документе XML обнаружен недопустимый символ или символ, непредставимый в кодировке документа.. SQLCODE=-16103, SQLSTATE=2200M, DRIVER=3.63.108

Либо там какие-то символы, которые сбивают с толку xml, либо текст не в кодировке базы.
Попробуйте выставить кодировку текста, если знаете какую, и некоторую защиту от управляющих символов в тексте:
xmlserialize(xmlquery('$D/doc/text()' passing xmlparse(document blob('<?xml version="1.0" encoding="cp1251"?><doc><![CDATA[')||t.b||blob(']]></doc>')) as "D") as clob(100))
12 апр 16, 17:14    [19048580]     Ответить | Цитировать Сообщить модератору
 Re: blob to char  [new]
wwwlz-grand
Member

Откуда:
Сообщений: 44
Mark Barinstein
wwwlz-grand
select xmlserialize(xmlquery('$D/doc/text()' passing xmlparse(document blob('<doc>')||t.message||blob('</doc>')) as "D") as clob(100))
from esbdb2user.failedeventdetail t

В документе XML обнаружен недопустимый символ или символ, непредставимый в кодировке документа.. SQLCODE=-16103, SQLSTATE=2200M, DRIVER=3.63.108

Либо там какие-то символы, которые сбивают с толку xml, либо текст не в кодировке базы.
Попробуйте выставить кодировку текста, если знаете какую, и некоторую защиту от управляющих символов в тексте:
xmlserialize(xmlquery('$D/doc/text()' passing xmlparse(document blob('<?xml version="1.0" encoding="cp1251"?><doc><![CDATA[')||t.b||blob(']]></doc>')) as "D") as clob(100))

Я ещё в первом посту написал, что в содержимом, скорее всего, вовсе не xml, а текст
12 апр 16, 17:19    [19048612]     Ответить | Цитировать Сообщить модератору
 Re: blob to char  [new]
Mark Barinstein
Member

Откуда: Москва
Сообщений: 4853
wwwlz-grand
Я ещё в первом посту написал, что в содержимом, скорее всего, вовсе не xml, а текст

Стандартных функций в db2 для этого нет.
Идея в том, чтобы заставить xml ядро преобразовать blob в clob. Там это сделать можно, поэтому я и оборачиваю текст в blob в xml теги, где можно указывать кодировку, если нужно.
У меня это работает.
12 апр 16, 17:34    [19048707]     Ответить | Цитировать Сообщить модератору
 Re: blob to char  [new]
Mark Barinstein
Member

Откуда: Москва
Сообщений: 4853
create or replace function blob2clob(p_b blob(1m), p_enc varchar(16))
returns clob(1m)
contains sql
deterministic
no external action
return
xmlserialize(xmlquery('$D/d/text()' passing xmlparse(
document blob(
coalesce('<?xml version="1.0" encoding="'||p_enc||'"?>', '')
||'<d><![CDATA[')
||p_b
||blob(']]></d>'
)) as "D") as clob(1m));

select i, length(b) l, b, enc
, blob2clob(b, enc) text 
, xmlserialize(xmlquery('$D/doc/text()' passing xmlparse(document blob('<?xml version="1.0" encoding="'||enc||'"?><doc><![CDATA[')||b||blob(']]></doc>')) as "D") as clob(100)) text2
from test_blob;

 I L  B                                        ENC    TEXT        TEXT2
 - -- ---------------------------------------- ------ ----------- -----------
 1 11 eff0e8e2e5f22c20ece8f0                   cp1251 привет, мир привет, мир
 2 20 d0bfd180d0b8d0b2d0b5d1822c20d0bcd0b8d180 utf-8  привет, мир привет, мир
12 апр 16, 17:47    [19048778]     Ответить | Цитировать Сообщить модератору
 Re: blob to char  [new]
wwwlz-grand
Member

Откуда:
Сообщений: 44
Mark Barinstein
create or replace function blob2clob(p_b blob(1m), p_enc varchar(16))
returns clob(1m)
contains sql
deterministic
no external action
return
xmlserialize(xmlquery('$D/d/text()' passing xmlparse(
document blob(
coalesce('<?xml version="1.0" encoding="'||p_enc||'"?>', '')
||'<d><![CDATA[')
||p_b
||blob(']]></d>'
)) as "D") as clob(1m));

select i, length(b) l, b, enc
, blob2clob(b, enc) text 
, xmlserialize(xmlquery('$D/doc/text()' passing xmlparse(document blob('<?xml version="1.0" encoding="'||enc||'"?><doc><![CDATA[')||b||blob(']]></doc>')) as "D") as clob(100)) text2
from test_blob;

 I L  B                                        ENC    TEXT        TEXT2
 - -- ---------------------------------------- ------ ----------- -----------
 1 11 eff0e8e2e5f22c20ece8f0                   cp1251 привет, мир привет, мир
 2 20 d0bfd180d0b8d0b2d0b5d1822c20d0bcd0b8d180 utf-8  привет, мир привет, мир

Подскажите, а что вместо ENC указывать? У меня же в базе нет столбца с кодировкой...
12 апр 16, 17:56    [19048841]     Ответить | Цитировать Сообщить модератору
 Re: blob to char  [new]
wwwlz-grand
Member

Откуда:
Сообщений: 44
Script1.sql

create or replace function blob2clob(p_b blob(1m), p_enc varchar(16))
returns clob(1m)
contains sql
deterministic
no external action
return
xmlserialize(xmlquery('$D/d/text()' passing xmlparse(
document blob(
coalesce('<?xml version="1.0" encoding="'||p_enc||'"?>', '')
||'<d><![CDATA[')
||p_b
||blob(']]></d>'
)) as "D") as clob(1m))
select blob2clob(message, cp1251) text 
, xmlserialize(xmlquery('$D/doc/text()' passing xmlparse(document blob('<?xml version="1.0" encoding="cp1251"?><doc><![CDATA[')||message||blob(']]></doc>')) as "D") as clob(100)) text2
from esbdb2user.failedeventdetail
 

Failed queries => 1
12 апр 16, 18:00    [19048856]     Ответить | Цитировать Сообщить модератору
 Re: blob to char  [new]
Mark Barinstein
Member

Откуда: Москва
Сообщений: 4853
wwwlz-grand,

Если вы не знаете кодировки текста, DB2 за вас этого не сможет угадать.
12 апр 16, 18:00    [19048857]     Ответить | Цитировать Сообщить модератору
 Re: blob to char  [new]
Mark Barinstein
Member

Откуда: Москва
Сообщений: 4853
wwwlz-grand,

Вы 2 запроса - создание функции (это я вам ее для простоты использования выражения потом привел) и ее использование слили в один запрос, да еще передаете в качестве параметра не строку 'cp1251', а литерал (без кавычек), что нельзя делать.
12 апр 16, 18:05    [19048880]     Ответить | Цитировать Сообщить модератору
 Re: blob to char  [new]
wwwlz-grand
Member

Откуда:
Сообщений: 44
Теперь ошибка


Документ XML содержит недопустимый раздел CDATA. Код причины = "2".. SQLCODE=-16111, SQLSTATE=2200M, DRIVER=3.63.108
12 апр 16, 18:09    [19048893]     Ответить | Цитировать Сообщить модератору
 Re: blob to char  [new]
Mark Barinstein
Member

Откуда: Москва
Сообщений: 4853
wwwlz-grand
Теперь ошибка


Документ XML содержит недопустимый раздел CDATA. Код причины = "2".. SQLCODE=-16111, SQLSTATE=2200M, DRIVER=3.63.108
Покажите, что вы сделали и делаете в точности.
12 апр 16, 18:22    [19048925]     Ответить | Цитировать Сообщить модератору
 Re: blob to char  [new]
wwwlz-grand
Member

Откуда:
Сообщений: 44
выполяню запрос

автор
select xmlserialize(xmlquery('$D/doc/text()' passing xmlparse(document blob('<?xml version="1.0" encoding="cp1251"?><doc><![CDATA[')||message||blob(']]></doc>')) as "D") as clob(100)) text2
from esbdb2user.failedeventdetail;
12 апр 16, 18:28    [19048952]     Ответить | Цитировать Сообщить модератору
 Re: blob to char  [new]
Mark Barinstein
Member

Откуда: Москва
Сообщений: 4853
wwwlz-grand,

100 байтов может не хватить.

clob(100) замените на clob(1m)
или какой там у вас размер blob'а.
12 апр 16, 18:48    [19049039]     Ответить | Цитировать Сообщить модератору
 Re: blob to char  [new]
wwwlz-grand
Member

Откуда:
Сообщений: 44
Заменил, ошибка та же

select xmlserialize(xmlquery('$D/doc/text()' passing xmlparse(document blob('<?xml version="1.0" encoding="cp1251"?><doc><![CDATA[')||message||blob(']]></doc>')) as "D") as clob(1m)) text2
from esbdb2user.failedeventdetail

Документ XML содержит недопустимый раздел CDATA. Код причины = "2".. SQLCODE=-16111, SQLSTATE=2200M, DRIVER=3.63.108


Длина блоба 1073741824
12 апр 16, 20:54    [19049384]     Ответить | Цитировать Сообщить модератору
 Re: blob to char  [new]
Mark Barinstein
Member

Откуда: Москва
Сообщений: 4853
Что выдаёт

Select max(length(message)) from esbdb2user.failedeventdetail
12 апр 16, 21:03    [19049409]     Ответить | Цитировать Сообщить модератору
 Re: blob to char  [new]
wwwlz-grand
Member

Откуда:
Сообщений: 44
116485
13 апр 16, 11:13    [19051047]     Ответить | Цитировать Сообщить модератору
 Re: blob to char  [new]
Mark Barinstein
Member

Откуда: Москва
Сообщений: 4853
wwwlz-grand,

Какая версия db2 и фикспак?

Прикрепите содержимое блоба.
Его можно получить в отдельном файле на сервере как он есть в базе командой:

call admin_cmd('export to my_dir\f.txt of del modified by lobsinsepfiles select message from esbdb2user.failedeventdetail where ...')

В where вставьте ограничение какое-нибудь, чтоб 1 файл получился, на записи которого запрос выдает ошибку.
13 апр 16, 12:08    [19051404]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / IBM DB2, WebSphere, IMS, U2, etc Ответить