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 */
016package org.opengion.hayabusa.taglib;
017
018import org.opengion.hayabusa.common.HybsSystem;
019import org.opengion.hayabusa.common.HybsSystemException;
020import org.opengion.hayabusa.db.DBTableModel;
021import org.opengion.hayabusa.db.Query;
022import org.opengion.hayabusa.db.DBSysArg;
023import org.opengion.hayabusa.db.DBUserArg;
024import org.opengion.hayabusa.resource.GUIInfo;
025import org.opengion.fukurou.system.DateSet;                                             // 6.4.2.0 (2016/01/29)
026import org.opengion.fukurou.util.ErrorMessage;
027import org.opengion.fukurou.util.StringUtil ;
028import org.opengion.fukurou.util.ToString;                                              // 6.1.1.0 (2015/01/17)
029import org.opengion.fukurou.util.ArraySet;                                              // 6.4.3.4 (2016/03/11)
030
031import static org.opengion.fukurou.util.StringUtil.nval ;
032import static org.opengion.fukurou.system.HybsConst.BR;                 // 6.1.0.0 (2014/12/26) refactoring
033
034import java.util.Set;                                                                                   // 6.4.3.4 (2016/03/11)
035
036/**
037 * PLSQLをCALLしてデータベースにアクセスするタグです。
038 * queryType = "JDBCPLSQL" が、標準で用意されています。
039 * queryType と 実際のJavaクラスとの関連付けは、システムリソースの Query_JDBCPLSQL 属性です。
040 *
041 * DBTableModel内のデータを 配列でPL/SQLに渡してDB登録します。
042 *
043 * ※ このタグは、Transaction タグの対象です。
044 *
045 * @og.formSample
046 * ●形式:<og:plsqlUpdate command="…" names="…" dbType="…" queryType="JDBCPLSQL" >{plsql(?,?,?,?,?)} <og:plsqlUpdate>
047 * ●body:あり(EVAL_BODY_BUFFERED:BODYを評価し、{@XXXX} を解析します)
048 *
049 * ●Tag定義:
050 *   <og:plsqlUpdate
051 *       queryType          【TAG】Query を発行する為のクラスIDを指定します({@og.doc03Link queryType 初期値:JDBCPLSQL})
052 *       command            【TAG】コマンド (NEW,RENEW)をセットします(PlsqlUpdateTag,UpdateTag の場合は、ENTRY)
053 *       scope              【TAG】キャッシュする場合のスコープ[request/page/session/application]を指定します(初期値:session)
054 *       maxRowCount        【TAG】(通常は使いません)データの最大読み込み件数を指定します (初期値:DB_MAX_ROW_COUNT[=1000])(0:[無制限])
055 *       skipRowCount       【TAG】(通常は使いません)データの読み始めの初期値を指定します
056 *       notfoundMsg        【TAG】検索結果がゼロ件の場合に表示するメッセージリソースIDを指定します(初期値:MSG0077[対象データはありませんでした])
057 *       names              【TAG】PL/SQLを利用する場合の引数にセットすべき データの名称をCSV形式で複数指定します
058 *       dbType             【TAG】Queryオブジェクトに渡す引数のタイプ定義(例:type名_ARRAY)
059 *       selectedAll        【TAG】データを全件選択済みとして処理するかどうか[true/false]を指定します(初期値:false)
060 *       tableId            【TAG】(通常は使いません)結果のDBTableModelを、sessionに登録するときのキーを指定します
061 *       dbid               【TAG】(通常は使いません)Queryオブジェクトを作成する時のDB接続IDを指定します
062 *       stopError          【TAG】PLSQL/SQL処理エラーの時に処理を中止するかどうか[true/false]を設定します(初期値:true)
063 *       dispError                      【TAG】エラー時にメッセージを表示するか[true/false]を設定します。通常はstopErrorと併用(初期値:true)
064 *       tableModelCommit   【TAG】テーブルモデルの確定処理を行うかどうか[true/false]を設定します(初期値:true)
065 *       useTimeView        【TAG】処理時間を表示する TimeView を表示するかどうかを指定します
066 *                                                                              (初期値:VIEW_USE_TIMEBAR[={@og.value SystemData#VIEW_USE_TIMEBAR}])。
067 *       caseKey            【TAG】このタグ自体を利用するかどうかの条件キーを指定します(初期値:null)
068 *       caseVal            【TAG】このタグ自体を利用するかどうかの条件値を指定します(初期値:null)
069 *       caseNN             【TAG】指定の値が、null/ゼロ文字列 でない場合(Not Null=NN)は、このタグは使用されます(初期値:判定しない)
070 *       caseNull           【TAG】指定の値が、null/ゼロ文字列 の場合は、このタグは使用されます(初期値:判定しない)
071 *       caseIf             【TAG】指定の値が、true/TRUE文字列の場合は、このタグは使用されます(初期値:判定しない)
072 *       debug              【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false)
073 *   >   ... Body ...
074 *   </og:plsqlUpdate>
075 *
076 * ●使用例
077 *    ・引数/プロシジャーを他のJSPから渡す場合
078 *    【copy.jsp】
079 *        <og:hidden name="names" value="UNIQ,USRID,ECNO,EDBN" />
080 *        <og:hidden name="SQL" value="{ call RKP0271E.RK0271E( ?,?,?,?,? ) }" />
081 *    【entry.jsp】
082 *        <og:plsqlUpdate
083 *            command    = "{@command}"
084 *            names      = "{@names}"         →PL/SQLに渡す引数(配列)のカラム名
085 *            dbType     = "RK0271ARG"             →PL/SQLに渡す引数(配列)の定義ファイル名
086 *            queryType  = "JDBCPLSQL" >
087 *        {@SQL}                              →CALLするPL/SQL
088 *        </og:plsqlUpdate>
089 *
090 *    ・引数/プロシジャーを直接書く場合
091 *    【entry.jsp】
092 *        <og:plsqlUpdate
093 *            command    = "{@command}"
094 *            names      = "UNIQ,USRID,ECNO,EDBN"  →PL/SQLに渡す引数(配列)のカラム名
095 *            dbType     = "RK0271ARG"             →PL/SQLに渡す引数(配列)の定義ファイル名
096 *            queryType  = "JDBCPLSQL" >
097 *        { call RKP0271E.RK0271E( ?,?,?,?,? )}    →CALLするPL/SQL
098 *        </og:plsqlUpdate>
099 *
100 *    <<参考>>
101 *    ・RKP0271E.RK0271E( ?,?,?,?,? )の「?」の意味
102 *        (RKP0271E.spc)------------------------------------------------------------
103 *        CREATE OR REPLACE PACKAGE RKP0271E AS
104 *        PROCEDURE RK0271E(
105 *             P_KEKKA    OUT    NUMBER           -- 1個目の「?」⇒結果 0:正常 1:警告 2:異常
106 *            ,P_ERRMSGS  OUT    ERR_MSG_ARRAY    -- 2個目の「?」⇒エラーメッセージ配列
107 *            ,P_NAMES     IN    VARCHAR2         -- 3個目の「?」⇒カラム名チェック用文字列
108 *            ,P_SYSARGS   IN    SYSARG_ARRAY     -- 4個目の「?」⇒登録条件配列(改廃(A:追加/C:変更/D:削除)等がセットされます)
109 *            ,P_RK0271    IN    RK0271ARG_ARRAY  -- 5個目の「?」⇒登録データ配列
110 *
111 *    ・RK0271ARGの定義の仕方
112 *        (RK0271ARG.sql)------------------------------------------------------------
113 *        DROP TYPE RK0271ARG_ARRAY;
114 *        CREATE OR REPLACE TYPE RK0271ARG AS OBJECT
115 *        (
116 *             UNIQ                VARCHAR2(11)
117 *            ,USRID               VARCHAR2(5)
118 *            ,ECNO                VARCHAR(7)
119 *            ,EDBN                VARCHAR(2)
120 *        ) ;
121 *        /
122 *        CREATE OR REPLACE TYPE RK0271ARG_ARRAY AS VARRAY(100) OF RK0271ARG;
123 *        /
124 *
125 * @og.group DB登録
126 *
127 * @version  4.0
128 * @author   Kazuhiko Hasegawa
129 * @since    JDK5.0,
130 */
131public class PlsqlUpdateTag extends QueryTag {
132        /** このプログラムのVERSION文字列を設定します。   {@value} */
133        private static final String VERSION = "6.9.9.0 (2018/08/20)" ;
134        private static final long serialVersionUID = 699020180820L ;
135
136        /** command 引数に渡す事の出来る コマンド  登録{@value} */
137        public static final String CMD_ENTRY  = "ENTRY" ;
138        // 6.4.3.4 (2016/03/11) String配列 から、Setに置き換えます。
139        private static final Set<String> COMMAND_SET = new ArraySet<>( CMD_ENTRY );
140
141        /** 引数のタイプ定義  */
142        protected String  userDBType    ;
143
144        // 3.5.2.0 (2003/10/20) 内部オブジェクトタイプ名を システムパラメータ で定義します。
145        private static final String SYSARG = "SYSARG";
146        private boolean selectedAll     ;
147
148        private boolean isCommit        = true;                 // 5.5.5.2 (2012/08/10) 6.0.2.5 (2014/10/31) refactoring
149
150        /**
151         * デフォルトコンストラクター
152         *
153         * @og.rev 6.4.2.0 (2016/01/29) PMD refactoring. Each class should declare at least one constructor.
154         */
155        public PlsqlUpdateTag() { super(); }            // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。
156
157        /**
158         * Taglibの開始タグが見つかったときに処理する doStartTag() を オーバーライドします。
159         *
160         * @og.rev 6.3.4.0 (2015/08/01) caseKey,caseVal,caseNN,caseNull,caseIf 属性対応
161         * @og.rev 6.4.3.4 (2016/03/11) String配列 から、Setに置き換えます。
162         *
163         * @return      後続処理の指示
164         */
165        @Override
166        public int doStartTag() {
167                if( !useTag() ) { return SKIP_BODY ; }  // 6.3.4.0 (2015/08/01)
168
169                dyStart = System.currentTimeMillis();
170
171                table = (DBTableModel)getObject( tableId );
172                if( table == null || table.getRowCount() == 0 ||
173                        ! check( command, COMMAND_SET ) ) { return SKIP_BODY ; }
174
175                startQueryTransaction( tableId );               // 3.6.0.8 (2004/11/19)
176                return EVAL_BODY_BUFFERED ;     // Body を評価する。( extends BodyTagSupport 時)
177        }
178
179        /**
180         * Taglibの終了タグが見つかったときに処理する doEndTag() を オーバーライドします。
181         *
182         * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。release2() を doEndTag()で呼ぶ。
183         * @og.rev 3.5.5.2 (2004/04/02) TaglibUtil.makeHTMLErrorTable メソッドを利用
184         * @og.rev 3.6.0.8 (2004/11/19) DBTableModel をセーブする時に、トランザクションチェックを行います。
185         * @og.rev 3.6.1.0 (2005/01/05) オーバーフロー時と登録件数の表示をコメントします。
186         * @og.rev 4.3.3.0 (2008/09/22) 検索結果を、"DB.ERR_CODE" キーでリクエストにセットする。
187         * @og.rev 4.3.3.0 (2008/09/22) 属性 stopError の設定により、JSP処理を中止するかどうかを制御します。
188         * @og.rev 4.3.5.7 (2009/03/22) アクセスカウント不具合対応
189         * @og.rev 6.3.4.0 (2015/08/01) caseKey,caseVal,caseNN,caseNull,caseIf 属性対応
190         * @og.rev 6.4.1.2 (2016/01/22) QueryTag.errMsgId  → QueryTag.ERR_MSG_ID  refactoring
191         * @og.rev 6.4.3.4 (2016/03/11) String配列 から、Setに置き換えます。
192         * @og.rev 5.9.26.1 (2017/11/10) dispError対応
193         * @og.rev 6.9.9.0 (2018/08/20) 「ERR0041:検索処理中に割り込みの検索要求がありました」エラーを、標準のErrorMessageに追加するようにします。
194         *
195         * @return      後続処理の指示
196         */
197        @Override
198        public int doEndTag() {
199                debugPrint();           // 4.0.0 (2005/02/28)
200                if( !useTag() ) { return EVAL_PAGE ; }  // 6.3.4.0 (2015/08/01)
201
202                String label = BR;                              // 検索しなかった場合。
203                if( check( command, COMMAND_SET ) ) {
204                        // 6.9.9.0 (2018/08/20) 「ERR0041:検索処理中に割り込みの検索要求がありました」エラーを、標準のErrorMessageに追加するようにします。
205                        if( table != null && ! commitTableObject( tableId, table ) ) {
206                                if( errMessage == null ) { errMessage = new ErrorMessage( "PlsqlUpdateTag Query Error!" ); }
207                                // ERR0041:検索処理中に割り込みの検索要求がありました。処理されません。
208                                errMessage.addMessage( 0,ErrorMessage.NG,"ERR0041" );   
209                                errCode = ErrorMessage.NG;
210                        }
211
212                        // 3.5.5.2 (2004/04/02) TaglibUtil.makeHTMLErrorTable メソッドを利用
213                        final String err = TaglibUtil.makeHTMLErrorTable( errMessage,getResource() );
214                        if( err != null && err.length() > 0 ) {
215                                if( errCode >= ErrorMessage.NG ) {              // 異常の場合
216                                        label = err;
217                                }
218                                // 6.4.1.2 (2016/01/22) QueryTag.errMsgId  → QueryTag.ERR_MSG_ID  refactoring
219                                setSessionAttribute( ERR_MSG_ID,errMessage );
220                        }
221                        else {
222                                // 6.4.1.2 (2016/01/22) QueryTag.errMsgId  → QueryTag.ERR_MSG_ID  refactoring
223                                removeSessionAttribute( ERR_MSG_ID );
224                        }
225                        // 4.3.3.0 (2008/09/22) 検索結果を、"DB.ERR_CODE" キーでリクエストにセットする。
226                        setRequestAttribute( "DB.ERR_CODE", String.valueOf( errCode ) );
227                        // 5.9.26.1 (2017/11/10) エラーメッセージをリクエスト変数で持つようにしておく
228                        setRequestAttribute( "DB.ERR_MSG", label );
229
230//                      // 6.9.9.0 (2018/08/20) 「ERR0041:検索処理中に割り込みの検索要求がありました」エラーを、標準のErrorMessageに追加するようにします。
231//                      // 3.6.0.8 (2004/11/19) トランザクションチェックを行います。
232//                      // 4.0.0.0 (2007/11/29) 入れ子if の統合
233//                      if( table != null && ! commitTableObject( tableId, table ) ) {
234//                              jspPrint( "PlsqlUpdateTag Query処理が割り込まれました。DBTableModel は登録しません。" );
235//                              return SKIP_PAGE;
236//                      }
237                }
238
239                // 5.9.26.1 (2017/11/10) dispErrorで表示をコントロール
240                if( dispError ) {
241                        jspPrint( label );
242                }
243
244                // 4.0.0 (2005/01/31) 処理時間集計
245                final long dyTime = System.currentTimeMillis()-dyStart;
246
247                // 4.0.0 (2005/01/31) セキュリティチェック(データアクセス件数登録)
248                final GUIInfo guiInfo = (GUIInfo) getSessionAttribute( HybsSystem.GUIINFO_KEY );
249                executeCount = getParameterRows().length ; // 4.3.5.7 (2009/03/16) アクセス件数不具合対応。チェック行と仮定
250                if( guiInfo != null ) { guiInfo.addWriteCount( executeCount,dyTime,sql ); }
251
252                // 4.3.3.0 (2008/09/22) 属性 stopError の設定により、処理を中止するかを判断します。
253                return errCode >= ErrorMessage.NG && stopError ? SKIP_PAGE : EVAL_PAGE ;                // 6.4.2.1 (2016/02/05) PMD refactoring. Useless parentheses.
254        }
255
256        /**
257         * タグリブオブジェクトをリリースします。
258         * キャッシュされて再利用されるので、フィールドの初期設定を行います。
259         *
260         * @og.rev 2.0.0.4 (2002/09/27) カスタムタグの release() メソッドを、追加
261         * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。release2() を doEndTag()で呼ぶ。
262         * @og.rev 3.5.2.0 (2003/10/20) sysDBType 廃止。SYSARG は、システムパラメータ で定義します。
263         * @og.rev 5.5.5.2 (2012/08/10) isTableModelCommit追加
264         *
265         */
266        @Override
267        protected void release2() {
268                super.release2();
269                userDBType      = null;
270                selectedAll     = false;
271                isCommit        = true;                 // 5.5.5.2 (2012/08/10) 6.0.2.5 (2014/10/31) refactoring
272        }
273
274        /**
275         * Query を実行します。
276         *
277         * @og.rev 2.1.2.3 (2002/12/02) データベース更新時に、更新フラグをセットするように変更
278         * @og.rev 3.5.0.0 (2003/09/17) カラム名ではなく、カラム番号を先に求めておく方式に変更。
279         * @og.rev 3.5.2.0 (2003/10/20) 内部オブジェクトタイプ名を システムパラメータ で定義します。
280         * @og.rev 3.5.4.2 (2003/12/15) HTMLTableViewForm クラス名変更(⇒ ViewForm_HTMLTable)
281         * @og.rev 3.5.6.0 (2004/06/18) DBRowHeader のパッケージプライベート化に伴なう変更
282         * @og.rev 4.0.0.0 (2005/01/31) setArguments 廃止、Query#execute に、引数をすべて追加
283         * @og.rev 4.3.0.0 (2008/07/22) DBSysArgの引数に日付、PG、ユーザーIDを追加
284         * @og.rev 5.5.5.2 (2012/08/10) isTableModelCommitによるテーブルモデル確定処理のコントロール
285         * @og.rev 6.4.2.0 (2016/01/29) DateSet.getDate( String ) を利用するように修正します。
286         *
287         * @param   query オブジェクト
288         */
289        @Override
290        protected void execute( final Query query ) {
291                        if( names == null ) {
292                                final String errMsg = "names 属性が、設定されていません。" + CR
293                                                        + sql + CR ;
294                                throw new HybsSystemException( errMsg );                // 3.5.5.4 (2004/04/15) 引数の並び順変更
295                        }
296                        else {
297                                final int[] rowNo = getParameterRows();
298                                final int rowCount = rowNo.length ;
299                                if( rowCount > 0 ) {
300                                        final String[] nameArray = StringUtil.csv2Array( names );
301                                        final int[]    clmNo     = getTableColumnNo( nameArray );               // 3.5.0.0
302
303                                        final String curdate = DateSet.getDate( "yyyyMMddHHmmss" );             // 6.4.2.0 (2016/01/29)
304                                        final String pgid = getGUIInfoAttri( "KEY" );                                           // 4.3.0.0
305                                        final String userid = getUser().getAttribute( "ID" );                           // 4.3.0.0
306
307                                        DBSysArg[]  sysArg  = new DBSysArg[rowCount];
308                                        DBUserArg[] userArg = new DBUserArg[rowCount];
309                                        for( int i=0; i<rowCount; i++ ) {
310                                                final int    row  = rowNo[i];
311                                                final String cdkh = table.getModifyType( row );
312                                                sysArg[i]  = new DBSysArg( SYSARG,row,cdkh,curdate,pgid,userid );
313                                                final String[] values = getTableModelData( clmNo,row ); // 3.5.0.0
314                                                userArg[i] = new DBUserArg( userDBType,nameArray,values );
315                                        }
316                                        query.execute( names,userDBType + "_ARRAY",sysArg,userArg );
317                                        errCode    = query.getErrorCode();
318                                        errMessage = query.getErrorMessage();
319
320                                        // 6.9.7.0 (2018/05/14) PMD These nested if statements could be combined
321//                                      if( errCode < ErrorMessage.NG ) {               // 異常以外の場合
322//                                              if( isCommit ) {                        // 5.5.5.2 (2012/08/10)  6.0.2.5 (2014/10/31) refactoring
323                                        if( errCode < ErrorMessage.NG && isCommit) {            // 異常以外の場合
324                                                        for( int j=rowCount-1; j>=0; j-- ) {
325                                                                final int row = rowNo[j];
326                                                                if( DBTableModel.DELETE_TYPE.equals( table.getModifyType( row ) ) ) {
327                                                                        table.removeValue( row );
328                                                                }
329                                                                else {
330                                                                        table.resetModify( row );
331                                                                }
332                                                        }
333//                                              }
334                                        }
335                                }
336                        }
337        }
338
339        /**
340         *  カラム名配列(String[])より、対応するカラムNo配列(int[])を作成します。
341         *
342         * @og.rev 3.5.0.0 (2003/09/17) 新規追加
343         *
344         * @param       nameArray カラム名配列(可変長引数)
345         *
346         * @return      カラムNo配列
347         */
348        private int[] getTableColumnNo( final String... nameArray ) {
349                int[] clmNo = new int[ nameArray.length ];
350                for( int i=0; i<clmNo.length; i++ ) {
351                        clmNo[i] = table.getColumnNo( nameArray[i] );
352                }
353                return clmNo;
354        }
355
356        /**
357         *  指定の行番号の、カラムNo配列(int[])に対応した値の配列を返します。
358         *
359         * 表示データの HybsSystem.ROW_SEL_KEY を元に、選ばれた 行を
360         * 処理の対象とします。
361         *
362         * @og.rev 3.5.0.0 (2003/09/17) カラム名ではなく、カラム番号を受け取るように修正。
363         *
364         * @param       clmNo カラムNo配列
365         * @param       row   行番号
366         *
367         * @return      行番号とカラムNo配列に対応した、値の配列
368         */
369        private String[] getTableModelData( final int[] clmNo,final int row ) {
370                String[] values = new String[ clmNo.length ];
371                for( int i=0; i<values.length; i++ ) {
372                        values[i] = table.getValue( row,clmNo[i] ) ;
373                        // NUMBER タイプのキャストエラーを防ぐ為の対応
374                        if( values[i] != null && values[i].isEmpty() ) { values[i] = null; }
375                }
376                return values;
377        }
378
379        /**
380         * 表示データの HybsSystem.ROW_SEL_KEY を元に、選ばれた 行を処理の対象とします。
381         *
382         * @og.rev 4.0.0.0 (2005/01/31) getParameterRows() を使用するように変更
383         *
384         * @return      選択行の配列
385         * @og.rtnNotNull
386         */
387        @Override
388        protected int[] getParameterRows() {
389                final int[] rowNo ;
390                if( selectedAll ) {
391                        final int rowCnt = table.getRowCount();         // 3.5.5.7 (2004/05/10)
392                        rowNo = new int[ rowCnt ];
393                        for( int i=0; i<rowCnt; i++ ) {
394                                rowNo[i] = i;
395                        }
396                } else {
397                        rowNo = super.getParameterRows();               // 4.0.0 (2005/01/31)
398                }
399                return rowNo ;
400        }
401
402        /**
403         * 【TAG】Queryオブジェクトに渡す引数のタイプ定義(例:type名_ARRAY)。
404         *
405         * @og.tag
406         * ここでは、type 定義のPL/SQL名を指定します。
407         * 行を表す配列は、type名_ARRAY という名称です。
408         *
409         * @param  type 定義のPL/SQL名
410         */
411        public void setDbType( final String type ) {
412                userDBType = getRequestParameter( type );
413        }
414
415        /**
416         * 【TAG】データを全件選択済みとして処理するかどうか[true/false]を指定します(初期値:false)。
417         *
418         * @og.tag
419         * 全てのデータを選択済みデータとして扱って処理します。
420         * 全件処理する場合に、(true/false)を指定します。
421         * 初期値は false です。
422         *
423         * @param  all データを全件選択済み [true:全件選択済み/false:通常]
424         */
425        public void setSelectedAll( final String all ) {
426                selectedAll = nval( getRequestParameter( all ),selectedAll );
427        }
428
429        /**
430         * 【TAG】Query を発行する為のクラスIDを指定します({@og.doc03Link queryType 初期値:JDBCPLSQL})。
431         *
432         * @og.tag
433         * 引数指定のINSERT/UPDATE文を実行する場合の、queryType 属性を使用します。
434         * このタグでは、execute( String ,String , DBSysArg[] , DBUserArg[] )を実行します。
435         * 代表的なクラスとして、"JDBCPLSQL" が標準で用意されています。
436         *
437         * タグにより使用できる/出来ないがありますが、これは、org.opengion.hayabusa.db
438         * 以下の Query_**** クラスの **** を与えます。
439         * これらは、Query インターフェースを継承したサブクラスです。
440         * {@og.doc03Link queryType Query_**** クラス}
441         *
442         * @og.rev 3.5.4.2 (2003/12/15) JavaDocコメント用にメソッド追加。
443         *
444         * @param       id Queryを発行する為の実クラスID
445         * @see         org.opengion.hayabusa.db.Query  Queryのサブクラス
446         * @see         org.opengion.hayabusa.db.Query#execute( String ,String , DBSysArg[] , DBUserArg[] )
447         */
448        @Override
449        public void setQueryType( final String id ) {
450                super.setQueryType( nval( id,"JDBCPLSQL" ) );
451        }
452
453        /**
454         * 【TAG】テーブルモデルに対する確定処理を行うかどうかを指定します(初期値:true)。
455         *
456         * @og.tag
457         * PlsqlUpdateタグで、エラーがなかった場合は通常、テーブルモデルの改廃に従って処理が行われます。
458         * (改廃Dについては削除処理を行い、その他については改廃を元に戻す)
459         *
460         * このパラメータをfalseに指定すると、テーブルモデルに対する処理を行いません。
461         * これは、例えばPL/SQLでエラーチェックのみを行いたい場合に有効です。
462         * 初期値はtrue(処理を行う)です。
463         *
464         * @og.rev 5.5.5.2 (2012/08/10) 新規作成
465         *
466         * @param  flag テーブルモデルの確定処理 [true:する/false:しない]
467         */
468        public void setTableModelCommit( final String flag ) {
469                isCommit = nval( getRequestParameter( flag ),isCommit );                // 6.0.2.5 (2014/10/31) refactoring
470        }
471
472        /**
473         * このオブジェクトの文字列表現を返します。
474         * 基本的にデバッグ目的に使用します。
475         *
476         * @return このクラスの文字列表現
477         * @og.rtnNotNull
478         */
479        @Override
480        public String toString() {
481                return ToString.title( this.getClass().getName() )
482                                .println( "VERSION"             ,VERSION        )
483                                .println( "selectedAll" ,selectedAll    )
484                                .fixForm().toString()
485                        + CR
486                        + super.toString() ;
487        }
488}