如何在不知道列数和名称的情况下在oracle中创建临时表。
例如:
Select columnA,columnB,* into temp_table from tableA.
在这里,tableA可能不是简单的表名,而是可能源自许多查询。
如何实现?还有其他替代方法吗?
答案 0 :(得分:1)
在Oracle中,您必须首先创建一个表,然后将其插入其中。或者,直接创建它(如我的示例)。
请注意,我已经创建了一个“普通”表;如果是临时,则可以在 global 或 private 之间进行选择(取决于您使用的数据库版本)。
对于这个讨论,我想这很好:
SQL> create table temp_table as
2 select a.*
3 from (select d.deptno, d.dname, e.ename --> this SELECT is your "tableA"
4 from emp e join dept d
5 on e.deptno = d.deptno
6 where job = 'CLERK'
7 ) a;
Table created.
SQL> select * from temp_table;
DEPTNO DNAME ENAME
---------- -------------------- ----------
10 ACCOUNTING MILLER
20 RESEARCH SMITH
20 RESEARCH ADAMS
30 SALES JAMES
SQL>
或者,创建一个视图并使用它:
SQL> create or replace view v_temp as
2 select d.deptno, d.dname, e.ename
3 from emp e join dept d
4 on e.deptno = d.deptno
5 where job = 'CLERK'
6 ;
View created.
SQL> select * from v_temp;
DEPTNO DNAME ENAME
---------- -------------------- ----------
10 ACCOUNTING MILLER
20 RESEARCH SMITH
20 RESEARCH ADAMS
30 SALES JAMES
SQL>
答案 1 :(得分:1)
此语句创建temp_table
,其中包含tableA
中的所有列和数据以及另外两个空列varchar和numeric。
create table temp_table as
select cast (null as varchar2(10)) columnA,
cast (null as number(6)) columnB,
tableA.*
from tableA
如果只需要结构,不需要数据,则添加:
where 1 = 0
答案 2 :(得分:0)
我不确定您为什么要拥有一个临时表,因为您不知道列,但是您可以考虑使用动态SQL根据过程中所需的列来创建表,然后将其再次删除。从我的角度来看,我认为这不是一个好的设计。
我建议考虑使用数据类型为VARCHAR2的'x'列数的collection。在交易过程中,您可以根据需要进行填充和处理,并且在该会话中也将保留。