【发布时间】:2014-12-31 14:22:07
【问题描述】:
我是一名应用程序程序员,但目前我有一种情况,我需要将收集了 1 个月的大量数据复制到一个数据库中的表中大约 653 GB 的数据到另一个数据库中的完全相同的表中(都是甲骨文11G)。每行大小约为 150 字节。所以行数大约是 40 亿。我不是在开玩笑。
我必须这样做。保存此数据的表(源表)基于日期列进行分区。因此,每个月的每一天都有一个分区,因此 12 月总共有 31 个分区。
目标数据库基于月份进行分区。因此,整个 12 月的目标数据库中有一个分区。
我选择通过 db 链接复制数据,并在 dba 的帮助下在这 2 个数据库之间创建了一个 db 链接。
我在目标数据库中有一个存储过程,它接受输入参数为(日期,表名)。此过程的作用是在目标数据库中创建一个名为 tablename 的临时表,并将给定日期的源数据库中的所有数据复制到目标数据库中的这个临时表中。我已经成功完成了2-3天。现在我想将临时表中的这些数据插入到同一目标数据库中的实际表中。为此,我执行了以下查询:
insert into schemaname.target_table select * from schemaname.temp_table;
但我得到以下 ORA 错误。
ORA-01858: a non-numeric character was found where a numeric was expected
两个表的表定义完全相同。我在互联网上搜索复制数据,发现上面的查询插入最简单。但我不明白这个错误。搜索此错误表明它与日期列有关。但它不应该因为两个表都具有相同的表结构而工作吗?
表中使用的数据类型有varchar2(x)、date、number(x,y)、char(x)。
请帮助我克服这个错误。让我知道是否需要任何其他信息。
【问题讨论】:
-
两个表中的列顺序是否相同?
-
如何查看订单。这就是我们通过 desc tablename 得到的吗?
-
应该是,虽然我这里没有oracle。另一种方法是 select * from target_table 和 select * from temp_table 并确保列的顺序相同。
-
@chammu,是的
desc tablename会给你列顺序。必须有区别,否则不会发生错误。 -
是的,你是对的。有区别。
标签: database oracle plsql bulkinsert sql-insert