2017-05-16 14 views
2

これは私が親切にuser75ponicの助けを借りて得たストアドプロシージャです。ソーステーブルのレコードをストアドプロシージャ経由でターゲットテーブルに転送した後にレコードを削除します

CREATE OR REPLACE PROCEDURE ARCHIVE_DATA 
AS 
BEGIN 
    MERGE 
    INTO Schema2.table trg 
    USING (
      SELECT 
       column1 
       , column2 
       , column3 
      FROM 
       Schema1.table 
      WHERE 
       col_date >= 360 
     ) 
     src 
    ON 
     (
      trg.column1 = src.column1 
     ) 
    WHEN NOT MATCHED THEN 
    INSERT 
     (
      column1 
      , column2 
      , column3 
     ) 
     VALUES 
     (
      src.column1 
      , src.column2 
      , src.column3 
     ) 
    ; 

    COMMIT; 
END; 
/

は今、このストアドプロシージャは、テーブルをソースからターゲットにレコードを転送することになっていると、それはそうやっています。

私の挑戦は、このストアドプロシージャに以下の削除スクリプトを含めることです。目的は、レコードが移動された後で、ターゲット表に存在する場合にのみ、レコードをソース表から削除することです。 original Post

+0

ソーステーブルとターゲットテーブルの主キーはどちらですか?毎週の記録を区別する日付または他のフィールドはありますか? – user75ponic

+0

PKは各テーブルのtable_idです。そして、table_date <= sysdate - 360はレコードの年齢を決定します。 – Cyber

答えて

0

挿入を行った後、あなたは下記のお手続きにDELETEステートメントを追加することができます参照として

DELETE FROM src WHERE src.table_date <= SYSDATE - 360 AND src.table_id IN (SELECT table_id FROM trg.column); 

これはオリジナルのポストがある:

以下は、削除スクリプトです。

DELETE FROM schema1.src_table src 
     WHERE src.table_id IN (SELECT trg.table_id 
           FROM schema2.trg_table trg 
           WHERE trg.table_id = src.table_id); 
+0

これは動作します、ありがとうございます。 – Cyber

+0

それはうまくいきました。ソース・テーブルとターゲット・テーブルには何百万もの行が存在するため、クエリを実行する必要がある時を精査する必要があります。 – user75ponic

+0

ソースのスキーマをコピーし、それを削除してスケジュールされたタスクとして実行させることを意図しています。 – Cyber

関連する問題