Использование глобальной временной таблицы в задании

Я работаю над хранимой процедурой PL-SQL, которая будет выполняться в зависимости от ежедневной работы. в хранимой процедуре я пытаюсь использовать глобальную временную таблицу, например:

CREATE GLOBAL TEMPORARY TABLE A_Table 
ON COMMIT PRESERVE ROWS 
AS SELECT * from B_Table

и тогда я попытаюсь создать такой индекс:

CREATE INDEX idx_a ON A_Table (id)

У меня две проблемы:

  1. Созданная мной таблица всегда пуста, поэтому все вычисления в хранимой процедуре будут равны нулю.
  2. когда я пытаюсь создать индекс, я получил эту ошибку:

    ORA-14452: попытка создать, изменить или удалить индекс для уже используемой временной таблицы

любой совет, пожалуйста?

С уважением

3 ответа

  1. Любые данные, помещенные во временную таблицу, будут присутствовать только до конца сеанса (или транзакции, если вы укажете on commit delete rows). Если вы хотите хранить данные между сессиями, используйте обычную таблицу.

  2. Закройте сеанс, который использует временную таблицу, и повторите попытку.

Вы упоминаете, что создаете временную таблицу, но, вероятно, вы создали ее один раз и не пытаетесь воссоздать ее каждый раз, когда запускается код 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

Поскольку мы вставили данные во второй сеанс, мы ничего не можем сделать с временной таблицей, пока не зафиксируем второй сеанс, тогда удаление завершится успешно.

У вас есть возможность очистить содержимое для сеанса, который его создал, либо при фиксации (при фиксации удаления строк), либо при сохранении данных до завершения сеанса (при сохранении фиксации строк).

  1. Созданная вами таблица может быть не пустой, а только для сессии, которая ее заполняет. Каждый сеанс имеет, так сказать, собственный экземпляр временной таблицы. Кстати, это главная особенность временных таблиц.

  2. Модификация темп. таблица невозможна, в то время как любой сеанс, который когда-либо использовал ее, является живым (может быть не активным)

Другие вопросы по тегам