Мое приложение OCI возвращает ORA-03106 («фатальная ошибка протокола связи двух задач») при выполнении SELECT * FROM mytable
, где mytable
имеет четыре столбца: INTEGER
, VARCHAR(1000)
, FLOAT
и DATE
и два ряда.Вызов завершается успешно, если есть только 1 строка.Вызов также завершается успешно, если в таблице есть столбец BLOB
(который также выбирается).
Различные форумы указывали, что причиной могут быть NLS_LANG
проблемы, а именно, этот набор символовпреобразование не выполняется на клиенте при получении данных, поскольку (возможно) файлы преобразования набора символов не могут быть найдены.Обратите внимание, что я протестировал множество возможных комбинаций установки NLS_LANG
, NLS_CHARACTERSET
, ORA_NLS10
и других переменных среды.Установка некоторых из этих воздействий на наблюдаемое поведение: иногда Oracle выдает ORA-01034: ORACLE not available ORA-27101: shared memory realm does not exist
;в других случаях происходит сбой клиентского приложения до получения первой строки (сбой происходит внутри OCIStmtFetch2()
).В частности, если клиентское приложение выполняет следующий запрос при первом установлении соединения: ALTER SESSION SET NLS_NUMERIC_CHARACTERS = '.,'
, сбой не происходит;вместо этого возвращается ошибка ORA-03106: fatal two-task communication protocol error
.
Примечание: возможно, причиной этого является наличие столбца DATE
, но установление воспроизводимых случаев оказалось очень трудным, поэтому я публикую своювопрос как есть.
Я потратил более 50 часов, пытаясь решить эту проблему.Любая помощь будет принята с благодарностью.
NEW: важные дополнительные сведения (см. Фрагмент кода ниже) : проблема возникает ТОЛЬКО во время извлечения данных PIECEWISE - не имеет значения, какой из двух методовЯ использую (динамическая функция обратного вызова или метод цикла, использующий функции получения / установки информации о штуках).Проходя по отладчику и просматривая буферы в памяти, которые я предоставил OCI для хранения данных FETCHED, все 4 поля в первой строке всегда извлекаются правильно;начальный FETCH второго столбца (это вызов, который возвращается с запросом информации о столбце VARCHAR при использовании циклического подхода) успешно заполняет все нединамические поля вплоть до столбца VARCHAR, но не включая его (т. е. INTEGERстолбец заполнен правильно);затем следующий FETCH успешно заполняет поле VARCHAR, и должен также успешно заполнить оставшиеся (не динамические) столбцы (поля FLOAT и DATE);однако, поле FLOAT заполнено правильно, но поле DATE повреждено, и, кроме того, этот вызов FETCH должен вернуть успех, но вместо этого он возвращает ORA-03106.
Следующий фрагмент кода, лишенный несущественной ошибки:проверяя и другой код, показывает, что происходит:
void RetrieveRow(...)
{
// All necessary environment, statement, describe, and define functions
// have already been called; non-dynamic buffers have already been allocated
retcode = OCIStmtFetch2(mystmt, fConnection->myerrhp, 1, OCI_DEFAULT, 0, OCI_DEFAULT);
while (retcode == OCI_NEED_DATA)
{
// ...
// ... Define the necessary arguments to OCIStmtGetPieceInfo() here ...
// ...
OCIStmtGetPieceInfo(mystmt, fConnection->myerrhp, (dvoid**)&define, &type, &inout, &iter, &idx, &piecep)
// ...
// ... Iteratively allocate and increase the buffer size for the required dynamic column here...
// ...
OCIStmtSetPieceInfo(define, OCI_HTYPE_DEFINE, fConnection->myerrhp, buf, alenp, piecep, indp, rcodep)
// ... Call OCIStmtFetch2() as part of the dynamic loop to fetch the next piece
retcode = OCIStmtFetch2(mystmt, fConnection->myerrhp, 1, OCI_DEFAULT, 0, OCI_DEFAULT);
}
// retcode is OCI_SUCCESS here when RetrieveRow() is called for the first row,
// ... and all data in the first row is properly populated in the buffers.
// But, when RetrieveRow() is called the second time, the above loop is entered,
// ... the INTEGER, VARCHAR (a dynamic field), and FLOAT fields are correctly populated,
// ... but the DATE field is corrupt, retcode is OCI_ERROR, and the error is ORA-03106.
// ... Note that even with a dynamic callback used instead of a loop, the error is the same.
// ... Note that when piecewise (dynamic) fetching is NOT used,
// ... all rows are retrieved successfully and there is no error.
}
Примечание: как отражено в моем изменении названия, эта проблема НЕ возникает, когда используются OCI и Oracle 11g.Если код ПОЛНОСТЬЮ не изменился, но включая файлы заголовков OCI 11g и загрузку библиотеки DLL OCI 11g, работающей с прослушивателем / экземпляром сервера базы данных Oracle 11g, код завершается БЕЗ этой ошибки.Ошибка возникает только в 10g.
Я был бы удовлетворен, если бы была предоставлена ссылка, которая четко и с уважением идентифицирует это как ошибку OCI / Oracle в версии 10g.(Я убежден, что это так.) Однако я не могу найти подтверждения, что это ошибка OCI / Oracle.