Как организовать доступ к Oracle 8.1.7 из программ на C.

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

lightspeed
Сообщения: 3
Зарегистрирован: 16 дек 2004, 04:58

Приветствую All,

В общем, такая ситуация. Мне необходимо организовать доступ из программы на C в Oracle.
До этого использовал perl + DBI.
Сейчас уже необходимо из perl макета сделать _быстродействующий_ модуль на C.
Какие методы лучше использовать?
UnixODBC? OCI? Что-то еще?

Базы Oracle/Solaris, Oracle/Linux.
Модуль на perl/C под linux/freebsd.
Oracle clients для 8.1.7 установлены в обеих системах (Linux/FreeBSD)
Best regards,
lightspeed
Absurd
Сообщения: 1228
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

OCI. Можно там еще какое-нибудь DAO соорудить.
2B OR NOT(2B) = FF
lightspeed
Сообщения: 3
Зарегистрирован: 16 дек 2004, 04:58

Вы можете подсказать пример программы с использованием OCI? Может документация есть где?
Best regards,
lightspeed
Grinders
Сообщения: 4
Зарегистрирован: 16 дек 2004, 12:53

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);
}
mosquit
Сообщения: 10
Зарегистрирован: 19 ноя 2004, 16:21
Откуда: Москва

Если важно именно быстродействие, то следует использовать прямые обращения к 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.
DeeJayC
Сообщения: 497
Зарегистрирован: 17 фев 2004, 11:26
Откуда: Ленинград (который Город на Неве)
Контактная информация:

Возможны варианты, как то:

1. OCCI - (Родной, Oracle)
2. OTL - рекомендую. очень удобная феня. примеры на сайте в изобилии. http://otl.sourceforge.net/home.htm
"Особое внимание начинающих аквариумистов хотим обратить на то, что рыбки никогда не спят на спинке!" (c)

viel spass, DeeJayC
mosquit
Сообщения: 10
Зарегистрирован: 19 ноя 2004, 16:21
Откуда: Москва

DeeJayC, про OTL не знал, спасибо. Проверим на быстродействие :-)
lightspeed
Сообщения: 3
Зарегистрирован: 16 дек 2004, 04:58

Всем,
Ребята, спасибо большое за информацию. Нужен именно C-шный код.
Необходимо разобраться в примерах.
Может кто знает номер (A.....) документа Oracle 8i по использованию OCI на C?

К Grinders,
Ваш код, откуда? Есть ли в <oci.h> эти функции?

Best regards,
lightspeed
Best regards,
lightspeed
DeeJayC
Сообщения: 497
Зарегистрирован: 17 фев 2004, 11:26
Откуда: Ленинград (который Город на Неве)
Контактная информация:

lightspeed писал(а):Всем,
Ребята, спасибо большое за информацию. Нужен именно C-шный код.
Необходимо разобраться в примерах.
Может кто знает номер (A.....) документа Oracle 8i по использованию OCI на C?

К Grinders,
Ваш код, откуда? Есть ли в <oci.h> эти функции?

Best regards,
lightspeed
OCI именно для C, а не для C++
"Особое внимание начинающих аквариумистов хотим обратить на то, что рыбки никогда не спят на спинке!" (c)

viel spass, DeeJayC
Grinders
Сообщения: 4
Зарегистрирован: 16 дек 2004, 12:53

Это просто написаны обертки к функциям OCI.
Так как разработка шла и для Linux и для OpenVMS :lol:
Ответить