2016-04-27 6 views
0

私は1つのテーブルを持っているので、同じカラム名とデータを持つダミーテーブルを作成する必要がありますが、いくつかのカラムには異なるデータタイプが必要です。 例:表1には、C1(varchar2)とC2(date)の2つの列があります。 C1(varchar2)列とC2(varchar2)列を持つTable-2というダミーのテーブルを作成する必要があります。別の表からすべての列の同じデータ型を持つ表を作成する方法は?

オラクルで行う方法をお勧めします。

+0

'varchar2'がすべての可能なタイプの開始テーブルを扱うことを確認できますか?たとえば、開始テーブルに 'BLOB'フィールドがあるとしたらどうでしょうか? – Aleksej

+0

最初の表のデータ型は問題になりません。ダミーを作成して、すべての列をvarchar2にする必要があります。 –

+0

開始テーブルのタイプを考慮する必要があります。たとえば、すべてのvarchar2カラムを持つtable2を作成します。 table1にblobフィールドがあるとします。テーブル2にデータを挿入しようとすると、エラーが発生します。だから、開始テーブルの種類についていくつかの妥協をしなければならない – Aleksej

答えて

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> 
2

するための最良の方法

create table Table-2 as select * from Table-1 where 1=0; 

をし、必要なcoluのデータ型を変更する - たとえば、データなしで、これはcreate as selectでテーブルを複製することです手動でこれ等MNS - 列が変更された後

alter table Table-2 modify (C2 varchar2); 

あなたは適切な変換を用いて、表2に表1からのデータをプッシュすることができます。あなたの例では -

insert into Table-2 select C1, to_char(C2,'dd-mm-yyyy') from Table-1; 
+0

真、それに応じて私の答えを編集します。 –

+0

2列は単なる例です。実行時には、ダミー表のデータ型を変更する必要がある列が100列あります。 –

+0

これは手動で行う必要があります。別の方法は、テーブルのDDLを生成し、新しいテーブルでDDLコマンドを実行する前にデータ型を変更することですが、これでもすべてのカラムを自分で変更する必要があります。 –

関連する問題