转换一个Oracle表(数据)以填充稍微不同的Oracle表的最佳方法是什么?

时间:2010-11-25 23:16:54

标签: database oracle migration database-migration

我有两个Oracle表,一个旧表和一个新表。 旧的设计很糟糕(比我的更多,请注意)但是有很多当前数据需要迁移到我创建的新表中。

新表有新列,不同列。

我只想写一个PHP脚本或者用一大堆字符串替换的东西......显然这是一种愚蠢的方法。

我真的希望能够在整个过程中清理数据。有些它与标记一起存储(例如:“
第一名字”),大量的空白等,所以我真的想在将它放入新表之前解决所有问题。< / p>

有没有人有这样的经历?我该怎么办?

谢谢:)

5 个答案:

答案 0 :(得分:7)

我这么做了 - 您可以使用简单的select statememt进行迁移:

create table newtable as select 
 field1,
 trim(oldfield2) as field3,
 cast(field3 as number(6)) as field4,
 (select pk from lookuptable where value = field5) as field5,
 etc,
from
 oldtable

对于清理和转换数据时,在本机SQL中无法做到的像php这样的中间语言几乎无法做到。

对于更复杂的清理,你总是可以创建一个可以解决繁重问题的sql函数,但是我已经清理了一些非常可怕的数据而没有求助于它。不要忘记在oracle中你有解码,案例陈述等。

答案 1 :(得分:0)

我会查看像Pentaho Kettle这样的ETL工具。您将能够查询旧表中的数据,进行转换和清理,然后将其重新插入到新表中,所有这些都使用了一个漂亮的WYSIWYG工具。

这是我之前回答的有关使用Kettle进行数据迁移和操作的问题 Using Pentaho Kettle, how do I load multiple tables from a single table while keeping referential integrity?

答案 2 :(得分:0)

如果数据量不大,如果你只打算这样做一次,那么很难打败自己动手的程序。特别是如果你有一些自定义逻辑,你需要实现。 下载,学习和使用的时间使用工具(如pentaho等)可能不值得你这么做。

对select *进行编码,更新内存和列中的列。使用PHP或任何其他编程语言快速完成插入操作。

话虽这么说,如果你发现自己经常这样做,那么ETL工具可能值得学习。

答案 3 :(得分:0)

我自己正在开展一个类似的项目 - 将数据从包含几十个表的一个模型迁移到类似数量的表的不同模型。

我采用了为每个目标表创建MERGE语句的方法。源查询获取它需要的所有数据,根据需要对其进行格式化,然后如果行已存在并且根据需要更新/插入,则合并将成功。这样,我可以在开发解决方案时多次运行该语句。

答案 4 :(得分:0)

取决于转化过程的复杂程度。如果很容易在单个SQL语句中表达,那么你们都已经设置好了;只需创建SELECT语句,然后执行CREATE TABLE / INSERT语句。但是,如果您需要执行一些复杂的转换或(颤抖)拆分或合并任何行以正确转换它们,您应该使用流水线表函数。但是,听起来并非如此;尝试坚持上面提到的另一个克里斯建议的单一陈述。你确实想要从数据库中提取数据来进行转换,因为进出Oracle的传输总是慢于将数据保存在数据库中。

还有一些提示:

  • 如果表已经存在并且您正在执行INSERT ... SELECT语句,请在插入上使用/ * + APPEND * /提示,以便进行批量操作。请注意,CREATE TABLE默认情况下会执行此操作(只要可能;在某些条件下您无法执行批量操作,例如,如果新表是索引组织表,则具有触发器等。
  • 如果您使用的是10.2或更高版本,则还应考虑使用LOG ERRORS INTO 子句将拒绝的记录记录到错误表中。这样,如果一条记录出现了你没想到的错误,你就不会失去整个操作。