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.xml; 017 018 import org.opengion.fukurou.util.Closer; 019 import org.opengion.fukurou.util.LogWriter; 020 import org.opengion.fukurou.db.DBUtil; 021 022 import java.io.Reader; 023 import java.io.BufferedReader; 024 import java.io.InputStreamReader; 025 import java.io.FileInputStream; 026 import java.util.Map; 027 import java.util.List; 028 import java.util.ArrayList; 029 import java.util.regex.Pattern; 030 import java.util.regex.Matcher; 031 import java.util.Arrays; 032 import java.util.Locale; 033 034 import java.sql.DriverManager; 035 import java.sql.Connection; 036 import java.sql.Statement; 037 import java.sql.PreparedStatement; 038 import java.sql.ParameterMetaData; 039 import java.sql.DatabaseMetaData; 040 import java.sql.SQLException; 041 042 /** 043 * ã“ã?クラスã¯ã€ã‚ªãƒ©ã‚¯ãƒ« XDKã® oracle.xml.sql.dml.OracleXMLSave クラス㨠044 * ã»ã¼åŒæ§˜ã?ç›®çš?§ä½¿ç”¨ã§ãるクラスã§ã™ã? 045 * æ‹¡å¼µXDKå½¢å¼ã?XMLファイルをèªã¿è¾¼ã¿ã€ãƒ‡ãƒ¼ã‚¿ãƒ™ã?ス㫠INSERT ã—ã¾ã™ã? 046 * 047 * æ‹¡å¼µXDKå½¢å¼ã?å…?¨ãªã‚?オラクル XDK(Oracle XML Developer's Kit)ã«ã¤ã?¦ã¯ã€ä»¥ä¸‹ã? 048 * リンクをå‚照願ã„ã¾ã™ã? 049 * <a href="http://otn.oracle.co.jp/software/tech/xml/xdk/index.html" target="_blank" > 050 * XDK(Oracle XML Developer's Kit)</a> 051 * 052 * ã“ã?クラスã§ã¯ã€MAP を登録ã™ã‚‹[ setDefaultMap( Map ) ]ã“ã¨ã«ã‚ˆã‚Šã€? 053 * XMLファイルã«å˜åœ¨ã—ãªã?‚«ãƒ©ãƒ?‚’åˆæœŸå€¤ã¨ã—ã¦è¨å®šã™ã‚‹ã“ã¨ãŒå¯èƒ½ã«ãªã‚Šã¾ã™ã? 054 * 例ãˆã°ã€ç™»éŒ²æ—¥ã‚??登録è€??ã¾ãŸã?ã€ãƒ†ãƒ³ãƒ—レートよりå„シスãƒ?ƒ ID毎㫠055 * 登録ã™ã‚‹ãªã©ã§ã™ã? 056 * åŒæ§˜ã«ã€èªã¿å–ã£ã?XMLãƒ•ã‚¡ã‚¤ãƒ«ã®æƒ??ã‚’æ›¸ãæ›ãˆã‚‹æ©Ÿè?[ setAfterMap( Map ) ]メソãƒ?ƒ‰ 057 * ã«ã‚ˆã‚Šã€ã‚«ãƒ©ãƒ??値ã®ç½®ãæ›ãˆã‚‚å¯èƒ½ã§ã™ã? 058 * 059 * æ‹¡å¼µXDKå½¢å¼ã?å…?¨ãªã‚?オラクル XDK(Oracle XML Developer's Kit)ã«ã¤ã?¦ã¯ã€ä»¥ä¸‹ã? 060 * リンクをå‚照願ã„ã¾ã™ã? 061 * <a href="http://otn.oracle.co.jp/software/tech/xml/xdk/index.html" target="_blank" > 062 * XDK(Oracle XML Developer's Kit)</a> 063 * 064 * æ‹¡å¼µXDKå½¢å¼ã¨ã¯ã€ROW 以外ã«ã€SQL処ç?”¨ã‚¿ã‚°(EXEC_SQL)ã‚’æŒã¤ XML ファイルã§ã™ã? 065 * ã¾ãŸã?登録ã™ã‚‹ãƒ??ブル(table)ã‚?ROWSETã‚¿ã‚°ã®å±žæ?æƒ??ã¨ã—ã¦ä»˜ä¸Žã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã? 066 * (大æ–?—å°æ–‡å—ã«æ³¨æ„? 067 * ã“れã¯ã€ã‚ªãƒ©ã‚¯ãƒ«XDKã§å‡¦ç?™ã‚‹å?åˆã?無視ã•れã¾ã™ã?ã§ã€åŒæ§˜ã«æ‰±ã?“ã¨ãŒå?æ¥ã¾ã™ã? 068 * ã“ã?ã€EXEC_SQL ã¯ã€ãれãれã? XMLãƒ??タをデータベã?スã«ç™»éŒ²ã™ã‚‹éš›ã«ã€? 069 * SQL処ç?‚’è‡ªå‹•çš„ã«æµã™ç‚ºã®ã€SQLæ–?‚’記載ã—ã¾ã™ã? 070 * ã“ã?処ç??ã€ã‚¤ãƒ™ãƒ³ãƒˆæ¯Žã«å®Ÿè¡Œã•れる為ã€ãã®é…ç½®é ??é‡è¦ã§ã™ã? 071 * ã“ã?ã‚¿ã‚°ã¯ã€è¤?•°è¨˜è¿°ã™ã‚‹ã“ã¨ã‚‚å?æ¥ã¾ã™ãŒã€BODY部ã«ã¯ã€?¼‘ã¤ã®SQLæ–??ã¿è¨˜è¿°ã—ã¾ã™ã? 072 * 073 * <ROWSET tableName="XX" > 074 * <EXEC_SQL> æœ??ã«è¨˜è¼‰ã—ã¦ã€å?期å?ç?ãƒ??タクリアç?を実行ã•ã›ã‚‹ã€? 075 * delete from GEXX where YYYYY 076 * </EXEC_SQL> 077 * <MERGE_SQL> ã“ã?SQLæ–?§ UPDATEã—ã¦ã€çµæžœãŒï¼ä»¶ãªã‚‰INSERTを行ã„ã¾ã™ã? 078 * update GEXX set AA=[AA] , BB=[BB] where CC=[CC] 079 * </MERGE_SQL> 080 * <ROW num="1"> 081 * <カラãƒ?>値1</カラãƒ?> 082 * ?¥?¥?¥ 083 * <カラãƒ?>値n</カラãƒ?> 084 * </ROW> 085 * ?¥?¥?¥ 086 * <ROW num="n"> 087 * ?¥?¥?¥ 088 * </ROW> 089 * <EXEC_SQL> æœ?¾Œã«è¨˜è¼‰ã—ã¦ã€??ç›®ã®è¨å®?æ•´åˆæ?登録)を行ã†ã€? 090 * update GEXX set AA='XX' , BB='XX' where YYYYY 091 * </EXEC_SQL> 092 * <ROWSET> 093 * 094 * @version 4.0 095 * @author Kazuhiko Hasegawa 096 * @since JDK5.0, 097 */ 098 public class HybsXMLSave implements TagElementListener { 099 /** シスãƒ?ƒ ä¾å˜ã?改行記å·ã‚’ã‚»ãƒ?ƒˆã—ã¾ã™ã? */ 100 private static final String CR = System.getProperty("line.separator"); 101 102 private String tableName = null; 103 private String[] keyColumns = null; 104 private Connection connection = null; 105 private PreparedStatement insPstmt = null; // INSERT用㮠PreparedStatement 106 private PreparedStatement updPstmt = null; // UPDATE用㮠PreparedStatement 107 private ParameterMetaData insMeta = null; 108 private ParameterMetaData updMeta = null; 109 private int insCnt = 0; 110 private int updCnt = 0; 111 private int delCnt = 0; 112 private int ddlCnt = 0; // 5.6.7.0 (2013/07/27) DDLæ–??カウンター 113 private Map<String,String> defaultMap = null; 114 private Map<String,String> afterMap = null; 115 private List<String> updClms = null; 116 private String[] insClms = null; 117 private String lastSQL = null; // 5.6.6.1 (2013/07/12) ãƒ?ƒãƒ?‚°ç”¨ã€‚最後ã«ä½¿ç”¨ã—ãŸSQLæ–? 118 119 private final boolean useParamMetaData ; // 4.0.0.0 (2007/09/25) 120 121 // UPDATE時ã? [XXX] ã‚’å–りå?ã—ã¾ã™ã?\w ã¯ã€å˜èªžæ§‹æ?æ–?? [a-zA-Z_0-9]ã¨åŒã˜ 122 private static final Pattern pattern = Pattern.compile( "\\[\\w*\\]" ); 123 124 // 5.6.9.2 (2013/10/18) EXEC_SQL ã®ã‚¨ãƒ©ãƒ¼ã‚’無視ã™ã‚‹ã‹ã©ã?‹ã‚’指定ã§ãã¾ã™ã? 125 private boolean isExecErrException = true; // true ã¯ã€ã‚¨ãƒ©ãƒ¼æ™‚ã« Exception を発行ã—ã¾ã™ã? 126 127 /** 128 * コãƒã‚¯ã‚·ãƒ§ãƒ³ã‚’指定ã—ã¦ã€ã‚ªãƒ–ジェクトを構築ã—ã¾ã™ã? 129 * ãƒ??ブルåã?ã€æ‹¡å¼µXDKå½¢å¼ã?ROWSETã‚¿ã‚°ã®tableName属æ?ã« 130 * 記述ã—ã¦ãŠãå¿?¦ãŒã‚りã¾ã™ã? 131 * 132 * @param conn ãƒ??タベã?ス接ç¶? 133 */ 134 public HybsXMLSave( final Connection conn ) { 135 this( conn,null ); 136 } 137 138 /** 139 * コãƒã‚¯ã‚·ãƒ§ãƒ³ã¨ãƒ??ブルåã‚’æŒ?®šã—ã¦ã€ã‚ªãƒ–ジェクトを構築ã—ã¾ã™ã? 140 * ã“ã“ã§æŒ?®šã™ã‚‹ãƒ†ãƒ¼ãƒ–ルåã?ã€ãƒ‡ãƒ•ォルトテーブルã¨ã?†æ‰±ã?§ã™ã? 141 * æ‹¡å¼µXDKå½¢å¼ã?ROWSETã‚¿ã‚°ã®tableName属æ?ã«ãƒ??ブルåãŒè¨˜è¿°ã•れã¦ã?‚‹å ´åˆã?ã€? 142 * ãã¡ã‚‰ãŒå„ªå…ˆã•れã¾ã™ã? 143 * 144 * @og.rev 4.0.0.0 (2007/09/25) ParameterMetaData を使用ã—ãŸãƒ‘ラメータè¨å®šè¿½åŠ?? 145 * @og.rev 5.3.8.0 (2011/08/01) useParamMetaData ã‚?ã“ã?クラスã§ç›´æŽ¥å–å¾—ã™ã‚‹ã?(PostgreSQL対å¿? 146 * 147 * @param conn ãƒ??タベã?ス接ç¶? 148 * @param table ãƒ??ブルå?ROWSETã‚¿ã‚°ã®table属æ?ãŒæœªè¨å®šæ™‚ã«ä½¿ç”¨) 149 */ 150 public HybsXMLSave( final Connection conn,final String table ) { 151 connection = conn; 152 tableName = table; 153 // useParamMetaData = ApplicationInfo.useParameterMetaData( conn ); 154 useParamMetaData = useParameterMetaData( connection ); // 5.3.8.0 (2011/08/01) 155 } 156 157 /** 158 * EXEC_SQL ã®ã‚¨ãƒ©ãƒ¼æ™‚ã« Exception を発行ã™ã‚‹ã‹ã©ã?‹ã‚’指定ã§ãã¾ã?åˆæœŸå€¤:true)ã€? 159 * true を指定ã™ã‚‹ã¨ã€ã‚¨ãƒ©ãƒ¼æ™‚ã«ã¯ã€?RuntimeException ã‚?throw ã—ã¾ã™ã? 160 * false ã«ã™ã‚‹ã¨ã€æ¨™æº–エラー出力ã«ã®ã¿ã€å?力ã—ã¾ã™ã? 161 * ã“ã?フラグã¯ã€EXEC_SQL ã®ã¿æœ‰åйã§ã™ã?ãれ以外ã?タブã?処ç?§ã¯ã€ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã™ã‚‹ã¨ 162 * ãã?時点ã§ã€Exception を発行ã—ã¦ã€å?ç?‚’終äº?—ã¾ã™ã? 163 * åˆæœŸå€¤ã¯ã€true(Exception を発行ã™ã‚? ã§ã™ã? 164 * 165 * @og.rev 5.6.9.2 (2013/10/18) æ–°è¦è¿½åŠ? 166 * 167 * @param flag true:Exception を発行ã™ã‚?false:標準エラー出力ã«å‡ºåŠ›ã™ã‚? 168 */ 169 public void onExecErrException( final boolean flag ) { 170 isExecErrException = flag; 171 } 172 173 /** 174 * <ROWSET> ã‚¿ã‚°ã®ä¸?•ªæœ??ã«å‘¼ã³å‡ºã•れã¾ã™ã? 175 * ROWSET ã®å±žæ?ã§ã‚ã‚‹ã€table 属æ?ã¨ã€dbid 属æ? ã‚’ã?TagElement ã® 176 * get メソãƒ?ƒ‰ã§å–å¾—ã§ãã¾ã™ã? 177 * å–得時ã®ã‚ーã¯ã€ãれãžã‚Œã?"TABLE" 㨠"DBID" ã§ã™ã? 178 * 179 * @param tag タグエレメンãƒ? 180 * @see org.opengion.fukurou.xml.TagElement 181 * @see HybsXMLHandler#setTagElementListener( TagElementListener ) 182 */ 183 public void actionInit( final TagElement tag ) { 184 String table = tag.get( "tableName" ); 185 if( table != null ) { tableName = table; } 186 } 187 188 /** 189 * <ROW> ã‚¿ã‚°ã® endElement 処ç?¯Žã«å‘¼ã³å‡ºã•れã¾ã™ã? 190 * ã“ã? Listener ã‚’ã‚»ãƒ?ƒˆã™ã‚‹ã“ã¨ã«ã‚ˆã‚Šã€è¡Œãƒ‡ãƒ¼ã‚¿ã‚’å–å¾—é?度ã€? 191 * TagElement オブジェクトを作æ?ã—ã?ã“ã?メソãƒ?ƒ‰ãŒå‘¼ã³å‡ºã•れã¾ã™ã? 192 * 193 * @og.rev 4.0.0.0 (2007/05/09) ParameterMetaData を使用ã—ãŸãƒ‘ラメータè¨å®šè¿½åŠ?? 194 * @og.rev 4.0.0.0 (2007/09/25) isOracle ã‹ã‚‰ useParamMetaData ã«å¤‰æ›´ 195 * @og.rev 4.3.7.0 (2009/06/01) HSQLDB対å¿? 196 * @og.rev 5.3.8.0 (2011/08/01) useParamMetaData setNull 対å¿?PostgreSQL対å¿? 197 * @og.rev 5.6.6.1 (2013/07/12) lastSQL 対応ã?ãƒ?ƒãƒ?‚°ç”¨ã«ã€æœ€å¾Œã«ä½¿ç”¨ã—ãŸSQLæ–?‚’残ã—ã¾ã™ã? 198 * 199 * @param tag タグエレメンãƒ? 200 * @see org.opengion.fukurou.xml.TagElement 201 * @see HybsXMLHandler#setTagElementListener( TagElementListener ) 202 */ 203 public void actionRow( final TagElement tag ) { 204 tag.setAfterMap( afterMap ); 205 206 String[] vals = null; // 5.6.6.1 (2013/07/12) ãƒ?ƒãƒ?‚°ç”¨ 207 try { 208 // æ›´æ–°SQL(MERGE_SQLã‚¿ã‚°)ãŒå˜åœ¨ã™ã‚‹å ´åˆã?処ç? 209 int tempCnt = 0; 210 if( updPstmt != null ) { 211 // String[] vals = tag.getValues( updClms ); 212 vals = tag.getValues( updClms ); // 5.6.6.1 (2013/07/12) ãƒ?ƒãƒ?‚°ç”¨ 213 for( int j=0; j<vals.length; j++ ) { 214 // 4.3.7.0 (2009/06/01) HSQLDB対応ã?空æ–?—ã?å ´å?ullã«ç½®æ›ãˆ 215 if( vals[j] != null && vals[j].length() == 0 ){ 216 vals[j] = null; 217 } 218 219 // 4.0.0.0 (2007/09/25) ParameterMetaData を使用ã—ãŸãƒ‘ラメータè¨å®šè¿½åŠ? 220 if( useParamMetaData ) { 221 int type = updMeta.getParameterType( j+1 ); 222 // 5.3.8.0 (2011/08/01) setNull 対å¿? 223 // updPstmt.setObject( j+1,vals[j],type ); 224 String val = vals[j]; 225 if( val == null || val.isEmpty() ) { 226 updPstmt.setNull( j+1, type ); 227 } 228 else { 229 updPstmt.setObject( j+1, val, type ); 230 } 231 } 232 else { 233 updPstmt.setObject( j+1,vals[j] ); 234 } 235 236 } 237 tempCnt = updPstmt.executeUpdate(); 238 if( tempCnt > 1 ) { 239 String errMsg = "Update ã‚ーãŒé‡è¤?—ã¦ã?¾ã™ã?" 240 + "TABLE=[" + tableName + "] ROW=[" 241 + tag.getRowNo() + "]" + CR 242 + " SQL=[" + lastSQL + "]" + CR // 5.6.6.1 (2013/07/12) ãƒ?ƒãƒ?‚°ç”¨ 243 + tag.toString() + CR 244 + Arrays.toString( vals ) + CR ; // 5.6.6.1 (2013/07/12) ãƒ?ƒãƒ?‚°ç”¨ 245 throw new RuntimeException( errMsg ); 246 } 247 updCnt += tempCnt; 248 } 249 // æ›´æ–°ã?0ä»¶ã®å ´åˆã?ã€INSERT処ç?‚’行ã„ã¾ã™ã? 250 if( tempCnt == 0 ) { 251 // åˆå›žINSERT時ã?タグよりã€DB登録SQLæ–?‚’構築ã—ã¾ã™ã? 252 if( insPstmt == null ) { 253 insClms = tag.getKeys(); 254 // String sql = insertSQL( insClms,tableName ); 255 // insPstmt = connection.prepareStatement( sql ); 256 lastSQL = insertSQL( insClms,tableName ); // 5.6.6.1 (2013/07/12) ãƒ?ƒãƒ?‚°ç”¨ 257 insPstmt = connection.prepareStatement( lastSQL ); 258 // 4.0.0.0 (2007/09/25) ParameterMetaData を使用ã—ãŸãƒ‘ラメータè¨å®šè¿½åŠ? 259 if( useParamMetaData ) { insMeta = insPstmt.getParameterMetaData(); } 260 } 261 // String[] vals = tag.getValues( insClms ); 262 vals = tag.getValues( insClms ); // 5.6.6.1 (2013/07/12) ãƒ?ƒãƒ?‚°ç”¨ 263 for( int j=0; j<vals.length; j++ ) { 264 // 4.3.7.0 (2009/06/01) HSQLDB対応ã?空æ–?—ã?å ´å?ullã«ç½®æ›ãˆ 265 if( vals[j] != null && vals[j].length() == 0 ){ 266 vals[j] = null; 267 } 268 269 // 4.0.0.0 (2007/09/25) ParameterMetaData を使用ã—ãŸãƒ‘ラメータè¨å®šè¿½åŠ? 270 if( useParamMetaData ) { 271 int type = insMeta.getParameterType( j+1 ); 272 // 5.3.8.0 (2011/08/01) setNull 対å¿? 273 // insPstmt.setObject( j+1,vals[j],type ); 274 String val = vals[j]; 275 if( val == null || val.isEmpty() ) { 276 insPstmt.setNull( j+1, type ); 277 } 278 else { 279 insPstmt.setObject( j+1, val, type ); 280 } 281 } 282 else { 283 insPstmt.setObject( j+1,vals[j] ); 284 } 285 } 286 insCnt += insPstmt.executeUpdate(); 287 } 288 } 289 catch( SQLException ex ) { 290 String errMsg = "DB登録エラーãŒç™ºç”Ÿã—ã¾ã—ãŸã€? 291 + "TABLE=[" + tableName + "] ROW=[" 292 + tag.getRowNo() + "]" + CR 293 + " SQL=[" + lastSQL + "]" + CR // 5.6.6.1 (2013/07/12) ãƒ?ƒãƒ?‚°ç”¨ 294 + tag.toString() + CR 295 + Arrays.toString( vals ) + CR // 5.6.6.1 (2013/07/12) ãƒ?ƒãƒ?‚°ç”¨ 296 + ex.getMessage() + ":" + ex.getSQLState() + CR ; 297 throw new RuntimeException( errMsg,ex ); 298 } 299 } 300 301 /** 302 * <EXEC_SQL> ã‚¿ã‚°ã® endElement 処ç?¯Žã«å‘¼ã³å‡ºã•れã¾ã™ã? 303 * getBody メソãƒ?ƒ‰ã‚’使用ã—ã¦ã€ã“ã®ã‚¿ã‚°ã®BODYéƒ¨ã®æ–?—å?ã‚’å–å¾—ã—ã¾ã™ã? 304 * ã“ã? Listener ã‚’ã‚»ãƒ?ƒˆã™ã‚‹ã“ã¨ã«ã‚ˆã‚Šã€EXEC_SQL ãƒ??ã‚¿ã‚’å–å¾—é?度ã€? 305 * TagElement オブジェクトを作æ?ã—ã?ã“ã?メソãƒ?ƒ‰ãŒå‘¼ã³å‡ºã•れã¾ã™ã? 306 * EXEC_SQL ã‚¿ã‚°ã§ã¯ã€deleteæ–?‚„updateæ–?ªã©ã€ç‰¹æ®Šãªå‰å?ç?‚„後å?ç?”¨ã® SQL㨠307 * DDL?ˆãƒ‡ãƒ¼ã‚¿å®šç¾©è¨?ªžï¼šData Definition Language?‰ã?処ç?ªã©ã‚‚記述ã§ãã¾ã™ã? 308 * ã“ã“ã§ã¯ç°¡æ˜“çš„ã«ã€ä½•ã‹å®Ÿè¡Œã•れãŸå ´åˆã?ã€delete 処ç?¨è€?ˆã€å‰Šé™¤ã‚«ã‚¦ãƒ³ãƒˆã‚’åŠ?®—ã—ã€? 309 * 0ä»¶ã§å¸°ã£ã¦ããŸå ´åˆã«ã€DDLãŒå®Ÿè¡Œã•れãŸã¨è€?ˆã€DDLカウントを?‹ï¼‘ã—ã¾ã™ã? 310 * ãŸã ã—ã?0ä»¶ delete ã‚‚è?ãˆã‚‰ã‚Œã‚‹ãŸã‚ã€SQLæ–??å…ˆé?æ–?—ã«ã‚ˆã‚‹ãƒã‚§ãƒ?‚¯ã¯å…¥ã‚Œã¦ãŠãã¾ã™ã? 311 * 312 * @og.rev 5.6.6.1 (2013/07/12) lastSQL 対応ã?ãƒ?ƒãƒ?‚°ç”¨ã«ã€æœ€å¾Œã«ä½¿ç”¨ã—ãŸSQLæ–?‚’残ã—ã¾ã™ã? 313 * @og.rev 5.6.7.0 (2013/07/27) DDL?ˆãƒ‡ãƒ¼ã‚¿å®šç¾©è¨?ªžï¼šData Definition Language?‰ã?処ç?»¶æ•°è¿½åŠ? 314 * @og.rev 5.6.9.2 (2013/10/18) EXEC_SQL ã®ã‚¨ãƒ©ãƒ¼æ™‚ã« Exception を発行ã™ã‚‹ã‹ã©ã?‹ã‚’指å®? 315 * 316 * @param tag タグエレメンãƒ? 317 * @see org.opengion.fukurou.xml.TagElement 318 * @see HybsXMLHandler#setTagElementListener( TagElementListener ) 319 */ 320 public void actionExecSQL( final TagElement tag ) { 321 Statement execSQL = null ; 322 try { 323 // String sql = tag.getBody(); 324 lastSQL = tag.getBody(); // 5.6.6.1 (2013/07/12) ãƒ?ƒãƒ?‚°ç”¨ 325 execSQL = connection.createStatement(); 326 // delCnt += execSQL.executeUpdate( sql ) ; 327 328 // 5.6.7.0 (2013/07/27) DDL?ˆãƒ‡ãƒ¼ã‚¿å®šç¾©è¨?ªžï¼šData Definition Language?‰ã?処ç?»¶æ•°è¿½åŠ? 329 // delCnt += execSQL.executeUpdate( lastSQL ) ; 330 int cnt = execSQL.executeUpdate( lastSQL ) ; 331 if( cnt > 0 ) { delCnt += cnt; } // ä»¶æ•°ãŒè¿”れã°ã€DDLã§ãªã?Ÿã‚ã?å‰Šé™¤æ•°ã‚’åŠ ç®? 332 else { 333 String sql = lastSQL.trim().toUpperCase( Locale.JAPAN ); 334 if( !sql.startsWith( "DELETE" ) && !sql.startsWith( "INSERT" ) && !sql.startsWith( "UPDATE" ) ) { 335 ddlCnt ++ ; 336 } 337 } 338 } 339 catch( SQLException ex ) { 340 String errMsg = "DB登録エラーãŒç™ºç”Ÿã—ã¾ã—ãŸã€? 341 + "TABLE=[" + tableName + "] ROW=[" 342 + tag.getRowNo() + "]" + CR 343 + " SQL=[" + lastSQL + "]" + CR // 5.6.6.1 (2013/07/12) ãƒ?ƒãƒ?‚°ç”¨ 344 + tag.toString() + CR 345 + ex.getMessage() + ":" + ex.getSQLState() + CR ; 346 347 // 5.6.9.2 (2013/10/18) EXEC_SQL ã®ã‚¨ãƒ©ãƒ¼æ™‚ã« Exception を発行ã™ã‚‹ã‹ã©ã?‹ã‚’指å®? 348 349 if( isExecErrException ) { 350 throw new RuntimeException( errMsg,ex ); 351 } 352 else { 353 System.err.println( errMsg ); 354 } 355 } 356 finally { 357 Closer.stmtClose( execSQL ); 358 } 359 } 360 361 /** 362 * <MERGE_SQL> ã‚¿ã‚°ã® endElement 処ç?™‚ã«å‘¼ã³å‡ºã•れã¾ã™ã? 363 * getBody メソãƒ?ƒ‰ã‚’使用ã—ã¦ã€ã“ã®ã‚¿ã‚°ã®BODYéƒ¨ã®æ–?—å?ã‚’å–å¾—ã—ã¾ã™ã? 364 * MERGE_SQLã‚¿ã‚°ã¯ã€ã?ージ処ç?—ãŸã„ãƒ??タ部よりも上ä½ã«è¨˜è¿°ã—ã¦ãŠã 365 * å¿?¦ãŒã‚りã¾ã™ãŒã€ä¸é–“部ã«è¤?•°å›žè¨˜è¿°ã—ã¦ã‚‚æ§‹ã„ã¾ã›ã‚“ã€? 366 * ã“ã?ã‚¿ã‚°ãŒç¾ã‚Œã‚‹ã¾ã§ã¯ã€INSERT ã®ã¿å®Ÿè¡Œã•れã¾ã™ã?ã“ã?タグ以é™ã?ã€? 367 * ä¸?—¦ UPDATE ã—ã?çµæžœã??ä»¶ã®å ´åˆã?ã€INSERTã™ã‚‹æµã‚Œã«ãªã‚Šã¾ã™ã? 368 * 完å?ã« INSERT ã®ã¿ã§ã‚ã‚‹ãƒ??ã‚¿ã‚’å‰åŠã«ã€UPDATE/INSERTを行ㆠ369 * ãƒ??タを後åŠã«ã€ãã®é–“ã«ã€MERGE_SQL ã‚¿ã‚°ã‚’å?れるã“ã¨ã§ã€ç„¡æ„味㪠370 * UPDATE ã‚’é¿ã‘ã‚‹ã“ã¨ãŒå¯èƒ½ã§ã™ã? 371 * ã“ã? Listener ã‚’ã‚»ãƒ?ƒˆã™ã‚‹ã“ã¨ã«ã‚ˆã‚Šã€MERGE_SQL ãƒ??ã‚¿ã‚’å–å¾—é?度ã€? 372 * TagElement オブジェクトを作æ?ã—ã?ã“ã?メソãƒ?ƒ‰ãŒå‘¼ã³å‡ºã•れã¾ã™ã? 373 * 374 * @og.rev 4.0.0.0 (2007/05/09) ParameterMetaData を使用ã—ãŸãƒ‘ラメータè¨å®šè¿½åŠ?? 375 * @og.rev 4.0.0.0 (2007/09/25) isOracle ã‹ã‚‰ useParamMetaData ã«å¤‰æ›´ 376 * @og.rev 5.6.6.1 (2013/07/12) lastSQL 対応ã?ãƒ?ƒãƒ?‚°ç”¨ã«ã€æœ€å¾Œã«ä½¿ç”¨ã—ãŸSQLæ–?‚’残ã—ã¾ã™ã? 377 * 378 * @param tag タグエレメンãƒ? 379 * @see org.opengion.fukurou.xml.TagElement 380 * @see HybsXMLHandler#setTagElementListener( TagElementListener ) 381 */ 382 public void actionMergeSQL( final TagElement tag ) { 383 if( updPstmt != null ) { 384 String errMsg = "MERGE_SQLã‚¿ã‚°ãŒã?è¤?•°å›žè¨˜è¿°ã•れã¦ã?¾ã™ã?" 385 + "TABLE=[" + tableName + "] ROW=[" 386 + tag.getRowNo() + "]" + CR 387 + " SQL=[" + lastSQL + "]" + CR // 5.6.6.1 (2013/07/12) ãƒ?ƒãƒ?‚°ç”¨ 388 + tag.toString() + CR; 389 throw new RuntimeException( errMsg ); 390 } 391 392 String orgSql = tag.getBody(); 393 Matcher matcher = pattern.matcher( orgSql ); 394 updClms = new ArrayList<String>(); 395 while( matcher.find() ) { 396 // ã“ã“ã§ã¯ã€[XXX]ã«ãƒžãƒƒãƒã™ã‚‹ç‚ºã€å‰å¾Œã?[]ã‚’å–り除ãã¾ã™ã? 397 updClms.add( orgSql.substring( matcher.start()+1,matcher.end()-1 ) ); 398 } 399 // String sql = matcher.replaceAll( "?" ); 400 lastSQL = matcher.replaceAll( "?" ); // 5.6.6.1 (2013/07/12) ãƒ?ƒãƒ?‚°ç”¨ 401 402 try { 403 // updPstmt = connection.prepareStatement( sql ); 404 updPstmt = connection.prepareStatement( lastSQL ); 405 // 4.0.0.0 (2007/09/25) ParameterMetaData を使用ã—ãŸãƒ‘ラメータè¨å®šè¿½åŠ? 406 if( useParamMetaData ) { updMeta = updPstmt.getParameterMetaData(); } 407 } 408 catch( SQLException ex ) { 409 String errMsg = "Statement作æ?時ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€? 410 + "TABLE=[" + tableName + "] ROW=[" 411 + tag.getRowNo() + "]" + CR 412 + " SQL=[" + lastSQL + "]" + CR // 5.6.6.1 (2013/07/12) ãƒ?ƒãƒ?‚°ç”¨ 413 + tag.toString() + CR 414 + ex.getMessage() + ":" + ex.getSQLState() + CR ; 415 throw new RuntimeException( errMsg,ex ); 416 } 417 } 418 419 /** 420 * UPDATE,DELETE を行ã†å ´åˆã? WHERE æ¡ä»¶ã«ãªã‚‹ã‚ーé…å? 421 * ã“ã?ã‚ー㮠AND æ¡ä»¶ã§ã‚«ãƒ©ãƒ?‚’特定ã—ã€UPDATE,DELETE ãªã©ã®å‡¦ç?‚’ 422 * 行ã„ã¾ã™ã? 423 * 424 * @param keyCols WHEREæ¡ä»¶ã«ãªã‚‹ã‚ーé…å? 425 */ 426 public void setKeyColumns( final String[] keyCols ) { 427 keyColumns = new String[keyCols.length]; 428 System.arraycopy( keyCols,0,keyColumns,0,keyColumns.length ); 429 } 430 431 /** 432 * XMLファイルをèªã¿å–ã‚‹å‰ã«æŒ?®šã™ã‚‹ã‚«ãƒ©ãƒ?¨å€¤ã®ãƒšã‚¢(マッãƒ?æƒ??ã‚’ã‚»ãƒ?ƒˆã—ã¾ã™ã? 433 * 434 * ã“ã?カラãƒ?¨å€¤ã®ãƒšã‚¢ã®ãƒžãƒƒãƒ—ã?ã€ã‚ªãƒ–ジェクト構築å‰ã«è¨å®šã•れる為ã€? 435 * XMLファイルã«ã‚ーãŒå˜åœ¨ã—ã¦ã?‚‹å ´åˆã?ã€å?ãŒæ›¸ã変ã‚りã¾ã™ã?(XML優å…? 436 * XMLファイルã«ã‚ーãŒå˜åœ¨ã—ã¦ã?ªã??åˆã?ã€ã“ã“ã§æŒ?®šã™ã‚‹Mapã®å€¤ã? 437 * åˆæœŸè¨å®šå?ã¨ã—ã¦ä½¿ç”¨ã•れã¾ã™ã? 438 * ã“ã“ã§æŒ?®šã™ã‚?Map ã« LinkedHashMap を使用ã™ã‚‹å ´åˆã?カラãƒ??ã‚? 439 * æŒ?®šã™ã‚‹ã“ã¨ãŒå?æ¥ã¾ã™ã? 440 * 441 * @param map åˆæœŸè¨å®šã™ã‚‹ã‚«ãƒ©ãƒ?ƒ‡ãƒ¼ã‚¿ãƒžãƒƒãƒ? 442 * @see #setAfterMap( Map ) 443 */ 444 public void setDefaultMap( final Map<String,String> map ) { defaultMap = map; } 445 446 /** 447 * XMLファイルをèªã¿å–ã£ãŸå¾Œã§æŒ?®šã™ã‚‹ã‚«ãƒ©ãƒ?¨å€¤ã®ãƒšã‚¢(マッãƒ?æƒ??ã‚’ã‚»ãƒ?ƒˆã—ã¾ã™ã? 448 * 449 * ã“ã?カラãƒ?¨å€¤ã®ãƒšã‚¢ã®ãƒžãƒƒãƒ—ã?ã€ã‚ªãƒ–ジェクト構築後ã«è¨å®šã•れる為ã€? 450 * XMLファイルã®ã‚ーã®å˜åœ¨ã«é–¢ä¿‚ãªãã?Mapã®ã‚ーã¨å€¤ãŒä½¿ç”¨ã•れã¾ã™ã?(Map優å…? 451 * null ã‚’è¨å®šã—ãŸå?åˆã?ã€ãªã«ã‚‚å?ç?•れã¾ã›ã‚“ã€? 452 * 453 * @param map 後è¨å®šã™ã‚‹ã‚«ãƒ©ãƒ?ƒ‡ãƒ¼ã‚¿ãƒžãƒƒãƒ? 454 * @see #setDefaultMap( Map ) 455 */ 456 public void setAfterMap( final Map<String,String> map ) { afterMap = map; } 457 458 /** 459 * ãƒ??タベã?スã«è¿½åŠ??ç?INSERT)を行ã„ã¾ã™ã? 460 * 461 * å…ˆã«æŒ?®šã•れãŸã‚³ãƒã‚¯ã‚·ãƒ§ãƒ³ã‚’用ã?¦ã€æŒ‡å®šã?ãƒ??ブル㫠INSERT ã—ã¾ã™ã? 462 * 引数ã«ã¯ã€XMLファイルを指定ã—ãŸãƒªãƒ¼ãƒ??ã‚’ã‚»ãƒ?ƒˆã—ã¾ã™ã? 463 * コãƒã‚¯ã‚·ãƒ§ãƒ³ã¯ã€çµ‚äº?¾Œã?コミットã•れã¾ã™ã?(close ã•れã¾ã›ã‚“ã€? 464 * リーãƒ??ã®ã‚¯ãƒãƒ¼ã‚ºã¯ã€ã“ã“ã§ã¯è¡Œã£ã¦ã?¾ã›ã‚“ã€? 465 * 466 * @og.rev 5.1.1.0 (2009/11/11) insMeta , updMeta ã®ã‚¯ãƒªã‚¢(気休ã‚) 467 * 468 * @param reader XMLファイルを指定ã™ã‚‹ãƒªãƒ¼ãƒ?? 469 */ 470 public void insertXML( final Reader reader ) { 471 try { 472 HybsXMLHandler handler = new HybsXMLHandler(); 473 handler.setTagElementListener( this ); 474 handler.setDefaultMap( defaultMap ); 475 476 handler.parse( reader ); 477 } 478 finally { 479 Closer.stmtClose( insPstmt ); 480 Closer.stmtClose( updPstmt ); 481 insPstmt = null; 482 updPstmt = null; 483 insMeta = null; // 5.1.1.0 (2009/11/11) 484 updMeta = null; // 5.1.1.0 (2009/11/11) 485 } 486 } 487 488 /** 489 * インサート用ã®SQLæ–?‚’作æ?ã—ã¾ã™ã? 490 * 491 * @param columns インサートã™ã‚‹ã‚«ãƒ©ãƒ? 492 * @param tableName インサートã™ã‚‹ãƒ†ãƒ¼ãƒ–ルå? 493 * 494 * @return インサート用ã®SQLæ–? 495 */ 496 private String insertSQL( final String[] columns,final String tableName ) { 497 if( tableName == null ) { 498 String errMsg = "tableName ãŒã‚»ãƒ?ƒˆã•れã¦ã?¾ã›ã‚“ã€? + CR 499 + "tableName ã¯ã€ã‚³ãƒ³ã‚¹ãƒˆãƒ©ã‚¯ã‚¿ã§æŒ?®šã™ã‚‹ã‹ã€ROWSETã®tableName属æ?ã§" 500 + "æŒ?®šã—ã¦ãŠãå¿?¦ãŒã‚りã¾ã? + CR ; 501 throw new RuntimeException( errMsg ); 502 } 503 504 StringBuilder sql = new StringBuilder(); 505 sql.append( "INSERT INTO " ).append( tableName ); 506 sql.append( " ( " ); 507 sql.append( columns[0] ); 508 for( int i=1; i<columns.length; i++ ) { 509 sql.append( "," ).append( columns[i] ); 510 } 511 sql.append( " ) VALUES ( " ); 512 sql.append( "?" ); 513 for( int i=1; i<columns.length; i++ ) { 514 sql.append( "," ).append( "?" ); 515 } 516 sql.append( " )" ); 517 518 return sql.toString(); 519 } 520 521 /** 522 * ãƒ??タベã?スã«è¿½åŠ?—ãŸä»¶æ•°ã‚’è¿”ã—ã¾ã™ã? 523 * 524 * @return 登録件数 525 */ 526 public int getInsertCount() { return insCnt; } 527 528 /** 529 * ãƒ??タベã?スを更新ã—ãŸä»¶æ•°ã‚’è¿”ã—ã¾ã™ã? 530 * ã“れã¯ã€æ‹¡å¼µXDKå½¢å¼ã§ã€MERGE_SQL タグを使用ã—ãŸå ´åˆã?更新処ç?»¶æ•°ã‚? 531 * åˆè¨ˆã—ãŸå?ã‚’è¿”ã—ã¾ã™ã? 532 * 533 * @return æ›´æ–°ä»¶æ•° 534 */ 535 public int getUpdateCount() { return updCnt; } 536 537 /** 538 * ãƒ??タベã?スã«å¤‰æ›´(æ›´æ–°ã€å‰Šé™¤ã‚’å«ã‚?ã—ãŸä»¶æ•°ã‚’è¿”ã—ã¾ã™ã? 539 * ã“れã¯ã€æ‹¡å¼µXDKå½¢å¼ã§ã€EXEC_SQL タグを使用ã—ãŸå ´åˆã?実行件数をåˆè¨ˆã—ã? 540 * 値を返ã—ã¾ã™ã? 541 * よã£ã¦ã€æ›´æ–°ã‹ã?追åŠ?‹ã€å‰Šé™¤ã‹ã?ã€åˆ¤ã‚Šã¾ã›ã‚“ãŒã?通常 登録å‰ã«å‰Šé™¤ã™ã‚‹ 542 * ケースã§ä½¿ã‚れるã“ã¨ã‹ã‚‰ã€deleteCount ã¨ã—ã¦ã?¾ã™ã? 543 * 544 * @return 変更件数(主ã«ã€å‰Šé™¤ä»¶æ•°) 545 */ 546 public int getDeleteCount() { return delCnt; } 547 548 /** 549 * ãƒ??タベã?スã«DDL?ˆãƒ‡ãƒ¼ã‚¿å®šç¾©è¨?ªžï¼šData Definition Language?‰å?ç?—ãŸä»¶æ•°ã‚’è¿”ã—ã¾ã™ã? 550 * ã“れã¯ã€æ‹¡å¼µXDKå½¢å¼ã§ã€EXEC_SQL タグを使用ã—ãŸå ´åˆã?実行件数をåˆè¨ˆã—ã? 551 * 値を返ã—ã¾ã™ã? 552 * EXEC_SQL ã§ã¯ã€ç™»éŒ²å‰ã«å‰Šé™¤ã™ã‚‹ delete 処ç?‚‚ã€EXEC_SQL タグを使用ã—ã¦å®Ÿè¡Œã—ã¾ã™ãŒ 553 * ãã?処ç?¨åˆ?‘ã¦ã‚«ã‚¦ãƒ³ãƒˆã—ã¾ã™ã? 554 * 555 * @og.rev 5.6.7.0 (2013/07/27) DDL?ˆãƒ‡ãƒ¼ã‚¿å®šç¾©è¨?ªžï¼šData Definition Language?‰ã?処ç?»¶æ•°è¿½åŠ? 556 * 557 * @return DDL?ˆãƒ‡ãƒ¼ã‚¿å®šç¾©è¨?ªžï¼šData Definition Language?‰å?ç?—ãŸä»¶æ•° 558 */ 559 public int getDDLCount() { return ddlCnt; } 560 561 /** 562 * 実際ã«ç™»éŒ²ã•れã?ãƒ??ブルåã‚’è¿”ã—ã¾ã™ã? 563 * 564 * ãƒ??ブルåã?ã€æ‹¡å¼µXDKå½¢å¼ã?ROWSETã‚¿ã‚°ã®tableName属æ?ã« 565 * 記述ã—ã¦ãŠãã‹ã?コンストラクターã§å¼•æ•°ã¨ã—ã¦æ¸¡ã—ã¾ã™ã? 566 * 両方æŒ?®šã•れãŸå ´åˆã?ã€ROWSETã‚¿ã‚°ã®tableName属æ?ãŒå„ªå…ˆã•れã¾ã™ã? 567 * ã“ã“ã§ã®è¿”り値ã¯ã€å®Ÿéš›ã«ä½¿ç”¨ã•れã?ãƒ??ブルåã§ã™ã? 568 * 569 * @return 変更件数(主ã«ã€å‰Šé™¤ä»¶æ•°) 570 */ 571 public String getTableName() { return tableName; } 572 573 /** 574 * ã“ã?接続ãŒã€PreparedStatement#getParameterMetaData() を使用ã™ã‚‹ã‹ã©ã?‹ã‚’判定ã—ã¾ã™ã? 575 * 本æ¥ã¯ã€ConnectionFactory#useParameterMetaData(String)を使ã?¹ãã ãŒã?dbid ãŒç„¡ã?Ÿã‚ã?直接å–å¾—ã—ã¾ã™ã? 576 * 577 * @og.rev 5.3.8.0 (2011/08/01) æ–°è¦ä½œæ? ( ApplicationInfo#useParameterMetaData(Connection) ã‹ã‚‰ã‚³ãƒ”ã? ) 578 * @og.rev 5.6.7.0 (2013/07/27) ProductName ã¯ã€DBUtil 経由ã§å–å¾—ã™ã‚‹ã? 579 * 580 * @param conn 接続å?(コãƒã‚¯ã‚·ãƒ§ãƒ³) 581 * 582 * @return 使用ã™ã‚‹å ´åˆï¼štrue / ãã?ä»?false 583 */ 584 private static boolean useParameterMetaData( final Connection conn ) { 585 586 String dbProductName = DBUtil.getProductName( conn ); 587 588 return "PostgreSQL".equalsIgnoreCase( dbProductName ) ; 589 590 // try { 591 // DatabaseMetaData meta = conn.getMetaData(); 592 // String dbProductName = meta.getDatabaseProductName(); 593 // 594 // if( "PostgreSQL".equalsIgnoreCase( dbProductName ) ) { return true; } 595 // 596 // return false ; 597 // } 598 // catch( SQLException ex ) { 599 // String errMsg = "DatabaseMetaData ã‹ã‚‰ã€getDatabaseProductName ã‚’å–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸã€? 600 // + ex.getMessage() + ":" + ex.getSQLState() ; 601 // throw new RuntimeException( errMsg,ex ); 602 // } 603 } 604 605 /** 606 * ãƒ?‚¹ãƒˆç”¨ã®ãƒ¡ã‚¤ãƒ³ãƒ¡ã‚½ãƒ?ƒ‰ 607 * 608 * java org.opengion.fukurou.xml.HybsXMLSave USER PASSWD URL TABLE FILE [ENCODE] [DRIVER] 609 * USER : DB接続ユーザー(GE) 610 * PASSWD: DB接続パスワーãƒ?GE) 611 * URL : DB接続JDBCドライãƒURL(jdbc:oracle:thin:@localhost:1521:HYBS 612 * TABLE : 登録ã™ã‚‹ãƒ??ブルID(GE21) 613 * FILE : 登録ã™ã‚‹ORACLE XDK å½¢å¼?XMLファイル(GE21.xml) 614 * ENCODE: ファイルã®ã‚¨ãƒ³ã‚³ãƒ¼ãƒ?åˆæœŸå€¤:UTF-8 615 * DRIVER: JDBCドライãƒã? åˆæœŸå€¤:oracle.jdbc.OracleDriver 616 * 617 * @og.rev 5.1.1.0 (2009/12/01) MySQL対å¿?明示çš?«ã€TRANSACTION_READ_COMMITTED を指定ã™ã‚‹ã? 618 * @og.rev 5.6.7.0 (2013/07/27) DDL?ˆãƒ‡ãƒ¼ã‚¿å®šç¾©è¨?ªžï¼šData Definition Language?‰ã?処ç?»¶æ•°è¿½åŠ? 619 * 620 * @param args コマンド引数é…å? 621 * @throws Exception 622 */ 623 public static void main( final String[] args ) 624 throws ClassNotFoundException , SQLException { 625 if( args.length < 5 ) { 626 LogWriter.log( "Usage: java org.opengion.fukurou.xml.HybsXMLSave USER PASSWD URL TABLE FILE [ENCODE] [DRIVER]" ); 627 LogWriter.log( " USER : DB接続ユーザー(GE)" ); 628 LogWriter.log( " PASSWD: DB接続パスワーãƒ?GE)" ); 629 LogWriter.log( " URL : DB接続JDBCドライãƒURL(jdbc:oracle:thin:@localhost:1521:HYBS)" ); 630 LogWriter.log( " TABLE : 登録ã™ã‚‹ãƒ??ブルID(GE21)" ); 631 LogWriter.log( " FILE : 登録ã™ã‚‹ORACLE XDK å½¢å¼?XMLファイル(GE21.xml)" ); 632 LogWriter.log( " [ ENCODE: ファイルã®ã‚¨ãƒ³ã‚³ãƒ¼ãƒ?åˆæœŸå€¤:UTF-8 ]" ); 633 LogWriter.log( " [ DRIVER: JDBCドライãƒã? åˆæœŸå€¤:oracle.jdbc.OracleDriver ]" ); 634 return ; 635 } 636 637 String user = args[0] ; 638 String passwd = args[1] ; 639 String url = args[2] ; 640 String table = args[3] ; 641 String file = args[4] ; 642 String encode = ( args.length == 6 ) ? args[5] : "UTF-8" ; 643 String driver = ( args.length == 7 ) ? args[6] : "oracle.jdbc.OracleDriver" ; 644 645 Class.forName(driver); 646 647 Connection conn = DriverManager.getConnection( url,user,passwd ); 648 Reader reader = null; 649 int insCnt; 650 int updCnt; 651 int delCnt; 652 int ddlCnt; // 5.6.7.0 (2013/07/27) DDL処ç?»¶æ•°è¿½åŠ? 653 try { 654 conn.setAutoCommit( false ); 655 conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED); // 5.1.1.0 (2009/12/01) 656 HybsXMLSave save = new HybsXMLSave( conn,table ); 657 658 reader = new BufferedReader(new InputStreamReader( 659 new FileInputStream( file ) ,encode )); 660 save.insertXML( reader ); 661 insCnt = save.getInsertCount(); 662 updCnt = save.getUpdateCount(); 663 delCnt = save.getDeleteCount(); 664 ddlCnt = save.getDDLCount(); // 5.6.7.0 (2013/07/27) DDL処ç?»¶æ•°è¿½åŠ? 665 666 Closer.commit( conn ); 667 } 668 // FileNotFoundException , UnsupportedEncodingException 669 catch( java.io.FileNotFoundException ex ) { 670 String errMsg = "ファイルãŒå˜åœ¨ã—ã¾ã›ã‚“ã€? + ex.getMessage() 671 + CR + "Table=[" + table + "] File =[" + file + "]" ; 672 throw new RuntimeException( errMsg,ex ); 673 } 674 catch( java.io.UnsupportedEncodingException ex ) { 675 String errMsg = "æŒ?®šã?エンコードãŒå˜åœ¨ã—ã¾ã›ã‚“ã€? + ex.getMessage() 676 + CR + "Table=[" + table + "] Encode =[" + encode + "]" ; 677 throw new RuntimeException( errMsg,ex ); 678 } 679 finally { 680 Closer.ioClose( reader ); 681 Closer.connClose( conn ); 682 } 683 684 System.out.println( "XML File[" + file + "] Into [" + table + "] Table" ); 685 System.out.println( " Insert Count : [" + insCnt + "]" ); 686 System.out.println( " Update Count : [" + updCnt + "]" ); 687 System.out.println( " Delete Count : [" + delCnt + "]" ); 688 System.out.println( " DDL Count : [" + ddlCnt + "]" ); 689 } 690 }