2016-08-30 5 views
0

私はtableBでデータを更新するプロシージャを作成する必要がありますが、他のデータベースから tableA(db-linkを使用しています)のデータを取得する必要があります。他のデータベースからテーブルデータを更新する最も効率的な方法は何ですか?

for tmp in cur loop 
    if tmp.name != (select name from tableB where tableB_ID = tmp.tableA_ID) then 
    update tableB set name = tmp.name where tableB_ID = tmp.tableA_ID; 
    end if; 
end loop; 

との差異を求めて2つのテーブルからの各行と各列をチェックしてください。私の考えでは、カーソルcursor curtableAデータをロードするだけでループを作成することです。

これは私の問題を単純に表現したものです。これは約25行の異なる列を持つことができ、約1000行の更新が必要な場合があるためです。もっと良い解決策は、すべての相違を1つの行から保存し、多くのsetで1つの更新ステートメントを作成することでしょうか? 私はそれを効率的に行う方法がちょっと混乱しています。多くの簡単な更新プログラムを作成するか(最大25個の更新を実行する必要があります)、複雑な更新プログラムを1つだけ作成します。最後に、更新する必要がある行の数についての情報がありません。誰かがより効率的なアイディアを持っているのかもしれない。

ありがとうございました!

+0

使用しているデータベースを指定してください。 (SQL Server、Oracleなど) – Av4t4r

+0

大きな話題ですが、あるインスタンスから別のインスタンスへの変更を同期したい場合(そして独自のソリューションをロールアップするノウハウを持っている場合)は、set操作を使用することをお勧めします(選択する*からMINUSを選択*をtab @ somelinkから選択)。また、更新プログラムを使用しないで、削除した後に挿入してください。 – tbone

+0

@ Av4t4r両方のデータベースがOracleです。 。 – Ice

答えて

0

これを行う1つの方法は、各列に動的ステートメントを作成することです。これと類似している可能性があります:

declare 
    sqlstr varchar2(1000); 
begin 
    for aCol in (select column_Name from user_tab_cols where table_name = 'TABLE_A' and column_name <> 'ID') loop 
     sqlstr := 'update tableB b set '||aCol.column_name|| 
     ' = (select a.'||aCol.column_name|| 
     ' from tableA a where a.ID = b.ID and '|| 
     ' a.'||aCol.column_name||' <> b.'||aCol.column_name||')'; 
    execute immediate sqlstr; 
end loop; 
+0

あなたは、それぞれのif文でこれと同じように何かを作成することを意味しますが、私はあなたを正しく理解していますか? – Ice

+0

いいえ、このブログは25個の更新ステートメントを実行し、テーブル全体を更新します –

関連する問題