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


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

Сообщений: 262
Местоположение: Ukraine, Kyiv
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Прямой запрос к базе на Oracle. Проблемы
27. Июня 2007 :: 16:38
Печать  
Помогите решить проблему с прямым запросом к Ораклу.
Делаю так:
Код
Выбрать все
DB=СоздатьОбъект("ODBCDatabase");
DB.Соединение("DRIVER={Microsoft ODBC for Oracle};SERVER=***;Uid=***;Pwd=***;");
RS=СоздатьОбъект("ODBCRecordSet");
RS.SetDatabase(DB);
ТЗ=Создатьобъект("ТаблицаЗначений");
ТекстЗапроса="
|SELECT HIS.TXN_DT AS DT, HIS.PART_NO AS NO
|FROM TS_HISTORY HIS
|WHERE trunc (txn_dt,'DDD') between  to_date('"+Строка(Дата1)+"','DD.MM.YY') and  to_date('"+Строка(Дата2)+"','DD.MM.YY')";
ТЗ=RS.ВыполнитьИнструкцию(ТекстЗапроса);
ТЗ.ВыбратьСтроку(); 


Так, как выше - работает на ура.

Если меняю текст запроса на такой:
Код
Выбрать все
ТекстЗапроса="select TRANS.bl_no, trunc(TRANS.receive_dt,'DDD') AS DT, SUPL.PAY_TO, TRANS.part_no, TRANS.part_desc, to_char(TRANS.part_price,'999999999.99') as PRICE, sum(TRANS.transit_qty) as QTY
|from SVC.TS_PURC_D as PURCH, SVC.TS_TRANSIT_D as TRANS, SVC.TS_SUPPL as SUPL
|where
|PURCH.purchase_no = TRANS.purchase_no and
|PURCH.purchase_seq = TRANS.purchase_seq
|and PURCH.STATUS = 'CLOS'
|and TRANS.supplier_cd = SUPL.supplier_cd
|and trunc(TRANS.receive_dt,'DDD') between  to_date('"+Строка(Дата1)+"','DD.MM.YY') and  to_date('"+Строка(Дата2)+"','DD.MM.YY')
|and SUPL.nation_cd <> 'NLD'
|group by TRANS.receive_dt, TRANS.bl_no, SUPL.PAY_TO, TRANS.part_no, TRANS.part_desc, TRANS.part_price "; 


то вылазит ошибка
Код
Выбрать все
ТЗ=RS.ВыполнитьИнструкцию(ТекстЗапроса);
{D:\1S BASES\ЗАГРУЗКАСЧЕТОВ.ERT(595)}: State 42000, native 933, message [Microsoft][ODBC driver for Oracle][Oracle]ORA-00933: SQL command not properly ended 


Т.е. такое впечатление, что запрос доходит до сервера в каком-то обрезанном виде.
Как ни крутил, - если в запросе выборка из более одной таблицы, то кампец...

Интересно, что через СоздатьОбъект("ADODB.Connection"), т.е. без 1срр, точно такой запрос нормально работает, а через ОДБС с 1срр не хочет Печаль
А хочется именно через ОДБС, да прямиком в ТЗ и далее в ТП...

Где собака порылась?
  
Наверх
ICQ  
IP записан
 
Kapet
Senior Member
****
Отсутствует


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

Сообщений: 262
Местоположение: Ukraine, Kyiv
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Re: Запрос к Oracle. Проблемы
Ответ #1 - 27. Июня 2007 :: 16:52
Печать  
Пардон: 1С++ v.2.5.0.2 Nightly build 2007-06-04
  
Наверх
ICQ  
IP записан
 
DmitrO
1c++ power user
Отсутствует


ex developer

Сообщений: 579
Местоположение: г. Киров
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Прямой запрос к базе на Oracle. Проблемы
Ответ #2 - 27. Июня 2007 :: 17:15
Печать  
А через ADODB наверно работает OLEDB провайдер, а не ODBC драйвер.
  
Наверх
ICQ  
IP записан
 
Kapet
Senior Member
****
Отсутствует


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

Сообщений: 262
Местоположение: Ukraine, Kyiv
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Re: Прямой запрос к базе на Oracle. Проблемы
Ответ #3 - 27. Июня 2007 :: 17:17
Печать  
Ну вроде да:
АДОСтрокаИнициализации = "Provider=MSDASQL.1;Password=***;Persist Security Info=True;User ID=***Смехata Source=***";
  
Наверх
ICQ  
IP записан
 
Kapet
Senior Member
****
Отсутствует


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

Сообщений: 262
Местоположение: Ukraine, Kyiv
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Re: Прямой запрос к базе на Oracle. Проблемы
Ответ #4 - 27. Июня 2007 :: 17:20
Печать  
Просто не хочется в цикле терзать и себя и сервер: дай очередную запись - на получи, дай очередную запись - на получи
  
Наверх
ICQ  
IP записан
 
Kapet
Senior Member
****
Отсутствует


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

Сообщений: 262
Местоположение: Ukraine, Kyiv
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Re: Прямой запрос к базе на Oracle. Проблемы
Ответ #5 - 27. Июня 2007 :: 17:28
Печать  
Вспоминаю, что когда-то недавно кто-то из тутошних корифеев предлагал добавить в 1с++ метод, выводящий реально посланный на сервер запрос, что-то типа Отладка(). В этом случае наверное такое очень бы пригодилось...
  
Наверх
ICQ  
IP записан
 
DmitrO
1c++ power user
Отсутствует


ex developer

Сообщений: 579
Местоположение: г. Киров
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Прямой запрос к базе на Oracle. Проблемы
Ответ #6 - 27. Июня 2007 :: 17:37
Печать  
да нет, так именно ODBC драйвер используется..
для OLEDB провайдера такая строка: Provider=MSDAORA
  
Наверх
ICQ  
IP записан
 
DmitrO
1c++ power user
Отсутствует


ex developer

Сообщений: 579
Местоположение: г. Киров
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Прямой запрос к базе на Oracle. Проблемы
Ответ #7 - 27. Июня 2007 :: 17:39
Печать  
Kapet писал(а) 27. Июня 2007 :: 17:28:
Вспоминаю, что когда-то недавно кто-то из тутошних корифеев предлагал добавить в 1с++ метод, выводящий реально посланный на сервер запрос, что-то типа Отладка(). В этом случае наверное такое очень бы пригодилось...

Этот метод там был всегда. Вызови перед выполнением запроса Отладка(1).
  
Наверх
ICQ  
IP записан
 
Kapet
Senior Member
****
Отсутствует


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

Сообщений: 262
Местоположение: Ukraine, Kyiv
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Re: Прямой запрос к базе на Oracle. Проблемы
Ответ #8 - 27. Июня 2007 :: 17:43
Печать  
DmitrO писал(а) 27. Июня 2007 :: 17:37:
да нет, так именно ODBC драйвер используется..
для OLEDB провайдера такая строка: Provider=MSDAORA

Вот тут я не силен...

Просто мне интересно: можно как-то тут сделать такое ТЗ=RS.ВыполнитьИнструкцию(ТекстЗапроса), чтоб быстро загнать запрос в ТЗ?
  
Наверх
ICQ  
IP записан
 
Kapet
Senior Member
****
Отсутствует


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

Сообщений: 262
Местоположение: Ukraine, Kyiv
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Re: Прямой запрос к базе на Oracle. Проблемы
Ответ #9 - 27. Июня 2007 :: 17:46
Печать  
DmitrO писал(а) 27. Июня 2007 :: 17:39:
Kapet писал(а) 27. Июня 2007 :: 17:28:
Вспоминаю, что когда-то недавно кто-то из тутошних корифеев предлагал добавить в 1с++ метод, выводящий реально посланный на сервер запрос, что-то типа Отладка(). В этом случае наверное такое очень бы пригодилось...

Этот метод там был всегда. Вызови перед выполнением запроса Отладка(1).

Отладка(1) в данном случае выдает желаемое за действительность: реально посланный запрос где-то обрезан, о чем и ругается сервер: SQL command not properly ended
  
Наверх
ICQ  
IP записан
 
DmitrO
1c++ power user
Отсутствует


ex developer

Сообщений: 579
Местоположение: г. Киров
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Прямой запрос к базе на Oracle. Проблемы
Ответ #10 - 27. Июня 2007 :: 17:52
Печать  
Отладка(1) выдает то, что отправляется на драйвер.
  
Наверх
ICQ  
IP записан
 
Kapet
Senior Member
****
Отсутствует


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

Сообщений: 262
Местоположение: Ukraine, Kyiv
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Re: Прямой запрос к базе на Oracle. Проблемы
Ответ #11 - 27. Июня 2007 :: 17:54
Печать  
DmitrO писал(а) 27. Июня 2007 :: 17:52:
Отладка(1) выдает то, что отправляется на драйвер.

Ну да, и я о том же: надо то, что реально шлется на сервер, который в моем случае ругается на недолжным образом законченный запрос...
Отладка(1) у меня показывает просто идилию...
  
Наверх
ICQ  
IP записан
 
DmitrO
1c++ power user
Отсутствует


ex developer

Сообщений: 579
Местоположение: г. Киров
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Прямой запрос к базе на Oracle. Проблемы
Ответ #12 - 27. Июня 2007 :: 18:29
Печать  
как тогда через АДО работает вообще не понятно..
  
Наверх
ICQ  
IP записан
 
vip
1c++ power user
Отсутствует



Сообщений: 1570
Зарегистрирован: 19. Мая 2006
Re: Прямой запрос к базе на Oracle. Проблемы
Ответ #13 - 27. Июня 2007 :: 18:31
Печать  
to Kapet
А ты попробуй присоединиться через родной Оракловый драйвер ODBC
Примерно так.
DB.Соединение("Driver={Oracle in OraHome92};dbq=***;Uid=***;Pwd=***");
Через майкрософтовский у меня недавно ничего не получлось.
  
Наверх
ICQ  
IP записан
 
DmitrO
1c++ power user
Отсутствует


ex developer

Сообщений: 579
Местоположение: г. Киров
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Прямой запрос к базе на Oracle. Проблемы
Ответ #14 - 27. Июня 2007 :: 18:45
Печать  
М.б. он результат до конца обработать не может. Попробуй еще такой код:
Код
Выбрать все
Результат = RS.Открыть(ТекстЗапроса);
Если Результат=0 Тогда
  Сообщить(RS.ПолучитьОписаниеОшибки());
КонецЕсли;
НомерЗаписи=0;
Пока RS.ВКонце()=0 Цикл
  НомерЗаписи=НомерЗаписи+1;
  Сообщить("Получена запись:"+НомерЗаписи);
  Результат = RS.След();
  Если Результат=0 Тогда
    Сообщить(RS.ПолучитьОписаниеОшибки());
  КонецЕсли;
КонецЦикла; 

  
Наверх
ICQ  
IP записан
 
Kapet
Senior Member
****
Отсутствует


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

Сообщений: 262
Местоположение: Ukraine, Kyiv
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Re: Прямой запрос к базе на Oracle. Проблемы
Ответ #15 - 29. Июня 2007 :: 08:37
Печать  
vip писал(а) 27. Июня 2007 :: 18:31:
to Kapet
А ты попробуй присоединиться через родной Оракловый драйвер ODBC
Примерно так.
DB.Соединение("Driver={Oracle in OraHome92};dbq=***;Uid=***;Pwd=***");
Через майкрософтовский у меня недавно ничего не получлось.

DB.Соединение("Driver={Oracle in OraDb10g_Home1};dbq=***;Uid=***;Pwd=***");
Да, соединяется. Но...
ТЗ=RS.ВыполнитьИнструкцию(ТекстЗапроса);
{D:\1S BASES\ЗАГРУЗКАСЧЕТОВ.ERT(596)}: State HY000, native 933, message [Oracle][ODBC][Ora]ORA-00933: SQL command not properly ended
  Печаль
  
Наверх
ICQ  
IP записан
 
Kapet
Senior Member
****
Отсутствует


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

Сообщений: 262
Местоположение: Ukraine, Kyiv
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Re: Прямой запрос к базе на Oracle. Проблемы
Ответ #16 - 29. Июня 2007 :: 08:39
Печать  
DmitrO писал(а) 27. Июня 2007 :: 18:45:
М.б. он результат до конца обработать не может. Попробуй еще такой код:
Код
Выбрать все
Результат = RS.Открыть(ТекстЗапроса);
Если Результат=0 Тогда
  Сообщить(RS.ПолучитьОписаниеОшибки());
КонецЕсли;
НомерЗаписи=0;
Пока RS.ВКонце()=0 Цикл
  НомерЗаписи=НомерЗаписи+1;
  Сообщить("Получена запись:"+НомерЗаписи);
  Результат = RS.След();
  Если Результат=0 Тогда
    Сообщить(RS.ПолучитьОписаниеОшибки());
  КонецЕсли;
КонецЦикла; 


Весь сыр-бор был уйти от такого цикла и махом получить результат запроса в тз...
  
Наверх
ICQ  
IP записан
 
Kapet
Senior Member
****
Отсутствует


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

Сообщений: 262
Местоположение: Ukraine, Kyiv
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Re: Прямой запрос к базе на Oracle. Проблемы
Ответ #17 - 29. Июня 2007 :: 09:16
Печать  
Через OLEDBData аналогичная жо:
Код
Выбрать все
DB=СоздатьОбъект("OLEDBData");
DB.Соединение("Provider=MSDASQL.1;Password=***;Persist Security Info=True;User ID=***;Data Source=***");
Команда=DB.СоздатьКоманду();
ТекстЗапроса="Select TRANS.bl_no, trunc(TRANS.receive_dt,'DDD') AS DT, TRANS.part_no, TRANS.part_desc, to_char(TRANS.part_price,'999999999.99') as PRICE, sum(TRANS.transit_qty) as QTY
|from SVC.TS_TRANSIT_D AS TRANS
|inner join SVC.TS_PURC_D as PURCH on (TRANS.purchase_no = PURCH.purchase_no and TRANS.purchase_seq = PURCH.purchase_seq)
|inner join SVC.TS_SUPPL as SUPL on SUPL.supplier_cd = TRANS.supplier_cd
|where
|PURCH.STATUS = 'CLOS'
|and trunc(TRANS.receive_dt,'DDD') between  to_date('"+Строка(Дата1)+"','DD.MM.YY') and  to_date('"+Строка(Дата2)+"','DD.MM.YY')
|and SUPL.nation_cd <> 'NLD'
|group by (TRANS.receive_dt, TRANS.bl_no, SUPL.PAY_TO, TRANS.part_no, TRANS.part_desc, TRANS.part_price) ";
ТЗ=Команда.ВыполнитьИнструкцию(ТекстЗапроса);
ТЗ.ВыбратьСтроку();
Команда.Закрыть(); 


ТЗ=Команда.ВыполнитьИнструкцию(ТекстЗапроса);
{D:\1S BASES\ЗАГРУЗКАСЧЕТОВ.ERT(601)}: FAILED! ICommandText::Execute(): [Oracle][ODBC][Ora]ORA-00933: SQL command not properly ended
  
Наверх
ICQ  
IP записан
 
Kapet
Senior Member
****
Отсутствует


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

Сообщений: 262
Местоположение: Ukraine, Kyiv
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Re: Прямой запрос к базе на Oracle. Проблемы
Ответ #18 - 29. Июня 2007 :: 09:51
Печать  
В общем я почти ничего не понял... Только то, что Оракл еще не дорос до "иннер джойн", и, как писал выше VIP  - мелкомягкий дривер "Microsoft ODBC for Oracle" тут  действительно не работает...

Всё заработало так:
Код
Выбрать все
DB=СоздатьОбъект("OLEDBData");
DB.Соединение("Provider=MSDASQL.1;Password=***;Persist Security Info=True;User ID=***;Data Source=***");
Команда=DB.СоздатьКоманду();
ТЗ=Создатьобъект("ТаблицаЗначений");
ТекстЗапроса="select TRANS.bl_no, trunc(TRANS.receive_dt,'DDD') AS DT, SUPL.PAY_TO, TRANS.part_no, TRANS.part_desc, to_char(TRANS.part_price,'999999999.99') as PRICE, sum(TRANS.transit_qty) as QTY
|from SVC.TS_PURC_D PURCH,
|SVC.TS_TRANSIT_D TRANS, SVC.TS_SUPPL SUPL
|where
|PURCH.purchase_no = TRANS.purchase_no and
|PURCH.purchase_seq = TRANS.purchase_seq and
|PURCH.STATUS = 'CLOS' and
|TRANS.supplier_cd = SUPL.supplier_cd
|and trunc(TRANS.receive_dt,'DDD') between  to_date('"+Строка(Дата1)+"','DD.MM.YY') and  to_date('"+Строка(Дата2)+"','DD.MM.YY')
|and SUPL.nation_cd <> 'NLD'
|group by TRANS.receive_dt, TRANS.bl_no, SUPL.PAY_TO, TRANS.part_no,  TRANS.part_desc, TRANS.part_price";
ТЗ=Команда.ВыполнитьИнструкцию(ТекстЗапроса);
ТЗ.ВыбратьСтроку(); 



и так;
Код
Выбрать все
DB=СоздатьОбъект("ODBCDatabase");
DB.Соединение("Driver={Oracle in OraDb10g_Home1};dbq=***;Uid=***;Pwd=***");
RS=СоздатьОбъект("ODBCRecordSet");
RS.SetDatabase(DB);
ТЗ=Создатьобъект("ТаблицаЗначений");
ТекстЗапроса="select TRANS.bl_no, trunc(TRANS.receive_dt,'DDD') AS DT, SUPL.PAY_TO, TRANS.part_no, TRANS.part_desc, to_char(TRANS.part_price,'999999999.99') as PRICE, sum(TRANS.transit_qty) as QTY
|from SVC.TS_PURC_D PURCH,
|SVC.TS_TRANSIT_D TRANS, SVC.TS_SUPPL SUPL
|where
|PURCH.purchase_no = TRANS.purchase_no and
|PURCH.purchase_seq = TRANS.purchase_seq and
|PURCH.STATUS = 'CLOS' and
|TRANS.supplier_cd = SUPL.supplier_cd
|and trunc(TRANS.receive_dt,'DDD') between  to_date('"+Строка(Дата1)+"','DD.MM.YY') and  to_date('"+Строка(Дата2)+"','DD.MM.YY')
|and SUPL.nation_cd <> 'NLD'
|group by TRANS.receive_dt, TRANS.bl_no, SUPL.PAY_TO, TRANS.part_no,  TRANS.part_desc, TRANS.part_price";
ТЗ=RS.ВыполнитьИнструкцию(ТекстЗапроса);
ТЗ.ВыбратьСтроку(); 


А с мелкомягкими дровами таки жо:
Код
Выбрать все
DB.Соединение("DRIVER={Microsoft ODBC for Oracle}...
ТЗ=RS.ВыполнитьИнструкцию(ТекстЗапроса);
{D:\1S BASES\ЗАГРУЗКАСЧЕТОВ.ERT(646)}: State 01S01, native 0, message [Microsoft][ODBC driver for Oracle]Ошибка в строке 1  


Всем спасибооооооо!
« Последняя редакция: 29. Июня 2007 :: 11:26 - Kapet »  
Наверх
ICQ  
IP записан
 
Kapet
Senior Member
****
Отсутствует


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

Сообщений: 262
Местоположение: Ukraine, Kyiv
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Re: Прямой запрос к базе на Oracle. Проблемы
Ответ #19 - 29. Июня 2007 :: 10:06
Печать  
DmitrO писал(а) 27. Июня 2007 :: 17:37:
да нет, так именно ODBC драйвер используется..
для OLEDB провайдера такая строка: Provider=MSDAORA

Сорри за святотатство, но судя по рабочему варианту выше - вроде таки OLEDB провайдер используется...
  
Наверх
ICQ  
IP записан
 
Переключение на Главную Страницу Страницы: [1] 
ОтправитьПечать