Go lang подключиться к Oracle 9i (используя go-oci8) - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть 32-разрядная БД Oracle (версия 9i - 9.2.0.7.0), 64-разрядный Mac, и я пытаюсь подключиться к нему, используя go-oci8 с Go Lang (версия go1.11.1 Darwin / amd64).

Я использовал SQL-Developer 4.0.2 , чтобы успешно подключиться к БД, а затем включил соединение InstantClient через нее, используя это руководство. Так что у меня все работает со стороны клиента Oracle.

Я использую InstantClient версии 11.2.0.4.0 (32-разрядная версия) для MacOS (базовая версия и SDK), я использовал в основном это руководство почти успешно. После всего, я получаю ошибку:

github.com/mattn/go-oci8 ld: warning: ignoring file /Users/myusername/Downloads/instantclient_11_2/libclntsh.dylib, file was built for i386 which is not the architecture being linked (x86_64): /Users/myusername/Downloads/instantclient_11_2/libclntsh.dylib Undefined symbols for architecture x86_64:

А потом длинный стек символов. В основном библиотека Go oci8 пытается использовать C (который является 64-битным) и пытается создать 64-битные файлы, которые затем будут использоваться Go. Если я попытаюсь использовать 64-битную версию InstantClient, у меня не возникнет проблем, но я получаю ошибку «driver: bad connection», которая связана с тем, что 64-битная версия не работает для подключения по какой-либо причине.

Понятия не имею, что делать, чтобы решить эту проблему - могу ли я каким-то образом форсировать сборку 32-битных файлов при использовании go get -u -v github.com/mattn/go-oci8? Или как-то заставить 64-битную версию InstantClient подключиться к старой 32-битной БД Oracle?

Буду очень признателен за любую помощь в том, как это запустить.

Редактировать: я пробовал 10.2 Oracle Client, но не могу подключить его к go-oci8 (я предполагаю, что он не поддерживает его). Я получаю ошибку ../github.com/mattn/go-oci8/oci8.go:113:25: could not determine kind of name for C.OCI_SYSASM

Окончательное редактирование для людей с такой же проблемой (переход к очень старой базе данных Oracle) - вы не можете взаимодействовать с готовыми решениями, использующими Go. Библиотеки, перечисленные для работы с Oracle, работают с клиентами версии 11.2 и выше.

1 Ответ

0 голосов
/ 05 ноября 2018

Архитектура Oracle Client должна соответствовать архитектуре вашего приложения. То есть если ваш Go Lang 64-битный, то клиент Oracle также должен быть 64-битным. Не имеет значения, является ли база данных 32-х или 64-х битной.

Я думаю, что основная проблема в том, что вы не можете подключиться с клиентом Oracle 11.2 к (20 лет!) Базе данных Oracle 9i.

Проверьте Матрица поддержки взаимодействия клиент / сервер для различных версий Oracle (ID документа 207303.1) для получения подробной информации.

Там написано:

Для соединений между 10.2 (или выше) и 9.2 конец 9.2 ДОЛЖЕН быть на 9.2.0.4 или выше. Соединения между 10.2 (или выше) и 9.2.0.1, 9.2.0.2 или 9.2.0.3 никогда не поддерживаются.

Вы не сказали нам, какую версию «Oracle 9i» вы используете.

...