У меня есть программа Oracle OCI, которая работает на различных платформах: SLES Linux, Ubuntu, AIX, Solaris и HP-UX. Я пытаюсь запустить ту же самую вещь на Redhat, и у меня возникают трудности.
Проблема возникает при использовании прокручиваемого курсора (вызов OCIStmtExecute
с OCI_STMT_SCROLLABLE_READONLY
) и использовании функции, которая выполняет двоичный поиск для получения точного размера набора результатов. В более общем смысле, проблема заключается в чтении после конца набора результатов, прежде чем читать значение ОК.
Я написал тестовую утилиту, которая выполняет простое утверждение, которое должно возвращать 1 строку (SELECT COUNT(*) FROM xxx
). Затем он извлекает данные из набора результатов:
Если я сначала получу строку 1, она будет работать нормально. Если я затем пройду мимо конца набора результатов, он продолжит работать нормально, когда я вернусь. Но если моя первая проверка выполняется после набора результатов, все идет не так:
> rdb_test 1
12:06:32.365 Checking row 1 - OK
> rdb_test 3
12:06:35.510 Checking row 3 - NO DATA
12:06:35.511 Checking row 2 - NO DATA
12:06:45.549 Checking row 1 - NO DATA
> rdb_test -3
12:06:49.344 Checking row 1 - OK
12:06:49.344 Checking row 3 - NO DATA
12:06:49.345 Checking row 2 - NO DATA
12:06:49.345 Checking row 1 - OK
Также есть странная задержка, 10 с в приведенном выше примере, когда он извлекает строку, которая должна быть в порядке. В отладчике это глубоко внутри функции OCIStmtFetch2 - неудивительно, что функция __read_nocancel ожидает ответа сервера.
Кто-нибудь еще видел эту проблему раньше?