6

(関数内の)テーブルの1つのバックアップテーブルを作成しようとしています。

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つの列を追加する必要がありますが、既存のテーブルの1つと同じデータ型である必要があります。同じタイプで別の名前になるようにselectを使用できますか?はいの場合、どうすればよいですか?
  • および別のテーブルからのいくつかのフィールド(したがって、結合を使用する必要があります)

和:

  • 複数のテーブルのタイプを持つ複数の列
  • タイプが固定された新しい列
  • テーブルABCの列XYのような変数タイプの新しい列
4

5 に答える 5

5

更新された要件に基づいて、次の2つのテーブルのタイプに基づいてテーブルを作成します。

create table t1 (col1 number, col2 varchar2(2), col3 date);
create table t2 (col1 varchar2(10 char));

Orangecrushが提案したように、常にfalseと評価されるフィルターを使用して、それらを結合することができます。

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 colum1, column2, column2
FROM user.TBTest

編集に基づいて:selectステートメントを好きなように変更できます。2つのテーブルを結合し、一方のテーブルから3つの列を選択し、もう一方のテーブルから2つの列を選択します

于 2013-02-01T12:46:30.060 に答える
4

このステートメントを使用して、バックアップを作成できます。

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

これは、バックアップテーブルにデータが必要ないことを前提としています。WHEREデータも必要な場合は、上記のステートメントから条件を削除してください。

于 2013-02-01T12:47:31.737 に答える
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;

バックアップを更新する場合は、マットビューで完全更新を実行します。

exec dbms_mview.refresh('MY_BACKUP', 'C', atomic_refresh=>false);

また、これは、バックアップを実行するためにDBAが使用するRMANまたはその他のツールに代わるものではありませんが、実行しようとしていることには適合します。

また、必要に応じてクエリに列を簡単に追加できることにも注意してください。

于 2013-02-01T13:09:48.910 に答える