2

在 Oracle 数据库中,我们创建了 22 个物化视图,并创建了一个过程来刷新所有这些 MV。22 个物化视图全部刷新成功。

在每个月的最后一天,我们想刷新物化视图并将数据复制到历史表中。这些历史表具有相同的结构以及另外三个包含数据复制日期以及数据所代表的月份和年份的列。

  • copy_date将是sysdate数据复制到历史表的时间
  • month并将year传递给存储过程。

例如,如果我在 1 月底忘记刷新并记得在 2 月 4 日

  • copy_date: 2月4日
  • 'month' 和 'year' 是:FEB 和 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

首先,我不确定您为什么要费心传入monthandyear参数,而不是简单地从sysdate. 在您的示例中,无论您在 1 月 30 日还是 2 月 4 日复制数据monthyear都基于当前。sysdate

一种选择是

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 个单独的存储过程。如果历史表始终将monthyearcopy_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 回答