Глобальные временные таблицы, получающие данные из другого сеанса в Oracle - PullRequest
0 голосов
/ 26 мая 2010

У нас есть хранимая процедура в Oracle, которая использует global temporary tables. В большинстве других наших хранимых процедур первое, что мы делаем, это удаляем данные из глобальных временных таблиц. Однако в некоторых хранимых процедурах у нас нет delete's.

Есть ли другие варианты, кроме добавления операторов удаления? Можно ли что-то сделать на стороне сервера для принудительного удаления данных из этих временных таблиц при запуске этого SP?

GTT определены с ON COMMIT PRESERVE ROWS;

1 Ответ

2 голосов
/ 26 мая 2010

Я думаю, что ваш заголовок вводит в заблуждение: проблема не в том, чтобы «получить данные из другого сеанса», а в том, чтобы повторно использовать один и тот же сеанс. Завершение сеанса всегда сбрасывает временную таблицу:

SQL> conn apc
Enter password:
Connected.

SQL> create global temporary table tmp_23 (username varchar2(30))
  2  on commit preserve rows
  3  /

Table created.

SQL> insert into tmp_23 values (user)
  2  /

1 row created.

SQL> commit
  2  /

Commit complete.

SQL> select * from tmp_23
  2  /

USERNAME
------------------------------
APC

SQL> conn apc
Enter password:
Connected.
SQL> select * from tmp_23
  2  /

no rows selected

SQL>

Изнутри сеанса нет способа очистить временную таблицу, которая имеет PRESERVE ROWS, кроме удаления усечения. Нет способа аннотировать хранимую процедуру так, как вы предлагаете. Поэтому я боюсь, что если вы испытываете проблему, как вы ее описываете, вам придется прикусить пулю и добавить вызовы DELETE (или TRUNCATE) в ваши процедуры. Или определите таблицы с помощью DELETE ROWS; но это, вероятно, не подойдет вашей обработке.

Между прочим, кажется, что вы используете временные таблицы довольно интенсивно. Это необычно в системах Oracle, потому что временные таблицы являются относительно дорогими объектами (все эти записи на диск), и обычно существует более эффективный способ приблизиться к вещам: например, кэширование данных в коллекциях PL / SQL или просто использование SQL. Разработчики, не имеющие опыта работы с Oracle, особенно SQL Server, часто злоупотребляют временными таблицами, поскольку они привыкли к такому способу работы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...