Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Чайниковый совсем вопрос про XML  [new]
Kromka
Member

Откуда:
Сообщений: 67
В общем, такая задачка попала в руки - нужно xml файл загрузить(загружать) в табличку, дабы потом уже вести работу далее. Аналогичная работа была ранее проведена другим сотрудником, поэтому пытаюсь по образу и подобию готового решения действовать. Вызывают затруднения поля с датами и временем.
Приведу немного урезанные данные, с обработкой которых у меня траблы (оставил только поля с датами)
это - схема документа
<?xml version="1.0" encoding="utf-8"?>
<!-- Created with Liquid XML Studio 1.0.8.0 (http://www.liquid-technologies.com) -->
<xsd:schema xmlns:od="urn:schemas-microsoft-com:officedata" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="dataroot">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element minOccurs="0" maxOccurs="unbounded" ref="COST_CENTER" />
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
  <xsd:element name="COST_CENTER">
    <xsd:annotation>
      <xsd:appinfo />
    </xsd:annotation>
    <xsd:complexType>
      <xsd:sequence>     
        <xsd:element minOccurs="0" maxOccurs="1" name="DATAB" type="xsd:date" />
        <xsd:element minOccurs="0" maxOccurs="1" name="DATBI" type="xsd:date" />
        <xsd:element minOccurs="0" maxOccurs="1" name="ZAYAVKA_DATE" type="xsd:date" />
        <xsd:element minOccurs="0" maxOccurs="1" name="CREATE_DATE" type="xsd:date" />
        <xsd:element minOccurs="0" maxOccurs="1" name="CHANGE_DATE" type="xsd:date" />
        <xsd:element minOccurs="0" maxOccurs="1" name="BLOCK_DATE" type="xsd:date" />
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>

вот сами данные
<?xml version="1.0" encoding="windows-1251"?>
<dataroot>
 <COST_CENTER>
  <DATAB>2001-01-01</DATAB>
  <DATBI>9999-12-31</DATBI>
  <ZAYAVKA_DATE>2009-06-24T13:17:32Z</ZAYAVKA_DATE>
  <CREATE_DATE>2009-04-08T12:18:33Z</CREATE_DATE>
  <CHANGE_DATE>2009-06-24T13:17:32Z</CHANGE_DATE>
  <BLOCK_DATE>2009-06-24T13:17:32Z</BLOCK_DATE>
 </COST_CENTER>
</dataroot>


select * from v$version;
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bi
PL/SQL Release 10.2.0.3.0 - Production
"CORE 10.2.0.3.0 Production"
TNS for Solaris: Version 10.2.0.3.0 - Production
NLSRTL Version 10.2.0.3.0 - Production

схему регистрирую и создаю таблицу так
  declare
  File_loc BFILE;
  begin
  File_loc := BFILENAME( 'XMLDIR_XSD', 'COST_CENTER.xsd' );

  dbms_xmlschema.registerSchema('http://localhost:8080/source/schemas/poSource/xsd/COST_CENTER.xsd', File_loc, genTypes => true, genTables => true);
  end;

CREATE TABLE xx_all.xx_xml_mih_mvz OF XMLType XMLTYPE STORE AS CLOB
XMLSCHEMA "http://localhost:8080/source/schemas/poSource/xsd/COST_CENTER.xsd"
ELEMENT "dataroot"

дополнительно, создана таблица, для переливания в неё разобранного содержимого файла.
код для переливания - 
 FOR c1 IN (
               SELECT  extractvalue(VALUE(des), '/COST_CENTER/DATAB') DATAB,
                       extractvalue(VALUE(des), '/COST_CENTER/DATBI') DATBI,
                       extractvalue(VALUE(des), '/COST_CENTER/ZAYAVKA_DATE') ZAYAVKA_DATE,
                       extractvalue(VALUE(des), '/COST_CENTER/CREATE_DATE') CREATE_DATE,
                       extractvalue(VALUE(des), '/COST_CENTER/CHANGE_DATE') CHANGE_DATE,
                       extractvalue(VALUE(des), '/COST_CENTER/BLOCK_DATE') BLOCK_DATE,
               FROM   XX_ALL.xx_xml_mih_mvz p,
                       TABLE(XMLSequence(extract(p.OBJECT_VALUE,
                                                 '/dataroot/COST_CENTER'))) des)
    LOOP
       
      INSERT INTO xx_mih_mvz_in
        (datab
         ,datbi
         ,zayavka_date
         ,create_date
         ,change_date
         ,block_date)
      VALUES
        (C1.datab
         ,C1.datbi
         ,C1.zayavka_date
         ,C1.create_date
         ,C1.change_date
         ,C1.block_date);   
    END LOOP; 

В таблице xx_mih_mvz_in эти поля - нужны как Date.
Данный код с этими данными ничего не вставляет. Меня беспокоят вроде как разные форматы дат в пришедшем файле. Как обойти эти грабли? Что почитать?
17 июл 09, 17:35    [7430748]     Ответить | Цитировать Сообщить модератору
 Re: Чайниковый совсем вопрос про XML  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116217
Может быть это и капитулянтский подход, но с прагматической точки зрения,
а почему бы и нет ? Оракл не понимает данные в XML как даты - значит надо
привести их к тому виду, когда он начнет их понимать :-). Вот какой у меня
парсинг получился

create table xmltest of xmltype 
/
create table tbl_dates
(datab date,
datbi date,
zayavka_date date,
create_date date,
change_date date,
block_date date)
/
INSERT INTO xmltest
select '<?xml version="1.0" encoding="windows-1251"?>
<dataroot>
 <COST_CENTER>
  <DATAB>2001-01-01</DATAB>
  <DATBI>9999-12-31</DATBI>
  <ZAYAVKA_DATE>2009-06-24T13:17:32Z</ZAYAVKA_DATE>
  <CREATE_DATE>2009-04-08T12:18:33Z</CREATE_DATE>
  <CHANGE_DATE>2009-06-24T13:17:32Z</CHANGE_DATE>
  <BLOCK_DATE>2009-06-24T13:17:32Z</BLOCK_DATE>
 </COST_CENTER>
</dataroot>' from dual;
/
INSERT INTO tbl_dates
SELECT  to_date(extractvalue(VALUE(des), '/COST_CENTER/DATAB'),'YYYY-MM-DD') DATAB,
        to_date(extractvalue(VALUE(des), '/COST_CENTER/DATBI'),'YYYY-MM-DD') DATBI,
        to_date(translate(extractvalue(VALUE(des), '/COST_CENTER/ZAYAVKA_DATE'),'_TZ','_'),'YYYY-MM-DDHH24:MI:SS') ZAYAVKA_DATE,
        to_date(translate(extractvalue(VALUE(des), '/COST_CENTER/CREATE_DATE'),'_TZ','_'),'YYYY-MM-DDHH24:MI:SS') ZAYAVKA_DATE,
        to_date(translate(extractvalue(VALUE(des), '/COST_CENTER/CHANGE_DATE'),'_TZ','_'),'YYYY-MM-DDHH24:MI:SS') ZAYAVKA_DATE,
        to_date(translate(extractvalue(VALUE(des), '/COST_CENTER/BLOCK_DATE'),'_TZ','_'),'YYYY-MM-DDHH24:MI:SS') ZAYAVKA_DATE
               FROM   xmltest p,
                       TABLE(XMLSequence(extract(p.OBJECT_VALUE,
                                                 '/dataroot/COST_CENTER'))) des
17 июл 09, 18:03    [7430933]     Ответить | Цитировать Сообщить модератору
 Re: Чайниковый совсем вопрос про XML  [new]
Kromka
Member

Откуда:
Сообщений: 67
[quot dmidek]Может быть это и капитулянтский подход, но с прагматической точки зрения,
а почему бы и нет ? Оракл не понимает данные в XML как даты - значит надо
привести их к тому виду, когда он начнет их понимать :-). Вот какой у меня
парсинг получился

Спасибо за подсказку. В принципе, я думал вырезать из этих строк символы Т и Z
но меня немного другое удивляет (из-за незнания мат-части)
Если в xsd схеме все эти поля заявлены как xsd:date, а в пришедшем файле имеем разный вид дат.... это нормально?
Еще, я могу внести изменения в схему. Например - все эти поля объявить как string, и уже потом, невзирая на ошибки, обрабатывать посла заливки в таблицу.
17 июл 09, 18:35    [7431129]     Ответить | Цитировать Сообщить модератору
 Re: Чайниковый совсем вопрос про XML  [new]
mymaster
Member

Откуда: Москва
Сообщений: 7
cast(to_timestamp_tz(extractvalue(VALUE(des), '/COST_CENTER/CREATE_DATE')) as date)
17 июл 09, 21:52    [7431647]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить