Как временные таблицы Oracle точно работают в такой хранимой процедуре? - PullRequest
2 голосов
/ 11 августа 2010

Предположим, я использую следующий код Oracle в хранимой процедуре:

CREATE GLOBAL TEMPORARY TABLE temp_table (
    field1 NUMBER,
    field2 NUMBER
)
ON COMMIT DELETE ROWS

Эта конкретная хранимая процедура может вызываться одновременно разными пользователями в любой момент. Насколько я понимаю, данные, видимые пользователю во временной таблице, будут для него частными, и эти строки будут удалены в COMMIT.

Однако, как это работает в отношении этого:

  1. Безопасно ли вызывать оператор CREATE выше каждый раз вызывается хранимая процедура? Может ли это привести к ошибке, поскольку там уже «существует» временная таблица (возможно), созданная другим пользователем (/ сеанс)? Или все будет в порядке, поскольку сервер все равно обрабатывает их конфиденциально?

  2. Что именно происходит с ON COMMIT DELETE ROWS? Я предполагаю, что при этом удаляются только строки, относящиеся к конкретному сеансу пользователя, а данные других сеансов остаются без изменений, верно?

Любая помощь будет оценена. :)

Ответы [ 2 ]

5 голосов
/ 11 августа 2010

Q1: безопасно ли звонить CREATE утверждение над каждым время вызова хранимой процедуры?

Основная причина, по которой вы создаете глобальную временную таблицу (GTT), заключается в том, чтобы создать ее один раз (не внутри процедуры) и использовать ее в качестве закрытой таблицы для сеанса. Будет выдано сообщение об ошибке, если таблица уже существует.

Q2: Что именно происходит с ON COMMIT DELETE ROWS?

Да. Данные удаляются после фиксации. Это происходит только для сеанса, которым вы управляете.

Проверьте создание GTT и его использование .

0 голосов
/ 11 августа 2010
  1. Я бы просто оставил там стол. Нет смысла бросать и воссоздавать его все время. Как вы говорите, это вызовет проблемы с параллелизмом.

  2. Да.

...