如何创建 oracle 程序以将数据导出到历史表中?
Posted
技术标签:
【中文标题】如何创建 oracle 程序以将数据导出到历史表中?【英文标题】:How to create oracle procedure to export data into history tables? 【发布时间】:2013-02-04 13:50:12 【问题描述】:在 Oracle 数据库中,我们创建了 22 个物化视图,并创建了一个过程来刷新所有这些 MV。 22个物化视图全部刷新成功。
在每个月的最后一天,我们想刷新物化视图并将数据复制到历史表中。这些历史表具有相同的结构以及三个额外的列,其中包含数据的复制日期以及数据所代表的月份和年份。
copy_date
将是数据复制到历史表时的sysdate
month
和 year
将被传递给存储过程。
例如,如果我在 1 月底忘记刷新并记得在 2 月 4 日
copy_date
: 2 月 4 日
“月”和“年”分别是:2012 年 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
当我运行此过程时,我想输入 month
和 year
参数的值(在本例中为 jan 和 2013)。
【问题讨论】:
你试过什么?你是在要求别人为你做这项工作。发布一些工作代码,然后您将使用该代码作为开始获得一些帮助。查看metaSO question 和Jon Skeet: Coding Blog,了解如何写作并提出一个好问题。 为什么要创建表的过程?据推测,每个物化视图都会有一个历史表。该历史表将由单个脚本创建一次。然后,您每月运行的过程只需将数据从物化视图复制到现有历史表中。 @Justin:是的,历史表已创建。但我需要将数据从主表复制到历史表的过程,如上所述。请帮忙。 【参考方案1】:首先,我不知道您为什么要麻烦传入month
和year
参数,而不是简单地从sysdate
派生。在您的示例中,无论您复制 1 月 30 日还是 2 月 4 日的数据,month
和 year
都基于当前的 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 个单独的存储过程。如果历史表总是将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;
【讨论】:
以上是关于如何创建 oracle 程序以将数据导出到历史表中?的主要内容,如果未能解决你的问题,请参考以下文章