Проблема PHP с выбором из глобальной временной таблицы Oracle
У меня есть глобальная временная таблица Oracle, которая находится "ПРИ ФИКСАЦИИ СТРОК УДАЛЕНИЯ".
У меня есть цикл, в котором я:
- Вставить в глобальную временную таблицу
- Выбор из глобальной временной таблицы (постобработка)
- Зафиксируйте, чтобы таблица была очищена перед следующей итерацией цикла
Вставка выполняется с помощью вызова oci_execute ($stmt, OCI_DEFAULT). Извлечение производится с помощью вызова oci_fetch_all($stmt, $result, 0, -1, OCI_FETCHSTATEMENT_BY_ROW |OCI_ASSOC). После этого выполняется фиксация: oci_commit().
Проблема в том, что поиск иногда работает, и иногда я получаю одну из следующих ошибок:
- ORA-08103: объект больше не существует
- ORA-01410: недопустимый ИДЕНТИФИКАТОР СТРОКИ
Как будто сеанс не может "видеть" записи, которые он ранее вставил.
У вас есть какие-либо идеи о том, что может быть причиной этого?
Спасибо.
1 answers
Используете ли вы пул соединений? Если это так, то может быть, что разные вызовы выполняются в отдельных сеансах.
Лучшим решением было бы иметь единую процедуру PL/SQL, которая заполняет временную таблицу и возвращает набор результатов за один вызов. Что затем предлагает еще лучшее решение: полностью отказаться от временного стола.
В Oracle существует несколько ситуаций, требующих использования временных таблиц. Большинство вещей решаемы с помощью чистого SQL или, возможно, массовый сбор во вложенные таблицы. Какие фактические манипуляции с данными во временной таблице вы выполняете между вставкой и последующим выбором?
Редактировать
Временные таблицы имеют снижение производительности - строки записываются на диск. Коллекции PL/SQL остаются в (сессионной) памяти и поэтому работают быстрее. Конечно, поскольку они находятся в памяти сеанса, они не решат проблему с объединением соединений.
Это причина, по которой вам нужно разделите данные на части, потому что вы не хотите передавать 200 000 строк в свой PHP одним махом? Я думаю, что мне нужно немного больше контекста, если я хочу помочь вам в дальнейшем.