SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 19.01.2009 16:10:04

Igor Panshin
Завсегдатай
Зарегистрирован: 04.06.2008
Сообщений: 62

работа с xml

В ms sql есть возможность работать с xml информацией типа

DECLARE @XmlDoc int
DECLARE @doc varchar(1000)
SET @doc ='
<ROOT>
<Customer CustomerID="VINET" ContactName="Paul Henriot">
   <Order CustomerID="VINET" EmployeeID="5" OrderDate="1996-07-04T00:00:00">
      <OrderDetail OrderID="10248" ProductID="11" Quantity="12"/>
      <OrderDetail OrderID="10248" ProductID="42" Quantity="10"/>
   </Order>
</Customer>
<Customer CustomerID="LILAS" ContactName="Carlos Gonzlez">
   <Order CustomerID="LILAS" EmployeeID="3" OrderDate="1996-08-16T00:00:00">
      <OrderDetail OrderID="10283" ProductID="72" Quantity="3"/>
   </Order>
</Customer>
</ROOT>'

--Create an internal representation of the XML document.
EXEC sp_xml_preparedocument @XmlDoc OUTPUT, @doc

-- Remove the internal representation.
SELECT tXml.[CustomerID]
FROM OPENXML (@XmlDoc, '/ROOT/Customer',1)
WITH (CustomerID  varchar(10),
      ContactName varchar(20))
AS tXml

Вопрос существует ли такая возможность работы с xml в mysql и, если не существует, то есть ли альтернативная поддержка работы с xml.
В принципе согласен на любой вариант лишь бы он был на стороне сервера БД, а не на клиенте. (на клиенте понятно, что есть).

Заранее спасибо.

Неактивен

 

#2 19.01.2009 16:53:28

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: работа с xml

Нет, в MySQL такой поддержки нет. Поддержку можно сделать с помощью UDF, но мне кажется,
оно того не стоит - индексы Вы использовать над такими документами использовать не сможете.

UPD: Впрочем, если заточить UDF под записывание в нормальную таблицу, то почему нет?

Неактивен

 

#3 19.01.2009 18:01:28

Igor Panshin
Завсегдатай
Зарегистрирован: 04.06.2008
Сообщений: 62

Re: работа с xml

UDF? Это lib_mysqludf_xql? Если так, то не хотелось бы влезать в линковку mysql ядра (если конечно я правильно понимаю)
А что вы скажет про ExtractValue() and UpdateXML()?
Различаются ли xml синтаксис в MySql vs. MS SQL?

Неактивен

 

#4 19.01.2009 18:37:39

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: работа с xml

Я имел в виду именно UDF - подключающиеся со стороны функции (динамически).

По поводу функций, которые Вы написали. Первая достает значение по XPath, вторая - заменяет.
Обе эти функции не умеют использовать индекс над данными, а потому с точки зрения БД достаточно
бесполезны.

P.S. И готовых UDF я не знаю. Может быть, их и нету в public domain.
P.P.S. Синтаксис XML не различается, т.к. это стандарт. Поддерживаемые MySQL опции XPath есть в
документации.
P.P.P.S. А расскажите, если не секрет, зачем нужен столь не родной способ хранения информации?

Неактивен

 

#5 19.01.2009 18:44:07

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: работа с xml

Посмотрел на http://www.mysqludf.org/lib_mysqludf_xql/ - это способ вытягивать данные
в виде XML из нормальных таблиц. Хранятся данные при этом в нормальном виде.

Неактивен

 

#6 20.01.2009 11:34:16

Igor Panshin
Завсегдатай
Зарегистрирован: 04.06.2008
Сообщений: 62

Re: работа с xml

Тут не преследуются какие-либо оптимизационные действия или еще какие полезные для БД. Просто существует приложение работающее с БД ms sql. Я же его перевожу на работу с MySql. Естественно, что я хочу это сделать быстро и с наименьшими телодвижениями.
Поскольку со стороны сервера БД текст хранимых процедур достаточно сложный, то хочется их переписать, используя стандартные возможности mysql. Более конкретно:
Со стороны ms sql имеется следующий текст:

    CALL `sp_xml_preparedocument` ( XmlDoc OUT,  _Values );

    INSERT INTO  ValuesTable (`Value`)
    SELECT tXml.`Value`
    FROM OPENXML ( XmlDoc, '/Values/Value',1) WITH (Value nvarchar(2048)) AS tXml
    LEFT JOIN
  (SELECT tHistory.`Value`
  FROM `dbo`.`dvtable_{ECA400D1-6710-42D4-9AA4-6B906D37FC3E}` AS tHistory WITH(ROWLOCK)
  WHERE tHistory.`ParentRowID` =  FunctionRowID AND tHistory.`Source` =  Source
    ) AS tHistoryValues
    ON tHistoryValues.`Value` = tXml.`Value`
    WHERE tHistoryValues.`Value` IS NULL;

    SELECT `Value` FROM  ValuesTable;

Здесь конкретно я могу воспользоваться
select ExtractValue('<Values><Value Value="x1" /><Value Value="x2" /></Values>','/Values/Value/attribute::Value');
перебрав все значения от 1 до
select ExtractValue('<Values><Value Value="x1" /><Value Value="x2" /></Values>', 'count(/Values/Value)');

Неактивен

 

#7 20.01.2009 13:49:52

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: работа с xml

Ух, какой зверь.

А не лучше сделать табличку отдельную, туда экспортировать XPath://Values/Value и потом сделать
простой и красивый JOIN? Оно еще и быстро начнет работать :)

Неактивен

 

#8 21.01.2009 10:49:21

Igor Panshin
Завсегдатай
Зарегистрирован: 04.06.2008
Сообщений: 62

Re: работа с xml

Не все так просто в этом зверинце. Особенно, когда здание базы построено, а приложения уже работают у заказчиков. Но, чтобы закончить както логически привожу, что получилось уже на mysql

Proc_Label:
BEGIN
  -- call `dvsp_dvreport_get`('<Values><Value Value="x1" /><Value Value="x2" /></Values>');
  -- select ExtractValue('<Values><Value Value="x1" /><Value Value="x2" /></Values>','/Values/Value/attribute::Value');

  DECLARE FunctionRowID char(36);
  DECLARE Nmax int;
  DECLARE i int;
  DECLARE Val nvarchar(2048);
  DECLARE xpath nvarchar(2048);
    CREATE TEMPORARY TABLE ValuesTable (`Value` nvarchar(2048));


    SET  FunctionRowID = (SELECT `RowID`
    FROM `dvtable_{10105DC1-8B61-4A76-B719-02D679662606}`
    WHERE `InstanceID` = InstanceID AND `ID` = FunctionID );

    -- CALL `sp_xml_preparedocument` ( XmlDoc OUT,  _Values );

  SET Nmax=(select ExtractValue(_Values,'count(/Values/Value)'));
  IF Nmax>0
  THEN
    SET i=1;
    WHILE (i<=Nmax)
    DO
       SET xpath=CONCAT('/Values/Value[',CAST(i AS char(32)),']/attribute::Value');
       SET Val= ExtractValue(_Values,xpath);
       IF NOT EXISTS (SELECT * FROM  `dvtable_{ECA400D1-6710-42D4-9AA4-6B906D37FC3E}`
       WHERE `Value` = Val AND `ParentRowID` =  FunctionRowID AND `Source` =  Source)
       THEN
         INSERT INTO ValuesTable (`Value`) SELECT Val;
       END IF;
       SET i=i+1;
    END WHILE;

    SELECT `Value` FROM  ValuesTable;
    DROP TABLE ValuesTable;
  END IF;
END;

Критиковать можноsmile

Неактивен

 

#9 21.01.2009 11:42:55

Igor Panshin
Завсегдатай
Зарегистрирован: 04.06.2008
Сообщений: 62

Re: работа с xml

Кстати по поводу решений создания новых технологических таблиц в боевой БД.  Через пару месяцев или полгода ты уже забываешь назначение и таблицы и полей, а также особенностей логики ее использования и заполнения. И потом в многопользовательской среде использования надо же вести строки для отдельных пользователей. Разводить доступ. Ну и т.д. В общем динамическую информацию бизнесс процессов не рекомендуется класть в таблицы.

Неактивен

 

#10 21.01.2009 12:45:01

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: работа с xml

Для этого все надо документировать smile
Можно подумать, в XML те же данные будут понятнее wink

Неактивен

 

#11 21.01.2009 14:20:55

Igor Panshin
Завсегдатай
Зарегистрирован: 04.06.2008
Сообщений: 62

Re: работа с xml

Я не сторонник xml как стандарта хранения данных, но нельзя отрицать, что это хороший стандарт их передачи, что и было изначально, когда этот стандарт придумывали.
Надо, конечно, документировать.
А потом доку каталогизировать. Ну да а потом каталоги документировать.smile
Думаю, что это тупиковый путь.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson