Есть ли у Oracle occi какие-либо ошибки памяти при написании больших двоичных объектов с использованием хранимых процедур через поток? - PullRequest
0 голосов
/ 06 октября 2011

Приведенная ниже функция вызовет некоторое повреждение памяти, которое вызовет исключение (которое невозможно идентифицировать, поскольку память повреждена) при выполнении другого вызова:

{    
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 может быть какая-то ошибка, которая повреждает память. Кто-нибудь знает что-нибудь об этом или сделал что-то подобное?

...