Как оказалось, совсем не сложно. Если знать как :)
Первоначально этой задачей занимался мой сотрудник. Он скачал что-то под названиями Oracle Database Client, сначала версии 10, затем 11. Приличного веса дистрибутивы с GUI-выми инсталляторами. Но почему-то ни один из них нормально 32-х битовый ODBC-драйвер поставить не смог (нормально, это что бы в ODBC connection string можно было указать что-то вроде “Oracle ODBC Driver” в параметре Driver).
Памятуя мудрость о том, что хорошо сделанное – это сделанное самим собой, я решил тряхнуть стариной и попробовать справиться с Oracle Database Client самостоятельно. От чего получил массу интересных ощущений.
Инсталлятор клиента 10-й версии заставлял Windows 7 переключаться в какой-то ущербный видеорежим, поскольку не мог работать в штатном режиме. Что уже вызывало подозрения.
Далее инсталлятор предлагал выбрать одну из готовых конфигураций или же определить custom-конфигурацию. В режиме custom-конфигурации я выбрал только ODBC-драйвера, но когда перед началом инсталляции была показана итоговая информация по устанавливаемым компонентам, то там было перечислено еще штук двадцать наименований. И на диск ставилось несколько десятков мегабайт всякой шняги (включая, как мне показалось, не только JRE, но еще и Perl). Плюс к тому инсталлятор ожесточенно ругался на то, что длина значения PATH больше 1023 символов и поэтому он не может это значение модифицировать.
Инсталлятор от 11-й версии уже нормально переваривал количество цветов в штатном видеорежиме. Но так же ставил туеву хучу всякой херни вместе с ODBC-библиотеками. И так же ругался на длину значения PATH.
Но при этом у инсталлятора от 10-й версии была большая кнопка “Deinstall components” на главном диалоге. А вот в 11-й версии ее уже не было. И я так не нашел способа цивильного удаления установленной Oracle-овским инструментом требухи со своей машины – вычищал ручками.
В результате обнюхивания того дерьма, которым Oracle-овский инсталлятор засерал мой винчестер, удалось найти маленький html-файлик с инструкцией по ручной установке ODBC-драйверов под названием ODBC_IC_Readme_Win.html. В котором все просто и доступно расписано – качаем два zip-архива из состава Instant Client, создаем вручную папочку на диске, туда оба эти архива распаковываем один за одним, запускаем odbc_install, модифицируем PATH + еще пара тому подобных операций (вот, например, такая инструкция для Oracle 10g).
Самое хорошее в этом то, что этот способ реально работает. Такое впечатление, что Instant Client-ом занимаются в Oracle люди старой закалки, которые не боятся ставить и настраивать все ручками. Поэтому у них и работающие вещи получаются.
А вот разработчикам GUI-вых инструментов чего-нибудь вправить не помешало бы (или руки, или голову). Поскольку от знакомства с их творениями остается твердое впечатление, что чем больше и богаче контора, тем более говеный софт она производит.
Кстати, еще о качестве софта от Oracle. Примечательно, что попытка скачать архив с Oracle Instant Client без предварительного логина на сайт Oracle приводит вот к такому сообщению о системной ошибки. Хотя контора попроще наверняка бы просто написала, что для доступа к архиву нужно зайти на сайт под своим аккаунтом.
ничуть не пытаясь оправдать говнооракл, отмечу, что "Database Client" != "ODBC Driver"
ОтветитьУдалитьи более того, что жадная контора может специально пускать свой клиент *мимо* драйвера, чтобы его не юзали с другими бд, или хотя бы для того, чтобы проще использовать нестандартные возможности и не дебажить их в драйвере
ну а раз (предположительно) клиент ходит в бд мимо драйвера, то драйвер там запросто может не работать...
вот оно, enterpise quality и Hardware and Software, Engeneered to Work Together!
кстати, сам только что напоролся на упомянутую тобой ошибку
ОтветитьУдалитьрешил я прочесть faq
вижу: The Instant Client interoperates with any database version that the full Oracle Client interoperates with. Please see the interoperability matrix: Metalink Note 207303.1
проходим по последней ссылке и видим System error.
"жадная контора может специально пускать свой клиент *мимо* драйвера"
ОтветитьУдалитьНе понимаю, что значит "мимо драйвера". Оракловский клиент другими словами и есть тот самый драйвер, другие ему не нужны. Причём присутствует он на большом количестве платформ ещё с тех лет, когда всех этих ODBC и в проекте не было.
Как раз наиболее распространённый сценарий доступа к БД оракла -- этот как раз использование родного оракловского интерфейса.
В том-то и дело, что Database Client включает в себя ODBC Driver и даже ставит его, но как-то странно.
ОтветитьУдалитьЕсли пытаться его активировать не через диалог создания DSN операционной системы, а через параметр Driver в connection string, то нужно указывать имя {Microsoft ODBC for Oracle}. При этом, как я понимаю, используется не прямая работа с Oracle ODBC, а через какой-то MS-овский промежуточный слой. По крайней мере при возникновении каких-либо ошибок сообщения о них были явно похожи на MS-совские сообщения, а не Oracle-овские.
Поскольку мы искали проблему при работе с БД и не знали, на что именно грешить, то захотелось убрать этот промежуточный слой и использовать Oracle ODBC напрямую. Сделать это оказалось возможно через ручную установку Oracle ODBC-драйверов.
А так, похоже, Oracle ODBC является довольно ущербным тонким слоем над Oracle OCI (который в любом случае нужен на машине).
@Roman Yankovsky
ОтветитьУдалитья обдумал твой коммент и уже хотел ответить, но меня тошнит от деталей взаимотношений ms & oracle и всех этих виндовых подробностей
тем более, что Евгений Охотников упомянул главную цель -- прямое взаимодействие; вот про нее можно поговорить
@Евгений Охотников
скажу сразу, с ораклом я напрямую не работал и его закидонов не знаю
но утверждение "При этом, как я понимаю, используется не прямая работа с Oracle ODBC, а через какой-то MS-овский промежуточный слой" для меня выглядит внутренне противоречивым
прямая работа -- это когда сервер БД открывает серверный tcp socket, твоя прога открывает клиентский tcp socket, и они обмениваются бинарными пакетами через tcp
понятно, парсить и генерить эти пакеты лучше не самому, а
1. слинковавшись с сишным кодом, предоставленным в данном случае ораклом, статически или динамически
либо 2. слинковавшись с одной из с++ либ, которая дает независимость от БД, опять статически или динамически
@имя:
ОтветитьУдалитьУ тебя наблюдается незнание предмета, имхо.
ODBC -- это и есть тот слой, который скрывает от программы работу с протоколом конкретной СУБД. Приложение линкуется к DLL-ке odbc32 (под 32-х битовой виндой) и использует оттуда стандартизированный API.
Когда приложение делает вызовы ODBC API из odbc32, та делегирует вызовы конкретному ODBC-драйверу (предоставляемому разработчиком СУБД или еще кем-то).
Так вот, в случае с {Microsoft ODBC for Oracle} происходила, как мне кажется, работа через промежуточный ODBC-драйвер от MS. Т.е. odbc32 грузила Oracle-овский драйвер не напрямую. Вместо этого загружался какой-то MS-овский псевдодрайвер, который уже загружал Oracle-драйвер.
Кстати говоря, ODBC -- это такая псевдонезависимость от СУБД. Как только возникает задача выжимать из СУБД производительность, сразу же приходится переходить на конкретные диалекты конкретных SQL-ей. И независимость от СУБД, фактически, теряется.
Другое дело, что при работе с OTL довольно тяжко заставить одно и то же приложение работать с MSSQL через ODBC, а с Oracle через OCI. Поэтому приходится и с Oracle через ODBC общаться.
Какая-то странная ситуация. В почте у меня есть еще один комментарий от тов. имя, а здесь его нет. То ли комментарий был удален автором, то ли Блоггер сбойнул.
ОтветитьУдалитьНа всякий случай упомяну, что я говорил не о "прямом взаимодействии" с СУБД Oracle, а о "прямой работе с ODBC-шным драйвером от Oracle".
@Евгений Охотников
ОтветитьУдалитьэто *точно* блоггер сбойнул
(и я как раз хотел спросить, не удалил ли его ты -- я знаю, что когда я удаляю свой коммент, блоггер пишет "коммент удален автором", а когда хозяином блога -- то не знаю что происходит)
могу перезапостить мой коммент если внезапно он кому-то интересен, но *мне* ты ответил, и у меня вопросов нет