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

Подскажите, как правильно реализовать инсерт 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
INSERT blob из ORACLE в таблицу MSSQL
    #39444632
RuCosinus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мой вариант не прокатил :( Поэтому нахождение рабочего решения стало еще более необходимым.

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

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

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

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


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