2

古いテーブルと新しいテーブルの 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

データのクリーニングと変換に関して、ネイティブ SQL では実行できないことで、php などの中間言語で実行できることはほとんどありません。

より複雑なクリーンアップについては、面倒な作業を行う SQL 関数をいつでも作成できますが、私はそれに頼らずにかなりひどいデータをクリーンアップしました。オラクルには、デコード、ケースステートメントなどがあることを忘れないでください。

于 2010-11-26T00:09:27.610 に答える
0

Pentaho Kettleのような ETL ツールをチェックアウトします。優れた WYSIWYG ツールを使用して、古いテーブルからデータをクエリし、変換してクリーンアップし、新しいテーブルに再挿入することができます。

これは、Kettle を使用したデータの移行と操作に関して私が回答した以前の質問です。
Pentaho Kettle を使用して、参照整合性を維持しながら単一のテーブルから複数のテーブルをロードするにはどうすればよいですか?

于 2010-11-25T23:53:32.067 に答える
0

データ ボリュームがそれほど多くなく、これを 1 回だけ実行する場合は、ロール イット ユアセルフ プログラムに勝るものはありません。特に、実装が必要なカスタム ロジックがある場合。ツール (pentaho など) のダウンロード、学習、および使用にかかる時間は、おそらくあなたの時間に見合う価値はありません。

select * のコーディング、メモリ内の列の更新、および挿入の実行は、PHP またはその他のプログラミング言語ですばやく実行できます。

そうは言っても、これを頻繁に行う場合は、ETL ツールを学習する価値があるかもしれません。

于 2010-11-25T23:58:09.037 に答える
0

変換プロセスの複雑さによって異なります。単一の SQL ステートメントで簡単に表現できれば、準備は完了です。SELECT ステートメントを作成してから、CREATE TABLE / INSERT ステートメントを実行するだけです。ただし、複雑な変換を実行する必要がある場合、または行を適切に変換するために行を分割またはマージする必要がある場合は、パイプライン化されたテーブル関数を使用する必要があります。ただし、そうではないようです。他のクリスが上で提案したように、単一のステートメントに固執するようにしてください。変換を行うためにデータベースからデータを引き出したくないのは間違いありません。Oracle との間の転送は、すべてのデータをデータベースに保持するよりも常に遅くなるためです。

さらにいくつかのヒント:

  • テーブルが既に存在し、INSERT...SELECT ステートメントを実行している場合は、挿入で /*+ APPEND */ ヒントを使用して、一括操作を実行できるようにします。CREATE TABLE はデフォルトでこれを行うことに注意してください (可能な限り。たとえば、新しいテーブルがインデックス構成テーブルである場合、トリガーがある場合など、特定の条件下では一括操作を実行できません。
  • 10.2 以降を使用している場合は、LOG ERRORS INTO句を使用して、拒否されたレコードをエラー テーブルに記録することも検討する必要があります。そうすれば、予期しないエラーが 1 つのレコードに含まれていても、操作全体が失われることはありません。
于 2010-11-26T03:58:10.877 に答える
0

私自身も同様のプロジェクトに取り組んでいます.数十のテーブルを含む1つのモデルから、同様の数のテーブルの多少異なるモデルにデータを移行しています.

私は、ターゲット テーブルごとに MERGE ステートメントを作成する方法を採用しました。ソースクエリは、必要なすべてのデータを取得し、必要に応じてフォーマットし、行が既に存在する場合はマージが機能し、必要に応じて更新/挿入します。このようにして、ソリューションを開発する際にステートメントを複数回実行できます。

于 2010-11-26T00:13:29.350 に答える