在Oracle数据库中,我们创建了22个物化视图,并创建了一个刷新所有这些MV的过程。所有22个物化视图都成功刷新。
在每个月的最后一天,我们想要刷新物化视图并将数据复制到历史表中。这些历史表具有相同的结构以及三个附加列,其中包含数据复制的日期以及数据所代表的月份和年份。
copy_date
将为sysdate
month
和year
将传入存储过程。 例如,如果我忘记在1月底刷新并在2月4日记住
copy_date
:feb的第4名报告团队将使用这些列过滤数据以进行分析。
示例:表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
当我运行此程序时,我想输入month
和year
参数的值(在本例中为jan和2013)。
答案 0 :(得分:2)
首先,我不确定为什么你会费心地传递month
和year
参数,而不是简单地从sysdate
推导出来。在您的示例中,month
和year
基于当前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个单独的存储过程。如果历史记录表始终将month
,year
和copy_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;