powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Проблема с распарсиванием XML файл-а в БД с NLS_CHARACTERSET=CL8MSWIN1251
35 сообщений из 35, показаны все 2 страниц
Проблема с распарсиванием XML файл-а в БД с NLS_CHARACTERSET=CL8MSWIN1251
    #39725215
menja_zovut_deniska
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет.
Ситуация следующая: необходимо парсить приходящие xlm-файлы.
Приходят они в UTF-8, грузятся в CLOB и в 99+% случаев все ок.
Но встречаются такие, которые отказывются парситься с ошибкой LPX-00217 invalid character.

Я прочитал, что для нормальной работы с XML кодировка БД должна быть в соответствующем формате, но может быть есть возможность обойти экто ограничение?
Интересно, что если в редакторе PL/Sql Developer-а открыть содержимое CLOB-ячейки
а)вставить-убрать символ и сохранить
б)скопировать текст и вставить в новую ячейку
текст начинает парситься

Основные коды символов, которые пока попадались
Chr(8242) - 2
Chr(16662) - ''
Chr(4374) - ''
И если первый ищется инстром и, в принципе, меняется, то другие два символа данная ф-ция не видит.
...
Рейтинг: 0 / 0
Проблема с распарсиванием XML файл-а в БД с NLS_CHARACTERSET=CL8MSWIN1251
    #39725222
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
menja_zovut_deniska,

А зачем искать?
Код: plsql
1.
2.
  select 'A'||Chr(16662)||'B', replace('A'||Chr(16662)||'B',Chr(16662),'') repl
    from  dual
...
Рейтинг: 0 / 0
Проблема с распарсиванием XML файл-а в БД с NLS_CHARACTERSET=CL8MSWIN1251
    #39725227
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
menja_zovut_deniskaПриходят они в UTF-8, грузятся в CLOB и в 99+% случаев все ок.
Но встречаются такие, которые отказывются парситься с ошибкой LPX-00217 invalid character.
...
Основные коды символов, которые пока попадались
Chr(8242) - 2
Chr(16662) - ''
Chr(4374) - ''


Что-то тут не так.
Если БД действительно в cl8mswin1251, то при корректном сохранении UTF-8 в CLOB текст будет конвертирован в 1251, при этом символы, не представимые в 1251, будут автомагически заменены знаками вопроса.

Поэтому проблема бьется на отдельные части:
1. Корректное сохранение данных в CLOB.
2. Корректная работа с xml.

По первому пункту - сессионный characterset должен быть указан как al32utf8 для загрузки utf8-файлов.
Если важно сохранять оригинальный xml - то, как вариант, воспользуйтесь NClob.
Обратите внимание: charset, указанный в заголовке xml-документа, не будет соответствовать кодировке файла в БД.
Если хочется хранить именно оригинал xml-документа, то рассмотрите BLOB.
...
Рейтинг: 0 / 0
Проблема с распарсиванием XML файл-а в БД с NLS_CHARACTERSET=CL8MSWIN1251
    #39725461
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousЕсли БД действительно в cl8mswin1251, то при корректном сохранении UTF-8 в CLOB текст будет конвертирован в 1251, при этом символы, не представимые в 1251, будут автомагически заменены знаками вопроса.В 11.2.0.2 (или 0.3) был заменён парсер xml. Неконвертируемые символы стали приводить, насколько я помню, именно к этой ошибке.
...
Рейтинг: 0 / 0
Проблема с распарсиванием XML файл-а в БД с NLS_CHARACTERSET=CL8MSWIN1251
    #39725648
menja_zovut_deniska
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MaximaXXL,

И реплейсил и транслейтил по кодам - ошибка та же самая
...
Рейтинг: 0 / 0
Проблема с распарсиванием XML файл-а в БД с NLS_CHARACTERSET=CL8MSWIN1251
    #39725655
Куй железо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
menja_zovut_deniska,

поменяй CLOB на BLOB
...
Рейтинг: 0 / 0
Проблема с распарсиванием XML файл-а в БД с NLS_CHARACTERSET=CL8MSWIN1251
    #39725657
menja_zovut_deniska
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot andrey_anonymous]menja_zovut_deniskaПо первому пункту - сессионный characterset должен быть указан как al32utf8 для загрузки utf8-файлов.

Поставил эксперимент у себя локально
БД 11.2.0.4

2 инстанса
-win1251
-al32utf8

Гружу со своей машины следующим скриптом

Код: 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 
    Dest_Clob  CLOB;
    Src_Clob   BFILE;
    Dst_Offset NUMBER;
    Src_Offset NUMBER;
    Lang_Ctx   NUMBER := Dbms_Lob.Default_Lang_Ctx;
    p_Warning  NUMBER;
  
    Len          NUMBER;
    l_Buffersize NUMBER := 3556437; 
    Amount       NUMBER;
  
  BEGIN
        delete clob_test;
        commit;
        Src_Clob := Bfilename('C_TEMP','TEST.xml');
        Dbms_Lob.Open(Src_Clob, Dbms_Lob.Lob_Readonly);
        Len := Dbms_Lob.Getlength(Src_Clob);      
        Dbms_Lob.Createtemporary(Dest_Clob, FALSE);
        Dst_Offset := 1;
        Src_Offset := 1;
          LOOP
            IF (Src_Offset + l_Buffersize - 1 > Len) THEN
              Amount := Len - Src_Offset + 1;
            ELSE
              Amount := l_Buffersize;
            END IF;
          
            Dbms_Lob.Loadclobfromfile(Dest_Lob     => Dest_Clob,
                                      Src_Bfile    => Src_Clob,
                                      Amount       => Amount,
                                      Dest_Offset  => Dst_Offset,
                                      Src_Offset   => Src_Offset,
                                      Bfile_Csid   => 873,
                                      Lang_Context => Lang_Ctx,
                                      Warning      => p_Warning);
          
            EXIT WHEN Src_Offset > Len;
          
          END LOOP;
          insert into clob_test(id,
                                i)
                                values(Dest_Clob,1);
          commit;
end;



Запрос следующий

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
select d.*
 from 
  CLOB_TEST a,
   Xmltable('//Файл/Документ' Passing Xmlparse(Document a.id) 
                Columns 
                IDDoc VARCHAR2(1000) Path '@ИдДок'
               )d
    WHERE       a.i=1;



В случае al32utf8 запрос отрабатывается как надо
В случае 1251(в реестре специально поменял все nls_lang на american_america.al32utf8) ошибка
...
Рейтинг: 0 / 0
Проблема с распарсиванием XML файл-а в БД с NLS_CHARACTERSET=CL8MSWIN1251
    #39725664
menja_zovut_deniska
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Куй железоmenja_zovut_deniska,

поменяй CLOB на BLOB
Ничего не изменилось в плане ошибки
...
Рейтинг: 0 / 0
Проблема с распарсиванием XML файл-а в БД с NLS_CHARACTERSET=CL8MSWIN1251
    #39725671
Куй железо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
menja_zovut_deniskaКуй железоmenja_zovut_deniska,

поменяй CLOB на BLOB
Ничего не изменилось в плане ошибки

а ты в коде соотв. инструменты связанные с типом CLOB не поменял наверно ?

Dbms_Lob.Load clob fromfile
...
Рейтинг: 0 / 0
Проблема с распарсиванием XML файл-а в БД с NLS_CHARACTERSET=CL8MSWIN1251
    #39725674
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
menja_zovut_deniskaОсновные коды символов, которые пока попадались
Chr(8242) - 2
Chr(16662) - ''
Chr(4374) - ''При кодировке базы 1251 символы имеют код в диапазоне 0-255. Более того, приведенные числа не имеют никакого отношения и к символам UTF-8, так как двубайт должен начинаться с битов 10.
...
Рейтинг: 0 / 0
Проблема с распарсиванием XML файл-а в БД с NLS_CHARACTERSET=CL8MSWIN1251
    #39725681
menja_zovut_deniska
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Куй железо,
конечно поменял))
Та бы скрипт не отпработал. Таблица-то другая
...
Рейтинг: 0 / 0
Проблема с распарсиванием XML файл-а в БД с NLS_CHARACTERSET=CL8MSWIN1251
    #39725689
menja_zovut_deniska
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
-2-menja_zovut_deniskaОсновные коды символов, которые пока попадались
Chr(8242) - 2
Chr(16662) - ''
Chr(4374) - ''При кодировке базы 1251 символы имеют код в диапазоне 0-255. Более того, приведенные числа не имеют никакого отношения и к символам UTF-8, так как двубайт должен начинаться с битов 10.
Ок. Внешние xml-парсеры нормально разбирают файл, Oracle с кодировкой инстанса al32utf8 тоже.
Вопрос в том, как и можно ли распарсить его в инстансе с кодировкой 1251
...
Рейтинг: 0 / 0
Проблема с распарсиванием XML файл-а в БД с NLS_CHARACTERSET=CL8MSWIN1251
    #39725699
Куй железо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
menja_zovut_deniska-2-пропущено...
При кодировке базы 1251 символы имеют код в диапазоне 0-255. Более того, приведенные числа не имеют никакого отношения и к символам UTF-8, так как двубайт должен начинаться с битов 10.
Ок. Внешние xml-парсеры нормально разбирают файл, Oracle с кодировкой инстанса al32utf8 тоже.
Вопрос в том, как и можно ли распарсить его в инстансе с кодировкой 1251

наверно в этом у тебя проблема можно ли распарсить его в инстансе с кодировкой 1251

Lang_Ctx NUMBER := Dbms_Lob.Default_Lang_Ctx;
...
Рейтинг: 0 / 0
Проблема с распарсиванием XML файл-а в БД с NLS_CHARACTERSET=CL8MSWIN1251
    #39725712
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
menja_zovut_deniskaВопрос в том, как и можно ли распарсить его в инстансе с кодировкой 1251Можно. Но для этого нужно определить причину ошибки.

Код: plsql
1.
declare ...

Зачем тут цикл. Да и вообще зачем столько кода, делай сразу селект из файла.
...
Рейтинг: 0 / 0
Проблема с распарсиванием XML файл-а в БД с NLS_CHARACTERSET=CL8MSWIN1251
    #39725727
menja_zovut_deniska
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
-2-menja_zovut_deniskaВопрос в том, как и можно ли распарсить его в инстансе с кодировкой 1251Можно. Но для этого нужно определить причину ошибки.

Код: plsql
1.
declare ...

Зачем тут цикл. Да и вообще зачем столько кода, делай сразу селект из файла.
Делал. Ситуация не менялась.
Еще руками ctrl-c ctrl-v из файла в clob поле делал))
...
Рейтинг: 0 / 0
Проблема с распарсиванием XML файл-а в БД с NLS_CHARACTERSET=CL8MSWIN1251
    #39725773
kaldorey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
menja_zovut_deniska,
У мня была похожая проблема, ошибка возникала в момент сохранения в таблицу. Проблема скорее всего была не в определенном символе, а в последовательности, путем добавления лишних незначащих символов часто удавалось решить, но не всегда. До конца так и не разобрался
...
Рейтинг: 0 / 0
Проблема с распарсиванием XML файл-а в БД с NLS_CHARACTERSET=CL8MSWIN1251
    #39725775
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можете сделать короткий wellformed- образец xml-файла, демонстрирующий проблему?
...
Рейтинг: 0 / 0
Проблема с распарсиванием XML файл-а в БД с NLS_CHARACTERSET=CL8MSWIN1251
    #39725793
menja_zovut_deniska
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я могу на почту или в личку кинуть сам заархивированный xml
...
Рейтинг: 0 / 0
Проблема с распарсиванием XML файл-а в БД с NLS_CHARACTERSET=CL8MSWIN1251
    #39725898
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
menja_zovut_deniska,

Просто сделайте минимальный пример и приложите к сообщению на форум.
...
Рейтинг: 0 / 0
Проблема с распарсиванием XML файл-а в БД с NLS_CHARACTERSET=CL8MSWIN1251
    #39725916
menja_zovut_deniska
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrey_anonymousmenja_zovut_deniska,

Просто сделайте минимальный пример и приложите к сообщению на форум.
Как я могу сделать минимальный пример, если не я формирую данные файлы и не знаю местарасположения данных символов в файле?
...
Рейтинг: 0 / 0
Проблема с распарсиванием XML файл-а в БД с NLS_CHARACTERSET=CL8MSWIN1251
    #39725925
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
menja_zovut_deniskaandrey_anonymousmenja_zovut_deniska,
Просто сделайте минимальный пример и приложите к сообщению на форум.
Как я могу сделать минимальный пример, если не я формирую данные файлы и не знаю местарасположения данных символов в файле?
Ну уж постарайтесь как-нибудь.
Что-то мне подсказывает, что проблемные символы будут находиться в районе смещения 3556437
...
Рейтинг: 0 / 0
Проблема с распарсиванием XML файл-а в БД с NLS_CHARACTERSET=CL8MSWIN1251
    #39725957
menja_zovut_deniska
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrey_anonymousmenja_zovut_deniskaпропущено...

Как я могу сделать минимальный пример, если не я формирую данные файлы и не знаю местарасположения данных символов в файле?
Ну уж постарайтесь как-нибудь.
Что-то мне подсказывает, что проблемные символы будут находиться в районе смещения 3556437

Лучше приложу более компактный код и скажу, что ровно ничего не поменялось

Код: 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.
declare 
    Dest_Clob  CLOB;
    Src_Clob   BFILE;
    Dst_Offset NUMBER:=1;
    Src_Offset NUMBER:=1;
    Lang_Ctx   NUMBER := Dbms_Lob.Default_Lang_Ctx;
    p_Warning  NUMBER;  
  
  BEGIN
        delete clob_test;
        commit;
        Src_Clob := Bfilename('C_TEMP','TEST.xml');
        Dbms_Lob.Open(Src_Clob, Dbms_Lob.Lob_Readonly);
        Dbms_Lob.Createtemporary(Dest_Clob, FALSE);
        Dbms_Lob.Loadclobfromfile(Dest_Lob     => Dest_Clob,
                                      Src_Bfile    => Src_Clob,
                                      Amount       => Dbms_Lob.Getlength(Src_Clob),
                                      Dest_Offset  => Dst_Offset,
                                      Src_Offset   => Src_Offset,
                                      Bfile_Csid   => 873,
                                      Lang_Context => Lang_Ctx,
                                      Warning      => p_Warning);
          
      DBMS_LOB.CLOSE(Src_Clob);
      insert into clob_test(id,
                                i)
                                values(Dest_Clob,1);
          commit;
end;
...
Рейтинг: 0 / 0
Проблема с распарсиванием XML файл-а в БД с NLS_CHARACTERSET=CL8MSWIN1251
    #39726034
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
menja_zovut_deniskaЛучше приложу более компактный код и скажу, что ровно ничего не поменялось


Да не особо лучше.
Выстрел вслепую:
Код: 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.
declare 
    Dest_Clob  CLOB;
    Dst_Offset NUMBER:=1;
    Src_Offset NUMBER:=1;
    Lang_Ctx   NUMBER := Dbms_Lob.Default_Lang_Ctx;
    p_Warning  NUMBER;  
BEGIN
        delete clob_test;
        commit;
      insert into clob_test(id,i)
                  values(Dest_Clob,1)
           returning id into Dest_Clob
            ;
        Dbms_Lob.Loadclobfromfile(Dest_Lob     => Dest_Clob,
                                      Src_Bfile    => Bfilename('C_TEMP','TEST.xml'),
                                      Amount       => DBMS_LOB.LOBMAXSIZE,
                                      Dest_Offset  => Dst_Offset,
                                      Src_Offset   => Src_Offset,
/* Попробуйте выбрать одну из строк ниже */
--                                      Bfile_Csid   =>  nls_charset_id('AL32UTF8'),
                                      Bfile_Csid   =>  nls_charset_id('UTF8'),
                                      Lang_Context => Lang_Ctx,
                                      Warning      => p_Warning);
  if p_Warning = DBMS_LOB.WARN_INCONVERTIBLE_CHAR then
    dbms_output.put_line('DBMS_LOB.WARN_INCONVERTIBLE_CHAR');
  end if;
  commit;
end;
...
Рейтинг: 0 / 0
Проблема с распарсиванием XML файл-а в БД с NLS_CHARACTERSET=CL8MSWIN1251
    #39726046
menja_zovut_deniska
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrey_anonymousmenja_zovut_deniskaЛучше приложу более компактный код и скажу, что ровно ничего не поменялось


Да не особо лучше.
Выстрел вслепую:
[/src]

Ну если не особо лучше, подскажите как я могу "сделать короткий wellformed- образец xml-файла, демонстрирующий проблему"
Я с удовольствием...

Выстрел не попал: ora-06502 numeric or value error invalid LOB locator
...
Рейтинг: 0 / 0
Проблема с распарсиванием XML файл-а в БД с NLS_CHARACTERSET=CL8MSWIN1251
    #39726053
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
menja_zovut_deniskaкак я могу "сделать короткий wellformed- образец xml-файла, демонстрирующий проблему"Возьми исходный xml и отсеки все лишнее.

menja_zovut_deniskaВыстрел не попал: ora-06502 numeric or value error invalid LOB locatorinsert empty_clob().
...
Рейтинг: 0 / 0
Проблема с распарсиванием XML файл-а в БД с NLS_CHARACTERSET=CL8MSWIN1251
    #39726063
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousЕсли хочется хранить именно оригинал xml-документа, то рассмотрите BLOB.
+100500
...
Рейтинг: 0 / 0
Проблема с распарсиванием XML файл-а в БД с NLS_CHARACTERSET=CL8MSWIN1251
    #39726067
menja_zovut_deniska
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
-2-menja_zovut_deniskaкак я могу "сделать короткий wellformed- образец xml-файла, демонстрирующий проблему"Возьми исходный xml и отсеки все лишнее.

menja_zovut_deniskaВыстрел не попал: ora-06502 numeric or value error invalid LOB locatorinsert empty_clob().

Это что значит?

-2-menja_zovut_deniskaкак я могу "сделать короткий wellformed- образец xml-файла, демонстрирующий проблему"Возьми исходный xml и отсеки все лишнее.

menja_zovut_deniskaВыстрел не попал: ora-06502 numeric or value error invalid LOB locatorinsert empty_clob().

далее ora-22289 не может использовать LOADFROMFILE при не открытом LOB

Коды Bfile_Csid 873(al32utf8) и 871 (utf8) показывают один и тот же результат
...
Рейтинг: 0 / 0
Проблема с распарсиванием XML файл-а в БД с NLS_CHARACTERSET=CL8MSWIN1251
    #39726070
menja_zovut_deniska
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Leonid Kudryavtsevandrey_anonymousЕсли хочется хранить именно оригинал xml-документа, то рассмотрите BLOB.
+100500
Оригинал не нужен. Задача - распарсить документ а cl8mswin1251
...
Рейтинг: 0 / 0
Проблема с распарсиванием XML файл-а в БД с NLS_CHARACTERSET=CL8MSWIN1251
    #39726071
menja_zovut_deniska
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Жалко править документ нельзя. В сообщении 21720682 не почистил цитаты.
"Это что значит?" относилось к "Возьми исходный xml и отсеки все лишнее"
...
Рейтинг: 0 / 0
Проблема с распарсиванием XML файл-а в БД с NLS_CHARACTERSET=CL8MSWIN1251
    #39726086
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так и парсите исходный документ, а не занимайтесь мазохизмом с кодировками

Насколько я помню (если не ошибаюсь) в XMLType можно сразу и BLOB преобразовать. Запихивать в CLOB не обяательно.

https://docs.oracle.com/cd/B19306_01/appdev.102/b14258/t_xml.htm#i1009657
...
Рейтинг: 0 / 0
Проблема с распарсиванием XML файл-а в БД с NLS_CHARACTERSET=CL8MSWIN1251
    #39726098
menja_zovut_deniska
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Leonid KudryavtsevТак и парсите исходный документ, а не занимайтесь мазохизмом с кодировками

Насколько я помню (если не ошибаюсь) в XMLType можно сразу и BLOB преобразовать. Запихивать в CLOB не обяательно.

https://docs.oracle.com/cd/B19306_01/appdev.102/b14258/t_xml.htm#i1009657

Какую конкретно ф-цию вы имеете в виду и каким способом?

createXML?

откуда блоб брать? уже загруженный из таблицы?
...
Рейтинг: 0 / 0
Проблема с распарсиванием XML файл-а в БД с NLS_CHARACTERSET=CL8MSWIN1251
    #39726115
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
menja_zovut_deniskaоткуда блоб брать? уже загруженный из таблицы?А как же ты это делал раньше?menja_zovut_deniska-2-...делай сразу селект из файла.Делал. Ситуация не менялась.
...
Рейтинг: 0 / 0
Проблема с распарсиванием XML файл-а в БД с NLS_CHARACTERSET=CL8MSWIN1251
    #39726124
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousВыстрел вслепую:

накосячил аж в двух местах :)
- не поправил insert
- забыл, что bfilename позволяет автомагически открыть файл только в dml.
Код: 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.
declare 
x bfile;
    Dest_Clob  CLOB;
    Dst_Offset NUMBER:=1;
    Src_Offset NUMBER:=1;
    Lang_Ctx   NUMBER := Dbms_Lob.Default_Lang_Ctx;
    p_Warning  NUMBER;  
BEGIN
x :=Bfilename('C_TEMP','TEST.xml');
dbms_lob.open(x, dbms_lob.lob_readonly);
        delete clob_test;
        commit;
      insert into clob_test(id,i)
                  values(Empty_Clob(),1)
           returning id into Dest_Clob
            ;
        Dbms_Lob.Loadclobfromfile(Dest_Lob     => Dest_Clob,
                                      Src_Bfile    => x,
                                      Amount       => DBMS_LOB.LOBMAXSIZE,
                                      Dest_Offset  => Dst_Offset,
                                      Src_Offset   => Src_Offset,
/* Попробуйте выбрать одну из строк ниже */
--                                      Bfile_Csid   =>  nls_charset_id('AL32UTF8'),
                                      Bfile_Csid   =>  nls_charset_id('UTF8'),
                                      Lang_Context => Lang_Ctx,
                                      Warning      => p_Warning);
dbms_lob.close(x);
  if p_Warning = DBMS_LOB.WARN_INCONVERTIBLE_CHAR then
    dbms_output.put_line('DBMS_LOB.WARN_INCONVERTIBLE_CHAR');
  end if;
  commit;
end;
/




menja_zovut_deniskaКакую конкретно ф-цию вы имеете в виду и каким способом?
createXML?

Можно и ее:

Код: plsql
1.
select xmltype.createXml(Bfilename('C_TEMP','TEST.xml'), nls_charset_id('UTF8'),null,0,0) from dual;


Можно и просто конструктором попробовать:
Код: plsql
1.
select xmltype(Bfilename('C_TEMP','TEST.xml')) from dual;



Как получить тестовый xml:
вообще непонятно в чем затруднения.
Берете свой файл, дающий ошибко.
Вырезаете все подряд пока ошибко не исчезнет - удобно половинным делением.
Возвращаете обратно последний вырезанный кусок, убеждаетесь что проблема вернулась, режете внутри него.
Через несколько итераций получите достаточно короткий документ, который можно зазиповать и прибить на форум.
...
Рейтинг: 0 / 0
Проблема с распарсиванием XML файл-а в БД с NLS_CHARACTERSET=CL8MSWIN1251
    #39726170
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поиграться-разобраться можно попробовать на этом примере:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
with t0(s) as (select '<?xml version="1.0" encoding="UTF-8"?><a>Съешь-ка еще этих мягких французских булочек, да выпей-ка чаю!</a>' from dual
     union all select '<?xml version="1.0" encoding="WINDOWS-1251"?><a>Съешь-ка еще этих мягких французских булочек, да выпей-ка чаю!</a>' from dual
     union all select '<a>Съешь-ка еще этих мягких французских булочек, да выпей-ка чаю!</a>' from dual
-- Генерируем LPX-00217
--     union all select '<a>'||chr(22)||chr(17)||'</a>' from dual
     )
, t_1251(s) as ( -- Получаем документ в кодировке win1251 (если базулька не utf-8)
                 select convert(s,'CL8MSWIN1251') from t0
                 )
, t_utf8(s) as ( -- Получаем документ в кодировке utf-8
                 select convert(s,'AL32UTF8') from t0
                 )
select s source_string
     -- кастуем utf-8 в raw - изображаем BLOB
     , xmltype.createxml(utl_raw.cast_to_raw(s),0,null,0,0).getStringVal() result_auto -- csid=0 - пытается разобораться самостоятельно (учитывает кодировку, заявленную в заголовке xml, по умолчанию полагает utf-8)
     , xmltype.createxml(utl_raw.cast_to_raw(s),nls_charset_id('AL32UTF8'),null,0,0).getStringVal() force_utf8 -- кодировка документа явно указана как utf8, заголовок xml по боку
     , xmltype.createxml(utl_raw.cast_to_raw(s),nls_charset_id('CL8MSWIN1251'),null,0,0).getStringVal() force_1251 -- кодировка документа явно указана как win1251, заголовок xml по боку
  from t_utf8
--  from t_1251 -- в этом варианте будет работать только force_1251 и result_auto для строки с заголовком "windows-1251", остальные по очевидной причине (нельзя разобрать реальный 1251 как utf-8) выбросят LPX-00217
;
...
Рейтинг: 0 / 0
Проблема с распарсиванием XML файл-а в БД с NLS_CHARACTERSET=CL8MSWIN1251
    #39726214
menja_zovut_deniska
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо большое за советы и ответы.
Каюсь, был немного не прав в части select-а сразу из файла
Начинал работать с инстансом на 10.2.0.4
И в нем при попытке select-а из файла аля

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
with a as (select XMLTYPE(bfilename('C_TEMP','TEST.xml'),NLS_CHARSET_ID('AL32UTF8')) xm from dual)
select d.*
 from 
   a,
   Xmltable('//Файл/Документ' Passing a.xm 
                Columns 
                IDDoc VARCHAR2(1000) Path '@ИдДок'
               )d



Вылезала ошибка

LX-00200 could not convert from encoding UTF-8 to WINDOWS-1251

Сейчас проверил на 11.2.0.4 - селект из файла работает. Проверил на другом инстансе 11.2.0.3 - работает

А вот на 10.2.0.4 на двух разных инстансах запрос к файлу выдает ошибку.
NLS_CHARSET_ID('UTF8') тоже выдает ошибку.
...
Рейтинг: 0 / 0
35 сообщений из 35, показаны все 2 страниц
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Проблема с распарсиванием XML файл-а в БД с NLS_CHARACTERSET=CL8MSWIN1251
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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