Страница 1 из 2
Как организовать доступ к Oracle 8.1.7 из программ на C.
Добавлено: 16 дек 2004, 05:07
lightspeed
Приветствую All,
В общем, такая ситуация. Мне необходимо организовать доступ из программы на C в Oracle.
До этого использовал perl + DBI.
Сейчас уже необходимо из perl макета сделать _быстродействующий_ модуль на C.
Какие методы лучше использовать?
UnixODBC? OCI? Что-то еще?
Базы Oracle/Solaris, Oracle/Linux.
Модуль на perl/C под linux/freebsd.
Oracle clients для 8.1.7 установлены в обеих системах (Linux/FreeBSD)
Добавлено: 16 дек 2004, 10:56
Absurd
OCI. Можно там еще какое-нибудь DAO соорудить.
Добавлено: 16 дек 2004, 12:01
lightspeed
Вы можете подсказать пример программы с использованием OCI? Может документация есть где?
Добавлено: 16 дек 2004, 12:59
Grinders
sprintf((char *)query, "select * from table_name ");
status = OCI_StmtPrepare(&ora_h, &stmt, query);
if (status !=OCI_dNormal) {
printf("Error parsing query '%s'\n", OCI_getLastError());
}
status = OCI_StmtExecute(&ora_h, &stmt, 1, &var1, &var2 ....);
if (status ==OCI_dError) {
printf("Error execute query '%s' status=%d\n", OCI_getLastError(), status);
}
Добавлено: 16 дек 2004, 16:26
mosquit
Если важно именно быстродействие, то следует использовать прямые обращения к OCI. Документация есть в Oracle.
Вот пример программы, обрабатывающей запрос на получение
одного действительного числа:
Код: Выделить всё
STDMETHODIMP COraread::get_Value(BSTR sqlstring, VARIANT* pVal)
{
USES_CONVERSION;
OCIPrepare(stmtp,err,W2A(sqlstring),wcslen(sqlstring),OCI_NTV_SYNTAX,OCI_DEFAULT);
checkErr(err,OCIDef(stmtp,&def,err,1,&pVal->dblVal,sizeof(double),4,(dvoid*)0,0,0,OCI_DEFAULT));
if(OCIExecute(svc,stmtp,err,1,0,(OCISnapshot*)0, (OCISnapshot*)0, OCI_EXACT_FETCH)==OCI_NO_DATA)
{
pVal->vt=VT_NULL;
return S_OK;
}
pVal->vt = VT_R8;
return S_OK;
}
Здесь описание STDMETHODIMP и тип VARIANT объясняются тем, что эта функция использована в модуле, который является COM-объектом. chekErr - функция обработки исключений, ее пример есть в описании OCI, там же в документации Oracle.
Добавлено: 16 дек 2004, 16:33
DeeJayC
Возможны варианты, как то:
1. OCCI - (Родной, Oracle)
2. OTL - рекомендую. очень удобная феня. примеры на сайте в изобилии.
http://otl.sourceforge.net/home.htm
Добавлено: 16 дек 2004, 17:10
mosquit
DeeJayC, про OTL не знал, спасибо. Проверим на быстродействие :-)
to Grinders
Добавлено: 17 дек 2004, 02:22
lightspeed
Всем,
Ребята, спасибо большое за информацию. Нужен именно C-шный код.
Необходимо разобраться в примерах.
Может кто знает номер (A.....) документа Oracle 8i по использованию OCI на C?
К Grinders,
Ваш код, откуда? Есть ли в <oci.h> эти функции?
Best regards,
lightspeed
Re: to Grinders
Добавлено: 17 дек 2004, 11:03
DeeJayC
lightspeed писал(а):Всем,
Ребята, спасибо большое за информацию. Нужен именно C-шный код.
Необходимо разобраться в примерах.
Может кто знает номер (A.....) документа Oracle 8i по использованию OCI на C?
К Grinders,
Ваш код, откуда? Есть ли в <oci.h> эти функции?
Best regards,
lightspeed
OCI именно для C, а не для C++
Добавлено: 17 дек 2004, 12:16
Grinders
Это просто написаны обертки к функциям OCI.
Так как разработка шла и для Linux и для OpenVMS :lol: