LINUX.ORG.RU

соединение с Oracle (язык программирования Си)


0

0

подскажите, пожалуйста, как из программы на Си соединиться с Oracl'овским сервером?

я смотрел instantclient_10_2/sdk/demo/cdemo81.c

там в аттрибутах задаются имя пользователя и пароль. А как же ip-адресс/имя сервера, порт?

или я чего-то не понимаю.

мда.

ты там ещё указываеш имя базы а потом в каком-то конфиге прописываеш что этому имени соответсвует определённый хост:порт и прочее

cvv ★★★★★
()
Ответ на: комментарий от cvv

а где этот конфиг брать/создавать?

я скачал client для linux. там .so'шки. скачал sdk, там .h'ки.

а как конфигурировать то на сервер? везде пишут про какой-то ORACLE_HOME, но у меня нет оракла, он на другой (виндовой) машине. у меня только библиотеки и хидеры.

Куда копать?

jackLucas
() автор топика
Ответ на: комментарий от cvv

насколько я понял, ORACLE_HOME - переменная окружения, указывающая на каталог, куда установлен Oracle. Но у меня нет Oracle. И не нужен он мне на клиенте. у меня есть библиотеки для доступа к нему по сети instantclient-basic-linux32-10.2.0.2-20060331.zip, и sdk instantclient-sdk-linux32-10.2.0.2-20060331.zip

Что ещё нужно скачать/создать/прописать ?

jackLucas
() автор топика

Суть такая, вообще линк к ораклу производится по tnsnames, который у тебя должен быть описан в $ORACLE_HOME/network/admin/tnsnames.ora что-то типа такого

ORAFLY = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.11)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = ORAFLY) (SID = ORAFLY) ) )

для коннекта библа оракла смотрит именно этот файл. Собственно для соединения тебе надо указать только имя, пароль, и SID (имя базы).

а далее как в примере: OCIEnv * envhp; // OCI environment handle OCIServer * srvhp; // OCI Server handle OCIError * errhp; // OCI Error handle OCISvcCtx * svchp; // OCI Service context handle OCISession * usrhp; // OCI Session handle

и вперед.. за коннектом ;)

Deleted
()

млин... еще разок...

Суть такая, вообще линк к ораклу производится по tnsnames, который у тебя должен быть описан в $ORACLE_HOME/network/admin/tnsnames.ora
что-то типа такого

ORAFLY =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.11)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = ORAFLY)
(SID = ORAFLY)
)
)

для коннекта библа оракла смотрит именно этот файл. Собственно для соединения тебе надо указать только имя, пароль, и SID (имя базы).

а далее как в примере:
OCIEnv * envhp; // OCI environment handle
OCIServer * srvhp; // OCI Server handle
OCIError * errhp; // OCI Error handle
OCISvcCtx * svchp; // OCI Service context handle
OCISession * usrhp; // OCI Session handle

и вперед.. за коннектом ;)

Deleted
()
Ответ на: комментарий от Deleted

>вообще линк к ораклу производится по tnsnames,

Вообще то линк производится по dsn, который имеет вид (примерно) "(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.11)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = ORAFLY) (SID = ORAFLY)))"

tnsnames нужен только для того, чтобы не пугать end-user-ов такими строками, это просто один из возможных вариантов реализации синонимов.

И вообще, jackLucas-а нужно послать RTFM-ить, там всё описано.

DonkeyHot ★★★★★
()
Ответ на: комментарий от DonkeyHot

во-первых, спасибо за науку :), в понедельник всё проверю.

во-вторых, посылайте RTFM'ить, я не против, только ссылки давайте точные, в тех файлах, которые я скачал (client и sdk), документации я не нашёл. PDF'ку с Oracle.com про OCI development я скачал, но быстро утонул в 1500 страниц. Везде видел ORACLE_HOME, но конкретных объяснений что, куда написать не нашёл :(

jackLucas
() автор топика
Ответ на: комментарий от DonkeyHot

>Вообще то линк производится по dsn
не придирайся к словам ;) tnsnames как раз таки и описывает эти dsn, собственно поэту и написал что "производится по tnsnames"

Deleted
()
Ответ на: комментарий от Deleted

>не придирайся к словам

Я не придираюсь. Своими глазами видел в доке по этому самому *-instant-* слова "tnsnames и ORACLE_HOME не нужен".

DonkeyHot ★★★★★
()
Ответ на: комментарий от jackLucas

>посылайте RTFM'ить, я не против, только ссылки давайте точные

Увы, мне DBA-шник доку прислал, я просмотрел, и забыл. Т.ч. их(ссылок) у меня нет. Но найти можно.

>но быстро утонул в 1500 страниц

"Отож!". У меня сложилось впечатление, что если хочешь работать с ораклом и не ((читать много-тысяче-страничные доки) или (понимать устройство всего этого)) - пользуйся более высоким (и желательно не-от-оракла:-) уровнем (типа питонского dbapi - там всё намного проще.

>Везде видел ORACLE_HOME

Где-то в release-notes по *-instant-* написано, как и на что его заменить.

DonkeyHot ★★★★★
()
Ответ на: комментарий от DonkeyHot

> "Отож!". У меня сложилось впечатление, что если хочешь работать с ораклом и не ((читать много-тысяче-страничные доки) или (понимать устройство всего этого)) - пользуйся более высоким (и желательно не-от-оракла:-) уровнем (типа питонского dbapi - там всё намного проще.

дык я вобщем-то не планировал особо с oracle работать, просто срочно надо программку накатать. но надо было на Си, да и Python я особо не знаю, но на Perlе бы с удовольствием. Но надо на Си.

Кстати, Ваши комментарии помогли решить задачу. правда с файлами .ora я заморачиваться не стал, по словам, что мне тут наговорили, нашёл и понял со здешней подачи нужный мне кусок текста (в доке на 1500 стр.), в котором было написано, что на ORACLE_HOME и его файлы можно смело наплевать а в OCIServerAttach () передавать не пустую строку, как в примерах, а "//host:port/service_name". Так что сейчас прога коннектится, выполняет простенький запрос select count(*) from ...; и выдаёт корректный результат. так что в целом задача решена. Я пока не совсем разобрался, как с selectaми работать, которые возвращают много строк, но чувствую, что надо читать OCIStmtFetch2 () в дополнение к OCIStmtExecute ().

:)

jackLucas
() автор топика
Ответ на: комментарий от jackLucas

кстати, а в чём глубокий смысл service_name? я выспросил данный параметр у нашего DBA, и оказалось, что он совпадает с именем базы.

jackLucas
() автор топика
Ответ на: комментарий от jackLucas

>в чём глубокий смысл service_name

на одном host:port может быть несколько баз, и т.н. "listener"-у нужно сказать, куда тебе надо.

DonkeyHot ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.