oracle怎么复制表以及表中数据
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle怎么复制表以及表中数据相关的知识,希望对你有一定的参考价值。
可用如下方法复制:
如果新表不存在:
比如有一张表叫test,现在要复制表结构及表内数据,可执行代码:
create table test as select * from test;这样就把表结构连同数据一起复制了。
如果表存在,可用以下代码:
insert into test1 select * from test;commit; 参考技术A 请检查两个表的字段。
INSERT INTO SELECT语句详解:
语句形式为:Insert into Table2(field1,field2,...) select value1,value2,... from Table1
注意:
(1)要求目标表Table2必须存在,并且字段field,field2...也必须存在
(2)注意Table2的主键约束,如果Table2有主键而且不为空,则 field1, field2...中必须包括主键
(3)注意语法,不要加values,和插入一条数据的sql混了,不要写成:
Insert into Table2(field1,field2,...) values (select value1,value2,... from Table1) 参考技术B ORACLE 10G及之前版本可用EXP(导出) ,IMP(导入),10G及10G可用 EXP_DP(导入),IMP_DP(导入). 参考技术C 你用的命令行,还是客户端?
命令行的话,把搜到的结果直接copy就行了啊。
如果用客户端工具的话,在搜到的结果的边框上点右键。肯定有复制选项啊。我用的PLSQL,有cory to excel. 参考技术D create table T_BAK AS SELECT * FROM T本回答被提问者采纳
如何创建 oracle 程序以将数据导出到历史表中?
【中文标题】如何创建 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怎么复制表以及表中数据的主要内容,如果未能解决你的问题,请参考以下文章