6

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

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

但是我把这行不通了,现在我的问题是我怎样才能让它尽可能地动态化,这样我就不必每次更改数据类型时都在备份脚本中更新数据类型,例如:

VARCHAR2(24 CHAR)VARCHAR2(50 CHAR)

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

编辑:我忘记了一些必要的事情:

  • 我必须添加 2 个不在原始表中的列,但应具有与现有表之一相同的数据类型。我可以使用 select as 所以它的类型相同但名称不同吗?如果是,我该怎么做?
  • 和一些来自不同表的字段(所以我必须使用连接)

和:

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

5 回答 5

5

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

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;

通常 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
于 2013-02-01T15:41:45.567 回答
4

您可以使用该语句来创建备份。

CREATE TABLE TBTestBackup AS SELECT * FROM ORIGINAL_TABLE_NAME WHERE 1=2;

这是假设您不想要备份表中的数据。如果您也需要数据,只需WHERE从上述语句中删除条件。

于 2013-02-01T12:47:31.737 回答
4

您可以使用以下命令创建表:

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

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

于 2013-02-01T12:46:30.060 回答
3

语法是

CREATE TABLE TBTestBackup as (SELECT * FROM TBTest)

不确定如何自动更改数据类型,但无论如何它不应该经常更改(如果确实需要这样做)。

于 2013-02-01T12:50:07.277 回答
2

听起来物化视图可以满足您的需求。

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);

另请注意,这不能替代RMAN或 DBA 用于执行备份的其他工具,但符合您的要求。

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

于 2013-02-01T13:09:48.910 回答