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    }