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.plugin.query; 017 018 import org.opengion.hayabusa.db.AbstractQuery; 019 import org.opengion.hayabusa.db.DBErrMsg; 020 import org.opengion.hayabusa.common.HybsSystem; 021 import org.opengion.hayabusa.common.HybsSystemException; 022 import org.opengion.fukurou.util.ErrorMessage; 023 import org.opengion.fukurou.util.StringUtil; 024 import org.opengion.fukurou.util.Closer; 025 026 import oracle.jdbc.OracleTypes; 027 import oracle.jdbc.OracleCallableStatement; 028 029 import oracle.sql.ARRAY; 030 import oracle.sql.ArrayDescriptor; 031 032 import java.sql.Types; 033 import java.sql.Connection; 034 import java.sql.CallableStatement; 035 import java.sql.ResultSet; 036 import java.sql.SQLException; 037 038 import java.util.Map; 039 040 /** 041 * エントリ系 PL/SQL をコールして、結果カーソルから、DBTableModel を作?します? 042 * 043 * java.sql.CallableStatement を用?、データベ?ス検索処?行います? 044 * 引数を?列指定で渡すことが?来?エラー時には、DBErrMsg オブジェクトにエラー??? 045 * 格納して返すことが可能です? 046 * ?変数の受け渡し??ォルト実??、AbstractQuery クラスを継承して? 047 * ため,ここでは、execute() メソ?を実?て?す? 048 * こ?クラスでは、ス??トメント文?execute() する事により,??タベ?ス? 049 * 検索した結果?DBTableModel に割り当てます? 050 * 051 * @og.formSample 052 * 例:jsp/TYPESB/result.jsp (検索系?カーソル返し) 053 * 例:jsp/TYPE3B/entry.jsp (エントリ系) 054 * names には、ARG_ARRAY 配?に?セ?されます? 055 * 使用する場合?、?わかり??数に受けて利用してください? 056 * 呼び出?PL/SQL では、検索系PL/SQL です?(下記?例?、エントリ系) 057 * 058 * <og:query 059 * command = "NEW" 060 * names = "SYSTEM_ID,LANG,CLM,NAME_JA,LABEL_NAME,KBSAKU,USER.ID" 061 * queryType = "JDBCErrMsg" 062 * displayMsg = "" > 063 * {call TYPE3B01.TYPE3B01(?,?,?,?)} 064 * </og:query> 065 * 066 * CREATE OR REPLACE PACKAGE TYPE3B01 AS 067 * TYPE CUST_CURSOR IS REF CURSOR; 068 * PROCEDURE TYPE3B01( 069 * P_KEKKA OUT NUMBER, 070 * P_ERRMSGS OUT ERR_MSG_ARRAY, 071 * P_RC1 OUT CUST_CURSOR, 072 * P_ARGS IN ARG_ARRAY ); 073 * END; 074 * 075 * P_SYSTEM_ID GEA08.SYSTEM_ID%TYPE := P_ARGS(1); --シス??? 076 * P_LANG GEA08.LANG%TYPE := P_ARGS(2); --?? 077 * P_CLM GEA08.CLM%TYPE := P_ARGS(3); --? 078 * P_NAME_JA GEA08.NAME_JA%TYPE := P_ARGS(4); --名称(漢? 079 * P_LABEL_NAME GEA08.LABEL_NAME%TYPE := P_ARGS(5); --表示名称 080 * P_KBSAKU GEA08.KBSAKU%TYPE := P_ARGS(6); --作?区? 081 * P_USRSET GEA08.USRSET%TYPE := P_ARGS(7); --登録? 082 * 083 * @og.group ??タ表示 084 * @og.group ??タ編? 085 * 086 * @version 4.0 087 * @author Kazuhiko Hasegawa 088 * @since JDK5.0, 089 */ 090 public class Query_JDBCErrMsg extends AbstractQuery { 091 //* こ?プログラ??VERSION??を設定します? {@value} */ 092 private static final String VERSION = "4.0.0.0 (2005/08/31)" ; 093 094 /** 095 * クエリーを実行します? 096 * 実行方法等??ブクラスの実?依存します? 097 * セ?されて?ス??トメント文字?とそ?タイプが合って???合?, 098 * エラーになります? 099 * 実行結果は、DBTableModel にセ?されます? 100 * 実行結果の件数は #getExecuteCount() で取得できます? 101 * 102 */ 103 @Override 104 public void execute() { 105 execute( null ); 106 } 107 108 /** 109 * 引数配?付?クエリーを実行します? 110 * 処??体?, #execute() と同様に、各サブクラスの実?依存します? 111 * これは、CallableStatement を用?、データベ?ス検索処?行います? 112 * {call TYPE3B01.TYPE3B01(?,?,?,?)} で?番目の引数には? 113 * names で?したリクエスト情報が?ARG_ARRAY 配?に?セ?されます? 114 * 使用する場合?、?わかり??数に受けて利用してください? 115 * 呼び出?PL/SQL では、検索系PL/SQL です? 116 * 117 * @og.rev 2.3.1.3 (2003/01/28) Open Cursor が?大量に残る件の対応?ResultSet ?close() 118 * @og.rev 3.1.1.0 (2003/03/28) 同期メソ?(synchronized付き)を非同期に変更する? 119 * @og.rev 3.3.3.1 (2003/07/18) ??登録時?後ろスペ?スを削除する? 120 * @og.rev 3.5.2.0 (2003/10/20) ?オブジェクトタイプ名?シス?パラメータ で定義します? 121 * @og.rev 3.5.6.0 (2004/06/18) nullに対する無?比?削除します? 122 * @og.rev 3.8.0.8 (2005/10/03) エラーメ?ージの出力?をメ?ージ?Queryに変更します? 123 * 124 * @param args オブジェクト?引数配? 125 */ 126 @Override 127 public void execute( final String[] args ) { 128 CallableStatement callStmt = null ; 129 ResultSet resultSet = null ; 130 try { 131 Connection conn = getConnection(); 132 callStmt = getConnection().prepareCall( getStatement() ); 133 callStmt.setQueryTimeout( DB_MAX_QUERY_TIMEOUT ); 134 Map<String,Class<?>> map = conn.getTypeMap(); 135 map.put( ERR_MSG,DBErrMsg.class ); // 4.0.0 (2005/01/31) 136 137 ArrayDescriptor sd = ArrayDescriptor.createDescriptor( ARG_ARRAY, conn ); 138 ARRAY newArray = new ARRAY( sd,conn,StringUtil.rTrims( args ) ); 139 140 callStmt.registerOutParameter(1, Types.INTEGER); 141 callStmt.registerOutParameter(2, OracleTypes.ARRAY,ERR_MSG_ARRAY); 142 callStmt.registerOutParameter(3, OracleTypes.CURSOR); 143 ((OracleCallableStatement)callStmt).setARRAY( 4,newArray ); 144 145 callStmt.execute(); 146 147 int rtnCode = callStmt.getInt(1); 148 setErrorCode( rtnCode ); 149 if( rtnCode < ErrorMessage.NG ) { // 異常以外?場? 150 resultSet = ((OracleCallableStatement)callStmt).getCursor(3); 151 createTableModel( resultSet ); 152 } 153 if( rtnCode > ErrorMessage.OK ) { // 正常以外?場? 154 ARRAY rtn3 = ((OracleCallableStatement)callStmt).getARRAY(2); 155 Object[] rtnval3 = (Object[])rtn3.getArray(); 156 ErrorMessage errMessage = new ErrorMessage( "Query_JDBCErrMsg Error!!" ); 157 for( int i=0; i<rtnval3.length; i++ ) { 158 DBErrMsg er = (DBErrMsg)rtnval3[i]; 159 if( er == null ) { break; } 160 errMessage.addMessage( er.getErrMsg() ); 161 } 162 setErrorMessage( errMessage ); 163 } 164 } 165 catch (SQLException ex) { 166 setErrorCode( ErrorMessage.EXCEPTION ); 167 String errMsg = ex.getMessage() + ":" + ex.getSQLState() + HybsSystem.CR 168 + getStatement() + HybsSystem.CR; 169 rollback(); 170 realClose(); 171 throw new HybsSystemException( errMsg,ex ); // 3.5.5.4 (2004/04/15) 引数の並び?更 172 } 173 finally { 174 Closer.resultClose( resultSet ); 175 Closer.stmtClose( callStmt ); 176 } 177 } 178 }