Задавайте вопросы, мы ответим
Вы не зашли.
В 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.
В принципе согласен на любой вариант лишь бы он был на стороне сервера БД, а не на клиенте. (на клиенте понятно, что есть).
Заранее спасибо.
Неактивен
Нет, в MySQL такой поддержки нет. Поддержку можно сделать с помощью UDF, но мне кажется,
оно того не стоит - индексы Вы использовать над такими документами использовать не сможете.
UPD: Впрочем, если заточить UDF под записывание в нормальную таблицу, то почему нет?
Неактивен
UDF? Это lib_mysqludf_xql? Если так, то не хотелось бы влезать в линковку mysql ядра (если конечно я правильно понимаю)
А что вы скажет про ExtractValue() and UpdateXML()?
Различаются ли xml синтаксис в MySql vs. MS SQL?
Неактивен
Я имел в виду именно UDF - подключающиеся со стороны функции (динамически).
По поводу функций, которые Вы написали. Первая достает значение по XPath, вторая - заменяет.
Обе эти функции не умеют использовать индекс над данными, а потому с точки зрения БД достаточно
бесполезны.
P.S. И готовых UDF я не знаю. Может быть, их и нету в public domain.
P.P.S. Синтаксис XML не различается, т.к. это стандарт. Поддерживаемые MySQL опции XPath есть в
документации.
P.P.P.S. А расскажите, если не секрет, зачем нужен столь не родной способ хранения информации?
Неактивен
Посмотрел на http://www.mysqludf.org/lib_mysqludf_xql/ - это способ вытягивать данные
в виде 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)');
Неактивен
Ух, какой зверь.
А не лучше сделать табличку отдельную, туда экспортировать XPath://Values/Value и потом сделать
простой и красивый JOIN? Оно еще и быстро начнет работать :)
Неактивен
Не все так просто в этом зверинце. Особенно, когда здание базы построено, а приложения уже работают у заказчиков. Но, чтобы закончить както логически привожу, что получилось уже на 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;
Критиковать можно
Неактивен
Кстати по поводу решений создания новых технологических таблиц в боевой БД. Через пару месяцев или полгода ты уже забываешь назначение и таблицы и полей, а также особенностей логики ее использования и заполнения. И потом в многопользовательской среде использования надо же вести строки для отдельных пользователей. Разводить доступ. Ну и т.д. В общем динамическую информацию бизнесс процессов не рекомендуется класть в таблицы.
Неактивен
Для этого все надо документировать
Можно подумать, в XML те же данные будут понятнее
Неактивен
Я не сторонник xml как стандарта хранения данных, но нельзя отрицать, что это хороший стандарт их передачи, что и было изначально, когда этот стандарт придумывали.
Надо, конечно, документировать.
А потом доку каталогизировать. Ну да а потом каталоги документировать.
Думаю, что это тупиковый путь.
Неактивен