Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / IBM DB2, WebSphere, IMS, U2, etc Новый топик    Ответить
 Как построить запрос выборки из переменной  [new]
Hektor
Member

Откуда: Омск
Сообщений: 181
Процедура получает на входе XML вида
<project>
*******************
</project>
<page>
*******************
</page>

Необзодимо разбить его на 2 XML:
1)
<project>
*******************
</project>

2)
<page>
*******************
</page>

Скиньте пожайлуста пример, или ссылку на документы.
31 май 07, 10:45    [4209661]     Ответить | Цитировать Сообщить модератору
 Re: Как построить запрос выборки из переменной  [new]
Mark Barinstein
Member

Откуда: Москва
Сообщений: 4947
Может, тут?
31 май 07, 14:41    [4212044]     Ответить | Цитировать Сообщить модератору
 Re: Как построить запрос выборки из переменной  [new]
Hektor
Member

Откуда: Омск
Сообщений: 181
Mark Barinstein
Может, тут?


Немного не то.

Предположим у нас есть выше описанный XML. Так же таблицы Table1 и Table2.
Нам нужно в ячейку одной таблицы вставить XML узел
<project>
*******************
</project>

в другую таблицу
<page>
*******************
</page>

В принципе как в таблицы разбивать значения полей XML я знаю

но мне нужно вставлять XML узлы полностью.
при этом если в одну таблицу данные по какой либо причине не вставятся, то и другая должна быть откатана
31 май 07, 15:03    [4212268]     Ответить | Цитировать Сообщить модератору
 Re: Как построить запрос выборки из переменной  [new]
Евгений Хабаров
Member

Откуда: Москва
Сообщений: 773
Это неправильный XML-документ.

Корневой узел должен быть один.
Т.е. как минимум нужно сделать "обрамляющий" тег.
А в него вложить два приведенных тега.

А дальше через XQUERY например.
Не скажу что приведенный ниже пример оптимален, сам только начал со всем этим разбираться

SELECT XMLQUERY('$a/root/name' passing F1 as "a") FROM
( SELECT XMLPARSE(DOCUMENT('<root><name><first>John</first><second>Smit</second></name><age>20</age></root>')) as F1 FROM SYSIBM.SYSDUMMY1 ) AS A

Соответсвенно на основе этого примера можно сваять INSERT оператор.
31 май 07, 17:57    [4213950]     Ответить | Цитировать Сообщить модератору
 Re: Как построить запрос выборки из переменной  [new]
Hektor
Member

Откуда: Омск
Сообщений: 181
CREATE PROCEDURE SELECT_XML_VAR (IN PROJECT XML)
language sql
BEGIN
	SELECT XMLQUERY('$a/projects/project' passing F1 as "a") FROM ( SELECT XMLPARSE(DOCUMENT(PROJECT)) as F1 FROM SYSIBM.SYSDUMMY1 ) AS A;
END @


Ошибка
com.ibm.db2.jcc.c.SqlException: An unexpected token "(" was found following "sing F1 as "a") FROM". Expected tokens may include: ",".
1 июн 07, 07:52    [4215450]     Ответить | Цитировать Сообщить модератору
 Re: Как построить запрос выборки из переменной  [new]
Hektor
Member

Откуда: Омск
Сообщений: 181
И опять же всё делается через одно место:

CREATE PROCEDURE SELECT_XML_VAR (IN PROJECT VARCHAR(2000))
language sql
BEGIN
	DECLARE RES XML;
	DECLARE INSERT_RES VARCHAR(2000);
	SELECT XMLQUERY('$a/projects/project' passing F1 as "a") INTO RES FROM (SELECT XMLPARSE(DOCUMENT (PROJECT)) as F1 FROM SYSIBM.SYSDUMMY1) AS A;
	SET INSERT_RES = XMLSERIALIZE(RES AS VARCHAR(2000));
	INSERT INTO DASUSR1.PROJECTS VALUES (XMLVALIDATE(xmlparse (DOCUMENT(INSERT_RES)) ACCORDING TO XMLSCHEMA ID PROJECTS_XSD));
END @

CALL SELECT_XML_VAR ('<projects><project><id>18</id><title>Шины</title><domains><domain>www.shina-rezina.ru</domain><domain>shina-rezina.ru</domain></domains><main_page>117</main_page><images_path>/img/Shina</images_path></project></projects>')
1 июн 07, 08:40    [4215574]     Ответить | Цитировать Сообщить модератору
 Re: Как построить запрос выборки из переменной  [new]
Mark Barinstein
Member

Откуда: Москва
Сообщений: 4947
Hektor
И опять же всё делается через одно место:
Да уж...
Только, если я нигде не ошибся, содержимое вашей процедуры можно заменить одним оператором:
INSERT INTO DASUSR1.PROJECTS 
VALUES 
(
XMLVALIDATE
(
 XMLSERIALIZE
 (
 XMLQUERY('$a/projects/project' passing XMLPARSE(DOCUMENT (PROJECT)) as "a") 
 AS VARCHAR(2000)
 )
 ACCORDING TO XMLSCHEMA ID PROJECTS_XSD
)
)
1 июн 07, 10:17    [4216134]     Ответить | Цитировать Сообщить модератору
 Re: Как построить запрос выборки из переменной  [new]
Евгений Хабаров
Member

Откуда: Москва
Сообщений: 773
Оригинально.

1. Вообще-то я вложенный SELECT привел только для наглядности.
В производственном режиме ИМХО лучше вначале положить в базу исходный XML, а потом уже его "разбивать" на составляющие, хотя это конечно зависит от ситуации.

2. Операцию выборки и вставки можно совместить в одном операторе (INSERT ... SELECT).

3. Зачем производить XMLSERIALIZE, если дальше нужно выполнить XMLPARSE ? Зачем хранить данные в виде VARCHAR, если их можно хранить как XML?

4. Валидацию XML можно установить как CONSTRAINT на соотвествующий столбец таблицы.

Вот пример хранимой:

CREATE PROCEDURE insert_xml ( SOURCE XML )
------------------------------------------------------------------------
-- SQL Хранимая процедура
------------------------------------------------------------------------
P1: BEGIN
DECLARE NAME_XML XML;
DECLARE DATA_XML XML;
SET NAME_XML = XMLQUERY('document { $a/root/name }' passing SOURCE as "a");
SET DATA_XML = XMLQUERY('document { $a/root/data }' passing SOURCE as "a");
INSERT INTO EHABAROV.TEST2(NAME,DATA) VALUES(NAME_XML,DATA_XML);
END P1

Настоятельно рекомендую почитать IBM Redbook sg247315 (DB2 9 pureXML Guide)
и презентацию http://www.citforum.ru/seminars/cbd2007/1_6_pureXML.ppt
1 июн 07, 11:56    [4217046]     Ответить | Цитировать Сообщить модератору
Все форумы / IBM DB2, WebSphere, IMS, U2, etc Ответить