powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / вопрос по xml и loop
13 сообщений из 13, страница 1 из 1
вопрос по xml и loop
    #39479571
maxwait
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!
Подскажите что не так сделал? выводиться всегда одна запись
Код: 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.
DECLARE                                                                                                                
    doc  DBMS_XMLDOM.DOMDocument;                                                                                        
    xdata  XMLTYPE;                                                                                                      

    CURSOR xmlcur IS                                                                                                  
    SELECT xmlelement("ELEMENT", XMLattributes('ver' as "ver")            
                                , xmlelement("OPEN",t.OPEN)                                                      
                                , xmlelement("CLOSE",t.CLOSE)                                                        
                                 ............ и т.д.                                 
                    )
      FROM TABLE t;
           
     BEGIN           
      OPEN xmlcur;   
           LOOP 
             FETCH xmlcur INTO xdata;
             EXIT WHEN xmlcur%NOTFOUND;
           END LOOP;
           dbms_output.put_line(xdata.getClobVal);
      CLOSE  xmlcur;   
      /*  
      doc := DBMS_XMLDOM.NewDOMDocument(xdata);                                                                            
      DBMS_XMLDOM.WRITETOFILE(doc, 'XMLDIR/data.xml');                                                                   
      */
   END; 



Заранее спасибо!
...
Рейтинг: 0 / 0
вопрос по xml и loop
    #39479580
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maxwait,

put_line перед end loop
...
Рейтинг: 0 / 0
вопрос по xml и loop
    #39480184
maxwait
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго времени суток,
подскажите пожалуйста
-как в атрибутах подсчитать общую длину блока в байтах и количества узлов в блоке
-и тоже самое только для каждого узла, общую длину узла и порядковый номер узла

Код: 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                                                                                                                
    doc  DBMS_XMLDOM.DOMDocument;                                                                                        
    xdata  XMLTYPE;     
       
CURSOR xmlcur IS   
SELECT XMLELEMENT("Table",
              XMLATTRIBUTES('200' as "len"/*Длина всего запроса в байтах LENGTHB */, '2' as "nRec"/*общее кол-во узлов*/),
        XMLAGG (
         XMLELEMENT("Rec",
               XMLATTRIBUTES('100' as "len"/*Длиина данного узла в байтах LENGTHB*/, '1' as "RecID" /*порядковый номер элемента*/),
          XMLFOREST(nvl(t.OPEN,' ') as "OPEN"                                                      
                  , nvl(t.CLOSE,'') as "CLOSE"                                                        
                  , nvl(t.TNAME,'') as "TNAME"                                
                  , nvl(t.ACCOUNT,'') as "ACCOUNT"
                  )     
                 )
                )
               )
FROM Tbl_Table t
WHERE rownum<=5;   
BEGIN           
    OPEN xmlcur;   
         LOOP 
           FETCH xmlcur INTO xdata;
           EXIT WHEN xmlcur%NOTFOUND;
           dbms_output.put_line(xdata.getClobVal);
         END LOOP;
    CLOSE  xmlcur;                    
END;    



Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
<Table len="200" nRec="2">
   <Rec len="100" RecID="1">
     <OPEN>06.08.2015</OPEN>
     <TNAME>Наименование 1 </TNAME>
     <ACCOUNT>123456789</ACCOUNT>
   </Rec>
   <Rec len="100" RecID="2">
     <OPEN>03.09.2015</OPEN>
     <TNAME>Наименование 2</TNAME>
     <ACCOUNT>987654321</ACCOUNT>
   </Rec>
</Table> 
...
Рейтинг: 0 / 0
вопрос по xml и loop
    #39480189
XMLSERIALIZE
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maxwaitобщую длину блока в байтах
Общая длина блока в байтах зависит от кодировки, в которой сохранен XML и количества символов отступа используемых при сериализации. Вы ее не узнаете, пока не сериализуете в двоичное прдеставление целевого формата.
...
Рейтинг: 0 / 0
вопрос по xml и loop
    #39480273
maxwait
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XMLSERIALIZE,

немного еще добавляю в 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.
DECLARE                                                                                                                
    doc  DBMS_XMLDOM.DOMDocument;                                                                                        
    xdata  XMLTYPE;     
       
CURSOR xmlcur IS   
SELECT XMLROOT (XMLELEMENT("TRANSPORT",
                XmlElement("THEADER", 
                   XMLATTRIBUTES("FILE" as "file"),
                   XmlElement("ORG", 'АО "РОГА И КОПЫТА"'),
                   XmlElement("BDate", '01.01.2017'),
                   XmlElement("LDate", '31.01.2017')
               ),
       XMLELEMENT("Table",
              XMLATTRIBUTES('200' as "len", '2' as "nRec"),
        XMLAGG (
         XMLELEMENT("Rec",
               XMLATTRIBUTES('100' as "len", '1' as "RecID"),
          XMLFOREST(nvl(t.OPEN,' ') as "OPEN"                                                      
                  , nvl(t.CLOSE,'') as "CLOSE"                                                        
                  , nvl(t.TNAME,'') as "TNAME"                                
                  , nvl(t.ACCOUNT,'') as "ACCOUNT"
                  )     
                 )
                )
               )
      ), version '1.0" encoding="windows-1251')
FROM Tbl_TABLE t
WHERE rownum<=2;   
BEGIN           
    OPEN xmlcur;   
         LOOP 
           FETCH xmlcur INTO xdata;
           EXIT WHEN xmlcur%NOTFOUND;
           dbms_output.put_line(xdata.getClobVal);
         END LOOP;
    CLOSE  xmlcur;                    
END; 



на выходе имею такой результат

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
<?xml version="1.0" encoding="windows-1251"?>
<TRANSPORT>
  <THEADER file="FILE">
    <Bank>АО &quot;РОГА И КОПЫТАК&quot;</Bank>
    <PBDate>01.01.2017</PBDate>
    <PLDate>01.02.2017</PLDate>
  </THEADER>
  <Table len="200" nRec="2">
    <Rec len="100" RecID="1">
      <OPEN>06.08.2015</OPEN>
      <TNAME>НАИМЕНОВАНИЕ</TNAME>
      <ACCOUNT>123</ACCOUNT>
    </Rec>
    <Rec len="100" RecID="2">
      <OPEN>03.09.2015</OPEN>
      <TNAME>НАИМЕНОВАНИЕ2</TNAME>
      <ACCOUNT>321</ACCOUNT>
    </Rec>
  </Table>
</TRANSPORT>




, Дальше подскажите какие мои действия. в какую сторону капать?
Заранее спасибо.
...
Рейтинг: 0 / 0
вопрос по xml и loop
    #39480274
maxwait
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maxwait,

чтобы определить служебные параметры len и rec
...
Рейтинг: 0 / 0
вопрос по xml и loop
    #39480443
maxwait
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maxwait,
Идентификатор взял ID из таблицы.
XMLATTRIBUTES('100' as "len", t.rn as "RecID"),

остался вопрос только в вычислением "len" длины в байтах.

Подскажите пожалуйста, в какую сторону копать!
...
Рейтинг: 0 / 0
вопрос по xml и loop
    #39480588
XMLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maxwaitПодскажите пожалуйста, в какую сторону копать!
XMLTYPE это объектный тип.
Какая длина этого элемента?
Код: plsql
1.
<a><b>1</b><c></c></a>


Допустим посчитал.
После твой документ сериализовали так:
Код: plsql
1.
2.
3.
4.
5.
select xmltype('<a><b>1</b><c></c></a>').getclobval(0,0) from dual
<a>
<b>1</b>
<c/>
</a>


о как, длина изменилась
А может его сериализовали так:
Код: plsql
1.
2.
3.
4.
5.
select xmlserialize (document xmltype('<a><b>1</b><c></c></a>') indent size = 4) from dual
<a>
    <b>1</b>
    <c/>
</a>


Опять другая длина.
Задача в общем не решаемая, а на частности время тратить не стоит.
...
Рейтинг: 0 / 0
вопрос по xml и loop
    #39480694
maxwait
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XMLer,

Да вот видите, этот атрибут len служебный, и в описании к структуре xml он важен. я бы с радостью опустил его, но думаю на той стороне, кто его будет принимать он не пройдет проверку...
В описании сказано, что учитывать все.. и отступы и пробелы и даже открывающие '<' и закрывающие '/>' теги. Думаю Ваш второй вариант наверное подойдет?
...
Рейтинг: 0 / 0
вопрос по xml и loop
    #39480705
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сталкивался с похожим при электронной подписи.
Отступы добавлялись/исчезали когда хотели (((. Долго бился, плюнул и все сделал на BLOB'ах (можно взять CLOB)
...
Рейтинг: 0 / 0
вопрос по xml и loop
    #39480757
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maxwaitатрибут len служебный, и в описании к структуре xml он важен. [...] на той стороне, кто его будет принимать он не пройдет проверку...Нет, я бы еще понял, если бы длину требовали для CDATы , - поскольку ее содержимое обычно не меняется при изменении формата основного документа, насколько я понимаю.
Но для самих XML-элементов указывать ихний размер в ихнем атрибуте - это, на мой взгляд, ахтунг.
Ведь, допустим, есть у вас XML-элемент. Посчитали его длину = X(неважно чего - байт или символов). Приписали ее ему в качестве атрибута. Но, смотрите-ка, после этого его длина увеличилась (поскольку добавили атрибут). Ну хорошо, исправили значение на новое. А длина элемента опять увеличилась, потому что, к примеру, значение длины было двухзначное, а стало трехзначное.
Я бы постарался послать ту сторону подальше с такими запросами.
Успехов
...
Рейтинг: 0 / 0
вопрос по xml и loop
    #39481465
XMLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevСталкивался с похожим при электронной подписи.
Отступы добавлялись/исчезали когда хотели (((. Долго бился, плюнул и все сделал на BLOB'ах (можно взять CLOB)
Отступы где?
Тут:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
<doc>
       <text>23512351234512</text>  
                                <ecp>MIIGWwetarqwett
trqwtqwtqertqe
wetqwetqwt
tqwertqtwtr==</ecp>
</doc>



или тут?
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
<doc>
<text>23512351234512</text>  
<ecp>MIIGWwetarqwett
trqwtqwtqertqe

wetqwetqwt
tqwertqtwtr==</ecp>
</doc>


Если второе то проблема с crlf, легко решается.
...
Рейтинг: 0 / 0
вопрос по xml и loop
    #39481474
XMLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--Eugene-- А длина элемента опять увеличилась, потому что, к примеру, значение длины было двухзначное, а стало трехзначное.

Не, элемент со значением длины лежит вовне: <a len="4"><b/></a>
--Eugene--Я бы постарался послать ту сторону подальше с такими запросами.
Успехов
Я бы поставил вопрос еще жестче: если не осознаю всю бредовость своих требований- уволиться чтобы не портить профессиональную карму. Решая такие задачи Вы деградируете. Смелости ТСу
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / вопрос по xml и loop
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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