2017-09-20 18 views
0

私はテーブルからselectを実行し、2つの異なるDB接続の同じ(同じ構造の)別のテーブルに挿入する必要があります。 これは私のコードです:2つの異なるDB接続の同じテーブルから選択/挿入

getSQL1
from("direct:" + getId) 
.toD("sql:classpath:" +getSql1 + "?datasource= DataSourse1&usePlaceHolder=true")) 
.setHeaders("Results", simple(${body}) 
toD("sql:classpath:" +getSql2 + "?datasource= DataSourse2&usePlaceHolder=true")) 

:それが原因でデータの動作しません。INSERT INTO Product2値($ {} headers.results)

:製品1 と getSQL2 SELECT * FROM format私は挿入しようとしています。私がセレクトから得るものは、次のようなものです: [{ID = 130、DESCRIPTION = Product130}] データを整理して130を得る必要があります。 'Product130' 助けが必要ですか?ありがとう。

+0

.setHeaders()?あなたは例外を受け取りますか?とにかく、返されるデータ形式は(デフォルトで)Javaオブジェクトです: 'Map'の' List'。複数のレコードが返されないようにするためのものがないため、複数の列のMapがあるため、Listです。 1つのレコードだけが必要な場合は、sql uriオプション 'outputType = SelectOne'を使うことができます。複数のカラムがある場合は、マップだけが表示されます。私はあなたのSQL文字列を外部化しているかどうかはわかりません....また、あなたが望むものを達成するために.toD()は必要ありません。 –

答えて

1

これにgetSql1選択オプションの一部を変更し、あなたの実際のコードの動作を仮定し、あなただけのレコードを転送している:代わりのリストを、結果としてあなたのメッセージ本文にマップを置く

"?datasource= DataSourse1&usePlaceHolder=true&outputType=SelectOne" 

地図。結果をヘッダにコピーする必要はありません。 CamelのSQLコンポーネントを使用すると、本文タイプがJavaマップの場合は、メッセージ本体の名前付きクエリパラメータが検索されます。

次は地図内のパラメータを使用するように、インサートを変更します。私は、列名が含まれて

insert into Product2 (ID, DESCRIPTION) values (:#ID, :#DESCRIPTION) 

注意してください。これは、安全性と優れた実践のためです。偶然に列の順序が元の表と同じでない場合でも、これは引き続き機能します。

+0

複数のレコードを転送しています。単純化するだけで、私は選択された1レコードを返しました。私が得るのはもちろん地図のリストです。私はそういうことをすることが可能かどうか疑問に思っていました:Product2への挿入Product1からの* Select? – fairlie

+0

複数のレコードが返される可能性があるので、私はCamelのSplitter EIPを使って、選択した '' ..split()。body()。 。<あなたがしたいものは何でも> ...。私はあなたの元の質問に対処すると思います。あなたの新しいSQLの質問に関しては、これまでここで尋ねられてきました。異なるデータベースを使用するため、通常はデータベースベンダー固有のソリューションです。しかし、SQLが特定のデータベースブランドで動作する場合、(一般的に)Camelを使用して実行できます。 –

+0

私はあなたの助言に従い、今はうまくいきます。ありがとう。 – fairlie

関連する問題