SQL创建表在列使用%type

Vlo*_*ity 5 sql oracle declaration

我正在尝试创建一个表的备份表(在函数中),

CREATE TABLE TBTestBackup
           (
             colum1           user.TBTest.colum1%type,
             colum2           user.TBTest.colum2%type,
             colum3           user.TBTest.colum3%type
             colum31           user.TBTest.colum3%type, --new column with same type as colum3
             colum4           user.TBTest2.column15type, --column from other table
             colum4           CHAR    (12 BYTE), --new column with fixed type
           ) TABLESPACE user_DATA
Run Code Online (Sandbox Code Playgroud)

但是我认为这是行不通的,现在我的问题是如何使它尽可能地动态,所以我不必每次更改数据类型时都在备份脚本中更新数据类型,例如:

VARCHAR2(24 CHAR)VARCHAR2(50 CHAR)

(表列是固定的,它们不会更改),这种情况很少发生,但是我们不得不这样做,因为该字段对于特定的值而言不够大,因此没有人更新备份表,并且id给出了一些错误。

编辑:我忘记了一些必要的东西:

  • 我必须添加2个不在原始表中的列,但应与已经存在的表之一具有相同的数据类型。我可以使用select作为,这样它将具有相同的类型但又有另一个名称?如果是,我该怎么做?
  • 以及来自不同表的某些字段(因此我必须使用联接)

和:

  • 来自多个表的具有类型的多个列
  • 固定类型的新列
  • 表格ABC中具有可变类型的新列,如XY

Ale*_*ole 5

根据您更新的要求,根据这两个表中的类型创建一个表:

create table t1 (col1 number, col2 varchar2(2), col3 date);
create table t2 (col1 varchar2(10 char));
Run Code Online (Sandbox Code Playgroud)

您可以将它们连接在一起,并使用一个始终评估为 false 的过滤器,正如 Orangecrush 建议的那样:

create table tb tablespace users as
select t1.col1 as col1, t1.col2 as col2, t1.col3 as col3,
    t1.col3 as col4, t2.col1 as col5, cast(null as varchar2(12 byte)) as col6
from t1
cross join t2
where null is not null;
Run Code Online (Sandbox Code Playgroud)

通常 across join是不受欢迎的,但优化器足够聪明,可以意识到过滤器意味着它根本不需要实际命中表。当然,如果有可以加入的字段,则可以使用普通的内部联接。

desc tb

Name Null Type              
---- ---- ----------------- 
COL1      NUMBER            
COL2      VARCHAR2(2)       
COL3      DATE              
COL4      DATE               -- new column with same type as t1.col3
COL5      VARCHAR2(10 CHAR)  -- column from other table
COL6      VARCHAR2(12)       -- new column with fixed type
Run Code Online (Sandbox Code Playgroud)