Переключение на Главную Страницу Страницы: [1]  ОтправитьПечать
Горячая тема (более 10 ответов) Помогите: один запрос к MS SQL и Oracle (число прочтений - 6866 )
Kapet
Senior Member
****
Отсутствует


Ламер - вансист

Сообщений: 262
Местоположение: Ukraine, Kyiv
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Помогите: один запрос к MS SQL и Oracle
14. Апреля 2008 :: 11:51
Печать  
Подозреваю, что сие возможно, но не хватает тямы.

Хочу получить в ТЗ данные из 2-х баз на Oracle и MS SQL 2000 (родная 1С) одним запросом. Запрос простой. Требуется из оракла выбрать коды альтернативных товаров по переданному в запрос коду товара, и в этой же выборке получить элементы справочника ТМЦ, найденные по коду этих найденных альтернатив в оракле.

Дилетантски делаю так, без надежды на работоспособность:
Код
Выбрать все
Процедура ПриОткрытии()
	MD=CreateObject("MetaDataWork");
	TMZ="sp"+MD.ИДСправочника("ТМЦ");
	DB=СоздатьОбъект("OLEDBData");
	DB.Соединение("Provider=MSDASQL.1;Password=***;Persist Security Info=True;User ID=***;Data Source=***;Mode=Read;");
	Команда=DB.СоздатьКоманду();
	Команда.Отладка(1);
	Команда.ДобПараметр(1,129,11,0,0);
	Попытка
		Команда.Подготовить("select alt.ALT_DART_NO, tmz.id as [Nomen $Справочник.ТМЦ] from DS_ALTERDART as alt, [rom].[db1c77].[dbo]."+TMZ+" as tmz where alt.ORG_DART_NO = ? and tmz.id = alt.ALT_DART_NO");
	Исключение
		DB.Закрыть();
	КонецПопытки;
КонецПроцедуры

Процедура Сформировать()
	Команда.УстановитьПараметр(1,СокрЛП(ДартНомер.Код));
	Команда.ВыполнитьИнструкцию(,ТЗ);
КонецПроцедуры
 


... и ессно получаю FAILED! ICommandText::Execute(): [Oracle][ODBC][Ora]ORA-00923: FROM keyword not found where expected

Может кто знает как это делается грамотно и правильно? Окажите любезность, плз!
Или хотя бы пните в нужном направлении...  Улыбка
  
Наверх
ICQ  
IP записан
 
Kapet
Senior Member
****
Отсутствует


Ламер - вансист

Сообщений: 262
Местоположение: Ukraine, Kyiv
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Re: Помогите: один запрос к MS SQL и Oracle
Ответ #1 - 14. Апреля 2008 :: 12:20
Печать  
Наверное грустный вопрос получился  Печаль
  
Наверх
ICQ  
IP записан
 
grayrat
Junior Member
**
Отсутствует



Сообщений: 99
Местоположение: Russia, Moscow
Зарегистрирован: 20. Мая 2006
Пол: Мужской
Re: Помогите: один запрос к MS SQL и Oracle
Ответ #2 - 14. Апреля 2008 :: 12:46
Печать  
А если к MSSQL прилинковать оракловский сервер?
  
Наверх
 
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Помогите: один запрос к MS SQL и Oracle
Ответ #3 - 14. Апреля 2008 :: 12:53
Печать  
grayrat писал(а) 14. Апреля 2008 :: 12:46:
А если к MSSQL прилинковать оракловский сервер?

Только так и можно сделать такой запрос.  Но тут есть некоторые моменты - смысл в том что при таком joine линкованная таблица полностью копируется с сервера на сервер, поэтому выигрышь в скорости очень сомнителен. Лучше делай два запроса к разным базам
  
Наверх
ICQ  
IP записан
 
Kapet
Senior Member
****
Отсутствует


Ламер - вансист

Сообщений: 262
Местоположение: Ukraine, Kyiv
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Re: Помогите: один запрос к MS SQL и Oracle
Ответ #4 - 14. Апреля 2008 :: 13:06
Печать  
Nick писал(а) 14. Апреля 2008 :: 12:53:
grayrat писал(а) 14. Апреля 2008 :: 12:46:
А если к MSSQL прилинковать оракловский сервер?

Только так и можно сделать такой запрос.  Но тут есть некоторые моменты - смысл в том что при таком joine линкованная таблица полностью копируется с сервера на сервер, поэтому выигрышь в скорости очень сомнителен. Лучше делай два запроса к разным базам

Если действительно при sp_addlinkedserver оракловские таблицы, участвующие в запросе, копируются целиком на сервер, то придется отказаться от этой идеи...
  
Наверх
ICQ  
IP записан
 
Kapet
Senior Member
****
Отсутствует


Ламер - вансист

Сообщений: 262
Местоположение: Ukraine, Kyiv
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Re: Помогите: один запрос к MS SQL и Oracle
Ответ #5 - 16. Апреля 2008 :: 14:35
Печать  
Nick писал(а) 14. Апреля 2008 :: 12:53:
grayrat писал(а) 14. Апреля 2008 :: 12:46:
А если к MSSQL прилинковать оракловский сервер?

Только так и можно сделать такой запрос.  Но тут есть некоторые моменты - смысл в том что при таком joine линкованная таблица полностью копируется с сервера на сервер, поэтому выигрышь в скорости очень сомнителен. Лучше делай два запроса к разным базам

После продолжительных танцов с бубнами прилинковал таки я оракловскую базу к своему MS SQL 2000 серваку.
В ананалайзере делаю запрос:
Код
Выбрать все
set nocount on select * from OPENQUERY(ORA, 'select ALT_DART_NO, ALT_TYPE from DS_ALTERDART where ORG_DART_NO = ''**********''') 


который благополучно выдает мне нужный результат. Время выполнения запроса не более 3 сек. Мелкомягкий скуль находится рядом, в локалке (Киев). Прилинкованая оракловская база лежит относительно далеко,  на серваке где-то около побережья Ла-Манша (без шуток). В таблице, откуда извлекаются данные, 25000 строк и 5 колонок.
Вот и берет меня сомненье, что скуль тащит на разборки всю таблицу к себе домой! Ваша информация на 100% верна?
  
Наверх
ICQ  
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Помогите: один запрос к MS SQL и Oracle
Ответ #6 - 16. Апреля 2008 :: 14:44
Печать  
Ну может на для разных СУБД механизмы используются разные но вот например:
http://www.xserver.ru/computer/database/sql/4/
  
Наверх
ICQ  
IP записан
 
Вадимко
God Member
*****
Отсутствует


Нам бы чего про ОдноЦэ...

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Помогите: один запрос к MS SQL и Oracle
Ответ #7 - 16. Апреля 2008 :: 14:48
Печать  
Молоток капет, я тоже этим пользовался когда не получалось через айпишник (может тупил), в разных подсетях
Вроде ексель тоже так делает, через OPENQUERY
  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Помогите: один запрос к MS SQL и Oracle
Ответ #8 - 16. Апреля 2008 :: 14:52
Печать  
Так насколько я понимаю у тебя не расределенный запрос получается
  
Наверх
ICQ  
IP записан
 
Kapet
Senior Member
****
Отсутствует


Ламер - вансист

Сообщений: 262
Местоположение: Ukraine, Kyiv
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Re: Помогите: один запрос к MS SQL и Oracle
Ответ #9 - 16. Апреля 2008 :: 14:56
Печать  
Nick писал(а) 16. Апреля 2008 :: 14:44:
Ну может на для разных СУБД механизмы используются разные но вот например:
http://www.xserver.ru/computer/database/sql/4/

При джойнах возможно так и происходит, но не в моем случае. Кстати, в примере есть и решение подобной проблемы.
Вот статистика вышеприведенного запроса (включено SET STATISTICS TIME ON)

SQL Server parse and compile time:
   CPU time = 0 ms, elapsed time = 136 ms.

SQL Server Execution Times:
   CPU time = 0 ms,  elapsed time = 0 ms.

SQL Server Execution Times:
   CPU time = 0 ms,  elapsed time = 0 ms.


SQL Server Execution Times:
   CPU time = 0 ms,  elapsed time = 72 ms.
  
Наверх
ICQ  
IP записан
 
Kapet
Senior Member
****
Отсутствует


Ламер - вансист

Сообщений: 262
Местоположение: Ukraine, Kyiv
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Re: Помогите: один запрос к MS SQL и Oracle
Ответ #10 - 16. Апреля 2008 :: 14:59
Печать  
Nick писал(а) 16. Апреля 2008 :: 14:52:
Так насколько я понимаю у тебя не расределенный запрос получается

Это только заготовка-тренировка в области со сплошными белыми пятнами для меня. Предполагается именно распределенный запрос.
  
Наверх
ICQ  
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Помогите: один запрос к MS SQL и Oracle
Ответ #11 - 16. Апреля 2008 :: 15:00
Печать  
Цитата:
Кстати, в примере есть и решение подобной проблемы.

Сложно назвать REMOTE JOINE решением этой проблемы.
  
Наверх
ICQ  
IP записан
 
Kapet
Senior Member
****
Отсутствует


Ламер - вансист

Сообщений: 262
Местоположение: Ukraine, Kyiv
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Re: Помогите: один запрос к MS SQL и Oracle
Ответ #12 - 16. Апреля 2008 :: 15:03
Печать  
Nick писал(а) 16. Апреля 2008 :: 15:00:
Цитата:
Кстати, в примере есть и решение подобной проблемы.

Сложно назвать REMOTE JOINE решением этой проблемы.

На безрыбье ...
  
Наверх
ICQ  
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Помогите: один запрос к MS SQL и Oracle
Ответ #13 - 16. Апреля 2008 :: 15:06
Печать  
По сути твой запрос это REMOTE JOINE с таблицей в которой 1 запись, а если их там 10?
3*10 = 30 сек, а если 100? Согласись это очень небольшое число Улыбка
  
Наверх
ICQ  
IP записан
 
Kapet
Senior Member
****
Отсутствует


Ламер - вансист

Сообщений: 262
Местоположение: Ukraine, Kyiv
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Re: Помогите: один запрос к MS SQL и Oracle
Ответ #14 - 16. Апреля 2008 :: 15:24
Печать  
Nick писал(а) 16. Апреля 2008 :: 15:06:
По сути твой запрос это REMOTE JOINE с таблицей в которой 1 запись, а если их там 10?
3*10 = 30 сек, а если 100? Согласись это очень небольшое число Улыбка

Математика возможно спорная. Как видно из статистики выше запрос выполняется за 72 ms. А разница между пересылкой одной записи в готовой выборке или 100 записей в готовой выборке должна быть несущественной. Или я чего-то недопонимаю? Сам оракловский запрос в данном случае выполняется вроде на удаленном сервере?
  
Наверх
ICQ  
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Помогите: один запрос к MS SQL и Oracle
Ответ #15 - 16. Апреля 2008 :: 15:30
Печать  
Цитата:
Сам оракловский запрос в данном случае выполняется вроде на удаленном сервере?

Да конечно но все парамтры для запроса берутся с локального сервера. А это означает копирование всех параметров на удаленный сервер и невозможность использования локальных индексов
  
Наверх
ICQ  
IP записан
 
Kapet
Senior Member
****
Отсутствует


Ламер - вансист

Сообщений: 262
Местоположение: Ukraine, Kyiv
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Re: Помогите: один запрос к MS SQL и Oracle
Ответ #16 - 16. Апреля 2008 :: 15:40
Печать  
Nick писал(а) 16. Апреля 2008 :: 15:30:
Цитата:
Сам оракловский запрос в данном случае выполняется вроде на удаленном сервере?

Да конечно но все парамтры для запроса берутся с локального сервера. А это означает копирование всех параметров на удаленный сервер и невозможность использования локальных индексов

Ввиду полнейшей безграмотности в предметной области распределенных запросов и оракловских базах данных я могу только учесть Ваши рекомендации и замечания в процессе дилетантских попыток скрестить козла с паровозом с большой долей благодарности за проявленное участие в решении моей проблемы.
Завтра попробую получить большую выборку из таблицы с кол-вом записей кажется более миллиона. Это уже будет информация для размышления. О результатах доложу  Улыбка
  
Наверх
ICQ  
IP записан
 
Kapet
Senior Member
****
Отсутствует


Ламер - вансист

Сообщений: 262
Местоположение: Ukraine, Kyiv
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Re: Помогите: один запрос к MS SQL и Oracle
Ответ #17 - 17. Апреля 2008 :: 10:42
Печать  
Спасибо ВСЕМ!
Собственно говоря вроде получил всё, что хотел.
Вот пример работающего запроса из MS SQL Query Analyser одновременно к ораклу и базе 1С на мелкомягком скуле:
Код
Выбрать все
set statistics time on
set nocount on
select
  ORCL.ABLG_NO
, ORCL.ADT
, ORCL.ABAY_TO
, ORCL.ADART_NO
, ORCL.ADART_DESCR
, ORCL.APRICE
, ORCL.AQTY
, tmz.descr as ТМЦ
from
  OPENQUERY(ORA, '
select
  TRANS.blg_no AS ABLG_NO
, trunc(TRANS.reserve_dt,''DDD'') AS ADT
, SUPL.BAY_TO AS ABAY_TO
, TRANS.dart_no AS ADART_NO
, TRANS.dart_desc AS ADART_DESCR
, to_char(TRANS.dart_price,''999999999.99'') as APRICE
, sum(TRANS.qty) as AQTY
from
  DS_PURCH PURCH
, DS_TRANS TRANS
, DS_SUPL SUPL
where
PURCH.purchase_no = TRANS.purchase_no and
PURCH.purchase_seс = TRANS.purchase_seс and
TRANS.supl = SUPL.supl
and trunc(TRANS.reserve_dt,''DDD'') between  to_date(''16.04.08'',''DD.MM.YY'') and  to_date(''16.04.08'',''DD.MM.YY'')
group by TRANS.reserve_dt, TRANS.blg_no, SUPL.BAY_TO, TRANS.dart_no,  TRANS.dart_desc, TRANS.dart_price
') as ORCL
left join
  [account_db].[dbo].sc148 as tmz(nolock) on tmz.descr = ORCL.DART_NO 


и его статистика:
Код
Выбрать все
SQL Server parse and compile time:
   CPU time = 0 ms, elapsed time = 2575 ms.
SQL Server Execution Times:
   CPU time = 0 ms,  elapsed time = 0 ms.
SQL Server Execution Times:
   CPU time = 0 ms,  elapsed time = 0 ms.
SQL Server Execution Times:
   CPU time = 0 ms,  elapsed time = 1467 ms. 


Я не уверен, что это - именно "распределенный" запрос, но на 90% мне потребуется строить именно такие, т.е. что-то забрать из оракла, потом найти определенные соответствия полученным данным в базе 1С, и, наконец, выложить всё вместе в ТЗ как поставщик данных для ТП (или другое). Получается значительно проще и быстрее, чем крутить с двумя запросами и промежуточными преобразованиями/вычислениями. За что и боролись...
  
Наверх
ICQ  
IP записан
 
Переключение на Главную Страницу Страницы: [1] 
ОтправитьПечать