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.db;
017
018 import java.io.IOException;
019 import java.io.Reader;
020 import java.sql.CallableStatement;
021 import java.sql.Clob;
022 import java.sql.Connection;
023 import java.sql.PreparedStatement;
024 import java.sql.ParameterMetaData;
025 import java.sql.ResultSet;
026 import java.sql.ResultSetMetaData;
027 import java.sql.SQLException;
028 import java.sql.Types;
029 import java.util.ArrayList;
030 import java.util.Locale;
031
032 // import java.text.DateFormat; // 5.5.5.4 (2012/08/18) DATE,TIMESTAMP の処ç�?‚’利用時にコメントを外す
033 // import java.text.SimpleDateFormat; // 5.5.5.4 (2012/08/18) DATE,TIMESTAMP の処ç�?‚’利用時にコメントを外す
034
035 import org.opengion.fukurou.util.ApplicationInfo;
036 import org.opengion.fukurou.util.Closer;
037 import org.opengion.fukurou.util.StringUtil;
038 import org.opengion.fukurou.util.HybsDateUtil;
039
040 /**
041 * ãƒ??タベã?ス関連の便利なメソãƒ?ƒ‰を集めた簡易ユーãƒ?‚£リãƒ?‚£ークラスですã?
042 * 全てのメソãƒ?ƒ‰は、static メソãƒ?ƒ‰になってã�?�¾すã?
043 *
044 * @og.rev 2.1.1.1 (2002/11/15) Serializable インターフェースを削除するã€?
045 * @og.rev 4.0.0.0 (2007/10/16) DBアクセス関係ã?メソãƒ?ƒ‰のみをパãƒ?‚±ージ移å‹?hayabusa/db > fukurou/db)
046 * @og.group ?¤?¢/Shell制御
047 *
048 * @version 4.0
049 * @author Kazuhiko Hasegawa
050 * @since JDK5.0,
051 */
052 public final class DBUtil {
053
054 /** シスãƒ?ƒ 依存ã?改行記号をセãƒ?ƒˆしますã?4.0.0.0(2007/10/17) */
055 private static final String CR = System.getProperty( "line.separator" );
056
057 /**
058 * インスタンスを作らなã�??で、コンストラクタは、private に設定しますã?
059 */
060 private DBUtil() {}
061
062 /**
063 * 初期ãƒ??タベã?スに接続して、Queryを実行しまã�?互換性確保ã?ため残してã�?�¾ã�?ã€?
064 *
065 * スãƒ??トメントと引数により、Prepared クエリーの検索のみ実行しますã?
066 * 結果は,すべてæ–?—å?に変換されて格納されますã?
067 * <del>検索するãƒ??タベã?スは、DEFAULT ですã?</del>
068 *
069 * @og.rev 3.8.7.0 (2006/12/15) アクセスログ取得ã?為,ApplicationInfoオブジェクトを設å®?
070 * @og.rev 4.0.0.0 (2007/10/10) dbid の初期値をã?"DEFAULT" から null に変更
071 * @og.rev 5.1.9.0 (2010/08/01) Transaction 対応しますã?
072 * @og.rev 5.3.7.0 (2011/07/01) TransactionReal の引数変更
073 * @og.rev 5.3.8.0 (2011/08/01) TransactionReal と close() 処ç�?‚’セãƒ?ƒˆで実行するã?
074 *
075 * @param stmt スãƒ??トメント文字å?
076 * @param args オブジェクトã?引数配å?
077 * @param appInfo アプリæƒ??オブジェクãƒ?
078 *
079 * @return 検索結果の配å?
080 */
081 public static String[][] dbExecute( final String stmt ,final String[] args ,final ApplicationInfo appInfo ) {
082 // return dbExecute( stmt ,args,appInfo,"DEFAULT" );
083 // return dbExecute( stmt, args, appInfo, null );
084
085 // Transaction tran = new TransactionReal( null,appInfo );
086 Transaction tran = new TransactionReal( appInfo ); // 5.3.7.0 (2011/07/01) 引数変更
087 // return dbExecute( stmt, args, tran, null, false );
088
089 // 5.3.8.0 (2011/08/01) TransactionReal と close() 処ç�?‚’セãƒ?ƒˆで実行するã?
090 try {
091 return dbExecute( stmt, args, tran, null, false );
092 }
093 finally {
094 // エラー発生時は、tran.rollback() が呼ばれてã�?‚‹ため、close()時にエラーフラグをセãƒ?ƒˆするå¿?¦�ã?なã�??
095 tran.close();
096 }
097 }
098
099 /**
100 * 初期ãƒ??タベã?スに接続して、Queryを実行しまã�?Transaction 対å¿?ã€?
101 *
102 * スãƒ??トメントと引数により、Prepared クエリーの検索のみ実行しますã?
103 * 結果は,すべてæ–?—å?に変換されて格納されますã?
104 * ここでは、Transactionオブジェクトからã?Connection を取りå?して使用しますã?
105 *
106 * @og.rev 5.1.9.0 (2010/08/01) 新規作æ? Transaction 対å¿?
107 *
108 * @param stmt スãƒ??トメント文字å?
109 * @param args オブジェクトã?引数配å?
110 * @param tran Transactionオブジェクãƒ?
111 *
112 * @return 検索結果の配å?
113 */
114 public static String[][] dbExecute( final String stmt ,final String[] args ,final Transaction tran ) {
115 return dbExecute( stmt, args, tran, null, false );
116 }
117
118 /**
119 * 検索するãƒ??タベã?スを指定して、Queryを実行しまã�?互換性確保ã?ため残してã�?�¾ã�?ã€?
120 *
121 * スãƒ??トメントと引数により、Prepared クエリーの検索のみ実行しますã?
122 * 結果は,すべてæ–?—å?に変換されて格納されますã?
123 * 追åŠ?¼š検索以外ã?SQLも実行できますã?結果は、null を返しますã?
124 *
125 * @og.rev 3.0.0.0 (2002/12/25) 検索のみのクエリーから、何でもありã?クエリーに変更
126 * @og.rev 2.3.1.3 (2003/01/28) Open Cursor がã?大量に残る件の対応ã?ResultSet ã‚?close()
127 * @og.rev 3.8.0.8 (2005/10/03) エラーメãƒ?‚»ージの出力é?をメãƒ?‚»ージ?‹Queryに変更しますã?
128 * @og.rev 3.8.7.0 (2006/12/15) アクセスログ取得ã?為,ApplicationInfoオブジェクトを設å®?
129 * @og.rev 4.0.0.1 (2007/12/03) try ??catch ??finally をきちんと行うã€?
130 * @og.rev 5.1.9.0 (2010/08/01) Transaction 対応しますã?
131 * @og.rev 5.3.7.0 (2011/07/01) TransactionReal の引数変更
132 * @og.rev 5.3.8.0 (2011/08/01) TransactionReal と close() 処ç�?‚’セãƒ?ƒˆで実行するã?
133 *
134 * @param stmt スãƒ??トメント文字å?
135 * @param args オブジェクトã?引数配å?
136 * @param appInfo アプリæƒ??オブジェクãƒ?
137 * @param dbid 接続å?ID
138 *
139 * @return 検索結果の配å?
140 */
141 public static String[][] dbExecute( final String stmt ,final String[] args, final ApplicationInfo appInfo, final String dbid ) {
142 // return dbExecute( stmt, args, appInfo, dbid, false );
143
144 // Transaction tran = new TransactionReal( dbid,appInfo );
145 Transaction tran = new TransactionReal( appInfo ); // 5.3.7.0 (2011/07/01) 引数変更
146 // return dbExecute( stmt, args, tran, dbid, false );
147
148 // 5.3.8.0 (2011/08/01) TransactionReal と close() 処ç�?‚’セãƒ?ƒˆで実行するã?
149 try {
150 return dbExecute( stmt, args, tran, dbid, false );
151 }
152 finally {
153 // エラー発生時は、tran.rollback() が呼ばれてã�?‚‹ため、close()時にエラーフラグをセãƒ?ƒˆするå¿?¦�ã?なã�??
154 tran.close();
155 }
156 }
157
158 /**
159 * 検索するãƒ??タベã?スを指定して、Queryを実行しまã�?Transaction 対å¿?ã€?
160 *
161 * スãƒ??トメントと引数により、Prepared クエリーの検索のみ実行しますã?
162 * 結果は,すべてæ–?—å?に変換されて格納されますã?
163 * 追åŠ?¼š検索以外ã?SQLも実行できますã?結果は、null を返しますã?
164 * ここでは、Transactionオブジェクトからã?Connection を取りå?して使用しますã?
165 *
166 * @og.rev 5.1.9.0 (2010/08/01) 新規作æ? Transaction 対å¿?
167 *
168 * @param stmt スãƒ??トメント文字å?
169 * @param args オブジェクトã?引数配å?
170 * @param tran Transactionオブジェクãƒ?
171 * @param dbid 接続å?ID
172 *
173 * @return 検索結果の配å?
174 */
175 public static String[][] dbExecute( final String stmt ,final String[] args, final Transaction tran , final String dbid ) {
176 return dbExecute( stmt, args, tran, dbid, false );
177 }
178
179 /**
180 * 検索するãƒ??タベã?スを指定して、Queryを実行しまã�?互換性確保ã?ため残してã�?�¾ã�?ã€?
181 *
182 * スãƒ??トメントと引数により、Prepared クエリーの検索のみ実行しますã?
183 * 結果は,すべてæ–?—å?に変換されて格納されますã?
184 * 追åŠ?¼š検索以外ã?SQLも実行できますã?結果は、null を返しますã?
185 *
186 * @og.rev 4.3.7.0 (2009/06/01) 新規作æ?
187 * @og.rev 5.1.2.0 (2010/01/01) setObject に ParameterMetaData の getParameterType を渡すã?(PostgreSQL対å¿?
188 * @og.rev 5.1.9.0 (2010/08/01) Transaction 対応しますã?
189 * @og.rev 5.3.7.0 (2011/07/01) TransactionReal の引数変更
190 * @og.rev 5.3.8.0 (2011/08/01) TransactionReal と close() 処ç�?‚’セãƒ?ƒˆで実行するã?
191 *
192 * @param stmt スãƒ??トメント文字å?
193 * @param args オブジェクトã?引数配å?
194 * @param appInfo アプリæƒ??オブジェクãƒ?
195 * @param dbid 接続å?ID
196 * @param useHeader 1行目にヘッãƒ??を含めるã�?
197 *
198 * @return 検索結果の配å?
199 */
200 public static String[][] dbExecute( final String stmt ,final String[] args, final ApplicationInfo appInfo, final String dbid, final boolean useHeader ) {
201 // Transaction tran = new TransactionReal( dbid,appInfo );
202 Transaction tran = new TransactionReal( appInfo ); // 5.3.7.0 (2011/07/01) 引数変更
203 // return dbExecute( stmt, args, tran, dbid, useHeader );
204
205 // 5.3.8.0 (2011/08/01) TransactionReal と close() 処ç�?‚’セãƒ?ƒˆで実行するã?
206 try {
207 return dbExecute( stmt, args, tran, dbid, useHeader );
208 }
209 finally {
210 // エラー発生時は、tran.rollback() が呼ばれてã�?‚‹ため、close()時にエラーフラグをセãƒ?ƒˆするå¿?¦�ã?なã�??
211 tran.close();
212 }
213 }
214
215 /**
216 * 検索するãƒ??タベã?スを指定して、Queryを実行しまã�?Transaction 対å¿?ã€?
217 *
218 * スãƒ??トメントと引数により、Prepared クエリーの検索のみ実行しますã?
219 * 結果は,すべてæ–?—å?に変換されて格納されますã?
220 * 追åŠ?¼š検索以外ã?SQLも実行できますã?結果は、null を返しますã?
221 *
222 * @og.rev 5.1.9.0 (2010/08/01) 新規作æ? Transaction 対å¿?
223 * @og.rev 5.3.8.0 (2011/08/01) Transaction を引数で受け取ったå?合ã?、close() しなã�??
224 * @og.rev 5.3.8.0 (2011/08/01) useParamMetaData ã‚?ConnectionFactory経由で取得ã?(PostgreSQL対å¿?、setNull 対å¿?
225 *
226 * @param stmt スãƒ??トメント文字å?
227 * @param args オブジェクトã?引数配å?
228 * @param tran Transactionオブジェクãƒ?
229 * @param dbid 接続å?ID
230 * @param useHeader 1行目にヘッãƒ??を含めるã�?
231 *
232 * @return 検索結果の配å?
233 */
234 // public static String[][] dbExecute( final String stmt ,final String[] args, final ApplicationInfo appInfo, final String dbid, final boolean useHeader ) {
235 public static String[][] dbExecute( final String stmt ,final String[] args, final Transaction tran, final String dbid, final boolean useHeader ) {
236 // Connection conn = null; // 5.1.9.0 (2010/08/01) Transaction 対å¿?
237 PreparedStatement pstmt = null;
238 ResultSet resultSet = null;
239 String[][] rtn = null;
240 // boolean errFlag = true;
241 try {
242 // conn = ConnectionFactory.connection( dbid,appInfo );
243 Connection conn = tran.getConnection( dbid ); // 5.1.9.0 (2010/08/01) Transaction 対å¿?
244 pstmt = conn.prepareStatement( stmt );
245 if( args != null ) {
246 // 5.1.1.0 (2009/11/11) setObject に ParameterMetaData の getParameterType を渡すã?(PostgreSQL対å¿?
247 // boolean useParamMetaData = ApplicationInfo.useParameterMetaData( conn );
248 boolean useParamMetaData = ConnectionFactory.useParameterMetaData( dbid ); // 5.3.8.0 (2011/08/01)
249 if( useParamMetaData ) {
250 ParameterMetaData pMeta = pstmt.getParameterMetaData();
251 for( int i=0; i<args.length; i++ ) {
252 int type = pMeta.getParameterType( i+1 );
253 // 5.3.8.0 (2011/08/01) setNull 対å¿?
254 // pstmt.setObject( i+1,args[i],type );
255 String val = args[i];
256 if( val == null || val.isEmpty() ) {
257 pstmt.setNull( i+1, type );
258 }
259 else {
260 pstmt.setObject( i+1, val, type );
261 }
262 }
263 }
264 else {
265 for( int i=0; i<args.length; i++ ) {
266 pstmt.setObject( i+1,args[i] );
267 }
268 }
269 }
270 boolean status = pstmt.execute();
271 if( status ) {
272 resultSet = pstmt.getResultSet();
273 // rtn = DBUtil.resultToArray( resultSet,false );
274 rtn = DBUtil.resultToArray( resultSet,useHeader ); // 4.3.7.0 (2009/06/01)
275 }
276 else {
277 // conn.commit();
278 tran.commit(); // 5.1.9.0 (2010/08/01) Transaction 対å¿?
279 }
280 // errFlag = false; // エラーでなã�?
281 }
282 catch ( SQLException ex ) {
283 // Closer.rollback( conn );
284 tran.rollback(); // 5.1.9.0 (2010/08/01) Transaction 対å¿?
285 String errMsg = ex.getMessage() + ":" + ex.getSQLState() + CR
286 + "SQL=[" + stmt + "]" + CR
287 + "ARG=[" + StringUtil.array2csv( args ) + "]" + CR
288 + "DBID=[" + dbid + "]" + CR;
289 throw new RuntimeException( errMsg,ex );
290 }
291 finally {
292 Closer.resultClose( resultSet );
293 Closer.stmtClose( pstmt );
294
295 // if( errFlag ) { ConnectionFactory.remove( conn,dbid ); }
296 // else { ConnectionFactory.close( conn,dbid ); }
297 // 5.3.8.0 (2011/08/01) Transaction を引数で受け取ったå?合ã?、close() しなã�??
298 // tran.close( errFlag ); // 5.1.9.0 (2010/08/01) Transaction 対å¿?
299 }
300 return rtn;
301 }
302
303 /**
304 * 初期ãƒ??タベã?スに接続して、CallableStatement(PL/SQL)を実行しまã�?互換性確保ã?ため残してã�?�¾ã�?ã€?
305 * スãƒ??トメントと引数により、CallableStatement クエリーを実行しますã?
306 * 結果は,スãƒ??タスとエラーメãƒ?‚»ージを返しますã?便宜的に、String配å?に
307 * 設定して返しますã?
308 * スãƒ??トメント文字å?にはã€?{ call PLSQL( ?,?,??¥?¥?¥ ) } となりますã?
309 * 第ä¸?¼•数、第二引数は、OUT属æ?で、結果(STATUS)とエラー時ã?å†?®¹(ERR_CODE)を返しますã?
310 * 第三引数以降ã? ? には、オブジェクトã?引数配å? がé?に割り当てられますã?
311 * <del>検索するãƒ??タベã?スは、DEFAULT ですã?</del>
312 *
313 * @og.rev 3.8.0.0 (2005/06/07) 新規追åŠ?
314 * @og.rev 3.8.7.0 (2006/12/15) アクセスログ取得ã?為,ApplicationInfoオブジェクトを設å®?
315 * @og.rev 4.0.0.0 (2007/10/10) dbid の初期値をã?"DEFAULT" から null に変更
316 * @og.rev 5.1.9.0 (2010/08/01) Transaction 対応しますã?
317 * @og.rev 5.3.7.0 (2011/07/01) TransactionReal の引数変更
318 * @og.rev 5.3.8.0 (2011/08/01) TransactionReal と close() 処ç�?‚’セãƒ?ƒˆで実行するã?
319 *
320 * @param stmt スãƒ??トメント文字å?
321 * @param args オブジェクトã?引数配å?
322 * @param appInfo アプリæƒ??オブジェクãƒ?
323 *
324 * @return 実行結果([0]=スãƒ??タス、[1]=エラーメãƒ?‚»ージ
325 */
326 public static String[] dbCallExecute( final String stmt ,final String[] args, final ApplicationInfo appInfo ) {
327 // return dbCallExecute( stmt ,args,appInfo,"DEFAULT" );
328 // return dbCallExecute( stmt ,args, appInfo, null );
329
330 // Transaction tran = new TransactionReal( null,appInfo );
331 Transaction tran = new TransactionReal( appInfo ); // 5.3.7.0 (2011/07/01) 引数変更
332 // return dbCallExecute( stmt ,args, tran, null );
333
334 // 5.3.8.0 (2011/08/01) TransactionReal と close() 処ç�?‚’セãƒ?ƒˆで実行するã?
335 try {
336 return dbCallExecute( stmt ,args, tran, null );
337 }
338 finally {
339 // エラー発生時は、tran.rollback() が呼ばれてã�?‚‹ため、close()時にエラーフラグをセãƒ?ƒˆするå¿?¦�ã?なã�??
340 tran.close();
341 }
342 }
343
344 /**
345 * 初期ãƒ??タベã?スに接続して、CallableStatement(PL/SQL)を実行しまã�?Transaction 対å¿?ã€?
346 * スãƒ??トメントと引数により、CallableStatement クエリーを実行しますã?
347 * 結果は,スãƒ??タスとエラーメãƒ?‚»ージを返しますã?便宜的に、String配å?に
348 * 設定して返しますã?
349 * スãƒ??トメント文字å?にはã€?{ call PLSQL( ?,?,??¥?¥?¥ ) } となりますã?
350 * 第ä¸?¼•数、第二引数は、OUT属æ?で、結果(STATUS)とエラー時ã?å†?®¹(ERR_CODE)を返しますã?
351 * 第三引数以降ã? ? には、オブジェクトã?引数配å? がé?に割り当てられますã?
352 * <del>検索するãƒ??タベã?スは、DEFAULT ですã?</del>
353 *
354 * @og.rev 5.1.9.0 (2010/08/01) 新規作æ? Transaction 対å¿?
355 *
356 * @param stmt スãƒ??トメント文字å?
357 * @param args オブジェクトã?引数配å?
358 * @param tran Transactionオブジェクãƒ?
359 *
360 * @return 実行結果([0]=スãƒ??タス、[1]=エラーメãƒ?‚»ージ
361 */
362 public static String[] dbCallExecute( final String stmt ,final String[] args, final Transaction tran ) {
363 return dbCallExecute( stmt ,args, tran, null );
364 }
365
366 /**
367 * 検索するãƒ??タベã?スを指定して、CallableStatement(PL/SQL)を実行しまã�?互換性確保ã?ため残してã�?�¾ã�?ã€?
368 * スãƒ??トメントと引数により、CallableStatement クエリーを実行しますã?
369 * 結果は,スãƒ??タスとエラーメãƒ?‚»ージを返しますã?便宜的に、String配å?に
370 * 設定して返しますã?
371 * スãƒ??トメント文字å?にはã€?{ call PLSQL( ?,?,??¥?¥?¥ ) } となりますã?
372 * 第ä¸?¼•数、第二引数は、OUT属æ?で、結果(STATUS)とエラー時ã?å†?®¹(ERR_CODE)を返しますã?
373 * 第三引数以降ã? ? には、オブジェクトã?引数配å? がé?に割り当てられますã?
374 * 検索するãƒ??タベã?スは、DEFAULT ですã?
375 *
376 * @og.rev 3.8.0.0 (2005/06/07) 新規追åŠ?
377 * @og.rev 3.8.7.0 (2006/12/15) アクセスログ取得ã?為,ApplicationInfoオブジェクトを設å®?
378 * @og.rev 4.0.0.1 (2007/12/03) try ??catch ??finally をきちんと行うã€?
379 * @og.rev 5.1.9.0 (2010/08/01) Transaction 対応しますã?
380 * @og.rev 5.3.7.0 (2011/07/01) TransactionReal の引数変更
381 * @og.rev 5.3.8.0 (2011/08/01) TransactionReal と close() 処ç�?‚’セãƒ?ƒˆで実行するã?
382 *
383 * @param stmt スãƒ??トメント文字å?
384 * @param args オブジェクトã?引数配å?
385 * @param appInfo アプリæƒ??オブジェクãƒ?
386 * @param dbid 接続å?ID
387 *
388 * @return 実行結果([0]=スãƒ??タス、[1]=エラーメãƒ?‚»ージ
389 */
390 public static String[] dbCallExecute( final String stmt ,final String[] args, final ApplicationInfo appInfo ,final String dbid ) {
391 // Transaction tran = new TransactionReal( dbid,appInfo );
392 Transaction tran = new TransactionReal( appInfo ); // 5.3.7.0 (2011/07/01) 引数変更
393 // return dbCallExecute( stmt ,args, tran, dbid );
394
395 // 5.3.8.0 (2011/08/01) TransactionReal と close() 処ç�?‚’セãƒ?ƒˆで実行するã?
396 try {
397 return dbCallExecute( stmt ,args, tran, dbid );
398 }
399 finally {
400 // エラー発生時は、tran.rollback() が呼ばれてã�?‚‹ため、close()時にエラーフラグをセãƒ?ƒˆするå¿?¦�ã?なã�??
401 tran.close();
402 }
403 }
404
405 /**
406 * 検索するãƒ??タベã?スを指定して、CallableStatement(PL/SQL)を実行しまã�?Transaction 対å¿?ã€?
407 * スãƒ??トメントと引数により、CallableStatement クエリーを実行しますã?
408 * 結果は,スãƒ??タスとエラーメãƒ?‚»ージを返しますã?便宜的に、String配å?に
409 * 設定して返しますã?
410 * スãƒ??トメント文字å?にはã€?{ call PLSQL( ?,?,??¥?¥?¥ ) } となりますã?
411 * 第ä¸?¼•数、第二引数は、OUT属æ?で、結果(STATUS)とエラー時ã?å†?®¹(ERR_CODE)を返しますã?
412 * 第三引数以降ã? ? には、オブジェクトã?引数配å? がé?に割り当てられますã?
413 * 検索するãƒ??タベã?スは、DEFAULT ですã?
414 *
415 * @og.rev 5.1.9.0 (2010/08/01) 新規作æ? Transaction 対å¿?
416 * @og.rev 5.3.8.0 (2011/08/01) Transaction を引数で受け取ったå?合ã?、close() しなã�??
417 *
418 * @param stmt スãƒ??トメント文字å?
419 * @param args オブジェクトã?引数配å?
420 * @param tran Transactionオブジェクãƒ?
421 * @param dbid 接続å?ID
422 *
423 * @return 実行結果([0]=スãƒ??タス、[1]=エラーメãƒ?‚»ージ
424 */
425 public static String[] dbCallExecute( final String stmt ,final String[] args, final Transaction tran ,final String dbid ) {
426 // Connection conn = null ; // 5.1.9.0 (2010/08/01) Transaction 対å¿?
427 CallableStatement callStmt = null ;
428
429 String[] rtn = new String[2] ;
430
431 // boolean errFlag = true;
432 try {
433 // conn = ConnectionFactory.connection( dbid,appInfo );
434 Connection conn = tran.getConnection( dbid ); // 5.1.9.0 (2010/08/01) Transaction 対å¿?
435 callStmt = conn.prepareCall( stmt );
436
437 callStmt.registerOutParameter( 1, Types.INTEGER );
438 callStmt.registerOutParameter( 2, Types.VARCHAR );
439 if( args != null ) {
440 for( int i=0; i<args.length; i++ ) {
441 callStmt.setObject( i+3,args[i] );
442 }
443 }
444 callStmt.execute();
445
446 rtn[0] = String.valueOf( callStmt.getInt(1) ); // 結果スãƒ??タス
447 rtn[1] = callStmt.getString(2); // å†?®¹(エラーメãƒ?‚»ージ)
448
449 // conn.commit();
450 tran.commit(); // 5.1.9.0 (2010/08/01) Transaction 対å¿?
451 // errFlag = false; // エラーでなã�?
452 }
453 catch ( SQLException ex ) {
454 // Closer.rollback( conn );
455 tran.rollback(); // 5.1.9.0 (2010/08/01) Transaction 対å¿?
456 String errMsg = ex.getMessage() + ":" + ex.getSQLState() + CR
457 + "SQL=[" + stmt + "]" + CR
458 + "ARG=[" + StringUtil.array2csv( args ) + "]" + CR
459 + "DBID=[" + dbid + "]" + CR;
460 throw new RuntimeException( errMsg,ex );
461 }
462 finally {
463 Closer.stmtClose( callStmt );
464 // if( errFlag ) { ConnectionFactory.remove( conn,dbid ); }
465 // else { ConnectionFactory.close( conn,dbid ); }
466 // 5.3.8.0 (2011/08/01) Transaction を引数で受け取ったå?合ã?、close() しなã�??
467 // tran.close( errFlag ); // 5.1.9.0 (2010/08/01) Transaction 対å¿?
468 }
469 return rtn;
470 }
471
472 /**
473 * SQLæ–??実行結果において、データの件数を取得しまã�?互換性確保ã?ため残してã�?�¾ã�?ã€?
474 * スãƒ??トメントと引数により、Prepared クエリーの検索を実行しますã?
475 * 結果は、件数を数値で返しますã?
476 * あくまで、存在チェãƒ?‚¯にå¿?¦�な処ç�??み行ってã�?‚‹ためã€??常の検索より高é?ですã?
477 *
478 * @og.rev 3.5.0.0 (2003/09/17) 新規作æ?
479 * @og.rev 3.8.0.8 (2005/10/03) エラーメãƒ?‚»ージの出力é?をメãƒ?‚»ージ?‹Queryに変更しますã?
480 * @og.rev 3.8.7.0 (2006/12/15) アクセスログ取得ã?為,ApplicationInfoオブジェクトを設å®?
481 * @og.rev 4.0.0.1 (2007/12/03) try ??catch ??finally をきちんと行うã€?
482 * @og.rev 5.1.2.0 (2010/01/01) setObject に ParameterMetaData の getParameterType を渡すã?(PostgreSQL対å¿?
483 * @og.rev 5.1.9.0 (2010/08/01) Transaction 対応しますã?
484 * @og.rev 5.3.7.0 (2011/07/01) TransactionReal の引数変更
485 * @og.rev 5.3.8.0 (2011/08/01) TransactionReal と close() 処ç�?‚’セãƒ?ƒˆで実行するã?
486 *
487 * @param stmt スãƒ??トメント文字å?
488 * @param args オブジェクトã?引数配å?
489 * @param appInfo アプリæƒ??オブジェクãƒ?
490 * @param dbid 接続å?ID
491 *
492 * @return 検索結果(ãƒ??タの件数)
493 */
494 public static int dbExist( final String stmt ,final String[] args, final ApplicationInfo appInfo , final String dbid ) {
495 // Transaction tran = new TransactionReal( dbid,appInfo );
496 Transaction tran = new TransactionReal( appInfo ); // 5.3.7.0 (2011/07/01) 引数変更
497 // return dbExist( stmt ,args, tran , dbid );
498
499 // 5.3.8.0 (2011/08/01) TransactionReal と close() 処ç�?‚’セãƒ?ƒˆで実行するã?
500 try {
501 return dbExist( stmt ,args, tran , dbid );
502 }
503 finally {
504 // エラー発生時は、tran.rollback() が呼ばれてã�?‚‹ため、close()時にエラーフラグをセãƒ?ƒˆするå¿?¦�ã?なã�??
505 tran.close();
506 }
507 }
508
509 /**
510 * SQLæ–??実行結果において、データの件数を取得しまã�?Transaction 対å¿?ã€?
511 * スãƒ??トメントと引数により、Prepared クエリーの検索を実行しますã?
512 * 結果は、件数を数値で返しますã?
513 * あくまで、存在チェãƒ?‚¯にå¿?¦�な処ç�??み行ってã�?‚‹ためã€??常の検索より高é?ですã?
514 *
515 * @og.rev 5.1.9.0 (2010/08/01) 新規作æ? Transaction 対å¿?
516 * @og.rev 5.3.8.0 (2011/08/01) Transaction を引数で受け取ったå?合ã?、close() しなã�??
517 * @og.rev 5.3.8.0 (2011/08/01) useParamMetaData ã‚?ConnectionFactory経由で取得ã?(PostgreSQL対å¿?、setNull 対å¿?
518 *
519 * @param stmt スãƒ??トメント文字å?
520 * @param args オブジェクトã?引数配å?
521 * @param tran Transactionオブジェクãƒ?
522 * @param dbid 接続å?ID
523 *
524 * @return 検索結果(ãƒ??タの件数)
525 */
526 public static int dbExist( final String stmt ,final String[] args, final Transaction tran , final String dbid ) {
527 // Connection conn = null; // 5.1.9.0 (2010/08/01) Transaction 対å¿?
528 PreparedStatement pstmt = null;
529 ResultSet resultSet = null;
530 int rtnCnt = -1;
531
532 // boolean errFlag = true;
533 try {
534 // conn = ConnectionFactory.connection( dbid,appInfo );
535 Connection conn = tran.getConnection( dbid ); // 5.1.9.0 (2010/08/01) Transaction 対å¿?
536 pstmt = conn.prepareStatement( stmt );
537 if( args != null ) {
538 // 5.1.2.0 (2010/01/01) setObject に ParameterMetaData の getParameterType を渡すã?(PostgreSQL対å¿?
539 // boolean useParamMetaData = ApplicationInfo.useParameterMetaData( conn );
540 boolean useParamMetaData = ConnectionFactory.useParameterMetaData( dbid ); // 5.3.8.0 (2011/08/01)
541 if( useParamMetaData ) {
542 ParameterMetaData pMeta = pstmt.getParameterMetaData();
543 for( int i=0; i<args.length; i++ ) {
544 int type = pMeta.getParameterType( i+1 );
545 // 5.3.8.0 (2011/08/01) setNull 対å¿?
546 // pstmt.setObject( i+1,args[i],type );
547 String val = args[i];
548 if( val == null || val.isEmpty() ) {
549 pstmt.setNull( i+1, type );
550 }
551 else {
552 pstmt.setObject( i+1, val, type );
553 }
554 }
555 }
556 else {
557 for( int i=0; i<args.length; i++ ) {
558 pstmt.setObject( i+1,args[i] );
559 }
560 }
561 }
562
563 resultSet = pstmt.executeQuery();
564 if( resultSet.next() ) {
565 rtnCnt = resultSet.getInt(1);
566 }
567 // errFlag = false; // エラーでなã�?
568 }
569 catch ( SQLException ex ) {
570 String errMsg = ex.getMessage() + ":" + ex.getSQLState() + CR
571 + "SQL=[" + stmt + "]" + CR
572 + "ARG=[" + StringUtil.array2csv( args ) + "]" + CR
573 + "DBID=[" + dbid + "]" + CR;
574 throw new RuntimeException( errMsg,ex ); // 3.5.5.4 (2004/04/15) 引数の並びé ?¤‰更
575 }
576 finally {
577 Closer.resultClose( resultSet );
578 Closer.stmtClose( pstmt );
579
580 // if( errFlag ) { ConnectionFactory.remove( conn,dbid ); }
581 // else { ConnectionFactory.close( conn,dbid ); }
582 // 5.3.8.0 (2011/08/01) Transaction を引数で受け取ったå?合ã?、close() しなã�??
583 // tran.close( errFlag ); // 5.1.9.0 (2010/08/01) Transaction 対å¿?
584 }
585 return rtnCnt;
586 }
587
588 /**
589 * ResultSet より、結果のæ–?—å?配å?を作æ?しますã?
590 *
591 * 結果は,すべてæ–?—å?に変換されて格納されますã?
592 * 移動したメソãƒ?ƒ‰で使われてã�?‚‹のでこれも移å‹?
593 *
594 * @og.rev 3.1.0.0 (2003/03/20) Vector を使用してã�?‚‹ç®?‰€でã€?�ž同期でも構わなã�?®?‰€をã?ArrayList に置換えã€?
595 * @og.rev 3.8.0.8 (2005/10/03) エラーメãƒ?‚»ージの出力é?をメãƒ?‚»ージ?‹Queryに変更しますã?
596 * @og.rev 4.0.0.0 (2005/01/31) private â‡?public , ヘッãƒ??æƒ??の取得有無フラグの追åŠ?
597 * @og.rev 5.6.7.0 (2013/07/27) CLOB 対å¿?
598 *
599 * @param resultSet ResultSetオブジェクãƒ?
600 * @param useHeader true:ヘッãƒ??を第ä¸?¡Œに含める/false:含めなã�?
601 *
602 * @return ResultSetの検索結果配å?
603 */
604 public static String[][] resultToArray( final ResultSet resultSet,final boolean useHeader ) {
605 ArrayList<String[]> data = new ArrayList<String[]>();
606 try {
607 ResultSetMetaData metaData = resultSet.getMetaData();
608 int numberOfColumns = metaData.getColumnCount();
609
610 String[] columnNames = new String[numberOfColumns];
611 // 5.6.7.0 (2013/07/27) CLOB 対å¿?
612 int[] type = new int[numberOfColumns];
613 boolean useClob = false; // そもそも、CLOB系のカラãƒ?�Œあるかどã�?�‹
614 for( int i = 0; i < numberOfColumns; i++ ) {
615 int tp = metaData.getColumnType( i+1 );
616 type[i] = tp ;
617 if( tp == Types.CLOB || tp == Types.ROWID || tp == Types.TIMESTAMP ) { useClob = true; }
618 if( useHeader ) {
619 columnNames[i] = ( metaData.getColumnLabel(i+1) ).toUpperCase(Locale.JAPAN) ;
620 }
621 }
622
623 if( useHeader ) { data.add( columnNames ); }
624
625 // 5.6.7.0 (2013/07/27) CLOB 対å¿?で、ã?ãƒ?ƒ€ーループを回すので、å?ç�?–¹法を変更
626 // if( useHeader ) {
627 // String[] columnNames = new String[numberOfColumns];
628 // for( int column = 0; column < numberOfColumns; column++ ) {
629 // columnNames[column] = ( metaData.getColumnLabel(column+1) ).toUpperCase(Locale.JAPAN) ;
630 // }
631 // data.add( columnNames );
632 // }
633
634 // 5.6.7.0 (2013/07/27) CLOB 対応ã?つã�?�§に、ループカウンタをã?0からに変更しますã?
635 while( resultSet.next() ) {
636 String[] columnValues = new String[numberOfColumns];
637 for( int i = 0; i < numberOfColumns; i++ ) {
638 Object obj = resultSet.getObject(i+1);
639 if( obj == null ) {
640 columnValues[i] = "";
641 }
642 else if( useClob ) {
643 columnValues[i] = getValue( resultSet, i ,type[i] );
644 }
645 else {
646 columnValues[i] = String.valueOf( obj );
647 }
648 }
649 data.add( columnValues );
650 }
651
652 // while( resultSet.next() ) {
653 // String[] columnValues = new String[numberOfColumns];
654 // for( int i = 1; i <= numberOfColumns; i++ ) {
655 // Object obj = resultSet.getObject(i);
656 // if( obj == null ) {
657 // columnValues[i-1] = "";
658 // }
659 // else {
660 // columnValues[i-1] = String.valueOf( obj );
661 // }
662 // }
663 // data.add( columnValues );
664 // }
665 }
666 catch ( SQLException ex ) {
667 String errMsg = "処ç�?µ�果を実行できませんでしたã€?
668 + CR + ex.getMessage() ;
669 throw new RuntimeException( errMsg,ex ); // 3.5.5.4 (2004/04/15) 引数の並びé ?¤‰更
670 }
671
672 int size = data.size();
673 String[][] rtn = new String[size][];
674 for( int i=0; i<size; i++ ) {
675 rtn[i] = data.get(i);
676 }
677
678 return rtn;
679 }
680
681 /**
682 * 検索結果オブジェクトからå?を取りå?しますã?
683 *
684 * @og.rev 5.3.6.0 (2011/06/01) é›?¨ˆ機è?対応によりメソãƒ?ƒ‰åŒ?
685 * @og.rev 5.5.5.4 (2012/08/18) ifæ–?‚’caseæ–?�«置き換えã?
686 * @og.rev 5.5.5.4 (2012/08/18) TIMESTAMP の処ç�?‚’追åŠ??
687 * @og.rev 5.5.7.2 (2012/10/09) HybsDateUtil を利用するように修正しますã?
688 *
689 * @param res 検索結果オブジェクãƒ?
690 * @param col カラãƒ?0から始まるå?。このメソãƒ?ƒ‰のå†?ƒ¨でã€?¼‹1してã�?�¾ã�?
691 * @param type ãƒ??タタイãƒ?java.sql.Types.XXXX)
692 *
693 * @return 値
694 * @throws SQLException
695 */
696 public static String getValue( final ResultSet res, final int col, final int type ) throws SQLException {
697 String val = null;
698
699 Object obj = res.getObject(col+1);
700 if( obj == null ) {
701 val = "";
702 }
703 else {
704 switch( type ) {
705 case Types.CLOB : val = getClobData( (Clob)obj ) ; break;
706 case Types.ROWID: val = res.getString(col+1); break;
707 // case Types.TIMESTAMP : val = DATE_FMT.format( (java.sql.Timestamp)obj ); break;
708 case Types.TIMESTAMP : val = HybsDateUtil.getDate( ((java.sql.Timestamp)obj).getTime() , "yyyyMMddHHmmss" ); break;
709 default : val = String.valueOf( obj );
710 }
711 }
712
713 return val;
714
715 // 5.5.5.4 (2012/08/18) ifæ–?‚’caseæ–?�«置き換ã�?
716 // if( type == Types.CLOB ) {
717 // Object obj = res.getObject(col+1);
718 // val = getClobData( (Clob)obj ) ;
719 // }
720 // else if( type == Types.ROWID ) {
721 // String obj = res.getString(col+1);
722 // if( obj == null ) {
723 // val = "";
724 // }
725 // else {
726 // val = obj;
727 // }
728 // }
729 // else {
730 // Object obj = res.getObject(col+1);
731 // if( obj == null ) {
732 // val = "";
733 // }
734 // else {
735 // val = String.valueOf( obj );
736 // }
737 // }
738 //
739 // return val;
740 }
741
742 // 5.5.5.4 (2012/08/18) DATE,TIMESTAMP の処ç�?‚’追åŠ?
743 // private static final DateFormat DATE_FMT = new SimpleDateFormat( "yyyyMMddHHmmss",Locale.JAPAN );
744
745 /**
746 * コネクションオブジェクトからデータベã?スのProductNameを取りå?しますã?
747 * ProductName は、小文字化して返しますã?
748 * またã?処ç�?‚¨ラーが発生したå?合ã?ã€?none" を返しますã?
749 * ここでは、SQLException は、発生させませんã€?
750 *
751 * @og.rev 5.6.7.0 (2013/07/27) 新規追åŠ?
752 * @og.rev 5.6.7.4 (2013/08/30) ProductNameの小文字化対å¿?
753 *
754 * @param conn コネクションオブジェクãƒ?
755 *
756 * @return ãƒ??タベã?スのProductName
757 */
758 public static String getProductName( final Connection conn ) {
759 String dbName ;
760 try {
761 // dbName = conn.getMetaData().getDatabaseProductName();
762 dbName = conn.getMetaData().getDatabaseProductName().toLowerCase( Locale.JAPAN ); // 5.6.7.4 (2013/08/30)
763 }
764 catch( SQLException ex ) {
765 dbName = "none";
766 }
767 return dbName ;
768 }
769
770 /**
771 * Clob オブジェクトから文字å?を取りå?しますã?
772 *
773 * @og.rev 5.3.6.0 (2011/06/01) 新規作æ?
774 *
775 * @param clobData Clobオブジェクãƒ?
776 *
777 * @return Clobオブジェクトから取りå?したæ–?—å?
778 * @throws SQLException
779 */
780 private static String getClobData( final Clob clobData ) throws SQLException {
781 if( clobData == null ) { return ""; }
782
783 Reader reader = null;
784 StringBuilder buf = new StringBuilder( 10000 );
785
786 try {
787 reader = clobData.getCharacterStream();
788 char[] ch = new char[10000];
789 int len ;
790 while( (len = reader.read( ch )) >= 0 ) {
791 buf.append( ch,0,len );
792 }
793 }
794 catch( IOException ex ) {
795 String errMsg = "CLOBãƒ??タの読み込みに失敗しましたã€?;
796 // throw new HybsSystemException( errMsg,ex );
797 throw new RuntimeException( errMsg,ex );
798 }
799 finally {
800 Closer.ioClose( reader );
801 }
802 return buf.toString();
803 }
804 }