powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / XML в Oracle9i. Примеры разборки
25 сообщений из 239, страница 3 из 10
XML в Oracle9i. Примеры разборки
    #33371549
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня везде юникод, я упоминал:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
SQL> select * from V$NLS_PARAMETERS
   2   where parameter in ('NLS_CHARACTERSET','NLS_NCHAR_CHARACTERSET');

PARAMETER                                                        VALUE
---------------------------------------------------------------- -----
NLS_CHARACTERSET                                                 UTF8
NLS_NCHAR_CHARACTERSET                                           UTF8
Чего интересно: updateXML колдует с encoding даже если не используется getStringVal():
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
SQL> select updateXml(
   2              XMLType('<?xml version="1.0" encoding="Cp1251"?><ROOT><USERS/></ROOT>')
   3            , '/ROOT/USERS'
   4            ,  XmlElement("USERS", XMLAgg(XMLForest(user_id, username)))
   5          ) xml
   6   from all_users
   7   where username = user;

XML
---------------------------------------------------------------------------------------
<?xml version="1.0" encoding="WINDOWS-1251"?>
<ROOT>
  <USERS>
    <USER_ID> 63 </USER_ID>
    <USERNAME>DAN</USERNAME>
  </USERS>
</ROOT>

Заметь: был Cp1251, стал WINDOWS-1251. Причем чтобы я ни пробовал вместо Cp1251: windows-1257, koi8-r, у меня вечно идет WINDOWS-1251. После чего изменил NLS_LANG на RU8PC866, переконнектился: и теперь всегда стал возвращаться CP866.

То есть, на мой взгляд, получается следующее: updateXML строит новый документ с кодировкой клиента и наполняет его данными. В случае отсутствия клиента (как, например, работа через Java Thin-драйвер) берется кодировка БД.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33420037
h00f
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приветствую.

У меня вопрос, очень бы хотелось бы получить ответ. Я с Ораклом работаю недавно (больше программер).

Собственно проблема.

Мне нужно распарсить XMLType с документами XML и как результат разложить в таблицы.

Я пользую парсер который выкладывался сдесь на борде.

Код: plaintext
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.
CREATE OR REPLACE PROCEDURE "XMLPARS" AS
BEGIN

DECLARE
  l_doc      DBMS_XMLDOM.DOMDocument;  -- основной DOM-документ
  vmarker int; -- temp
  zvk XMLType;
  -- Процедура вывода атрибутов узла
  PROCEDURE ShowNodeAttributes(i_node IN DBMS_XMLDOM.DOMNode)
  IS
    l_nattrs DBMS_XMLDOM.DOMNamedNodeMap;  -- список атрибутов узла
    l_node   DBMS_XMLDOM.DOMNode;          -- узел с типом - атрибут
    l_sattrs VARCHAR2( 2000 );               -- текстовое описание атрибутов
  BEGIN
    -- получить атрибуты узла
    l_nattrs := DBMS_XMLDOM.GetAttributes(i_node);
    
    -- вывести имена атрибутов и их значения одной строкой
    IF NOT DBMS_XMLDOM.isNull(l_nattrs) THEN
      FOR i IN  0 ..DBMS_XMLDOM.GetLength(l_nattrs)- 1  LOOP
        l_node    := DBMS_XMLDOM.item(l_nattrs,i);
        l_sattrs  := l_sattrs||DBMS_XMLDOM.GetNodeName(l_node)||'="'
                     ||DBMS_XMLDOM.GetNodeValue(l_node)||'" ';
      END LOOP;
      dbms_output.put_line('Attrs: '||l_sattrs);              
    END IF;   
  END;
  
  -- Рекурсивная процедура построения дерева DOM документа
  PROCEDURE RecursiveTree(i_node IN DBMS_XMLDOM.DOMNode)
  IS
    l_nlist DBMS_XMLDOM.DOMNodeList;  -- Список дочерних узлов
    l_node  DBMS_XMLDOM.DOMNode;      -- текущий узел 
    l_nval  VARCHAR2( 2000 );           -- значение узла
  BEGIN
    -- откроем описание узла
    dbms_output.put_line('Start: '||DBMS_XMLDOM.getNodeName(i_node));
    
    -- если значение узла NULL, пропустим его
    l_nval := DBMS_XMLDOM.getNodeValue(i_node);
    IF l_nval IS NOT NULL THEN
       dbms_output.put_line('Value: '||l_nval);
    END IF;
    
    -- Вывести атрибуты узла
    ShowNodeAttributes(i_node);
    
    -- для дочерних узлов, узла, рассматриваемого в текущий момент
    l_nlist := DBMS_XMLDOM.getchildnodes(i_node);
    
    -- повторить выполненные действия   
    IF NOT DBMS_XMLDOM.isNull(l_nlist) THEN
       FOR i IN  0 ..DBMS_XMLDOM.getLength(l_nlist)- 1  LOOP           
          l_node := DBMS_XMLDOM.item(l_nlist,i);         
          RecursiveTree(l_node); 
       END LOOP; 
    END IF;
    
    -- закроем описание узла
    dbms_output.put_line('Endof: '||DBMS_XMLDOM.getNodeName(i_node));   
  END;
BEGIN
-- инициализация документа
/*   l_doc := DBMS_XMLDOM.newdomdocument(XMLType('
--<bookshelf>
  <book name="А Таle Of Two Cities" author="Dickens">
    <part n="1">Recalled to Life</part>
    <part n="2">The Golden Thread</part>
    <part n="3">A Track of A storm</part>
  </book>
  <book name="Great Expectations" author="Dickens">
    <part contents="no info"/>
  </book>
</bookshelf>'));  
*/   
   -- построение дерева

  
--  select xmlzvk into zvk from r_mail where marker=820987247469933;
  select description into zvk from books1 where marker= 1 ;
  l_doc := DBMS_XMLDOM.newdomdocument(zvk);
   RecursiveTree(DBMS_XMLDOM.makeNode(l_doc));
END; 
END;

Получаю результат. Проблема в том, что я НЕМОГУ НАЙТИ решение КАК мне разложить результаты в реляционные таблицы. Я не знаю заранее какому тэгу соответствует какое поле и его тип. Я сделал XMLSchema документ с нотацией Oracle (насколько я смог разобраться с ней) в надежде что это поможет решить данную проблему.

Код: plaintext
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"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xdb="http://xmlns.oracle.com/xdb" elementFormDefault="qualified" attributeFormDefault="unqualified" xdb:storeVarrayAsTable="true">
  <xs:include schemaLocation="v01-CODES-RUSSIA.xsd"/>
  <xs:include schemaLocation="v01-TYPES-RUSSIA.xsd"/>
  <xs:element name="Msg" xdb:defaultTable="R_ZAY">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="ForInfo" type="ForInfoCODES" xdb:SQLName="FORINFO" xdb:SQLType="VARCHAR2"/>
        <xs:element name="Enterprise" type="EnterpriseTYPE" xdb:SQLName="ENTERPRISE" xdb:SQLType="VARCHAR2"/>
        <xs:element name="SelfNumber" type="SelfNumberTYPE" xdb:SQLName="SELF_NUMBER" xdb:SQLType="NUMBER"/>        
        
-----8<---------SKIP------>8------

        <xs:element name="Notes" type="NotesTYPE" minOccurs="0" xdb:defaultTable="R_NOTES"/>
        <xs:element name="Text" type="TextTYPE" minOccurs="0" xdb:SQLName="TEXT" xdb:SQLType="VARCHAR2"/>
      </xs:sequence>
      <xs:attribute name="type" type="TypeCODES" xdb:SQLName="ID_MTYPE" xdb:SQLType="VARCHAR2"/>
    </xs:complexType>
  </xs:element>
</xs:schema>

Данная схема IMHO смогла бы мне помочь, но опять же как ее увязать с парсером и раскладкой в таблицы, к сожалению я не знаю.

Был бы БЕЗМЕРНО ПРИЗНАТЕЛЕН за помощь с решением данной проблемы. Я просто в одиночку разруливаю эту задачу..

По системе Oracle 10.1.0
icq:168815113

Сорри если ламерские вопросы..
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33420525
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
h00fПолучаю результат. Проблема в том, что я НЕМОГУ НАЙТИ решение КАК мне разложить результаты в реляционные таблицы. Я не знаю заранее какому тэгу соответствует какое поле и его тип. Я сделал XMLSchema документ с нотацией Oracle (насколько я смог разобраться с ней) в надежде что это поможет решить данную проблему.

А чем же в конечном счете определяется, что куда должно попасть?
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33420676
h00f
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я посчитал, что использование XMLSchema + нотации Oracle позволят сделать некий универсальный механизм по загрузке. Я просто не понимаю, как еще можно прописать куда должно записываться содержимое тэга, как реализовать хранение контейнера, при условии что типов сообщений порядка 36!

Проблема в том, что часть проекта связанная с парсингом и накоплением дожна быть максимально универсальной т.к. (12 типов сообщений по почте, 24 типа по SOAP планируется + куча алгоритмов заимодействия и последующая реализация WSA). Я поднял XMLSchema для валидации XML сообщений, насколько смог разобрал нотации Oracle в этой части в надежде, что используя XMLSchema (XSDL) и XMLType с XML документами смогу нормально разложить в базу. Но столкнулся с тем что я НЕ ПОНИМАЮ КАК пользовать парсер с XMLSchema + XML.
PL/SQL учу но опыта мало, Java не знаю, да Oracle Application Server не стоит ишо.

Наверное звучит глупо и много всего, но блин нада делать а у мя бошка кругом от всего в особенности этого парсинга с загрузкой в таблицы.. Сотни вопросов.. Сорри понесло ..
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33420714
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я вот тоже думал, что есть нечто навороченное, наподобе пары пакетов DBMS_XMLGEN -> DBMS_XMLSAVE (в 10-ке добавили DBMS_XMLSTORE, реализованный чисто на C, что обещает быть быстрее DBMS_XMLSAVE c Java): http://download-uk.oracle.com/docs/cd/B19306_01/appdev.102/b14259/xdb_dbmstore.htm#sthref1413

It takes a canonical XML mapping similar to that produced by package DBMS_XMLGEN; converts it to object-relational constructs; and inserts, updates or deletes the value from relational tables.
Т.е. есть некий "канонический" XML, который всегда можно запихать в таблицу не гадая о том, какие в XML и таблице поля, закладываясь на то, что они совпадают. Получается одна процедура на заливку всех таблиц из xml. Как следует выкручиваться, если XML не "каконический" - вопрос, который бы хотелось прояснить. Пока все варианты сводятся к тому, что для обработкий каждой таблицы пишется свой код, либо делается опять же свой разборщик приходящего XML.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33445621
h00f
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть интересный пример по мапингу XML.. одна проблема пример загрузки XML приведен на Java на Pl/sql нетути .. к сожалению. .

Oracle Database 10g XML & SQL: Design, Build & Manage XML Applications in Java, C, C++ & PL/SQL
Object Views
If an XML document is not in the canonical format, you can create object views or XMLType views, to allow XSU to map XML documents to database tables. In the following contact.xml XML document, the contact information is stored as follows:


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
<Contact_List>
 <Contact>
  <User_id>userid</User_id>
  <First_Name>Steve</First_Name>
  <Last_Name>Jones</Last_Name>
  <Business>
   <Email>Steve.Jones@oracle.com<;/Email>
   <Phone>( 650 ) 5769801 </Phone>
   <Address>
    <Street1>4op11</Street1>
    <Street2> 500  Oracle Parkway</Street2>
    <City>Redwood Shores</City>
    <State>CA</State>
    <Zipcode> 94065 </Zipcode>
    <Country>USA</Country>
   </Address>
  </Business>
 </Contact>
</Contact_List>

Oracle Database 10g XML & SQL: Design, Build & Manage XML Applications in Java, C, C++ & PL/SQL
The database schema is defined as follows:


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
CREATE TYPE address_typ AS OBJECT(
  street1 VARCHAR2( 200 ), 
  street2 VARCHAR2( 200 ), 
  city VARCHAR2( 100 ), 
  state VARCHAR2( 20 ), 
  zipcode VARCHAR2( 20 ), 
  country VARCHAR2( 20 )); 
/
CREATE TABLE contact_tbl(
  contactid VARCHAR2( 15 ) PRIMARY KEY, 
  firstname VARCHAR2( 100 ), 
  lastname VARCHAR2( 200 ), 
  midname VARCHAR2( 50 ), 
  business_phone VARCHAR2( 20 ), 
  home_phone VARCHAR2( 10 ), 
  cell_phone VARCHAR2( 20 ), 
  business_addr address_typ, 
  business_email VARCHAR2( 150 ));

Oracle Database 10g XML & SQL: Design, Build & Manage XML Applications in Java, C, C++ & PL/SQL
Using the canonical mapping, the XML document cannot directly map to the table columns as the document contains multiple levels; thus, to insert this XML document, you need to create the following object view:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
CREATE TYPE contactinfo_type AS OBJECT(
   phone VARCHAR2( 20 ),
   email VARCHAR2( 150 ),
   address address_typ);
/
 -- Create Object View
CREATE VIEW contact_view AS
   SELECT contactid AS user_id, firstname AS first_name, lastname AS
     last_name,midname AS mid_name,
     contactinfo_type(business_phone,business_email,
     business_addr) AS business
   FROM contact_tbl;

Oracle Database 10g XML & SQL: Design, Build & Manage XML Applications in Java, C, C++ & PL/SQL
Then, you can run a similar command to load the XML file into CUSTOMER_VIEW:


Код: plaintext
1.
2.
java OracleXML putXML -conn "jdbc:oracle:thin:@localhost:1521:orclX"
 -user "demo/demo" -fileName "contacts.xml" "contact_view"

Я как довольно слабый в части pl/sql не могу понять можно ли с помощью данного решения решить проблему хранения XML сообщений смешанной структуры (вертикальная+горизонтальная) с хорошей степенью вложенности контейнеров..

И еще как посредством pl/sql сделать мапинг XML таки в эту конструкцию...

Извиняюсь на назойливость.. Но проект горит и уже сзати попахивает паленным.. Сорри
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33460210
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Появился ещё один вопрос по разборке XML.
Вопрос такой. Можно ли каким-то образом написать, приведённый ниже, запрос без использования union. Нужно учитывать, что в XML документе может отсутствовать как первая часть <PROCEDURE name="DATA_1"> так и вторая <PROCEDURE name="DATA_2">. В обычном запросе это бы решилось с помощью (+).
Код: plaintext
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.
select
     'x' as source
    ,x.extract('//PARAM[@name="1"]/@value').getStringVal()  as param_1
    ,x.extract('//PARAM[@name="2"]/@value').getStringVal()  as param_2
    ,null  as param_3
from
    table(XMLSequence(xmltype('<RESPONCE>
                                 <PROCEDURE name="DATA_1">
                                  <PARAM name="1" value="AAA" />
                                  <PARAM name="2" value="100" />
                                 </PROCEDURE>
                                 <PROCEDURE name="DATA_2">
                                  <PARAM name="1" value="AAA" />
                                  <PARAM name="2" value="200" />
                                  <PARAM name="3" value="1" />
                                 </PROCEDURE>
                                </RESPONCE>').extract('RESPONCE/PROCEDURE[@name="DATA_1"]'))) x

union

select
     'y' as source
    ,y.extract('//PARAM[@name="1"]/@value').getStringVal()  as param_1
    ,y.extract('//PARAM[@name="2"]/@value').getStringVal()  as param_2
    ,y.extract('//PARAM[@name="3"]/@value').getStringVal()  as param_3
from
    table(XMLSequence(xmltype('<RESPONCE>
                                 <PROCEDURE name="DATA_1">
                                  <PARAM name="1" value="AAA" />
                                  <PARAM name="2" value="100" />
                                 </PROCEDURE>
                                 <PROCEDURE name="DATA_2">
                                  <PARAM name="1" value="AAA" />
                                  <PARAM name="2" value="200" />
                                  <PARAM name="3" value="1" />
                                 </PROCEDURE>
                                </RESPONCE>').extract('RESPONCE/PROCEDURE[@name="DATA_2"]'))) y
where extractValue(value(y),'//PARAM[@name="3"]/@value') = '1';

...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33460324
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если может отсутствовать как первая, так и вторая части, то (+)-ом ИМХО не отделаешься, это уже напоминает FULL OUTER JOIN.

Раз их может не быть - вставь их самостоятельно, чтобы были наверняка:
Код: plaintext
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.
select case procedure_name when 'DATA_1' then 'x' when 'DATA_2' then 'y' end source
     , max(param_1) param_1
     , max(param_2) param_2
     , max(param_3) param_3
from (select x.extract('//PROCEDURE/@name').getStringVal() procedure_name
           , x.extract('//PROCEDURE/PARAM[@name="1"]/@value').getStringVal() param_1
           , x.extract('//PROCEDURE/PARAM[@name="2"]/@value').getStringVal() param_2
           , x.extract('//PROCEDURE/PARAM[@name="3"]/@value').getStringVal() param_3
      from table(XMLSequence(XMLType(
'<RESPONCE>
 <PROCEDURE name="DATA_1">
  <PARAM name="1" value="AAA" />
  <PARAM name="2" value="100" />
 </PROCEDURE>
 <PROCEDURE name="DATA_2">
  <PARAM name="1" value="AAA" />
  <PARAM name="2" value="200" />
  <PARAM name="3" value="1" />
 </PROCEDURE>
</RESPONCE>').extract('/RESPONCE/PROCEDURE'))) x
      union all
      select 'DATA_1', null, null, null from dual
      union all
      select 'DATA_2', null, null, null from dual
     )
group by procedure_name;
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33463712
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, попробую!
В случае с union почему-то вылетает ошибка
ORA-22905: cannot access rows from a non-nested table item

Есть идеи, почему? Смоделировать такую ситуацию для тестового примера пока не получается.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33463818
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
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.
        select
             'x'  as source
            ,'1' as order_by
            ,'1' as id
            ,'1' as p
            ,to_date('01.01.1900','dd.mm.yyyy') as chng_date
            ,'1' as chng_r
            ,'1' as chng_code
            ,'1' as dtype
            ,'1' as dcode
            ,'1' as no
            ,to_date('01.01.1900','dd.mm.yyyy') as issue_date
            ,to_date('01.01.1900','dd.mm.yyyy') as expire_date
            ,'1' as country
            ,'1' as country2
            ,'1' as offc
            ,'1' as offcc
            ,'1' as offct
        from
             table(XMLSequence(cp_xml.extract('RESPONSE/PROCEDURE[@name="DATA_1"]')))  x
        union
        select
             'y'  as source
            ,'1' as order_by
            ,'1' as id
            ,'1' as p
            ,to_date('01.01.1900','dd.mm.yyyy') as stat_chng_date
            ,'1' as chng_r
            ,'1' as chng_code
            ,'1' as dtype
            ,'1' as dcode
            ,'1' as no
            ,to_date('01.01.1900','dd.mm.yyyy') as issue_date
            ,to_date('01.01.1900','dd.mm.yyyy') as expire_date
            ,'1' as country
            ,'1' as country2
            ,'1' as offc
            ,'1' as offcc
            ,'1' as offct
        from
             table(XMLSequence(cp_xml.extract('RESPONSE/PROCEDURE[@name="DATA_2"]'))) Y

Такое вызывает ORA-22905
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33463852
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ошибка появляется независимо от количества параметров. Инетресно, что в SQL*Plus такой запрос работает, а внутри процедуры - нет!
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33464384
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В предыдущих примервх был RESPON C E, теперь стал RESPOR S E - так и должно быть?
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33464461
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С этим всё в порядке, описка просто
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33464467
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33464728
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну по-скольку 9-ый Оракл что-то бастует и не хочет работать с XMLType и Union, ваш, Денис, вариант нахожу переспективным. Но как создать селект без union, если в запрос добавляется параметр order_by (числа 11 и 22 - могут быть любыми)
Код: plaintext
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.
select
     'x' as source
    ,case when x.extract('//PARAM[@name="2"]/@value').getStringVal() =  11  then '1' else '3' end as order_by
    ,x.extract('//PARAM[@name="1"]/@value').getStringVal()  as param_1
    ,x.extract('//PARAM[@name="2"]/@value').getStringVal()  as param_2
    ,null  as param_3
from
    table(XMLSequence(xmltype('<RESPONCE>
                                 <PROCEDURE name="DATA_1">
                                  <PARAM name="1" value="AAA" />
                                  <PARAM name="2" value="100" />
                                 </PROCEDURE>
                                 <PROCEDURE name="DATA_2">
                                  <PARAM name="1" value="AAA" />
                                  <PARAM name="2" value="200" />
                                  <PARAM name="3" value="1" />
                                 </PROCEDURE>
                                </RESPONCE>').extract('RESPONCE/PROCEDURE[@name="DATA_1"]'))) x

union

select
     'y' as source
    ,case when y.extract('//PARAM[@name="2"]/@value').getStringVal() =  22  then '2' else '4' end as order_by
    ,y.extract('//PARAM[@name="1"]/@value').getStringVal()  as param_1
    ,y.extract('//PARAM[@name="2"]/@value').getStringVal()  as param_2
    ,y.extract('//PARAM[@name="3"]/@value').getStringVal()  as param_3
from
    table(XMLSequence(xmltype('<RESPONCE>
                                 <PROCEDURE name="DATA_1">
                                  <PARAM name="1" value="AAA" />
                                  <PARAM name="2" value="100" />
                                 </PROCEDURE>
                                 <PROCEDURE name="DATA_2">
                                  <PARAM name="1" value="AAA" />
                                  <PARAM name="2" value="200" />
                                  <PARAM name="3" value="1" />
                                 </PROCEDURE>
                                </RESPONCE>').extract('RESPONCE/PROCEDURE[@name="DATA_2"]'))) y
where extractValue(value(y),'//PARAM[@name="3"]/@value') = '1';

...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33464757
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во-первых, поясни, чем не нравится вышеприведенный вариант? Во-вторых, почему UNION, а не UNION ALL, раз запросы наверняка разнятся? При использовании последнего ИМХО можно заложиться, что UNION ALL порядок записей не меняет. И, напоследок, что мешает использовать CASE в ORDER BY?
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33464781
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По поводу union all согласен.

Почему нельзя case в order by:

В XML от процедуры DATA_1 есть строки с определёнными значениями параметров param_2:
- тоесть если param_2 принадлежит какому-то множеству (в примере числу 11), такие строки выводить первыми.
- другие строки выводить третими по счёту

В XML от процедуры DATA_2 есть строки с определёнными значениями параметров param_2 (но эти значения НЕ ТАКИЕ как в первой процедуре):
Выводим соответственно вторыми и четвёртыми по счёту.

Чтобы в итоге получилось:
данные_процедуры_1
данные_процедуры_2
данные_процедуры_1
данные_процедуры_2

Этот порядок очень важен. XML писал не я, не могу на него повлиять в данном случае.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33464791
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Видимо нужна функция
function get_ortder_by(source,param2) return number
:)
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33464838
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделал функцию, создал селект без union (похожий на тот, что привёл Денис) и никак проблем. Спасибо!
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33833063
lav_spb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сорри, но никак не могу понять как имя такой примерно select:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
select d.extract('/ATTRIBUTE/@id').getStringVal() surname,'имя package' package
from table(XMLSequence(XMLType(
'<?xml version="1.0" encoding="windows-1257" ?>
<RESPONSE>
  <DATA REQUEST_ID="111">
    <ENTITY name="PACKAGE_001">
      <ATTRIBUTE id="PERS_ID"  value="1111" />
      <ATTRIBUTE id="FIRST_NAME" value="OLGA" />
      <ATTRIBUTE id="SURNAME" value="NOVIKOVA" />
    </ENTITY>
    <ENTITY name="PACKAGE_002">
      <ATTRIBUTE id="PERS_ID" value="2222" />
      <ATTRIBUTE id="FIRST_NAME" value="ANNA" />
      <ATTRIBUTE id="SURNAME" value="ANTONOVA" />
    </ENTITY>
  </DATA>
</RESPONSE>'
      ).extract('RESPONSE/DATA/ENTITY/ATTRIBUTE'))) d;


Получить Entity name рядом с каждым id Атрибута???
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33833209
Lav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пишу вот так, а не работает, помогите плиз.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
select d.extract('/ATTRIBUTE/@id').getStringVal() surname,d.extract('../ENTITY/@name').getstringval() package
from table(XMLSequence(XMLType(
'<?xml version="1.0" encoding="windows-1257" ?>
<RESPONSE>
  <DATA REQUEST_ID="111">
    <ENTITY name="PACKAGE_001">
      <ATTRIBUTE id="PERS_ID" name="1" value="1111" />
      <ATTRIBUTE id="FIRST_NAME" name="2" value="OLGA" />
      <ATTRIBUTE id="SURNAME" name="3" value="NOVIKOVA" />
    </ENTITY>
    <ENTITY name="PACKAGE_002">
      <ATTRIBUTE id="PERS_ID" name="4" value="2222" />
      <ATTRIBUTE id="FIRST_NAME" name="5" value="ANNA" />
      <ATTRIBUTE id="SURNAME" name="6" value="ANTONOVA" />
    </ENTITY>
  </DATA>
</RESPONSE>'
      ).extract('RESPONSE/DATA/ENTITY/ATTRIBUTE'))) d;
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33833210
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
/topic/300566
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33833536
Lav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо. Помогло.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #34046528
Фотография Timm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наткнулся на статью об SQL/XML в Оракле. Описываются основные функции, новые возможности 10g, примеры, known issues, bugs, присутствуют ссылки на доку, короче XML in Oracle by Example.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #34188059
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Denis Popov
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
select d.extract('//ENTITY//ATTRIBUTE[@name="SURNAME"]/@value').getStringVal() surname
from table(XMLSequence(XMLType(
'<?xml version="1.0" encoding="windows-1257" ?>
<RESPONSE>
  <DATA REQUEST_ID="111">
    <ENTITY name="PACKAGE_001">
      <ATTRIBUTE name="PERS_ID" value="1111" />
      <ATTRIBUTE name="FIRST_NAME" value="OLGA" />
      <ATTRIBUTE name="SURNAME" value="NOVIKOVA" />
    </ENTITY>
    <ENTITY name="PACKAGE_001">
      <ATTRIBUTE name="PERS_ID" value="2222" />
      <ATTRIBUTE name="FIRST_NAME" value="ANNA" />
      <ATTRIBUTE name="SURNAME" value="ANTONOVA" />
    </ENTITY>
  </DATA>
</RESPONSE>'
      ).extract('RESPONSE/DATA/ENTITY'))) d;


На одной СУБД Oracle этот запрос проходит, на другой нет:

ORA-06502: PL/SQL: numeric or value error
ORA-06512: at line 1

Oracle 9.2.0.1.0, если я правильно понял.

Патч?
...
Рейтинг: 0 / 0
25 сообщений из 239, страница 3 из 10
Форумы / Oracle [игнор отключен] [закрыт для гостей] / XML в Oracle9i. Примеры разборки
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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