Здравствуйте Alexey Menkov, Вы писали:
AM>Сделай хранимую процедуру в Oracle и передавай ей параметры.
В том то все и заключается, что все равно что делать — либо делать INSERT, либо делать процедуру. Конечно, разница по скорости есть, но она все равно далека от идеальной. Я все делаю в одной транзакции. Вот кусок кода (заранее прошу прощения за кривой код — все-таки он тестовый):
char buf[1000];
ora_cnn->Open("Provider=MSDAORA.1;Data Source=myDB;User ID=user1;Password=pwd1;","","",-1);
ora_rs->Open ( "SELECT * FROM TEST_TAB",
_variant_t((IDispatch *)ora_cnn,true),
ADODB::adOpenStatic,
ADODB::adLockBatchOptimistic,
ADODB::adCmdText );
ora_cmd->ActiveConnection = ora_cnn;
ora_cmd->CommandType = ADODB::adCmdText;
const n = 49;
for ( int i = 0; i < n; i++ ){
pars[i].CreateInstance ( __uuidof(ADODB::Parameter) );
pars[i]->Type = ora_rs->Fields->GetItem((long) i)->Type;
pars[i]->Size = ora_rs->Fields->GetItem((long) i)->DefinedSize;
pars[i]->Direction = ADODB::adParamInput;
ora_cmd->Parameters->Append ( pars[i] );
}
ora_cnn->BeginTrans ( );
_bstr_t query = "BEGIN INSERT INTO test_tab1( ";
for ( i = 0; i < n; i++ ){
query += ora_rs->Fields->GetItem((long)i)->Name;
if ( i < n - 1 )
query += ",";
}
query += ") VALUES (";
for ( i = 0; i < n; i++ ){
query += _bstr_t("?");
if ( i < n - 1 )
query += ",";
}
query += "); END; ";
ora_cmd->CommandText = query;
ora_cmd->PutPrepared ( true );
if ( 1 ){
for ( int i = 0; i < 500; i++ ){
try{
for ( int kk = 0; kk < n; kk++ )
pars[kk]->Value = ora_rs->Fields->GetItem((long)kk)->Value;
ora_cmd->Execute ( 0, 0, ADODB::adExecuteNoRecords );
ora_rs->MoveNext ();
} catch(_com_error &a){
cout << a.Description ();
return 0;
}
}
}
ora_cnn->CommitTrans ( );
P.S. Сразу хочу сказать, что на клиенте не тормозит — загрузка процессора на клиенте около 30%, почти все время тратится на Execute. В данном примере данные из таблицы test_tab качаются в test_tab1, у которой идентичная структура. Если убрать PutPrepared, то скорость почти не меняется.