SQL创建表在列中使用%type

SQL创建表在列中使用%type,sql,oracle,declaration,Sql,Oracle,Declaration,我正在尝试创建我的一个表的备份表(在函数中) 但我知道这行不通, 现在我的问题是,我如何使其尽可能动态化,这样我就不必在每次更改数据类型时都在备份脚本中更新数据类型,例如: VARCHAR2(24个字符)toVARCHAR2(50个字符) (表列是固定的,它们不会更改) 这种情况并不经常发生,但有时我们不得不这样做,因为该字段对于特定值来说不够大,然后没有人更新备份表,id给出了一些错误 编辑:我忘了一些必要的东西: 我必须添加两列,它们不在原始表中,但应具有与现有表之一相同的数据类型。 我是

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

但我知道这行不通, 现在我的问题是,我如何使其尽可能动态化,这样我就不必在每次更改数据类型时都在备份脚本中更新数据类型,例如:

VARCHAR2(24个字符)
to
VARCHAR2(50个字符)

(表列是固定的,它们不会更改) 这种情况并不经常发生,但有时我们不得不这样做,因为该字段对于特定值来说不够大,然后没有人更新备份表,id给出了一些错误

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

  • 我必须添加两列,它们不在原始表中,但应具有与现有表之一相同的数据类型。 我是否可以使用select,使其具有相同的类型,但有另一个名称? 如果是,我怎么做
  • 以及来自不同表的一些字段(因此我必须使用联接)
总数:

  • 来自多个表的多个类型为的列
  • 固定类型的新柱
  • 表ABC中变量类型为ColumXY的新列

您可以使用以下内容创建表格:

CREATE TABLE TBTestBackup AS 
SELECT colum1, column2, column2
FROM user.TBTest

根据您的编辑:您可以将select语句更改为您喜欢的任何内容。连接两个表,从一个表中选择3列,从另一个表中选择2列。您可以使用该语句创建备份

CREATE TABLE TBTestBackup AS SELECT * FROM ORIGINAL_TABLE_NAME WHERE 1=2;
这是假设您不希望备份表中的数据。如果您也需要数据,只需从上述语句中删除
WHERE
条件。

语法为

CREATE TABLE TBTestBackup as (SELECT * FROM TBTest)
不确定如何自动更改数据类型,但无论如何,它不应该经常更改(如果需要的话)。

听起来像是一个可以满足您需要的工具

create materialized view my_backup
tablespace whatever
nologging
build immediate
refresh complete on demand
as
select t.* 
from some_table t;
如果要刷新备份,请在mat视图上执行完全刷新:

exec dbms_mview.refresh('MY_BACKUP', 'C', atomic_refresh=>false);
还要注意的是,这并不能替代DBA用来执行备份的工具或其他工具,但符合您的要求


还请注意,您可以根据需要轻松地向查询中添加额外的列。

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

create table t1 (col1 number, col2 varchar2(2), col3 date);
create table t2 (col1 varchar2(10 char));
您可以使用一个过滤器将它们连接在一起,该过滤器的计算结果始终为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;
通常,
交叉连接
是不受欢迎的,但优化器足够聪明,能够意识到过滤器意味着它根本不需要实际命中表。当然,如果有可以连接的字段,则可以使用普通的内部连接

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

不过,刷新物化视图不会拾取底层列中的数据类型更改,是吗?如果数据太大,刷新时仍然会出错。(刚刚尝试了这个方法,根据我的答案中的表创建了一个视图,然后将
t1.col2
更改为
varchar2(5)
,并插入一个5字符的值。在插入之前,视图重新定义为OK,但仍然显示为
varchar2(2)
;在插入刷新后得到ORA-12899)。当然,整个视图仍然可以删除和重新创建,因此在大多数情况下,它仍然比CTAS好。完美!这正是我需要的!:D
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