использование глобальной временной таблицы в задании - PullRequest
0 голосов
/ 25 октября 2011

Я работаю над хранимой процедурой 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 ]

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

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

1 голос
/ 25 октября 2011

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

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

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

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

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

...