powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / DB2 LUW v. 9.7 ESE fp7: перенос таблицы с XML из одной базы в другую
3 сообщений из 3, страница 1 из 1
DB2 LUW v. 9.7 ESE fp7: перенос таблицы с XML из одной базы в другую
    #38584901
VITLKN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DB2 версии 9.7 ESE fix pack 7, 64-х разрядная, под WINDOWS

Есть задача переноса данных из одной таблицы в другую, которая физически находится в другой базе данных (тоже под управлением DB2). Переносимая таблица содержит 2 столбца XML. Для переноса используется утилита LOAD через процедуру sysproc.admin_cmd
Для переноса используется такая команда:
Код: plsql
1.
call sysproc.admin_cmd('load from (database DBNAME select * from SHEMANAME.SOURCE_TABLE) of cursor insert into SHEMANAME.TARGET_TABLE');


В процессе выполнения возникает ошибка SQL1407N с сообщением Опция "SOURCEUSEREXIT" несовместима с "XML columns"...
SQL1407N Опция "<имя-опции>" несовместима с "<возможность>".
Объяснение:
Утилита не поддерживает опцию "<имя-опции>" с "<возможность>".
Действия пользователя:
Повторите команду, задав совместимые опции.

В интернете нашел совет использовать функцию XMLSERIALIZE
Команда выглядит так:
Код: plsql
1.
call sysproc.admin_cmd('load from (database DBNAME select COL1, COL2, COL3, XMLSERIALIZE(XMLCOL1 as clob), XMLSERIALIZE(XMLCOL2 as clob) from SHEMANAME.SOURCE_TABLE) of cursor insert into SHEMANAME.TARGET_TABLE');


Не помогает.

Таблица без XML столбцов переносится без проблем.

Выполнение команды через CLI интерфейс завершается с той же ошибкой.
Код: plsql
1.
2.
DECLARE C1 CURSOR database DBNAME user "DBUSER" using "DBPASSWORD" FOR SELECT * FROM SHEMANAME.SOURCE_TABLE
load from C1 of cursor insert into SHEMANAME.TARGET_TABLE;



Поиск зарегистрированного APAR по данной теме, не дал результатов.

Прошу помощи, совета по решению данной проблемы.
Спасибо.
...
Рейтинг: 0 / 0
DB2 LUW v. 9.7 ESE fp7: перенос таблицы с XML из одной базы в другую
    #38585256
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
VITLKN,

Либо через файлы, либо через промежуточную таблицу с clob вместо xml, куда сначала xmlserialize(xmlcolN as clob) из удаленной, а потом из нее в целевую с xmlparse(document clobcolN).
...
Рейтинг: 0 / 0
DB2 LUW v. 9.7 ESE fp7: перенос таблицы с XML из одной базы в другую
    #38586051
VITLKN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mark Barinstein,

спасибо за ценный совет!
Ваши ответы всегда конкретны и точны, восхищен глубоким знанием DB2.

Тут я должен покаяться, ибо был невнимателен при чтении документации.
В описании использования команды LOAD через процедуру SYSPROC.ADMIN_CMD в разделе Usage notes можно прочитать:
Loading XML documents between databases is not supported and returns error message SQL1407N
Пруфлинк: http://pic.dhe.ibm.com/infocenter/db2luw/v9r7/index.jsp?topic=/com.ibm.db2.luw.sql.rtn.doc/doc/r0023577.html
Если бы я увидел это сразу, то отказался бы от самой идеи переноса XML данных между базами через курсор.
Однако, я этого не заметил, и, благодаря Марку, решение было найдено.
На мой взгляд, это гораздо более удобный способ, чем перенос с использованием файлов через экспорт-импорт.

Что касается собственно решения данной задачи:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
-- все действия производятся в базе данных назначения (в которую необходимо перенести данные)
-- сначала делаем подготовительную работу

-- создаем промежуточную (буферную) таблицу назначения с CLOB полями вместо xml
create table SHEMANAME.TARGET_TABLE_BUFFER AS 
 (select T.COL_1, 
  T.COL_1, 
  T.COL_N, 
  cast ('' as clob (2 m)) as CLOBCOL1,
  cast ('' as clob (2 m)) as CLOBCOL2
  from SHEMANAME.TARGET_TABLE T) 
  with no data; 

-- создаем таблицу исключений для сохранения записей, которые по каким-либо причинам не смогли вставиться в промежуточную таблицу
create table SHEMANAME.TARGET_TABLE_LOAD_EXCEPTION AS 
 (select T.*, 
  current timestamp as TIME_LABEL,
  cast ('' as clob (128K)) as MSG 
  from SHEMANAME.TARGET_TABLE_BUFFER T) 
  with no data; 

--при необходимости надо дать права на вставку для вновь созданной таблицы группе пользователей, которые осуществляют загрузку 
grant insert, select on SHEMANAME.TARGET_TABLE_LOAD_EXCEPTION to group LOAD_AGENT;

-- основная команда по переносу XML данных из таблицы в удаленной базе в таблицу, находящуюся в текущей базе
call sysproc.admin_cmd('load from (database DBNAME select COL_1, COL_2, COL_N, XMLSERIALIZE(XMLCOL_1 as clob) as CLOBCOL1, XMLSERIALIZE(XMLCOL_2 as clob) as CLOBCOL2 from SHEMANAME.SOURCE_TABLE) of cursor messages on server insert into SHEMANAME.TARGET_TABLE_BUFFER for exception SHEMANAME.TARGET_TABLE_LOAD_EXCEPTION NONRECOVERABLE');

--если все прошло без ошибок, то приступаем к переносу данных из промежуточной таблицы в основную
-- тут в моей задаче есть особенность: основная таблица партиционирована, поэтому перед переносом добавляем нужную партицию
-- из-за того, что таблица назначения партиционирована, перенос у меня в любом случае был бы двухфазным, поэтому предложение Марка о промежуточной таблице подошло идеально 
alter table SHEMANAME.TARGET_TABLE add partition PARTNAME starting ('yyyy-mm-dd 00:00:00.000') inclusive ending ('yyyy-mm-dd1 00:00:00.000') exclusive long in SPACENAME_LONGDAT;

-- и наконец заключительный этап: перенос из промежуточной таблицы в основную таблицу назначения
-- так как таблица назначения партиционирована, то использовать таблицу исключений при переносе не получится
-- поэтому придется обойтись без таблицы исключений
call sysproc.admin_cmd('load from (select COL_1, COL_2, COL_N, xmlparse(document CLOBCOL1 preserve whitespace) as XMLCOL_1, xmlparse(document CLOBCOL2 preserve whitespace) as XMLCOL_2 from SHEMANAME.TARGET_TABLE_BUFFER) of cursor messages on server insert into SHEMANAME.TARGET_TABLE NONRECOVERABLE');


Тему можно считать закрытой.
Спасибо.
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / DB2 LUW v. 9.7 ESE fp7: перенос таблицы с XML из одной базы в другую
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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