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