powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / XML в Oracle9i. Примеры разборки
25 сообщений из 239, страница 2 из 10
XML в Oracle9i. Примеры разборки
    #33364675
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
declare
  xml     XMLType := XMLType(
'<?xml version="1.0" encoding="windows-1257" ?>
<RESPONSE xmlns="http://testserver"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://testserver response.xsd">
  <DATA/>
</RESPONSE>');
  parser  xmlparser.Parser;
  xmldoc  xmldom.DOMDocument;
  xslelem xmldom.DOMElement;
  nspace  varchar2( 50 );
begin
  parser := xmlparser.newParser;
  xmlparser.setValidationMode(parser, false);
  xmlparser.setPreserveWhiteSpace(parser, true);
  xmlparser.parseClob(parser, xml.getClobVal());
  xmldoc := xmlparser.getDocument(parser);
  xslelem := xmldom.getDocumentElement(xmldoc);
  nspace := xmldom.getNamespace(xslelem);
  dbms_output.enable( 20000 );
  dbms_output.put_line('Namespace: '||nspace);
end;
/



...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33364691
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Denis PopovВ качестве одной мысли: если исходный XML окаймить еще одним элементом, т.е. вложить в некий другой XML, то extract(), с учетом исправленного пути, работает и без namespace.

Я сделал так:
Код: 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.
select
    xmlelement("MY_RESPONSE",
                    xmltype('<RESPONSE
xmlns="http://testserver"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://testserver response.xsd">
 <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>
 </DATA>
</RESPONSE>'))
from dual;

-- output
'<MY_RESPONSE><RESPONSE
xmlns="http://testserver" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://testserver response.xsd">
  <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>
  </DATA>
</RESPONSE>
</MY_RESPONSE>'

В результате запроса my_XML.existsNode('RFP/RESPONSE') получаем '0'. Не получилось.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33364701
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Извиняюсь, я имел в виду xmldom, использованный в примере

А в заблуждение попал из-за версий Oracle: в Oracle 10.2 синоним XMLDOM указывает на пакет sys.DBMS_XMLDOM, а в Oracle 9.2 на sys.XMLDOM.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33364723
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Denis PopovИзвиняюсь, я имел в виду xmldom, использованный в примере

А в заблуждение попал из-за версий Oracle: в Oracle 10.2 синоним XMLDOM указывает на пакет sys.DBMS_XMLDOM, а в Oracle 9.2 на sys.XMLDOM.

В 9-ом Оракле это XDB.DBMS_XMLDOM.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33364978
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В дополнение к этому XSL , заметил, что если в XSL указать в имени шаблона не "/", а имя элемента с указанным namespace, то оно работает:
Код: 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.
create table test_xml (xml XMLType);
insert into test_xml (xml) values (XMLType(
'<?xml version="1.0" encoding="windows-1257" ?>
<RESPONSE xmlns="http://testserver"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://testserver response.xsd">
  <DATA>
    <SYSTEM_ERRORS>
      <ERROR_CODE>BAD_PERSON_ID</ERROR_CODE>
      <ERROR>Incorrect person ID, please check input data</ERROR>
      <ERROR>ORA-01403: no data found</ERROR>
      <ERROR>ORA-20000: person_id is empty</ERROR>
    </SYSTEM_ERRORS>
  </DATA>
</RESPONSE>'));

create table test_xsl (xsl XMLType);
insert into test_xsl (xsl) values (XMLType(
'<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="no"/>

<xsl:template match="RESPONSE">
<xsl:for-each select="RESPONSE/DATA/SYSTEM_ERRORS/ERROR">
  <xsl:choose>
    <xsl:when test="position()=1"></xsl:when>
    <xsl:otherwise>;</xsl:otherwise>
  </xsl:choose>
  <xsl:value-of select="."/>
</xsl:for-each>
</xsl:template>

</xsl:stylesheet>'));
commit;

select XMLTransform (
          xml.xml
        , (select xsl from test_xsl)
       ).getStringVal() result
from test_xml xml;
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33364995
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и напоследок: баловство все это:) Подсказали мне, как получается namespace в XMLType (через тот же XSL):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
select
  XMLType(
'<RESPONSE xmlns="http://testserver"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://testserver response.xsd">
</RESPONSE>'
  ).transform(
    XMLType(
'<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/*">
    <xsl:value-of select="namespace-uri(.)"/>
  </xsl:template>
</xsl:stylesheet>'
    )
  ).getStringVal() namespace 
from dual;
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33368529
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Denis PopovНу и напоследок: баловство все это:) Подсказали мне, как получается namespace в XMLType

Красивый вариант. Тоесть я снчала извлекаю этот namespace, а потом уже его использую в операторе extract(), как второй параметр. Вроди хорошая реализация (до тех пор, пока в FROM используется extract()).

Спасибо!
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33368530
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Flukky
Код: plaintext
1.
"//SYSTEM_ERRORS/ERROR[1]/text()"; "//SYSTEM_ERRORS/ERROR[2]/text()"; "//SYSTEM_ERRORS/ERROR[3]/text()".

Только как я могу узнать, сколько элементов <ERROR> у меня в документе?

Этот вопрос ещё актуален. Как узнать количество элементов в документе?
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33368579
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FlukkyИ ещё вопрос по этой же теме. Возвращается XML в формате <?xml version="1.0" encoding="utf-8" ?>. Как сменить кодировку на windows-1257?

Этот вопрос тоже всё ещё актуален.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33368593
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, с разборкой XML документов более или менее разобрался. Не исключено, что начав разрабатывать реально приложение (сейчас только тесты), ещё появяться.

Теперь есть вопрос про составление XML документа .

Какие функции обычно используют для составления XML документа? xmltype(varchar2) и xmltype.createxml(varchar2) я уже знаю (хотя не пойму, чем одна от другой отличаются).

Также знаком с функциями из пакета DBMS_XMLDOM и DBMS_XMLPARSER. Но эти функции создают XMLDOMDOCUMENT , а мне хотелось бы узнать, какие функции работают с типом XMLTYPE .

Спасибо!
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33368649
Фотография Andrew IF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если посмотреть Oracle9i Database Online Documentation раздел SQL, PL/SQL, and SQL*Plus syntax and examples. на букву X , то там есть всё, что надо.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33368763
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FlukkyЭтот вопрос ещё актуален. Как узнать количество элементов в документе?
Думаю, через тот же XMLSequence.
FlukkyИ ещё вопрос по этой же теме. Возвращается XML в формате <?xml version="1.0" encoding="utf-8" ?>. Как сменить кодировку на windows-1257?
В Оракле есть функция CONVERT для перекодировки строк. На крайняк можно через Java перекодировать весь XML, даже подправив атрибут encoding.
FlukkyТакже знаком с функциями из пакета DBMS_XMLDOM и DBMS_XMLPARSER. Но эти функции создают XMLDOMDOCUMENT, а мне хотелось бы узнать, какие функции работают с типом XMLTYPE.
Могу врать, но вроде как это независимые вещи. XMLDOM реализован с использованием Java (я получал явские исключения при его использовании) XMLType и иже с ними (м.б. с какой-то версии Оракла) Java не используют и рекомендованы к использованию как главное направление.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33369227
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я конечно извиняюсь за своё недопонимание, но я не могу найти в доке того, что мне нужно. Там куча информации... Я попросту не знаю, что искать, наверное...

В DBMS_XMLDOM были такие процедуры:
dbms_xmldom.makeNode
dbms_xmldom.createElement
dbms_xmldom.appendChild
dbms_xmldom.createTextNode

А для XMLType я ничего такого не вижу. Ну тоесть, нужно создать структуру дерева, например:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
'<RECORD1>
 <RECORD1_1>Text</RECORD1_1>
 <RECORD1_2 name="NAME1_2" value="VALUE1_2" />
 <SUBRECORD>
   <SUB1>Text</SUB1>
   <SUB2>Text</SUB2>
 </SUBRECORD>
 <NOTES />
</RECORD1>'

Можно, конечно, создать это дело спомощью DBMS_XMLDOM, потом превратить в CLOB/Varchar2, а потом в XMLType. Но я недаюсь, что есть методы по-проще.

Спасибо! И извините за глупые вопросы...
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33369390
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
select XMLElement(
           "RECORD1"
         , XMLElement("RECORD1_1", 'Text')
         , XMLElement("RECORD1_2", XMLAttributes('NAME1_2' as "name", 'VALUE1_2' as "value"))
         , XMLElement(
               "SUBRECORD"
             , XMLElement("SUB1", 'Text')
             , XMLElement("SUB2", 'Text')
           )
         , XMLElement("NOTES")
       ) xml
from dual;
Т.е. получается все наоборот, построение идет не от корня, а к корню XML. Есть еще функция updateXML , но ИМХО строить через чее XML с нуля достаточно напряжно.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33369853
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо! Очень удобный подход к построению документа в 9-ке!

Сейчас пробую разобраться с updateXML().
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33369868
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что будет быстрее работать, если мне нужно составить такой запрос:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
'
<REQUEST>
  <TITLTE>TEST</TITLE>
  <PARAM name="param1" value="1" />
  <PARAM name="param2" value="2" />
  ...
  <PARAM name="paramN" value="N" />
</REQUEST>
'
Поскольку количество <param> запранее неизвестно, есть 2 способа, как можно создать такой xml-документ. Какой из них быстрее?
Имена и значения параметров PARAM лежат в массиве.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
-- СПОСОБ 1
-- создаём динамический ref cursor, куда вписываем значение
v_ref := 'select XMLElement("REQUEST",........';
for i in massiv.first .. massiv.last
loop
  v_ref:= v_ref || 'XMLElement("PARAM",.....'
end loop;
-- Делаем Fetch для динамического курсора и получаем XML документ (у меня 
-- этот вариант работает!)

-- СПОСОБ 2
-- создаём XML документ без <PARAM>
-- <PARAM> записываем через updateXML() в цикле пробегая по массиву Massiv
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33369968
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Легко проверить, думаю, самое быстрый вариант будет заключаться в минимальном использовании объектов. Решил потренироваться:
Код: 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.
declare
  type t_property is record (key varchar2( 64 ), value varchar2( 64 ));
  type tbl_property is table of t_property;
  vt_property tbl_property;
  v_sql varchar2( 32767 );
  xml XMLType;
  i integer;
  ts timestamp;
begin
  dbms_output.enable( 20000 );
  dbms_random.seed(sysdate);

  select rownum, trunc(dbms_random.value *  100 )
  bulk collect into vt_property
  from all_objects
    where rownum <=  300 ;
  -- 1
  ts := systimestamp; dbms_output.put_line('Start 1: '||ts);
  v_sql := '<REQUIEST>';
  i := vt_property.first;
  while vt_property.exists(i) loop
    v_sql := v_sql||'<PARAM name="'||vt_property(i).key||'" value="'||vt_property(i).value||'"/>';
    i := vt_property.next(i);
  end loop;
  v_sql := v_sql||'</REQUIEST>';
  xml := XMLType(v_sql);
  dbms_output.put_line('End   1: '||systimestamp||' : '||((systimestamp - ts) day to second));
  --  2
  ts := systimestamp; dbms_output.put_line('Start 2: '||ts);
  v_sql := 'select XMLElement("REQUEST"';
  i := vt_property.first;
  while vt_property.exists(i) loop
    v_sql := v_sql||',XMLElement("PARAM",XMLAttributes('''||vt_property(i).key||''' as "name", '''||vt_property(i).value||''' as "value"))';
    i := vt_property.next(i);
  end loop;
  v_sql := v_sql||') from dual';
  execute immediate v_sql into xml;
  dbms_output.put_line('End   2: '||systimestamp||' : '||((systimestamp - ts) day to second));
  -- 3
  ts := systimestamp; dbms_output.put_line('Start 3: '||ts);
  xml := XMLType('<REQUEST/>');
  i := vt_property.first;
  while vt_property.exists(i) loop
    select updateXml(
               XMLType('<REQUEST/>')
             , '/REQUEST'
             , XmlElement("REQUEST", XMLAgg(XmlElement("PARAM", XMLAttributes(''||vt_property(i).key||'' as "name", 'VALUE1_2' as "value"))))
           )
    into xml
    from dual;
    i := vt_property.next(i);
  end loop;
  dbms_output.put_line('End   3: '||systimestamp||' : '||((systimestamp - ts) day to second));
end;
/
Вот и гляди, для 300 параметров у меня следующее:
Код: plaintext
1.
2.
3.
4.
5.
6.
Start 1: 09.11.05 20:44:21.708170
End   1: 09.11.05 20:44:21.714328000 +03:00 : +000000000 00:00:00.006420000
Start 2: 09.11.05 20:44:21.714749
End   2: 09.11.05 20:44:21.732228000 +03:00 : +000000000 00:00:00.017736000
Start 3: 09.11.05 20:44:21.732637
End   3: 09.11.05 20:44:22.536805000 +03:00 : +000000000 00:00:00.804434000


Единственное, что первые два способа упираются в максимальный размер VARCHAR'а, т.е. 32767 для PL/SQL.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33370848
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Denis PopovЛегко проверить, думаю, самое быстрый вариант будет заключаться в минимальном использовании объектов.

Спасибо!
Без комментариев
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33370866
Vadya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Flukky Denis PopovЛегко проверить, думаю, самое быстрый вариант будет заключаться в минимальном использовании объектов.

Спасибо!
Без комментариев

Вообще с XML завязывать надо,
ни к чему это хорошему не приведет :-))
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33371000
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Denis Popov FlukkyИ ещё вопрос по этой же теме. Возвращается XML в формате <?xml version="1.0" encoding="utf-8" ?>. Как сменить кодировку на windows-1257?
В Оракле есть функция CONVERT для перекодировки строк.

Я тут с кодировками запутался.
База в кодировке LATVIAN_LATVIA.BLT8CP921
Создать XML документ с encoding="BLT8CP921" не получается, т.к. пишет "System does not support the specified encoding". Создаём XML с encoding="windows-1257". Всё работает.

Но теперь я не знаю, что писать в Convert. Кодировка другой базы, куда нужно послать XML документ - UTF-8.
Код: plaintext
1.
v_unicode_xml := xmltype(convert(p_xml.getStringVal(), 'CL8MSWIN1257', 'UTF8')) );
Ошибка: ORA-12703: this character set conversion is not supported
Код: plaintext
1.
v_unicode_xml := xmltype(convert(p_xml.getStringVal(), 'BLT8CP921', 'UTF8')) );
Ошибка: ORA-31011: XML parsing failed
LPX-00216: invalid character 128 (0x80)
Это если есть национальные симболы (отличные от латиницы). Если их нету, парсуется нормально.

Где-то в Интеренете есть список всех доступных кодировок для Convert? Наверное, для windows-1257 этот самый 'BLT8CP921' не подходит.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33371067
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и самое интересное... после того, как я делаю updateXML(), encoding="windows-1257" автоматически изменяется на encoding="UTF-8". Так должно быть?
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33371118
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, в третем случае я накосячил, там идет постоянное обновление одного и того же экземпляра элемента "PARAM", а не добавление нового. Можно переписать следующим образом:
Код: 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.
create or replace type t_property as object (key varchar2( 64 ), value varchar2( 64 ))
/
create or replace type tbl_property as table of t_property
/

declare
  vt_property tbl_property;
  v_sql varchar2( 32767 );
  xml XMLType;
  i integer;
  ts timestamp;
begin
  dbms_output.enable( 20000 );
  dbms_random.seed(sysdate);
  select cast(multiset (
           select rownum, trunc(dbms_random.value *  100 ) from all_objects where rownum <=  300 
         ) as tbl_property)
  into vt_property
  from dual;

  ts := systimestamp; dbms_output.put_line('Start 1: '||ts);
  v_sql := '<REQUIEST>';
  i := vt_property.first;
  while vt_property.exists(i) loop
    v_sql := v_sql||'<PARAM name="'||vt_property(i).key||'" value="'||vt_property(i).value||'"/>';
    i := vt_property.next(i);
  end loop;
  v_sql := v_sql||'</REQUIEST>';
  xml := XMLType(v_sql);
  dbms_output.put_line('End   1: '||systimestamp||' : '||((systimestamp - ts) day to second));
  --  2
  ts := systimestamp; dbms_output.put_line('Start 2: '||ts);
  v_sql := 'select XMLElement("REQUEST"';
  i := vt_property.first;
  while vt_property.exists(i) loop
    v_sql := v_sql||
      ',XMLElement("PARAM",XMLAttributes('''||vt_property(i).key||''' as "name", '''||vt_property(i).value||''' as "value"))';
    i := vt_property.next(i);
  end loop;
  v_sql := v_sql||') from dual';
  execute immediate v_sql into xml;
  dbms_output.put_line('End   2: '||systimestamp||' : '||((systimestamp - ts) day to second));
  -- 3
  ts := systimestamp; dbms_output.put_line('Start 3: '||ts);
  select updateXml(
               XMLType('<REQUEST/>')
             , '/REQUEST'
             , XmlElement(
                   "REQUEST"
                 , XMLAgg(XmlElement("PARAM", XMLAttributes(''||t.key||'' as "name", ''||t.key||'' as "value")))
               )
           )
  into xml
  from table(cast(vt_property as tbl_property)) t;
  dbms_output.put_line('End   3: '||systimestamp||' : '||((systimestamp - ts) day to second));
end;
/
Код: plaintext
1.
2.
3.
4.
5.
6.
Start 1: 10.11.05 13:25:47.306544
End   1: 10.11.05 13:25:47.312837000 +03:00 : +000000000 00:00:00.006548000
Start 2: 10.11.05 13:25:47.313239
End   2: 10.11.05 13:25:47.333826000 +03:00 : +000000000 00:00:00.020822000
Start 3: 10.11.05 13:25:47.334226
End   3: 10.11.05 13:25:47.371349000 +03:00 : +000000000 00:00:00.037393000


ИМХО: updateXML хорош для изменения существующего XML, но не для формирования нового.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33371206
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FlukkyГде-то в Интеренете есть список всех доступных кодировок для Convert?
Код: plaintext
select * from v$nls_valid_values where parameter = 'CHARACTERSET';
Насчет перекодирования, к сожалению, мало чего могу сказать. У нас база создана в юникоде и оперируем мы документами исключительно в юникоде, почему, как мне думается, о некоторых проблемах перекодирования и работы с национальными кодировками я не догадываюсь:)

Flukkyи самое интересное... после того, как я делаю updateXML(), encoding="windows-1257" автоматически изменяется на encoding="UTF-8". Так должно быть?
Тут какая-то особенность приведения XMLType к строке Например, с использованием XMLType.getStringVal()
Код: 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.
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> 60 </USER_ID>
    <USERNAME>SCOTT</USERNAME>
  </USERS>
</ROOT>


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          ).getStringVal() xml
   6   from all_users
   7   where username = user;

XML
----------------------------------------------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<ROOT>
  <USERS>
    <USER_ID> 60 </USER_ID>
    <USERNAME>SCOTT</USERNAME>
  </USERS>
</ROOT>

О как. причем возможности указания кодировки вроде как нет.
...
Рейтинг: 0 / 0
XML в Oracle9i. Примеры разборки
    #33371438
Flukky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Denis Popov
Тут какая-то особенность приведения XMLType к строке Например, с использованием XMLType.getStringVal()


Видимо потому, что getStringVal() работает с CLOB, а кодировка CLOB в базе данных указывается не в 'NLS_CHARACTERSET', а в 'NLS_NCHAR_CHARACTERSET'. Могу ошибаться.

Что у Вас говорит такой запрос?
Код: plaintext
1.
2.
select * from V$NLS_PARAMETERS
where parameter in ('NLS_CHARACTERSET','NLS_NCHAR_CHARACTERSET');

У меня:
NLS_CHARACTERSET = BLT8CP921
NLS_NCHAR_CHARACTERSET = UTF8

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


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