Вот пример того, как вы можете это сделать:
SQL> create or replace procedure temptable (par_table_name in varchar2)
2 is
3 l_cnt number;
4 l_str varchar2(200);
5 begin
6 -- if TEMP_TABLE already exists, drop it
7 select count(*)
8 into l_cnt
9 from user_tables
10 where table_name = 'TEMP_TABLE';
11
12 if l_cnt > 0 then
13 execute immediate 'drop table temp_table';
14 end if;
15
16 -- create a new TEMP_TABLE
17 l_str := 'create global temporary table temp_table on commit preserve rows ' ||
18 'as select * from ' || par_table_name;
19 execute immediate (l_str);
20 end;
21 /
Procedure created.
SQL> exec temptable('dept');
PL/SQL procedure successfully completed.
SQL> select * from temp_table;
DEPTNO DNAME LOC
---------- -------------------- --------------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
SQL>
Однако , в Oracle вы на самом деле не создаете / удаляете таблицы динамически - вы создаете их один раз и используете их много раз. Для глобальной временной таблицы вы должны создать ее один раз и при необходимости заполнить в разных сеансах.
Могут быть такие же требования, как и у вас (т.е. использовать одно и то же имя таблицы для разных источников данных), поэтому - если это ваш случай, посмотрите, поможет ли приведенный выше код.