выбор

yaro83
Дата: 26.09.2004 22:26:42
Помогите с выбором: времени на работу мало, надо решить изучать или нет OCI, можно ли без него реализовать нижеследующие пункты.

От программы требуется:
1) работать со строками (добавлять, удалять, обновлять)
2) работать с таблицей (добавлять и удалять стобцы)
3) вызывать процедуры и функции, которые есть в базе данных

Понятно, что все это можно сделать на OCI, а можно ли это сделать при подключении к базе данных через ODBC или OleDB? Какие есть плюсы и минусы с различных точек зрения.

Спасибо.
Вячеслав Любомудров
Дата: 27.09.2004 02:22:54
Изучить OCI не трудно
Но быстрее будет Pro*
Ебстественно IMHO
Вячеслав Любомудров
Дата: 27.09.2004 02:27:33
С точки зрения OCI - самый быстрый вариант
ODBC - самый медленный
Pro* - в серединке
понятно, что чем больше телодвижений - тем шустрей, но зачастую это и не нужно
Все-таки большую часть пусть сервер делает (он большой)
yaro83
Дата: 27.09.2004 21:37:34
Ну хорошо. Ну а вызывать функции и процедуры PLSQL можно через ODBC? Можно пример такого вызова? Или это просто вызов хранимой проыедуры?
Вячеслав Любомудров
Дата: 28.09.2004 02:28:02
Нашел в древних исходниках
void GLogout(HDBC hDbc)	{
	HSTMT hStmt;

	if (SQLAllocStmt(hDbc, &hStmt))
		return;
	SQLExecDirect(hStmt, (unsigned char *)"{call USER_LOGIN.ARM_END}", SQL_NTS);
	SQLFreeStmt(hStmt, SQL_DROP);
	return;
}
А параметры там по-моему через вопросы передаются - честно говоря нет никакого желания всю это мерзость вспоминать
yaro83
Дата: 28.09.2004 10:34:33
Значит, если я не ошибся, это обычный SQL/CLI API. Да там действительно через вопросы параметры передаются. Но ведь OCI, который появился вместе с 8 Oracle сильно похож на этот CLI. Тогда возникают вопросы:
1) в OCI около 100 функций, а в CLI по стандарту около 40, вопрос: что специфичного дает этот OCI по сравнению с CLI
2) можно ли не пользуясь средствами OCI написать программу, которая бы что-то делала при получении сообщения из базы данных об изменении содержимого таблицы? Где об этом почитать можно?

Спасибо.
Вячеслав Любомудров
Дата: 28.09.2004 11:03:39
Что-то я не понял, об чем речь?
Что подразумевается под хитрым выражением SQL/CLI API (Command line) ?
Ну так можно посравнивать - вызов в ODBC я приводил, в Pro*C это будет выглядеть примерно так
	EXEC SQL WHENEVER SQLERROR GOTO login_err;
	EXEC SQL EXECUTE
		DECLARE
			otd luser.otdel%type;
		BEGIN
			select otdel into otd
			from luser
			where username=USER;

			user_login.arm_start(:arm_name, :arm_ver, otd);
			IF length(:arm_role) > 0 THEN
				user_login.x_proc(:arm_pass:arm_pass_ind,
							:arm_role);
			ELSE
				:arm_pass:arm_pass_ind := NULL;
			END IF;
		END;
	END-EXEC;
В OCI
bool PrepareStatment()	{
	static char getline_txt[] =
		"begin\
			if sys.dbms_pipe.receive_message(:pipename, 0) = 0 then\
				sys.dbms_pipe.unpack_message(:str);\
				:rc := 1;\
			else\
				:rc := 0;\
			end if;\
		exception\
			when others then\
				:rc := -1;\
		end;";
	int err;

	OCIHandleAlloc(hEnv, (void **)&hStmt, OCI_HTYPE_STMT, 0, 0);
	err = OCIStmtPrepare(hStmt, hErr, (OraText*)getline_txt,
			strlen(getline_txt), OCI_NTV_SYNTAX, OCI_DEFAULT)
	|| OCIBindByName(hStmt, &hBindPipe, hErr, (OraText*)":pipename", -1, pipename,
		sizeof(pipename), SQLT_STR, 0, 0, 0, 0, 0, OCI_DEFAULT)
	|| OCIBindByName(hStmt, &hBindStr, hErr, (OraText*)":str", -1, str,
		sizeof(str), SQLT_STR, 0, 0, 0, 0, 0, OCI_DEFAULT)
	|| OCIBindByName(hStmt, &hBindRc, hErr, (OraText*)":rc", -1, &rc,
		sizeof(rc), SQLT_INT, 0, 0, 0, 0, 0, OCI_DEFAULT);
	if (err && OracleError(OCI_ERROR, "on statment prepare"))
		return false;
	return true;
}

bool ExecStatment()	{
	int err;

	err = OCIStmtExecute(hSrvCtx, hStmt, hErr, 1, 0, 0, 0, OCI_DEFAULT);

	if (err && OracleError(OCI_ERROR, "on statment execute"))
		return false;
	return true;
}
Что такое 100 функций OCI 40 CLI тоже не понятно (насколько я помню в ODBC тоже под сотню вызовов)
По моим личным впечатлениям: ODBC - зло, медленнее OCI почти в 2 раза и не поддерживает многих возможностей.
Pro*C - практически не уступает OCI по скорости, но это уже на любителя (и опять же не позволяет новый прибамбасов)
OO4O (Oracle Objects for OLE) - насколько я понимаю далеки от кроссплатформенности, да и сложно это уже для меня (я давно уже стараюсь не заниматься программированием)
Аналогично насчет OCCI - просто не пробовал (и насколько понимаю тоже не все фичи поддерживаются)

Теперь на счет почитать - как обычно родная дока Oracle:
Oracle9 i
Application Developer's Guide - Fundamentals
Release 2 (9.2)
March 2002
Part No. A96590-01

Кстати, в ней уже по-моему не упоминается ODBC
azhukov
Дата: 28.09.2004 11:05:40
Мне кажется, для 95% задач использовать непосредственно OCI нецелесообразно, вполне подойдут более высокоуровневые инструменты (DOA,ADO,JDBC итп). Исходи из того на чем ты программируешь клиента.
yaro83
Дата: 28.09.2004 11:47:45
TO Вячеслав Любомудров:
CLI - Call Level Interface, это стандарт, выпущенный одной из стандартизирующих организаций, после того, как она поняла, что ODBC, который продвигала Microsoft набирает обороты. ODBC3 как раз поддерживает этот стандарт. Это я прочел в одной книге, пока в магазине стоял. Я посмотрел на его функции, они все начинаются c SQL... Как я понля, раз ODBC API реализует этот стандарт, то в нем есть эти функции.
OCI, который с 8 Oracle, построен над CLI и его функции так же очень похожи на функции CLI, начинаются с OCI.

Pro*C - к сожалению, на знаю, что такое.
OCCI - тоже, можно расшифровать.

Правильно ли я понял, что все три Ваших примера об одном и том же? Или последний про OCI нет, можно подробнее про последний пример, видимо, он иллюстрирует получение сообщения из базы данных об изменении таблицы.

TO azhukov: Вы абслютно правы, но чтобы не ошибиться и не переписывать код, я пытаюсь понять, обойдусь ли я функциональностью ODBC или OleDB по сравнению с OCI. Клиент будет либо MFC приложение, либо написан на C#. Пока меня беспокоит только вот что: что дает OCI кроме скорости, что функционально он дает?
yaro83
Дата: 28.09.2004 20:17:33
Если написать приложение с использованием OCI то понадобиться поставить Oracle клиента на компьютера, а при использовании OleDb или ODBC в этом не будет необходимости. Поясните PLS. Прав я или нет?