我有一个表,我需要创建一个具有相同列名和数据的虚拟表,但对于某些列具有不同的数据类型。 例如:表-1有两列C1(varchar2)和C2(日期)。 我需要创建一个名为Table-2的虚表,其中包含列C1(varchar2)和C2(varchar2)。
请在oracle中建议如何做到这一点。
答案 0 :(得分:2)
执行此操作的最佳方法是使用create as select
复制表格,而不使用数据,例如 -
create table Table-2 as select * from Table-1 where 1=0;
然后手动更改所需列的数据类型 -
alter table Table-2 modify (C2 varchar2);
更改列后,您可以使用正确的转换将数据从表-1推送到表-2中。在你的例子中 -
insert into Table-2 select C1, to_char(C2,'dd-mm-yyyy') from Table-1;
答案 1 :(得分:1)
假设可以在VARCHAR2
中转换起始表的所有列(隐式转换),您可以执行以下操作。
假设你有这张桌子:
SQL> create table table1 (
2 date_field date,
3 varchar_field varchar2(1000),
4 number_field number
5 );
Table created.
SQL> insert into table1 values (sysdate, 'some text', 999);
1 row created.
SQL> commit;
Commit complete.
您可以使用隐式类型转换构建一个动态SQL来创建另一个表并将数据从一个表复制到另一个表:
SQL> declare
2 stm varchar2(32767);
3 begin
4 select 'create table table2( ' ||
5 listagg(column_name, ' varchar2(4000), ') within group (order by column_name) ||
6 ' varchar2(4000) )'
7 into stm
8 from user_tab_columns
9 where table_name = 'TABLE1';
10 --
11 execute immediate stm;
12 --
13 select 'insert into table2( ' ||
14 listagg(column_name, ', ') within group (order by column_name) ||
15 ' ) select ' ||
16 listagg(column_name, ', ') within group (order by column_name) ||
17 ' from table1'
18 into stm
19 from user_tab_columns
20 where table_name = 'TABLE1';
21 execute immediate stm;
22 end;
23 /
PL/SQL procedure successfully completed.
SQL> select * from table2;
DATE_FIELD NUMBER_FIELD VARCHAR_FIELD
--------------- --------------- ---------------
27-APR-16 some text 999
SQL>