Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / INSERT blob из ORACLE в таблицу MSSQL / 5 сообщений из 5, страница 1 из 1
26.04.2017, 11:46
    #39444577
RuCosinus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INSERT blob из ORACLE в таблицу MSSQL
Добрый день.

Подскажите, как правильно реализовать инсерт blob-поля в таблицу на MSSQL?

Вводные:
Есть БД на oracle и БД на MSSQL, которая подвязана через dblink. В оракловой БД есть некая функция, которая берет входные данные из таблицы, лежащей на внешней MSSQL БД и рожает xml-ки по курсору и эти 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.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
CREATE OR REPLACE FUNCTION GET_BLOB_AND_OTHER (in_num in number) return number is
       is_ok number(1,0);
   PRAGMA AUTONOMOUS_TRANSACTION;    
   
   from_date date;
   till_date date;
   num varchar2(20);
   num_a varchar2(20); 
   i number(7,0);   

   CURSOR st_Cur
   IS
   select TO_CHAR(NUM),
          NUM_A,
          FROM_DATE,
          TILL_DATE
   from LIST@DBLINK
   where NUM_ID=in_num;
      
begin
   i:=1;
   OPEN st_Cur;
   LOOP  
     FETCH st_Cur INTO num, num_a, from_date,till_date;
       EXIT WHEN st_Cur%NOTFOUND;
       
       INSERT INTO OUT_RESULT@DBLINK (NUM_ID,LINE_NUMBER,RESULT)
       VALUES (in_num,i,
       (select xmlroot(XMLElement("gt-response",xmlattributes('http://gt-response.java-test-site.com' as "xmlns"),
               XMLElement("data",XMLElement("Field",xmlattributes('NAME_1' as "name"),'name 1'),
                                 XMLElement("Field",xmlattributes('NAME_2' as "name"),'name 2'),
                                 XMLElement("Field",xmlattributes('DATE_FROM' as "name"),from_date),
                                 XMLElement("Field",xmlattributes('DATE_TILL' as "name"),till_date)), 
               XMLAGG(XMLElement("data",
                  XMLElement("Field",xmlattributes('ID' as "name"),t.id),
                  XMLElement("Field",xmlattributes('NUMBER' as "name"),t0.num),
                  XMLElement("Field",xmlattributes('DATE1' as "name"),t0.date1),
                  XMLElement("Field",xmlattributes('DATE2' as "name"),t0.date2),
                  XMLElement("Field",xmlattributes('SUMM' as "name"),t0.summ),
                  XMLElement("Field",xmlattributes('CUR' as "name"),t0.cur),
                  XMLElement("Field",xmlattributes('DET' as "name"),t0.det),
                  XMLElement("Field",xmlattributes('LOC' as "name"),case length(tca.country || ', ' || tca.city) 
                                                                                 when 2 then ''
                                                                                 else tca.country || ', ' || tca.city
                                                                               end)))) , version '1.0').getBlobVal(171)
       from table (get_data(from_date,till_date,card_num)) t0
       left join transaction_table t on t.id= t0.id
       left join transaction_table_2 tca on tca.id=t.id) ) ;
       commit;
       i:=i+1;
 	END LOOP;
  CLOSE st_Cur;
  
  
  return 0;
end GET_BLOB_AND_OTHER;



Вопрос:
Впервые попробовав запустить эту конструкцию, я понял, что что-то не то. Посмотрел, оказывается при таком раскладе я получаю ora-22992. Порывшись по интернету я понял, что это довольно естественно, с LOB-полями небольшие сложности. Но вот как решить данную загвоздку я нигде не нашел (может хреновый из меня "искун", не спорю). Вся информация, касающаяся ora-22992, что я нашел - это информация о том, как считать LOB-поля, а не как записать, с соответствующими примерами решений. Есть идея, правда я ее еще не проверил, что можно сделать временную табличку, записать в нее, а потом попробовать вставить из нее через конструкцию а-ля вот этой
Код: plsql
1.
execute immediate 'INSERT INTO OUT_RESULTS@DBLINK SELECT * FROM TEMP_TABLE' ;


Сработает ли или нет, я сейчас проверю. Но, в любом случае, хотелось бы услышать, возможен ли другой путь.

Заранее благодарю.
...
Рейтинг: 0 / 0
26.04.2017, 12:20
    #39444632
RuCosinus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INSERT blob из ORACLE в таблицу MSSQL
Мой вариант не прокатил :( Поэтому нахождение рабочего решения стало еще более необходимым.

На всякий случай напишу версии серверов: Oracle 11 и MS SQL 2012
...
Рейтинг: 0 / 0
26.04.2017, 16:06
    #39444876
RuCosinus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INSERT blob из ORACLE в таблицу MSSQL
Я, похоже, тупица.
Если я правильно понял, нужно просто при инсерте преобразовать оракловский тип BLOB в MSSQL-ный binary. Правда как это сделать мне пока не понятно.

Подтвердите, пожалуйста, мою догадку или опровергните.
...
Рейтинг: 0 / 0
26.04.2017, 16:10
    #39444883
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INSERT blob из ORACLE в таблицу MSSQL
RuCosinus,

jtds + jdbc - как крайний вариант

можно пойти от обратного, openquery + linked server, увы, работают зачастую лучше оракловой гетерогенки
...
Рейтинг: 0 / 0
27.04.2017, 15:46
    #39445550
RuCosinus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INSERT blob из ORACLE в таблицу MSSQL
env,
да, спасибо, я тоже в итоге пришел к подходу "от обратного".
Другого решения не нашел, а городить на яве желания не возникло.
Еще раз благодарю.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / INSERT blob из ORACLE в таблицу MSSQL / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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