Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / распарсить большой XLM / 15 сообщений из 15, страница 1 из 1
12.02.2020, 14:29
    #39925724
Moss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
распарсить большой XLM
Подскажите как распарсить большой xml
Код: 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.
with t as
    (
select '<ROWSET_WRAPPER xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <ROWSET xmlns:eln="http://a.com" xmlns="http://a.com" eln:version="1.1" >

<ROW>
  <C_REG>1</C_REG>
  <NAME_REG>АР КРИМ</NAME_REG>
<SET_STI>
   <ROW_STI>
     <C_STI>101</C_STI>
     <C_RAJ>1</C_RAJ>
     <T_STI>1</T_STI>
     <NAME_STI>ГОЛОВНЕ УПРАВЛІННЯ ДПС У ХЕРСОНСЬКІЙ ОБЛАСТІ, АВТОНОМНІЙ РЕСПУБЛІЦІ КРИМ ТА М.СЕВАСТОПОЛІ (ВЕЗ КРИМ)</NAME_STI>
     <NAME_RAJ>АВТОНОМНА РЕСПУБЛІКА КРИМ</NAME_RAJ>
   </ROW_STI>
   <ROW_STI>
     <C_STI>102</C_STI>
     <C_RAJ>2</C_RAJ>
     <T_STI>2</T_STI>
     <NAME_STI>ГОЛОВНЕ УПРАВЛІННЯ ДПС У ХЕРСОНСЬКІЙ ОБЛАСТІ, АВТОНОМНІЙ РЕСПУБЛІЦІ КРИМ ТА М.СЕВАСТОПОЛІ, ГЕНІЧЕСЬКЕ УПРАВЛІННЯ, ГЕНІЧЕСЬКА ДПІ (ВЕЗ КРИМ,М.АЛУШТА)</NAME_STI>
     <NAME_RAJ>М.АЛУШТА</NAME_RAJ>
   </ROW_STI>
   <ROW_STI>
     <C_STI>103</C_STI>
     <C_RAJ>3</C_RAJ>
     <T_STI>6</T_STI>
     <NAME_STI>ГОЛОВНЕ УПРАВЛІННЯ ДПС У ХЕРСОНСЬКІЙ ОБЛАСТІ, АВТОНОМНІЙ РЕСПУБЛІЦІ КРИМ ТА М.СЕВАСТОПОЛІ, ГЕНІЧЕСЬКЕ УПРАВЛІННЯ, ГЕНІЧЕСЬКА ДПІ (ВЕЗ КРИМ,М.АРМЯНСЬК)</NAME_STI>
     <NAME_RAJ>М.АРМЯНСЬК</NAME_RAJ>
   </ROW_STI>
   <ROW_STI>
     <C_STI>104</C_STI>
     <C_RAJ>4</C_RAJ>
     <T_STI>6</T_STI>
     <NAME_STI>ГОЛОВНЕ УПРАВЛІННЯ ДПС У ХЕРСОНСЬКІЙ ОБЛАСТІ, АВТОНОМНІЙ РЕСПУБЛІЦІ КРИМ ТА М.СЕВАСТОПОЛІ, ГЕНІЧЕСЬКЕ УПРАВЛІННЯ, ГЕНІЧЕСЬКА ДПІ (ВЕЗ КРИМ,М. ДЖАНКОЙ)</NAME_STI>
     <NAME_RAJ>М.ДЖАНКОЙ/ДЖАНКОЙСЬКИЙ Р-Н</NAME_RAJ>
   </ROW_STI>
   <ROW_STI>
     <C_STI>105</C_STI>
     <C_RAJ>5</C_RAJ>
     <T_STI>6</T_STI>
     <NAME_STI>ГОЛОВНЕ УПРАВЛІННЯ ДПС У ХЕРСОНСЬКІЙ ОБЛАСТІ, АВТОНОМНІЙ РЕСПУБЛІЦІ КРИМ ТА М.СЕВАСТОПОЛІ, ГЕНІЧЕСЬКЕ УПРАВЛІННЯ, ГЕНІЧЕСЬКА ДПІ (ВЕЗ КРИМ,М.ЄВПАТОРІЯ)</NAME_STI>
     <NAME_RAJ>М.ЄВПАТОРІЯ</NAME_RAJ>
   </ROW_STI>
   <ROW_STI>
     <C_STI>106</C_STI>
     <C_RAJ>6</C_RAJ>
     <T_STI>6</T_STI>
     <NAME_STI>ГОЛОВНЕ УПРАВЛІННЯ ДПС У ХЕРСОНСЬКІЙ ОБЛАСТІ, АВТОНОМНІЙ РЕСПУБЛІЦІ КРИМ ТА М.СЕВАСТОПОЛІ, ГЕНІЧЕСЬКЕ УПРАВЛІННЯ, ГЕНІЧЕСЬКА ДПІ (ВЕЗ КРИМ,М.КЕРЧ)</NAME_STI>
     <NAME_RAJ>М.КЕРЧ</NAME_RAJ>
   </ROW_STI>
   <ROW_STI>
     <C_STI>107</C_STI>
     <C_RAJ>7</C_RAJ>
     <T_STI>6</T_STI>
     <NAME_STI>ГОЛОВНЕ УПРАВЛІННЯ ДПС У ХЕРСОНСЬКІЙ ОБЛАСТІ, АВТОНОМНІЙ РЕСПУБЛІЦІ КРИМ ТА М.СЕВАСТОПОЛІ, ГЕНІЧЕСЬКЕ УПРАВЛІННЯ, ГЕНІЧЕСЬКА ДПІ (ВЕЗ КРИМ, М.КРАСНОПЕРЕКОПСЬК)</NAME_STI>
     <NAME_RAJ>М.КРАСНОПЕРЕКОПСЬК</NAME_RAJ>
   </ROW_STI>
   
</SET_STI>
</ROW>
  
</ROWSET>
</ROWSET_WRAPPER>
' as myxml from dual
   )
   SELECT x.*
     FROM t,
        XMLTABLE(xmlnamespaces('http://a.com' as "eln"),
                '/ROWSET_WRAPPER/eln:ROWSET/eln:ROW/eln:SET_STI/eln:ROW_STI ' PASSING
                XMLTYPE(t.myxml) COLUMNS 
          
                   "C_STI" NUMBER(17, 2) PATH 'eln:C_STI',
                    "C_RAJ"  NUMBER(17, 2) PATH 'eln:C_RAJ',
                    "NAME_STI"  VARCHAR2(2555) PATH 'eln:NAME_STI',
                     "NAME_RAJ"  VARCHAR2(2555) PATH 'eln:NAME_RAJ'
                  
                
                )  x;



При большом размере получаю соответственно ORA-01704: string literal too long

Через clob?
Спасибо!
...
Рейтинг: 0 / 0
12.02.2020, 14:32
    #39925727
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
распарсить большой XLM
Moss
Через clob?
Clob-литералы не длиннее, поскольку их просто нет.
http://www.bugtraq.ru/forum/faq/general/smart-questions.html] RTFM
...
Рейтинг: 0 / 0
12.02.2020, 15:02
    #39925750
Moss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
распарсить большой XLM
или для такого варианта
Код: 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.
WITH t AS
 (SELECT XMLType('
<ROWSET>   
<ROW>
  <C_REG>1</C_REG>
  <NAME_REG>АР КРИМ</NAME_REG>
<SET_STI>
   <ROW_STI>
     <C_STI>101</C_STI>
     <C_RAJ>1</C_RAJ>
     <T_STI>1</T_STI>
     <NAME_STI>ГОЛОВНЕ УПРАВЛІННЯ ДПС У ХЕРСОНСЬКІЙ ОБЛАСТІ, АВТОНОМНІЙ РЕСПУБЛІЦІ КРИМ ТА М.СЕВАСТОПОЛІ (ВЕЗ КРИМ)</NAME_STI>
     <NAME_RAJ>АВТОНОМНА РЕСПУБЛІКА КРИМ</NAME_RAJ>
   </ROW_STI>
   <ROW_STI>
     <C_STI>102</C_STI>
     <C_RAJ>2</C_RAJ>
     <T_STI>2</T_STI>
     <NAME_STI>ГОЛОВНЕ УПРАВЛІННЯ ДПС У ХЕРСОНСЬКІЙ ОБЛАСТІ, АВТОНОМНІЙ РЕСПУБЛІЦІ КРИМ ТА М.СЕВАСТОПОЛІ, ГЕНІЧЕСЬКЕ УПРАВЛІННЯ, ГЕНІЧЕСЬКА ДПІ (ВЕЗ КРИМ,М.АЛУШТА)</NAME_STI>
     <NAME_RAJ>М.АЛУШТА</NAME_RAJ>
   </ROW_STI>
   </SET_STI>
</ROW>


<ROW>
  <C_REG>2</C_REG>
  <NAME_REG>АР КРИМ</NAME_REG>
<SET_STI>
   <ROW_STI>
     <C_STI>101</C_STI>
     <C_RAJ>1</C_RAJ>
     <T_STI>1</T_STI>
     <NAME_STI>ГОЛОВНЕ УПРАВЛІННЯ ДПС У ХЕРСОНСЬКІЙ ОБЛАСТІ, АВТОНОМНІЙ РЕСПУБЛІЦІ КРИМ ТА М.СЕВАСТОПОЛІ (ВЕЗ КРИМ)</NAME_STI>
     <NAME_RAJ>АВТОНОМНА РЕСПУБЛІКА КРИМ</NAME_RAJ>
   </ROW_STI>
   <ROW_STI>
     <C_STI>102</C_STI>
     <C_RAJ>2</C_RAJ>
     <T_STI>2</T_STI>
     <NAME_STI>ГОЛОВНЕ УПРАВЛІННЯ ДПС У ХЕРСОНСЬКІЙ ОБЛАСТІ, АВТОНОМНІЙ РЕСПУБЛІЦІ КРИМ ТА М.СЕВАСТОПОЛІ, ГЕНІЧЕСЬКЕ УПРАВЛІННЯ, ГЕНІЧЕСЬКА ДПІ (ВЕЗ КРИМ,М.АЛУШТА)</NAME_STI>
     <NAME_RAJ>М.АЛУШТА</NAME_RAJ>
   </ROW_STI>
   </SET_STI>
</ROW>

<ROW>
  <C_REG>2</C_REG>
  <NAME_REG>ВIННИЦЬКА</NAME_REG>
<SET_STI>
   <ROW_STI>
     <C_STI>201</C_STI>
     <C_RAJ>1</C_RAJ>
     <T_STI>6</T_STI>
     <NAME_STI>ГОЛОВНЕ УПРАВЛІННЯ ДПС У ВІННИЦЬКІЙ ОБЛАСТІ, ЖМЕРИНСЬКЕ УПРАВЛІННЯ, БАРСЬКА ДПІ (БАРСЬКИЙ РАЙОН)</NAME_STI>
     <NAME_RAJ>БАРСЬКИЙ Р-Н</NAME_RAJ>
   </ROW_STI>
   <ROW_STI>
     <C_STI>202</C_STI>
     <C_RAJ>2</C_RAJ>
     <T_STI>6</T_STI>
     <NAME_STI>ГОЛОВНЕ УПРАВЛІННЯ ДПС У ВІННИЦЬКІЙ ОБЛАСТІ, ТРОСТЯНЕЦЬКЕ УПРАВЛІННЯ, БЕРШАДСЬКА ДПІ (БЕРШАДСЬКИЙ РАЙОН)</NAME_STI>
     <NAME_RAJ>БЕРШАДСЬКИЙ Р-Н</NAME_RAJ>
   </ROW_STI>
   <ROW_STI>
     <C_STI>203</C_STI>
     <C_RAJ>3</C_RAJ>
     <T_STI>6</T_STI>
     <NAME_STI>ГОЛОВНЕ УПРАВЛІННЯ ДПС У ВІННИЦЬКІЙ ОБЛАСТІ, ВІННИЦЬКЕ УПРАВЛІННЯ, ВІННИЦЬКА ДПІ (ВІННИЦЬКИЙ РАЙОН)</NAME_STI>
     <NAME_RAJ>ВІННИЦЬКИЙ Р-Н</NAME_RAJ>
   </ROW_STI>
   
</SET_STI>
</ROW>
</ROWSET> 
') xml
    FROM dual)
    
SELECT
    a.*
  FROM (       SELECT 
               extractValue(VALUE(row1), 'ROW/C_REG') C_REG,
               extractValue(VALUE(row1), 'ROW/NAME_REG') NAME_REG,
               extractValue(VALUE(subrowl), 'ROW_STI/C_STI') C_STI,
               extractValue(VALUE(subrowl), 'ROW_STI/C_RAJ') C_RAJ,
               extractValue(VALUE(subrowl), 'ROW_STI/T_STI') T_STI,
               extractValue(VALUE(subrowl), 'ROW_STI/NAME_STI') NAME_STI,
               extractValue(VALUE(subrowl), 'ROW_STI/NAME_RAJ') NAME_RAJ
          FROM t s,
               TABLE(XMLSequence(s.xml.extract('ROWSET/ROW'))) row1 ,
               TABLE(XMLSequence(VALUE(row1).extract('ROW/SET_STI/ROW_STI')))(+) subrowl) a
...
Рейтинг: 0 / 0
12.02.2020, 15:08
    #39925756
Moss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
распарсить большой XLM
Elic
Moss
Через clob?
Clob-литералы не длиннее, поскольку их просто нет.
http://www.bugtraq.ru/forum/faq/general/smart-questions.html] RTFM

Сори если не правильно спросил.

Попробую по-другому.

Есть большой текст в виде набора тэгов.
Необходимо распарсить его для последующей вставки в таблицу.
В какой тип данных можно его сохранить, и как из него потом извлечь данные?
...
Рейтинг: 0 / 0
12.02.2020, 15:21
    #39925767
Moss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
распарсить большой XLM
Может в сторону external table копать?
...
Рейтинг: 0 / 0
12.02.2020, 15:25
    #39925770
123йй
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
распарсить большой XLM
Moss,

а зачем это делать в БД ?
...
Рейтинг: 0 / 0
12.02.2020, 15:34
    #39925773
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
распарсить большой XLM
Moss
Есть большой текст
Где он есть?
http://www.bugtraq.ru/forum/faq/general/smart-questions.html] RTFM
...
Рейтинг: 0 / 0
12.02.2020, 15:36
    #39925774
Moss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
распарсить большой XLM
Elic
Moss
Есть большой текст
Где он есть?
http://www.bugtraq.ru/forum/faq/general/smart-questions.html] RTFM

В файле .xml
...
Рейтинг: 0 / 0
12.02.2020, 15:40
    #39925775
Moss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
распарсить большой XLM
123йй,

В Excel я делал импорт а потом в базу вставлял.
Сразу в базу вставлял т.к. показал в примерах, но не натыкался на ограничение.
Можно конечно "забить" но уже хочу разобраться..
...
Рейтинг: 0 / 0
12.02.2020, 16:13
    #39925816
merch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
распарсить большой XLM
MossВ файле .xml

а чем dbms_lob не устроил?
...
Рейтинг: 0 / 0
12.02.2020, 19:05
    #39925953
Moss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
распарсить большой XLM
merch,
я создал табличку myblob_xml с полем blob
закинул в нее текст.
Попытался порезать на куски, но не учатно.
Думал обрезать от <ROW> по </ROW> но и внутри этих тегов много текста...
Код: plsql
1.
2.
3.
4.
5.
6.
7.
SELECT 

UPPER( UTL_RAW.CAST_TO_VARCHAR2(DBMS_LOB.SUBSTR(a, 2000, (NG.ID - 1) * 1000 + 1))) TextBlock

FROM myblob_xml x, (SELECT level as ID FROM dual connect BY level <100000)  NG

WHERE (NG.ID - 1) * 1000 < DBMS_LOB.Getlength(a)



Подкиньте идей....
...
Рейтинг: 0 / 0
12.02.2020, 19:17
    #39925962
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
распарсить большой XLM
Moss
с полем blob
Зачем?
Moss
Попытался порезать на куски
Зачем?
...
Рейтинг: 0 / 0
13.02.2020, 19:30
    #39926412
Moss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
распарсить большой XLM
Elic,
Я же писал - Думал обрезать от <ROW> по </ROW>
Почему blob ? потому что когда-то у меня была задачка найти есть ли определенный текст в поле сlob.

Я делал так
Код: 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.
SELECT DISTINCT *

FROM (SELECT aa.sql_id , trunc(bb.sample_time),

UPPER( UTL_RAW.CAST_TO_VARCHAR2(DBMS_LOB.SUBSTR(ext_clob2blob_moss(sql_text), 2000, (NG.Id - 1) * 1000 + 1))) TextBlock

FROM dba_hist_sqltext aa
,
(
select distinct sql_id , sample_time from  dba_hist_active_sess_history
where sample_time >= to_date('20131208','YYYYMMDD')
  and sample_time <= to_date('20131213','YYYYMMDD')
  and machine like '%WS-KV-000-91259%'

) bb , (SELECT level as ID FROM dual connect BY level <100000) NG 
where 
aa.sql_id = bb.sql_id  
and (NG.Id- 1) * 1000 < DBMS_LOB.Getlength(ext_clob2blob_moss(sql_text))

AND UPPER(

UTL_RAW.CAST_TO_VARCHAR2(
 
DBMS_LOB.SUBSTR(

ext_clob2blob_moss(sql_text), 

2000,

(NG.Id - 1) * 1000 + 1

))) LIKE UPPER('%380000%') 

)



Еще и конвертировал clob в 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.
create or replace function ext_clob2blob_moss(p_clob in clob) return blob is
 -- transforming CLOB a BLOB
 l_off number default 1;
 l_amt number default 4096;
 l_offWrite number default 1;
 l_amtWrite number;
 l_str varchar2(4096 char);
 p_blob blob;
 begin
  dbms_lob.createtemporary(p_blob,true,dbms_lob.session);
  begin
   loop
    dbms_lob.read ( p_clob, l_amt, l_off, l_str );
    l_amtWrite := utl_raw.length ( utl_raw.cast_to_raw( l_str) );
    dbms_lob.write( p_blob, l_amtWrite, l_offWrite,
    utl_raw.cast_to_raw( l_str ) );
    l_offWrite := l_offWrite + l_amtWrite;
    l_off := l_off + l_amt;
    l_amt := 4096;
   end loop;
  exception when no_data_found then null;
  end;
  return p_blob;
 end;



Почему я когда-то делал именно так - даже не помню...

Вот и решил попробовать похожим способом... но неудачно..

Я понимаю, что задавая вопросы Вы возможно хотите что-бы я обосновывая ход своих мыслей понимал почему я копаю не в ту сторону.. Но пока не докопался...
...
Рейтинг: 0 / 0
14.02.2020, 07:34
    #39926539
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
распарсить большой XLM
Moss
когда-то у меня была задачка
Moss
Но пока не докопался...
Не каждому дано…
...
Рейтинг: 0 / 0
19.02.2020, 18:02
    #39928605
Moss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
распарсить большой XLM
Elic,

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


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