如何创建oracle过程以将数据导出到历史表中?

时间:2013-02-04 13:50:12

标签: sql oracle plsql

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

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

    将数据复制到历史记录表时,
  • copy_date将为sysdate
  • monthyear将传入存储过程。

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

  • copy_date:feb的第4名
  • '月'和'年'是: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)。

1 个答案:

答案 0 :(得分:2)

首先,我不确定为什么你会费心地传递monthyear参数,而不是简单地从sysdate推导出来。在您的示例中,monthyear基于当前sysdate,无论您是在1月30日还是2月4日复制数据。

一个选项是

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;