2

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

新表有新的列,不同的列。

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

我真的很希望能够一路清理数据。有些存储在其中带有标记(例如:“
First Name
”)、大量空格等,所以我真的很想在将其放入新表之前修复所有这些问题。

有没有人有做这样的事情的经验?我该怎么办?

谢谢 :)

4

5 回答 5

8

我经常这样做 - 您可以使用简单的 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

在清理和转换数据时,您可以使用 php 等中间语言做的事情真的很少,而在原生 SQL 中您无法做到。

对于更复杂的清理,您始终可以创建一个执行繁重工作的 sql 函数,但我已经清理了一些非常糟糕的数据而没有诉诸于此。不要忘记在 oracle 中你有 decode、case 语句等。

于 2010-11-26T00:09:27.610 回答
0

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

这是我之前回答的关于使用 Kettle 进行数据迁移和操作的问题。
使用 Pentaho Kettle,如何在保持参照完整性的同时从单个表加载多个表?

于 2010-11-25T23:53:32.067 回答
0

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

编写一个 select *、更新内存中的列和进行插入将在 PHP 或任何其他编程语言中快速完成。

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

于 2010-11-25T23:58:09.037 回答
0

我自己也在做一个类似的项目——将数据从一个包含几十个表的模型迁移到一个具有相似数量表的稍微不同的模型。

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

于 2010-11-26T00:13:29.350 回答
0

取决于转换过程的复杂程度。如果在单个 SQL 语句中表达起来很容易,那么您就大功告成了;只需创建 SELECT 语句,然后执行 CREATE TABLE / INSERT 语句。但是,如果您需要执行一些复杂的转换或(颤抖)拆分或合并任何行以正确转换它们,则应使用流水线表函数。不过,听起来情况并非如此。尝试坚持上面其他克里斯建议的单一陈述。您绝对不想将数据从数据库中提取出来进行转换,因为传入和传出 Oracle 总是比将数据全部保存在数据库中要慢。

还有一些提示:

  • 如果表已经存在并且您正在执行 INSERT...SELECT 语句,请在插入时使用 /*+ APPEND */ 提示,以便您执行批量操作。请注意,默认情况下 CREATE TABLE 会执行此操作(只要可能;您不能在某些条件下执行批量操作,例如,如果新表是索引组织表、具有触发器等)。
  • 如果您使用的是 10.2 或更高版本,您还应该考虑使用LOG ERRORS INTO子句将被拒绝的记录记录到错误表中。这样,如果一条记录出现您未预料到的错误,您将不会丢失整个操作。
于 2010-11-26T03:58:10.877 回答