Я думаю, что ваш заголовок вводит в заблуждение: проблема не в том, чтобы «получить данные из другого сеанса», а в том, чтобы повторно использовать один и тот же сеанс. Завершение сеанса всегда сбрасывает временную таблицу:
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, часто злоупотребляют временными таблицами, поскольку они привыкли к такому способу работы.