Вы упоминаете, что создаете временную таблицу, но, вероятно, вы создали ее один раз и не пытаетесь воссоздать ее каждый раз, когда запускается код plsql, а также определение индекса может оставаться во временной таблице - это также не нужно создавать каждый раз, когда вы запускаете код.
Глобальная временная таблица имеет статическое определение - вы просто создаете ее, и она есть, но она не генерирует повтор / отмену, а содержащиеся в ней данные видны только сеансу, который ее заполняет.
SQL*Plus: Release 10.1.0.4.2 - Production on Wed Oct 26 01:22:30 2011
Copyright (c) 1982, 2005, Oracle. All rights reserved.
Connected to:
Oracle Database 10g Express Edition Release 10.2.0.1.0 - Production
SQL> create global temporary table test (name varchar2(20));
Table created.
SQL> insert into test values ('one');
1 row created.
SQL> insert into test values ('two');
1 row created.
SQL> select * from test;
NAME
--------------------
one
two
Затем в другой сессии
SQL*Plus: Release 10.1.0.4.2 - Production on Wed Oct 26 01:23:17 2011
Copyright (c) 1982, 2005, Oracle. All rights reserved.
Connected to:
Oracle Database 10g Express Edition Release 10.2.0.1.0 - Production
SQL> select * from test;
no rows selected
SQL> insert into test values ('three');
1 row created.
SQL> select * from test;
NAME
--------------------
three
назад в первом сеансе
SQL> commit;
Commit complete.
SQL> select * from test;
no rows selected
SQL> drop table test;
drop table test
*
ERROR at line 1:
ORA-14452: attempt to create, alter or drop an index on temporary table already
in use
Поскольку мы вставили данные во второй сеанс, мы ничего не можем сделать с временной таблицей
пока мы не зафиксируем во втором сеансе, тогда падение завершится успешно
У вас есть возможность очистить содержимое для сеанса, который его создал, либо при фиксации (при фиксации удаления строк), либо при сохранении данных до завершения сеанса (при сохранении фиксации строк).