Почему ORA-03106 в программе OCI при ВЫБОРЕ более 1 строки?Только 10 г, а не 11 г - PullRequest
3 голосов
/ 24 марта 2012

Мое приложение 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.

1 Ответ

0 голосов
/ 28 марта 2012

Какая точная версия клиента и сервера Oracle используется?

Возможно совпадение хотя бы с одной известной ошибкой Oracle:

Относится к: Oracle Server - Enterprise Edition- Версия: с 10.2.0.1 по 10.2.0.2 - Версия: с 10.2 по 10.2 Информация в этом документе относится к любой платформе.Проверен на актуальность 21-января-2010

Симптомы Приложение на основе OCI периодически выдает ORA-03106: фатальная ошибка протока связи с двумя задачами и имеет записи об ошибках в журнале приложения.

Внимание!может не отображаться в файле alert.log и в файлах трассировки SQL NET

Причина Это было определено как ошибка 4523125

Решение Обновите клиент и сервер до версии 10.2.0.3 * 1014.*

В целом, это похоже на проблему с поддержкой Oracle.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...