Проблема PHP с выбором из глобальной временной таблицы Oracle - PullRequest
3 голосов
/ 04 мая 2010

У меня есть глобальная временная таблица Oracle "ON COMMIT DELETE ROWS".

У меня есть цикл, в котором я:

  • Вставить в глобальную временную таблицу
  • Выбор из глобальной временной таблицы (постобработка)
  • Фиксация, так что таблица очищается перед следующей итерацией цикла

Вставка выполняется с помощью вызова oci_execute ($ stmt, OCI_DEFAULT). Получение осуществляется через вызов oci_fetch_all ($ stmt, $ result, 0, -1, OCI_FETCHSTATEMENT_BY_ROW | OCI_ASSOC) После этого делается коммит: oci_commit ().

Проблема в том, что поиск иногда работает, и иногда я получаю одну из следующих ошибок:

  • ORA-08103: объект больше не существует
  • ORA-01410: недействительный ROWID

Как будто сеанс не может «видеть» записи, которые он ранее вставил.

У вас есть идеи, что может быть причиной этого?

Спасибо.

1 Ответ

2 голосов
/ 04 мая 2010

Вы используете пул соединений? Если это так, то может быть так, что разные вызовы выполняются в отдельных сеансах.

Лучшим решением было бы иметь одну процедуру PL / SQL, которая заполняет временную таблицу и возвращает набор результатов в одном вызове. Который затем предлагает еще лучшее решение: покончить с временной таблицей.

В Oracle есть несколько ситуаций, требующих использования временных таблиц. Большинство вещей можно решить с помощью чистого SQL или, возможно, массового сбора во вложенные таблицы. Какие фактические манипуляции с данными во временной таблице вы выполняете между вставкой и последующим выбором?

редактировать

Временные таблицы имеют снижение производительности - строки записываются на диск. Коллекции PL / SQL остаются в (сессионной) памяти и поэтому работают быстрее. Конечно, поскольку они находятся в памяти сеанса, они не решат проблему, с которой вы столкнулись при создании пула соединений.

Является ли причиной того, что вам нужно разделить данные на части, потому что вы не хотите передавать 200 000 строк в ваш PHP одним махом? Я думаю, что мне нужно немного больше контекста, если я хочу помочь вам в дальнейшем.

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