2

Oracleデータベースでは、22個のマテリアライズド・ビューを作成し、これらすべてのMVを更新する手順を作成しました。22個のマテリアライズド・ビューすべてが正常にリフレッシュされます。

毎月最終日に、マテリアライズドビューを更新し、データを履歴テーブルにコピーしたいと考えました。これらの履歴テーブルは同じ構造であり、データがコピーされた日付とデータが表す月と年を含む3つの追加の列があります。

  • copy_datesysdateデータが履歴テーブルにコピーされるときになります
  • monthyearストアドプロシージャに渡されます 。

たとえば、1月末に更新するのを忘れて、2月4日に思い出した場合

  • copy_date:2月4日
  • 「月」と「年」は次のとおりです。2月と2012年

レポートチームは、これらの列を使用してデータをフィルタリングし、分析します。

例:表A

study country state
abc    india    ap
bcd    china    xx

次のような履歴テーブルにデータをコピーする手順が必要です。

month year copy_date     study  country state
jan   2013 01-01-2013    abc    india   ap

この手順を実行するときに、パラメーターmonthyearパラメーター(この場合はjanと2013)の値を入力します。

4

1 に答える 1

3

まず、単純にから派生するのではなく、なぜパラメータmonthとパラメータをわざわざ渡すのかわかりません。あなたの例では、あなたとは、1月30日または2月4日にデータをコピーするかどうかの現在に基づいています。yearsysdatemonthyearsysdate

1つのオプションは

CREATE OR REPLACE PROCEDURE copy_a( p_month IN VARCHAR2, p_year IN NUMBER )
AS
BEGIN
  INSERT INTO a_history( month, year, copy_date, study, country, state )
    SELECT p_month, p_year, sysdate, study, country, state
      FROM a;
END;

動的SQLを使用して、22個の個別のストアドプロシージャを作成する必要をなくすこともできます。履歴テーブルの最初の3列が常にmonth、、、yearcopy_dateあり、残りの列がベーステーブルとまったく同じ順序である場合

CREATE OR REPLACE PROCEDURE copy_table( p_table_name IN VARCHAR2, 
                                        p_month IN VARCHAR2, 
                                        p_year IN NUMBER )
AS
  l_sql_stmt VARCHAR2(10000);
BEGIN
  l_sql_stmt := 'INSERT INTO ' || p_table_name || '_hist ' ||
                ' SELECT :mnth, :yr, sysdate, a.* ' ||
                '   FROM ' || p_table_name;
  EXECUTE IMMEDIATE l_sql_stmt 
    USING p_month, p_year;
END;
于 2013-02-06T15:09:20.557 に答える