В Oracle практически никогда не требуется создавать объекты во время выполнения.
Глобальные временные таблицы, возможно, являются лучшим решением вашей проблемы, однако, поскольку вы не сказали точно, зачем вам нужна временная таблица, я предлагаю вам сначала проверить, нужна ли временная таблица; половину времени вы можете сделать с одним SQL, что, как вы могли подумать, потребует нескольких запросов.
Тем не менее, я довольно успешно использовал глобальные временные таблицы в прошлом в приложениях, которым нужно было поддерживать отдельное «пространство» в таблице для нескольких контекстов в одном сеансе; это делается путем добавления дополнительного столбца идентификатора (например, «CALL_ID»), для которого изначально установлено значение 1, и последующие вызовы процедуры будут увеличивать этот идентификатор. Идентификатор обязательно будет запомнен с использованием глобальной переменной где-нибудь, например. глобальная переменная пакета, объявленная в теле пакета. НАПРИМЕР.:
PACKAGE BODY gtt_ex IS
last_call_id integer;
PROCEDURE myproc IS
l_call_id integer;
BEGIN
last_call_id := NVL(last_call_id, 0) + 1;
l_call_id := last_call_id;
INSERT INTO my_gtt VALUES (l_call_id, ...);
...
SELECT ... FROM my_gtt WHERE call_id = l_call_id;
END;
END;
Вы обнаружите, что GTT работают очень хорошо даже при высокой степени параллелизма, определенно лучше, чем при использовании обычных таблиц. Лучшей практикой является разработка приложения таким образом, чтобы ему никогда не приходилось удалять строки из временной таблицы, поскольку GTT автоматически очищается после завершения сеанса.
person
Jeffrey Kemp
schedule
28.07.2009