【问题标题】:How to create one table with same datatype of all columns from another table?如何从另一张表中创建一个具有相同数据类型的所有列的表?
【发布时间】:2016-04-27 20:24:26
【问题描述】:

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

请建议在 oracle 中执行此操作的方法。

【问题讨论】:

  • 您如何确定varchar2 将处理所有可能的起始表类型?例如,如果您在起始表中有一个BLOB 字段怎么办?
  • 第一个表的数据类型无关紧要。我需要创建一个我希望所有列都为 varchar2 的虚拟对象。
  • 您必须考虑起始表的类型:假设您创建了一个包含所有 varchar2 列的 table2;假设您在 table1 中有一个 blob 字段,当您尝试在 table2 中插入数据时,您会收到错误消息。所以,你必须对起始表的类型做出一些假设

标签: oracle


【解决方案1】:

最好的方法是复制带有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;

【讨论】:

  • 2 列只是一个例子,在运行时我可能有 100 列需要更改虚拟表中的数据类型。
  • 您仍然必须手动执行此操作,另一种方法是为表生成 DDL,然后在对新表运行 DDL 命令之前更改数据类型,但这仍然需要您自己更改每一列。
【解决方案2】:

假设起始表的所有列都可以在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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-31
    • 1970-01-01
    相关资源
    最近更新 更多