Приведенная ниже функция вызовет некоторое повреждение памяти, которое вызовет исключение (которое невозможно идентифицировать, поскольку память повреждена) при выполнении другого вызова:
{
ora::Statement stmt(__cn);
string sql("BEGIN Pckg.Sp_procA(:1, :2, :3, :4, :5, :6, :7, :8, "
":9, :10, :11, :12, :13, :14, :15, :payload); END;");
occi::Blob payload(__cn.getConnection());
occi::Environment* tempEnv = occi::Environment::createEnvironment();
occi::Timestamp reportTime(tempEnv);
reportTime.fromText(__report.report_time), "yyyy-mm-ddH24:mi:ss.ff");
stmt.setSQL(sql);
stmt.setString (1, "");
stmt.setString (2, "");
stmt.setString (3, __report.varA);
stmt.setString (4, __report.varB);
stmt.setInt (5, __report.varC);
stmt.setString (6, __report.varD);
stmt.setString (7, __report.varE);
stmt.setString (8, __report.varF);
stmt.setTimestamp(9, reportTime);
stmt.setNull (10, occi::OCCITIMESTAMP);
stmt.setString (11, __report.varG);
stmt.setString (12, __report.varH);
stmt.setString (13, __report.varI);
stmt.setString (14, __report.varK);
stmt.setString (15, __report.varX);
stmt.setBinaryStreamMode(16, __report.payload.Size(), true);
stmt.executeUpdate();
occi::Stream* streamedData = stmt.getStream(16);
streamedData->writeLastBuffer(__report.payload.GetPtr(), __report.payload.Size());
stmt.closeStream(streamedData);
occi::Environment::terminateEnvironment(tempEnv);
return true;
}
Функция ниже работает отлично, если код выше не выполняется и выглядит следующим образом:
{
ora::Statement stmt(__cn);
string sql("BEGIN "
"Pckg.Sp_procB(:1, :2, :3, :4, :5, :6, :7, :8, :9, :10, :11); END;");
occi::Environment* tempEnv = occi::Environment::createEnvironment();
occi::Timestamp reportTime(tempEnv);
reportTime.fromText(__report.report_time, "yyyy-mm-dd HH24:mi:ss.ff");
stmt.setSQL(sql);
stmt.setString (1, "");
stmt.setString (2, "");
stmt.setString (3, __report.varA);
stmt.setString (4, __report.varB);
stmt.setInt (5, __report.varB);
stmt.setString (6, __report.varD);
stmt.setString (7, __report.varE);
stmt.setString (8, __report.varF);
stmt.setString (9, __report.varG);
stmt.setTimestamp(10, reportTime);
stmt.setNull (11, occi::OCCITIMESTAMP);
stmt.executeUpdate();
occi::Environment::terminateEnvironment(tempEnv);
return true;
}
Я получил пример вставки BLOB-объектов из документации Oracle и не вижу в этом ничего плохого. Вторая функция, похоже, тоже в порядке, что заставило меня подумать, что у Oracle может быть какая-то ошибка, которая повреждает память. Кто-нибудь знает что-нибудь об этом или сделал что-то подобное?