如何从另一个表创建一个具有相同数据类型的表?

时间:2016-04-27 09:39:52

标签: oracle

我有一个表,我需要创建一个具有相同列名和数据的虚拟表,但对于某些列具有不同的数据类型。 例如:表-1有两列C1(varchar2)和C2(日期)。 我需要创建一个名为Table-2的虚表,其中包含列C1(varchar2)和C2(varchar2)。

请在oracle中建议如何做到这一点。

2 个答案:

答案 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>