Java下綴り動的SQL文の実行


実際の業務では、複雑なデータ計算を完了するために動的SQLを接続する必要があります.ネット上の各種技術フォーラムでは、以下のような問題が議論されています.
  http://bbs.csdn.net/topics/390876591
  http://bbs.csdn.net/topics/390981627
  https://www.linkedin.com/groups/SQL-Query-Help-needed-137774.S.5948812806903119877?trk=groups_items_see_more-0-b-ttl
  http://bbs.csdn.net/topics/390073758
  http://bbs.csdn.net/topics/390611005 
ダイナミックSQLを接続する一般的な方法は、次のとおりです.
1、動的文の使用
多くのデータベースでは、OracleのEXECUTE IMMEDIATE文、MSSQLのEXECおよびSP_など、動的SQLを処理する構文が提供されています.EXECUTESQL、Mysqlの前処理文など.これらの機能により、データベース側で動的クエリーを処理するのに大きな遍歴を提供しますが、この方法は比較的簡単な動的クエリーにのみ適用され、複雑な場合は次の方法が採用されることがよくあります.
2、ストレージプロセスの使用
複雑な場合、一般的には、ストレージ中に動的SQLが接続されます.ストレージ・プロシージャを使用すると、比較的柔軟に実行できますが、符号化の複雑さが高すぎて、実行効率が低い場合があります.
3、その他の(例えばJAVA)プログラムを使用する
外部の他の高度な言語(JAVAなど)を使用して接続した後、データベースに渡して実行するのも選択肢であり、柔軟性が高いが、JAVAは集合計算のサポートが不足しているため、これらの準備を完了するのは容易ではない.
動的SQLを実行する必要があるマスタプログラムがJAVAである場合、動的SQLクラスの計算を完了するために集算器を使用することができ、集算器は動的解釈実行のスクリプトであり、動的SQL実行を容易につづることができる.集算器はJDBCインタフェースを提供し、Javaアプリケーションとデータベースの間に置くことができ、アプリケーションがデータベースにアクセスするように集算器スクリプトを実行し続けるようにし、アプリケーション構造はほとんど変更されません.
次に、動的SQLクラスの計算を演算器で行い、JAVAプログラムに統合する方法を例に示します.
ダイナミックSQLの接続
動的SQLパッチを演算器で完了し、パッチ後のSQLをデータベースに渡して、ターゲット結果をクエリーします.コレクタは完了時にターゲット計算に関与せず、動的SQLのみを接続します.次のような要件があります.
パラメータsourceとtargetは、同じ構造でデータが異なる2つのテーブルを表しますが、テーブル構造は不明です.table 1とtable 2のプライマリ・キーがAとBであるなど、プライマリ・キーを基準にsourceでtargetを更新する必要があります.データは以下の通りです.
Java下拼接执行动态SQL语句_第1张图片
table 2でtable 1を更新する場合、MERGE文は次のようになります.
       MERGE INTO table1 as t
       USING table2 as s
       ON t.A=s.A and t.B=s.B
       WHEN MATCHED
       THEN UPDATE SET t.C=s.C,t.D=s.D
       WHEN NOT MATCHED
       THEN INSERT VALUES(s.A,s.B,s.C,s.D)

実装スクリプト:
Java下拼接执行动态SQL语句_第2张图片
A 1,A 2:システムテーブルからテーブルsourceのプライマリキーを読み出して変数pksを格納し,計算結果は集合["A","B"]である.各データベースでプライマリ・キーを取得する方法は異なります.ここではMSSQLを例に挙げます.
A 3,A 4:sourceの完全フィールドを読み出し,columnsの計算結果は["A"、"B"、"C"、"D]]である.
A 5:MERGE文を動的に生成する.pks.(…)はループ関数で、結果セットを含む集合のメンバーを順次計算できます.計算では~ループ変数を参照し、#でループカウントを参照できます.
A 6:MERGE文を実行します.
テーブル構造が不明なため、ストレージ・プロシージャまたはJAVAでテーブル構造を取得してSQLを動的にスペルするのは面倒です.コレクションクラスコンピューティングを使用して、コードが簡単で、スクリプトが汎用的で、メンテナンスが容易です.
集計スクリプトの計算結果は、レポート・データ・ソースとして使用できます.また、JAVAプログラムでJDBC方式で読み込んで使用することもできます.JAVA読み出し呼び出しの集計スクリプト・コードは次のとおりです.
           Class.forName("com.esproc.jdbc.InternalDriver");
              con= DriverManager.getConnection("jdbc:esproc:local://");
//ストレージ・プロシージャのような演算子スクリプトを呼び出します.ここでp 1は演算スクリプトのファイル名です.
              st =(com. esproc.jdbc.InternalCStatement)con.prepareCall("call p1()");st.setObject(1,"table1");
              st.setObject(2,"table2");
//実行スクリプト
              st.execute();
               ……
コンパイラスクリプトを呼び出すのとデータベースにアクセスする方法はまったく同じで、JDBCに詳しいプログラマーはすぐに把握できます.
演算子JDBCの配置および呼び出しに関するより詳細な情報は、演算子統合アプリケーションがJAVAによって呼び出されることを参照することができる.
ダイナミックテーブル間接続
静的なテーブル間接続に対して、動的テーブル間接続は使用するテーブルを事前に知らなかった.次のデータ・クエリーのように、
A表:
   
B表:
        
C表:
       
AテーブルのTable Nameから、BテーブルまたはCテーブルに対応するIDのNum値を取得する必要があります.
目標結果:
       
実装スクリプト:
       
A 1:SQLを実行してA表から数を取る;
A 2:まずTable Nameでグループ化し、循環グループで動的なクエリー文をつなぎ、最後にクエリー結果をIDで並べ替える.
動的SQLの結合作業を単純化するには、集算器の集合計算能力(グループ化後もグループメンバーが保存されている)を使用します.
特殊フォーマットデータ更新
動的データ照会に加えて動的更新が必要な場合もあり、更新されたデータは常にサードパーティ製プログラムに由来し、そのフォーマットもJSONフォーマット、XMLなど多種多様である.特殊な業務背景の下で、これらの特殊なフォーマット(従来の2 Dテーブルに比べて)のデータを更新する必要がある場合があります.(リレーションシップ)データベースにあります.これはサードパーティ製のプログラムで行う必要がありますが、JAVAなどの高度な言語ではクラスライブラリが不足したり、ハードコーディングが困難になったりする問題があります.この場合は、演算器で行うことができます.次に、JSON形式のファイルの入庫を解析する演算器の例を見てみましょう.ソースデータは以下の通りです.
Java下拼接执行动态SQL语句_第3张图片
要件:上記の内容で指定したノード、主にimeiのServiceリストをデータベース2枚のテーブルgroupsとServicesに更新します.
ここでのJSON列は、多層を含むため、多くの層がダイナミック(LISTやSERVICESのノード数や名前が固定されていないなど)であり、解析に大きな難易度をもたらし、属性名部分にはMOVISTAR SPAINなどのスペースやドット番号(Requires.Networkなど)も含まれており、解析の難易度が大幅に増加し、JAVAを使用すると非常に書きにくい.
実装スクリプト:
Java下拼接执行动态SQL语句_第4张图片
A 1:JSON形式のファイルを読み込んで、結果は階層の結果セットを持つ.
A 2-A 3:更新内容を格納する2つの空のシーケンステーブルを作成する.
A 4-D 10:A 1を循環し、内容を動的に解析し、解析結果をA 2、A 3目標結果シーケンス表に出力する.
A 11-A 12:更新を実行し、groupsテーブルおよびservicesテーブルにA 2、A 3シーケンステーブルを更新します.