powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Как построить запрос выборки из переменной
8 сообщений из 8, страница 1 из 1
Как построить запрос выборки из переменной
    #34563530
Hektor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Процедура получает на входе XML вида
Код: plaintext
1.
2.
3.
4.
5.
<project>
*******************
</project>
<page>
*******************
</page>

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

2)
Код: plaintext
1.
2.
<page>
*******************
</page>

Скиньте пожайлуста пример, или ссылку на документы.
...
Рейтинг: 0 / 0
Как построить запрос выборки из переменной
    #34564761
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Может, тут ?
...
Рейтинг: 0 / 0
Как построить запрос выборки из переменной
    #34564871
Hektor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mark BarinsteinМожет, тут ?

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

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

в другую таблицу
Код: plaintext
1.
2.
<page>
*******************
</page>

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

но мне нужно вставлять XML узлы полностью.
при этом если в одну таблицу данные по какой либо причине не вставятся, то и другая должна быть откатана
...
Рейтинг: 0 / 0
Как построить запрос выборки из переменной
    #34565742
Это неправильный 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 оператор.
...
Рейтинг: 0 / 0
Как построить запрос выборки из переменной
    #34566534
Hektor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
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: ",".
...
Рейтинг: 0 / 0
Как построить запрос выборки из переменной
    #34566589
Hektor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И опять же всё делается через одно место:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
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 @

Код: plaintext
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>')
...
Рейтинг: 0 / 0
Как построить запрос выборки из переменной
    #34566770
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
HektorИ опять же всё делается через одно место:Да уж...
Только, если я нигде не ошибся, содержимое вашей процедуры можно заменить одним оператором:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
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
)
)
...
Рейтинг: 0 / 0
Как построить запрос выборки из переменной
    #34567208
Оригинально.

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
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Как построить запрос выборки из переменной
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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