001 /*
002 * Copyright (c) 2009 The openGion Project.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
013 * either express or implied. See the License for the specific language
014 * governing permissions and limitations under the License.
015 */
016 package org.opengion.fukurou.process;
017
018 import org.opengion.fukurou.util.Argument;
019 import org.opengion.fukurou.util.SystemParameter;
020 import org.opengion.fukurou.util.LogWriter;
021
022 import org.opengion.fukurou.util.HybsEntry ;
023 import org.opengion.fukurou.util.Closer;
024 import org.opengion.fukurou.db.ConnectionFactory;
025
026 import java.util.Set ;
027 import java.util.HashSet ;
028 import java.util.Map ;
029 import java.util.LinkedHashMap ;
030
031 import java.sql.Connection;
032 import java.sql.Statement;
033 import java.sql.ResultSet;
034 import java.sql.SQLException;
035
036 /**
037 * Process_BulkQueryは、データベã?スから読み取ったå?容をã?ä¸?‹¬処ç�?�™るためにã€?
038 * ParamProcess のサブクラス(Process_DBParam)にセãƒ?ƒˆしたりã?åŠ?·¥したりすã‚?
039 * FirstProcess と、ChainProcess のインターフェースを両方持ったã?実è£?‚¯ラスですã?
040 *
041 * こã?クラスは、上流からã?下流への処ç�??ã€?¼‘度しか実行されませんã€?
042 * FirstProcess の検索結果は、Set オブジェクトとして、Process_DBParam に渡しますã?
043 * ChainProcess は、その結果を取りå?しã?自åˆ??身の処ç�?µ�果と合せてåŠ?·¥しますã?
044 *
045 * FirstProcess ではã€?action は、query のみですã?
046 * query は、指定ã?SQLæ–?‚’実行し、結果のSetをParamProcessに設定しますã?
047 * ChainProcess ではã€?action は、query、bulkSet、minus、intersect が指定できますã?
048 * query は、上記と同じですã?
049 * minus は、å?のSetから、SQLæ–??実行結果を引き算し、結果Setをå?設定しますã?
050 * intersect は、å?のSetから、SQLæ–??実行結果と重è¤?�™る結果Setをå?設定しますã?
051 * bulkSet は、å?のSetを取りå?しã?SQLæ–?�«åŠ?‘³して処ç�?�—ますã?
052 * 流れçš?�«は、query で検索しã?minusまたã?intersect でSetオブジェクトをåŠ?·¥しã?bulkSet で
053 * 利用しますã?例えば、ORACLEから、ユニã?クキーのSetを作æ?しã?SQLServerのユニã?クキーã‚?
054 * minusした結果をã?ORACLEからDELETEすれば、不要なãƒ??タを削除するなどの処ç�?�Œ実行可能になりますã?
055 * またã?単純に、query ã�?�‘をã?チェインすれば、単発のUPDATEæ–?‚’実行することが可能ですã?
056 *
057 * ãƒ??タベã?ス接続å?等ã?、ParamProcess のサブクラス(Process_DBParam)に
058 * 設定された接ç¶?Connection)を使用しますã?
059 * DBID は、Process_DBParam の -configFile でæŒ?®šすã‚?DBConfig.xml ファイルを使用しますã?
060 *
061 * 引数æ–?—å?中にスペã?スを含ã‚??合ã?、ダブルコーãƒ??ション("") で括って下さã�??
062 * 引数æ–?—å?の ã€?』ã?前後には、スペã?スは挟めません。å¿?�šã€?key=value の様に
063 * 繋げてくださいã€?
064 *
065 * SQLæ–?�«は、{@DATE.YMDH}等ã?シスãƒ?ƒ 変数が使用できますã?
066 *
067 * @og.formSample
068 * Process_BulkQuery -action=query -dbid=DBGE -sql="select KEY from TABLE_X"
069 *
070 * -action=処ç�?–¹æ³?å¿??) ??実行するå?ç�?–¹法をæŒ?®šしまã�?
071 * -action=query 単なるSQLæ–?‚’実行しますã?
072 * -action=bulkSet 実行したSQLæ–??結果をã?Set<String> オブジェクトに設定しますã?
073 * -action=minus Set<String> オブジェクトと、ここでの実行結果の差åˆ?‚’とりますã?
074 * -action=intersect Set<String> オブジェクトと、ここでの実行結果の積å?をとりますã?
075 * [ -dbid=DB接続ID ] ??-dbid=DBGE (ä¾? Process_DBParam の -configFile でæŒ?®šすã‚?DBConfig.xml ファイルで規å®?
076 * [ -sql=検索SQLæ–? ] ??-sql="select * from GEA08"
077 * [ -sqlFile=検索SQLファイル ] ??-sqlFile=select.sql
078 * -sql= を指定しなã�??合ã?、ファイルでå¿?�šæŒ?®šしてくださいã€?
079 * [ -sql_XXXX=固定å? ] ??-sql_SYSTEM_ID=GE
080 * SQLæ–?¸の{@XXXX}æ–?—å?を指定ã?固定å?で置き換えますã?
081 * WHERE SYSTEM_ID='{@SYSTEM_ID}' �WHERE SYSTEM_ID='GE'
082 * [ -bulkKey=XXXX ] ??-bulkKey=XXXX
083 * SQLæ–?¸の{@XXXX}æ–?—å?をProcess_BulkQuery等で取得したå?で置き換えますã?
084 * WHERE SYSTEM_ID IN ( {@XXXX} ) �WHERE SYSTEM_ID IN ( 'AA','BB','CC' )
085 * [ -bulkType=NUM|STR ] ??-bulType=STR
086 * Bulkの値を文字å?に変換する場合に、数字型かã?æ–?—型を指定しますã?
087 * 数字型では、AA,BB,CC としã?æ–?—型ではã€?AA','BB','CC' に変換しまã�?初期値:STR)ã€?
088 * [ -fetchSize=100 ] ?šフェãƒ?ƒ�する行数(初期値:100)
089 * [ -display=[false/true] ] ?š結果を標準å?力に表示する(true)かしなã�?false)ã�?初期値:false[表示しない])
090 * [ -debug=[false/true] ] ?šデバッグæƒ??を標準å?力に表示する(true)かしなã�?false)ã�?初期値:false[表示しない])
091 *
092 * @og.rev 5.3.4.0 (2011/04/01) 新規追åŠ?
093 * @version 4.0
094 * @author Kazuhiko Hasegawa
095 * @since JDK5.0,
096 */
097 public class Process_BulkQuery extends AbstractProcess implements FirstProcess , ChainProcess {
098 private static final int MAX_BULK_SET = 500 ; // ORACLE の制ç´?�Œ 1000 なのでã€?
099
100 private static final String ACT_QUERY = "query" ;
101 private static final String ACT_BULKSET = "bulkSet" ;
102 private static final String ACT_MINUS = "minus" ;
103 private static final String ACT_INTERSECT = "intersect" ;
104
105 private static final String[] ACTION_LST = new String[] { ACT_QUERY,ACT_BULKSET,ACT_MINUS,ACT_INTERSECT };
106
107 // private LineModel newData = null;
108
109 private String actionCmd = null; // SQL結果を加工(query:実行ã?minus:引き算ã?intersect:重è¤??)
110 private String dbid = null; // メインDB接続ID
111
112 private String bulkKey = null;
113 private boolean bulkType = true; // true:STR , false:NUM
114
115 private int sqlCount = 0; // SQLæ–??処ç�?»¶数
116 private int setCount = 0; // 取り出したSetの件数
117 private int outCount = 0; // マã?ジ後ã?Setの件数
118
119 private int fetchSize = 100;
120 private boolean display = false; // 表示しなã�?
121 private boolean debug = false; // ãƒ?ƒ�ãƒ?‚°æƒ??
122 private boolean firstTime = true; // æœ??のä¸?›ž目
123
124 private static final Map<String,String> mustProparty ; // ?»プロパティ?½å¿??チェãƒ?‚¯用 Map
125 private static final Map<String,String> usableProparty ; // ?»プロパティ?½整合æ?チェãƒ?‚¯ Map
126
127 static {
128 mustProparty = new LinkedHashMap<String,String>();
129 mustProparty.put( "action", "実行するå?ç�?–¹法をæŒ?®šしますã?(query|minus|intersect)" );
130
131 usableProparty = new LinkedHashMap<String,String>();
132 usableProparty.put( "dbid", "Process_DBParam の -configFile でæŒ?®šすã‚?DBConfig.xml ファイルで規å®? );
133 usableProparty.put( "sql", "検索SQLæ–?sql or sqlFile å¿??)ä¾? \"select * from GEA08\"" );
134 usableProparty.put( "sqlFile", "検索SQLファイル(sql or sqlFile å¿??)ä¾? select.sql" );
135 usableProparty.put( "sql_", "SQLæ–?¸の{@XXXX}æ–?—å?を指定ã?固定å?で置き換えますã?" +
136 CR + "WHERE SYSTEM_ID='{@SYSTEM_ID}' �WHERE SYSTEM_ID='GE'" );
137 usableProparty.put( "dbid2", "DB接続ID2 ä¾? Process_DBParam の -configFile でæŒ?®šすã‚?DBConfig.xml ファイルで規å®? );
138 usableProparty.put( "sql2", "検索SQLæ–?(sql or sqlFile å¿??)ä¾? \"select * from GEA08\"" );
139 usableProparty.put( "sqlFile2", "検索SQLファイル2(sql or sqlFile å¿??)ä¾? select.sql" );
140 usableProparty.put( "sql2_", "SQLæ–?中の{@XXXX}æ–?—å?を指定ã?固定å?で置き換えますã?" +
141 CR + "WHERE SYSTEM_ID='{@SYSTEM_ID}' �WHERE SYSTEM_ID='GE'" );
142 usableProparty.put( "bulkKey", "SQLæ–?¸の{@XXXX}æ–?—å?をProcess_BulkQuery等で取得したå?で置き換えますã?" +
143 CR + "WHERE SYSTEM_ID IN ( {@XXXX} ) �WHERE SYSTEM_ID IN ( 'AA','BB','CC' )" );
144 usableProparty.put( "bulkType", "Bulkの値を文字å?に変換する場合に、文字型かã?数字型を指定しますã?" +
145 CR + "数字型では、AA,BB,CC としã?æ–?—型ではã€?AA','BB','CC' に変換しますã?(初期値:STR)" );
146 usableProparty.put( "fetchSize","フェãƒ?ƒ�する行数 (初期値:100)" );
147 usableProparty.put( "display", "結果を標準å?力に表示する(true)かしなã�?false)ã�? +
148 CR + "(初期値:false:表示しなã�?" );
149 usableProparty.put( "debug", "ãƒ?ƒ�ãƒ?‚°æƒ??を標準å?力に表示する(true)かしなã�?false)ã�? +
150 CR + "(初期値:false:表示しなã�?" );
151 }
152
153 /**
154 * ãƒ?ƒ•ォルトコンストラクターã€?
155 * こã?クラスは、動çš?½œæ?されますã?ãƒ?ƒ•ォルトコンストラクターでã€?
156 * super クラスに対して、å¿?¦�な初期化を行っておきますã?
157 *
158 */
159 public Process_BulkQuery() {
160 super( "org.opengion.fukurou.process.Process_BulkQuery",mustProparty,usableProparty );
161 }
162
163 /**
164 * プロセスの初期化を行いますã?初めにä¸?º¦ã�?�‘、呼び出されますã?
165 * 初期処ç�?ファイルオープンã€?¼¤?¢オープンç?に使用しますã?
166 *
167 * @og.rev 5.3.9.0 (2011/09/01) 1000件をè¶?�ˆたå?合ã?処ç�?‚’追åŠ?
168 *
169 * @param paramProcess ãƒ??タベã?スの接続å?æƒ??などを持ってã�?‚‹オブジェクãƒ?
170 */
171 public void init( final ParamProcess paramProcess ) {
172 Argument arg = getArgument();
173
174 actionCmd = arg.getProparty("action" , null , ACTION_LST );
175
176 fetchSize = arg.getProparty("fetchSize",fetchSize);
177 display = arg.getProparty("display",display);
178 debug = arg.getProparty("debug",debug);
179 // if( debug ) { println( arg.toString() ); } // 5.7.3.0 (2014/02/07) ãƒ?ƒ�ãƒ?‚°æƒ??
180
181 dbid = arg.getProparty("dbid");
182 String sql = arg.getFileProparty("sql","sqlFile",true);
183 if( debug ) { println( "入力SQL:" + sql ); }
184
185 HybsEntry[] entry =arg.getEntrys( "sql_" ); //配å?
186 SystemParameter sysParam = new SystemParameter( sql );
187 sql = sysParam.replace( entry );
188 if( debug ) { println( "変換SQL:" + sql ); }
189
190 if( ACT_BULKSET.equalsIgnoreCase( actionCmd ) ) {
191 bulkKey = arg.getProparty("bulkKey");
192 String bkType = arg.getProparty("bulkType");
193 if( bkType != null ) { bulkType = bkType.equalsIgnoreCase( "STR" ); }
194
195 Set<String> setData = paramProcess.getBulkData();
196 if( debug ) { println( setData.toString() ); }
197 setCount = setData.size();
198
199 if( setCount > 0 ) {
200 // 5.3.9.0 (2011/09/01) 1000件をè¶?�ˆたå?合ã?処ç�?‚’追åŠ?
201 // sql = makeBulkQuery( sql,bulkKey,bulkType,setData );
202 // if( debug ) { println( "BulkSQL:" + sql ); }
203 // createSetData( paramProcess, dbid, sql );
204 String[] sqls = makeBulkQuery( sql,bulkKey,bulkType,setData );
205 for( int i=0; i<sqls.length; i++ ) {
206 if( debug ) { println( "BulkSQL:" + sqls[i] ); }
207 createSetData( paramProcess, dbid, sqls[i] );
208 }
209 }
210 }
211 else if( ACT_QUERY.equalsIgnoreCase( actionCmd ) ) {
212 Set<String> setData2 = createSetData( paramProcess, dbid, sql );
213 if( debug ) { println( setData2.toString() ); }
214 setCount = setData2.size();
215 outCount = setCount;
216 paramProcess.setBulkData( setData2 );
217 }
218 else {
219 Set<String> setData = paramProcess.getBulkData();
220 Set<String> setData2 = createSetData( paramProcess, dbid, sql );
221 setCount = setData2.size();
222
223 if( ACT_MINUS.equalsIgnoreCase( actionCmd ) ) {
224 setData.removeAll( setData2 );
225 }
226 else if( ACT_INTERSECT.equalsIgnoreCase( actionCmd ) ) {
227 setData.retainAll( setData2 );
228 }
229 outCount = setData.size();
230 if( debug ) { println( setData.toString() ); }
231 paramProcess.setBulkData( setData );
232 }
233 }
234
235 /**
236 * プロセスの終äº?‚’行いますã?æœ?¾Œにä¸?º¦ã�?�‘、呼び出されますã?
237 * 終äº??ç�?ファイルクローズã€?¼¤?¢クローズç?に使用しますã?
238 *
239 * @param isOK トã?タルで、OKã�?�£たかどã�?�‹ [true:成功/false:失敗]
240 */
241 public void end( final boolean isOK ) {
242 // 何もありませんã€?
243 }
244
245 /**
246 * こã?ãƒ??タの処ç�?�«おいて、次の処ç�?�Œ出来るかどã�?�‹を問ã�?�ˆわせますã?
247 * こã?呼び出し1回毎に、次のãƒ??タを取得する準備を行いますã?
248 *
249 * @return 処ç�?�§きる:true / 処ç�?�§きなã�?false
250 */
251 public boolean next() {
252 return firstTime;
253 }
254
255 /**
256 * 引数の LineModel をå?ç�?�™るメソãƒ?ƒ‰ですã?
257 * 変換処ç�?¾Œã? LineModel を返しますã?
258 * 後続å?ç�?‚’行わなã�??å�?ãƒ??タのフィルタリングを行う場å�?はã€?
259 * null ãƒ??タを返しますã?つまりã?null ãƒ??タは、後続å?ç�?‚’行わなã�?
260 * フラグの代わりにも使用してã�?�¾すã?
261 * なおã?変換処ç�?¾Œã? LineModel と、オリジナルの LineModel がã?
262 * 同ä¸?�‹、コピã?(クローン)かã?、各処ç�?ƒ¡ソãƒ?ƒ‰å†?�§決めてã�?�¾すã?
263 * ドキュメントに明記されてã�?�ªã�??合ã?、副作用が問題になるå?合ã?ã€?
264 * å�??ç�?�”とに自åˆ?�§コピã?(クローン)して下さã�??
265 *
266 * @param data オリジナルのLineModel
267 *
268 * @return 処ç�?¤‰換後ã?LineModel
269 */
270 @SuppressWarnings(value={"unchecked"})
271 public LineModel action( final LineModel data ) {
272 return data ;
273 }
274
275 /**
276 * æœ??にã€?行データである LineModel を作æ?しまã�?
277 * FirstProcess は、次ã€?�¨処ç�?‚’チェインしてã�?��æœ??の行データã‚?
278 * 作æ?して、後続ã? ChainProcess クラスに処ç�?ƒ‡ータを渡しますã?
279 *
280 * @param rowNo 処ç�?¸の行番号
281 *
282 * @return 処ç�?¤‰換後ã?LineModel
283 */
284 public LineModel makeLineModel( final int rowNo ) {
285 firstTime = false; // ä¸?º¦しか処ç�?�—なã�?�Ÿめã?false を設定するã?
286
287 LineModel model = new LineModel();
288
289 model.setRowNo( rowNo );
290
291 return model;
292 }
293
294 /**
295 * å†?ƒ¨で使用する Set オブジェクトを作æ?しますã?
296 * Exception 以外では、å¿?�š Set<String> オブジェクトを返しますã?
297 *
298 * @og.rev 5.3.9.0 (2011/09/01) 1000件をè¶?�ˆたå?合ã?処ç�?‚’追åŠ?
299 *
300 * @param paramProcess ãƒ??タベã?スの接続å?æƒ??などを持ってã�?‚‹オブジェクãƒ?
301 * @param dbid 接続å?ID
302 * @param sql 実行するSQLæ–?検索系)
303 *
304 * @return 実行結果から取り出した、最初ã?カラãƒ??みを集めた Setオブジェクãƒ?
305 * @throws RuntimeException ãƒ??タベã?ス処ç�?�Œできなかったå?合ã?
306 */
307 private Set<String> createSetData( final ParamProcess paramProcess, final String dbid, final String sql ) {
308 Set<String> data = new HashSet<String>();
309
310 Connection connection = null;
311 Statement stmt = null;
312 ResultSet resultSet = null;
313
314 try {
315 connection = paramProcess.getConnection( dbid );
316 stmt = connection.createStatement();
317 if( fetchSize > 0 ) { stmt.setFetchSize( fetchSize ); }
318 if( stmt.execute( sql ) ) { // true:検索系 , false:更新系
319 resultSet = stmt.getResultSet();
320 while( resultSet.next() ) {
321 sqlCount++ ;
322 String str = resultSet.getString(1);
323 if( display ) { println( str ); }
324 data.add( str );
325 }
326 }
327 else {
328 // sqlCount = stmt.getUpdateCount(); // 5.3.9.0 (2011/09/01)
329 sqlCount += stmt.getUpdateCount();
330 }
331 }
332 catch (SQLException ex) {
333 String errMsg = "SQL を実行できませんでしたã€? + CR
334 + "errMsg=[" + ex.getMessage() + "]" + CR
335 + "errorCode=[" + ex.getErrorCode() + "] State=[" + ex.getSQLState() + "]" + CR
336 + "DBID=" + dbid + CR
337 + "SQL =" + sql ;
338
339 throw new RuntimeException( errMsg,ex );
340 }
341 finally {
342 Closer.resultClose( resultSet );
343 Closer.stmtClose( stmt );
344
345 ConnectionFactory.remove( connection,dbid );
346 }
347 return data;
348 }
349
350 /**
351 * å†?ƒ¨で使用する Set オブジェクトを作æ?しますã?
352 * Exception 以外では、å¿?�š Set<String[]> オブジェクトを返しますã?
353 *
354 * @og.rev 5.3.9.0 (2011/09/01) 1000件をè¶?�ˆたå?合ã?処ç�?‚’追åŠ?
355 *
356 * @param sql オリジナルのSQLæ–?
357 * @param bulkKey ä¸?‹¬処ç�?�§置き換えるキーæ–?—å?
358 * @param bulkType æ–?—型(true)かã?数字型(false)を指å®?
359 * @param setData ä¸?‹¬処ç�??å…?�¨なるSetオブジェクãƒ?
360 *
361 * @return オリジナルのSQLæ–?に ä¸?‹¬処ç�??æ–?—å?と置換したSQLæ–??配å?
362 */
363 private String[] makeBulkQuery( final String sql, final String bulkKey, final boolean bulkType,final Set<String> setData ) {
364 String[] sqls = new String[ (setData.size()/MAX_BULK_SET) + 1 ];
365 int idx = 0;
366 int cnt = 0;
367
368 StringBuilder buf = new StringBuilder();
369 String bulkVal = null;
370 if( bulkType ) { // æ–?—å?の場å�?
371 for( String key : setData ) {
372 cnt++;
373 buf.append( ",'" ).append( key ).append( "'" );
374 if( cnt >= MAX_BULK_SET ) {
375 bulkVal = buf.substring( 1 ); // 先é?のコロンをã?ずす
376 sqls[idx++] = sql.replace( "{@" + bulkKey + "}" ,bulkVal );
377 cnt = 0;
378 buf = new StringBuilder();
379 }
380 }
381 if( cnt > 0 ) { // きっちりで終わらなã�??å�?
382 bulkVal = buf.substring( 1 ); // 先é?のコロンをã?ずす
383 sqls[idx] = sql.replace( "{@" + bulkKey + "}" ,bulkVal );
384 }
385 }
386 else { // 数字ã?場å�?
387 for( String key : setData ) {
388 cnt++;
389 buf.append( "," ).append( key );
390 if( cnt >= MAX_BULK_SET ) {
391 bulkVal = buf.substring( 1 ); // 先é?のコロンをã?ずす
392 sqls[idx++] = sql.replace( "{@" + bulkKey + "}" ,bulkVal );
393 cnt = 0;
394 buf = new StringBuilder();
395 }
396 }
397 if( cnt > 0 ) { // きっちりで終わらなã�??å�?
398 bulkVal = buf.substring( 1 ); // 先é?のコロンをã?ずす
399 sqls[idx] = sql.replace( "{@" + bulkKey + "}" ,bulkVal );
400 }
401 }
402 // String bulkVal = buf.substring( 1 ); // 先é?のコロンをã?ずす
403
404 // return sql.replace( "{@" + bulkKey + "}" ,bulkVal );
405 return sqls;
406 }
407
408 /**
409 * プロセスの処ç�?µ�果のレポã?ト表現を返しますã?
410 * 処ç�??ログラãƒ?��、å?力件数、å?力件数などのæƒ??ですã?
411 * こã?æ–?—å?をそのまま、標準å?力に出すことで、結果レポã?トと出来るよã�?�ª
412 * 形式で出してくださいã€?
413 *
414 * @return 処ç�?µ�果のレポã?ãƒ?
415 */
416 public String report() {
417 String report = "[" + getClass().getName() + "]" + CR
418 + TAB + "Action : " + actionCmd + CR
419 + TAB + "DBID : " + dbid + CR
420 + TAB + "sqlCount : " + sqlCount + CR
421 + TAB + "setCount : " + setCount + CR
422 + TAB + "outCount : " + outCount ;
423
424 return report ;
425 }
426
427 /**
428 * こã?クラスの使用方法を返しますã?
429 *
430 * @return こã?クラスの使用方æ³?
431 */
432 public String usage() {
433 StringBuilder buf = new StringBuilder();
434
435 buf.append( "Process_BulkQueryは、データベã?スから読み取ったå?容をã?ä¸?‹¬処ç�?�™るためにã€? ).append( CR );
436 buf.append( "ParamProcess のサブクラス(Process_DBParam)にセãƒ?ƒˆしたりã?åŠ?·¥したりすã‚? ).append( CR );
437 buf.append( "FirstProcess と、ChainProcess のインターフェースを両方持ったã?実è£?‚¯ラスですã?" ).append( CR );
438 buf.append( CR );
439 buf.append( "こã?クラスは、上流からã?下流への処ç�??ã€?¼‘度しか実行されませんã€? ).append( CR );
440 buf.append( "FirstProcess の検索結果は、Set オブジェクトとして、Process_DBParam に渡しますã?" ).append( CR );
441 buf.append( "ChainProcess は、その結果を取りå?しã?自åˆ??身の処ç�?µ�果と合せてåŠ?·¥しますã?" ).append( CR );
442 buf.append( CR );
443 buf.append( "FirstProcess ではã€?action は、query のみですã?" ).append( CR );
444 buf.append( " query は、指定ã?SQLæ–?‚’実行し、結果のSetをParamProcessに設定しますã?" ).append( CR );
445 buf.append( "ChainProcess ではã€?action は、query、bulkSet、minus、intersect が指定できますã?" ).append( CR );
446 buf.append( " query は、上記と同じですã?" ).append( CR );
447 buf.append( " minus は、å?のSetから、SQLæ–??実行結果を引き算し、結果Setをå?設定しますã?" ).append( CR );
448 buf.append( " intersect は、å?のSetから、SQLæ–??実行結果と重è¤?�™る結果Setをå?設定しますã?" ).append( CR );
449 buf.append( " bulkSet は、å?のSetを取りå?しã?SQLæ–?�«åŠ?‘³して処ç�?�—ますã?" ).append( CR );
450 buf.append( CR );
451 buf.append( "流れçš?�«は、query で検索しã?minusまたã?intersect でSetオブジェクトをåŠ?·¥しã?" ).append( CR );
452 buf.append( "bulkSet で利用しますã?例えば、ORACLEから、ユニã?クキーのSetを作æ?しã?" ).append( CR );
453 buf.append( "SQLServerのユニã?クキーをminusした結果をã?ORACLEからDELETEすれば、不要な" ).append( CR );
454 buf.append( "ãƒ??タを削除するなどの処ç�?�Œ実行可能になりますã?またã?単純に、query ã�?�‘をã?" ).append( CR );
455 buf.append( "チェインすれば、単発のUPDATEæ–?‚’実行することが可能ですã?" ).append( CR );
456 buf.append( CR );
457 buf.append( "ãƒ??タベã?ス接続å?等ã?、ParamProcess のサブクラス(Process_DBParam)に" ).append( CR );
458 buf.append( "設定された接ç¶?Connection)を使用しますã?" ).append( CR );
459 buf.append( CR );
460 buf.append( "引数æ–?—å?中に空白を含ã‚??合ã?、ダブルコーãƒ??ション(\"\") で括って下さã�??" ).append( CR );
461 buf.append( "引数æ–?—å?の ã€?』ã?前後には、空白は挟めません。å¿?�šã€?key=value の様に" ).append( CR );
462 buf.append( "繋げてくださいã€? ).append( CR );
463 buf.append( CR );
464 buf.append( "SQLæ–?�«は、{@DATE.YMDH}等ã?シスãƒ?ƒ 変数が使用できますã?" ).append( CR );
465 buf.append( CR ).append( CR );
466
467 buf.append( getArgument().usage() ).append( CR );
468
469 return buf.toString();
470 }
471
472 /**
473 * こã?クラスは、main メソãƒ?ƒ‰から実行できませんã€?
474 *
475 * @param args コマンド引数配å?
476 */
477 public static void main( final String[] args ) {
478 LogWriter.log( new Process_BulkQuery().usage() );
479 }
480 }