Страница 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: