    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.plugin.table;
    017
    018import java.io.File;
    019import java.io.PrintWriter;
    020import java.util.Locale;
    021
    022import org.opengion.fukurou.system.OgBuilder ;                          // 6.4.4.1 (2016/03/18)
    023import org.opengion.fukurou.db.DBUtil;
    024import org.opengion.fukurou.db.Transaction;                                     // 5.5.2.6 (2012/05/25)
    025import org.opengion.fukurou.util.ErrorMessage;
    026import org.opengion.fukurou.util.FileUtil;
    027import org.opengion.fukurou.util.FixLengthData;
    028import org.opengion.fukurou.util.StringUtil;
    029import org.opengion.hayabusa.common.HybsSystem;
    030import org.opengion.hayabusa.common.HybsSystemException;
    031import org.opengion.hayabusa.db.AbstractTableFilter;
    032import org.opengion.hayabusa.db.DBTableModel;
    033
    034/**
    035 * TableFilter_TABLE は、TableFilter インターフェースを継承した、DBTableModel 処理用の
    036 * 実装クラスです。
    037 *
    038 * ここでは、テーブル一覧の検索結果より、GF05 のテーブルカラム定義テーブルから
    039 * 必要な情報を取得し、テーブル作成スクリプトを作成します。
    040 * 出力ファイルは、テーブル名＋"S.sql" という命名規則で作成します。
    041 * 検索では、(SYSTEM_ID,TBLSYU,TABLE_NAME,NAME_JA,TABLESPACE_NAME,INITIAL_EXTENT,COMMENTS)
    042 * の項目を取得する必要があります。
    043 *
    044 * 6.1.0.0 (2014/12/26) より、NEXT_EXTENT は使用しなくなりました。
    045 *
    046 * パラメータは、tableFilterタグの keys, vals にそれぞれ記述するか、BODY 部にCSS形式で記述します。
    047 * 【パラメータ】
    048 *  {
    049 *       DIR : {&#064;BASE_DIR}/sql/install/01_TABLE ;    出力ファイルの基準フォルダ(必須)
    050 *       XML : false ;                                    XML出力を行うかどうか[true/false]を指定します(初期値:false)。
    051 *  }
    052 *
    053 * @og.formSample
    054 * ●形式：
    055 *      select SYSTEM_ID,TBLSYU,TABLE_NAME,NAME_JA,TABLESPACE_NAME,INITIAL_EXTENT,COMMENTS from GF02
    056 *
    057 *      ① &lt;og:tableFilter classId="TABLE" keys="DIR,XML" vals='"{&#064;BASE_DIR}/sql/install/01_TABLE,"' /&gt;
    058 *
    059 *      ② &lt;og:tableFilter classId="TABLE" &gt;
    060 *               {
    061 *                   DIR : {&#064;BASE_DIR}/sql/install/01_TABLE ;
    062 *                   XML : false ;
    063 *               }
    064 *         &lt;/og:tableFilter&gt;
    065 *
    066 * @og.rev 4.0.0.0 (2005/08/31) 新規作成
    067 * @og.rev 5.6.6.0 (2013/07/05) keys の整合性チェックを追加
    068 * @og.rev 8.1.0.3 (2022/01/21) TableFilter_TABLE のORACLE部分をTableFilter_TABLE_ORACLEに移動する。
    069 *
    070 * @version  0.9.0  2000/10/17
    071 * @author   Kazuhiko Hasegawa
    072 * @since    JDK1.1,
    073 */
    074public class TableFilter_TABLE extends AbstractTableFilter {
    075        /** このプログラムのVERSION文字列を設定します。   {@value} */
    076        private static final String VERSION = "8.1.0.3 (2022/01/21)" ;
    077
    078        // 6.1.0.0 (2014/12/26) NEXT_EXTENT は、使いません。
    079        private static final String[] DBKEY = {"SYSTEM_ID","TBLSYU","TABLE_NAME","NAME_JA",
    080                                                        "TABLESPACE_NAME","INITIAL_EXTENT","COMMENTS" };
    081
    082        // 5.1.1.0 (2009/12/01) データのアクセス用の配列番号のIDを private ⇒ protected にします。
    083        /** データのアクセス用の配列番号 {@value} */
    084        protected static final int SYSTEM_ID            = 0;
    085        /** データのアクセス用の配列番号 {@value} */
    086        protected static final int TBLSYU                       = 1;
    087        /** データのアクセス用の配列番号 {@value} */
    088        protected static final int TABLE_NAME           = 2;
    089        /** データのアクセス用の配列番号 {@value} */
    090        protected static final int NAME_JA                      = 3;
    091        /** データのアクセス用の配列番号 {@value} */
    092        protected static final int TABLESPACE_NAME      = 4;
    093        /** データのアクセス用の配列番号 {@value} */
    094        protected static final int INITIAL_EXTENT       = 5;
    095        /** データのアクセス用の配列番号 {@value} */
    096        protected static final int COMMENTS                     = 6;            // 6.1.0.0 (2014/12/26) NEXT_EXTENT は、使いません。
    097
    098        private static final String GF05_SEL = "SELECT CLM,SEQNO,NAME_JA,CLS_NAME,USE_LENGTH,DATA_DEFAULT,NOT_NULL,'' AS OPTS"
    099                                                                                        + " FROM GF05"
    100                                                                                        + " WHERE SYSTEM_ID=? AND TBLSYU=? AND TABLE_NAME=?"
    101                                                                                        + " AND   FGJ='1'"
    102                                                                                        + " ORDER BY SEQNO" ;
    103
    104        /** データのアクセス用の配列番号 {@value} */
    105        protected static final int GF05_CLM                     = 0;
    106        /** データのアクセス用の配列番号 {@value} */
    107        protected static final int GF05_SEQNO           = 1;
    108        /** データのアクセス用の配列番号 {@value} */
    109        protected static final int GF05_NAME_JA         = 2;
    110        /** データのアクセス用の配列番号 {@value} */
    111        protected static final int GF05_CLS_NAME        = 3;
    112        /** データのアクセス用の配列番号 {@value} */
    113        protected static final int GF05_USE_LENGTH      = 4;
    114        /** データのアクセス用の配列番号 {@value} */
    115        protected static final int GF05_DATA_DEFAULT= 5;
    116        /** データのアクセス用の配列番号 {@value} */
    117        protected static final int GF05_NOT_NULL        = 6;
    118        /** データのアクセス用の配列番号 {@value} */
    119        protected static final int GF05_OPTIONS         = 7;
    120
    121 //     private static final String ENCODE = "Windows-31J" ;
    122        private static final String ENCODE = "UTF-8" ; // 4.3.6.6 (2009/05/15)
    123
    124        private static final String CMNT  = "************************************************************************" ;
    125
    126        private static final int X = FixLengthData.X ;          // type 定数
    127        private static final int S = FixLengthData.S ;          // type 定数
    128        private static final int K = FixLengthData.K ;          // type 定数
    129        private static final int T = FixLengthData.T ;          // addLen 定数
    130        private static final int T2= FixLengthData.T2 ;         // addLen 定数
    131
    132        /** 各種定数 */
    133        // 6.0.2.3 (2014/10/10) AbstractTableFilter へ移動
    134
    135        /** XML形式かどうか */
    136
    137        /**
    138         * デフォルトコンストラクター
    139         *
    140         * @og.rev 6.4.1.1 (2016/01/16) keysMap を、サブクラスから設定させるように変更。
    141         */
    142        public TableFilter_TABLE() {
    143                super();
    144                initSet( "DIR"  , "出力ファイルの基準フォルダ(必須)"                                           );
    145                initSet( "XML"  , "XML出力を行うかどうか[true/false]を指定(初期値:false)"      );
    146        }
    147
    148        /**
    149         * DBTableModel処理を実行します。
    150         *
    151         * @og.rev 3.8.7.0 (2006/12/15) アクセスログ取得の為、ApplicationInfoオブジェクトを設定
    152         * @og.rev 4.0.0.0 (2007/11/28) メソッドの戻り値をチェックします。
    153         * @og.rev 4.3.7.0 (2009/06/01) トリガー、SEQUENCE作成機能、XML出力機能追加
    154         * @og.rev 5.1.1.0 (2009/12/01) XML_START_TAG に、tableName をセットします。
    155         * @og.rev 5.1.9.0 (2010/08/01) Transaction 対応
    156         * @og.rev 5.5.2.6 (2012/05/25) protected変数を、private化したため、getterメソッドで取得するように変更
    157         * @og.rev 5.6.6.0 (2013/07/05) FixLengthData の簡易コンストラクタを使用
    158         * @og.rev 6.0.2.3 (2014/10/10) isXml で、CR + EXEC_END_TAG のキャッシュを作成します。
    159         * @og.rev 6.3.7.0 (2015/09/04) AutoCloseableを使用したtry-with-resources構築に対応。
    160         * @og.rev 6.5.0.1 (2016/10/21) ErrorMessage をまとめるのと、直接 Throwable を渡します。
    161         * @og.rev 8.1.0.3 (2022/01/21) 引数にtableNameを渡すように変更。
    162         *
    163         * @return      実行結果のテーブルモデル
    164         */
    165        public DBTableModel execute() {
    166                isXml = StringUtil.nval( getValue( "XML" ), false );
    167
    168//              execEndTag = isXml ? CR + EXEC_END_TAG : ";" ;                  // 6.0.2.3 (2014/10/10)
    169                execEndTag = isXml ? ";" + CR + EXEC_END_TAG : ";" ;    // 8.1.0.3 (2022/01/21) 『;』と改行を追加
    170
    171                final File dir = new File( getValue( "DIR" ) );
    172                if( ! dir.exists() && ! dir.mkdirs() ) {
    173                        final String errMsg = "所定のフォルダが作成できませんでした。[" + dir + "]" ;
    174                        // 4.3.4.4 (2009/01/01)
    175                        throw new HybsSystemException( errMsg );
    176                }
    177
    178                // カンマ,カラム,クラス,(,桁数,),初期値,NOT_NULL,拡張機能,コメント開始,行番号,名称,コメント終了
    179                final int[] addLen = new int[] { 0,T,0,0,0,T2,T,T,T2,0,1,T,0 }; // 各データ間のスペース
    180                final int[] type   = new int[] { X,X,X,X,S,X, X,X,X, X,S,K,X }; // 各データの種別 X:半角 S:空白前埋め K:全角混在
    181                final FixLengthData fixData = new FixLengthData( addLen,type );
    182
    183                // 6.4.1.1 (2016/01/16) PMD refactoring. Avoid declaring a variable if it is unreferenced before a possible exit point.
    184                final DBTableModel table = getDBTableModel();           // 5.5.2.6 (2012/05/25) インターフェースにgetterメソッド追加
    185                final Transaction tran = getTransaction();      // 5.5.2.6 (2012/05/25)
    186                final int[] clmNo = getTableColumnNo( DBKEY );
    187                final int rowCnt  = table.getRowCount();
    188                for( int row=0; row<rowCnt; row++ ) {
    189                        // 6.3.7.0 (2015/09/04) AutoCloseableを使用したtry-with-resources構築に対応。
    190                        final String[] data             = table.getValues( row );                               // 6.3.9.1 (2015/11/27)
    191                        final String systemId   = data[clmNo[SYSTEM_ID]];
    192                        final String tblsyu             = data[clmNo[TBLSYU]];
    193                        final String tableName  = data[clmNo[TABLE_NAME]];
    194
    195                        try( PrintWriter writer = FileUtil.getPrintWriter( new File( dir,tableName + ( isXml ? "S.xml" : "S.sql" ) ),ENCODE ) ) {
    196
    197                                if( isXml ) { writer.println( XML_START_TAG.replace( "xxx",tableName ) ); }             // 5.1.1.0 (2009/12/01) tableName をセット
    198                                writer.print( makeHeadLine( clmNo,data ) );
    199
    200                                final String[] vals = new String[] { systemId,tblsyu,tableName };
    201                                final String[][] gf05 = DBUtil.dbExecute( GF05_SEL,vals,tran ); // 5.1.9.0 (2010/08/01) Transaction 対応
    202
    203                                String uniqName = null;
    204                                fixData.clear();
    205                                // 値セット：まずは、最大長を求める必要がある。
    206                                for( int i=0; i<gf05.length; i++ ) {
    207                                        final String[] outData = makeLineList( gf05[i],i==0 );
    208                                        fixData.addListData( outData );
    209
    210                                        // 4.3.7.0 (2009/06/01)
    211                                        if( "UNIQ".equalsIgnoreCase( gf05[i][GF05_CLM] ) || "UNIQSEQ".equalsIgnoreCase( gf05[i][GF05_CLM] ) ) {
    212                                                uniqName = gf05[i][GF05_CLM].toUpperCase( Locale.JAPAN );
    213                                        }
    214                                }
    215                                // 固定長化：最大長であわせた文字列を出力します。
    216                                for( int i=0; i<gf05.length; i++ ) {
    217                                        writer.println( fixData.getFixData( i ) );
    218                                }
    219                                writer.println( makeEndLine( clmNo,data ) );
    220
    221                                // 4.3.7.0 (2009/06/01) UNIQ項目のSEQとトリガーを作成
    222                                if( uniqName != null ) {
    223//                                      writer.println( makeUniqSeq( clmNo,data ) );
    224//                                      writer.println( makeUniqTrig( clmNo,data, uniqName ) );
    225                                        writer.println( makeUniqSeq( tableName ) );                                     // 8.1.0.3 (2022/01/21)
    226                                        writer.println( makeUniqTrig( tableName, uniqName ) );          // 8.1.0.3 (2022/01/21)
    227                                }
    228
    229                                if( isXml ) { writer.println( XML_END_TAG ); }
    230                        }
    231                        catch( final RuntimeException ex ) {            // catch は、close() されてから呼ばれます。
    232                                // 6.5.0.1 (2016/10/21) ErrorMessage をまとめるのと、直接 Throwable を渡します。
    233                                final ErrorMessage errMessage = makeErrorMessage( "TableFilter_TABLE Error",ErrorMessage.NG )
    234                                                .addMessage( row+1,ErrorMessage.NG,"TABLE"
    235                                                        , "TABLE=[" + tableName + "]"
    236                                                        , StringUtil.array2csv( data )
    237                                                )
    238                                                .addMessage( ex );
    239
    240                                // BAT から呼び出す場合があるため、標準エラー出力にも情報を出しておきます。
    241                                System.out.println( errMessage );
    242                        }
    243                }
    244
    245                return table;
    246        }
    247
    248        /**
    249         * ヘッダー部分の処理を実行します。
    250         *
    251         * @og.rev 5.6.6.0 (2013/07/05) FixLengthData の簡易コンストラクタを使用
    252         * @og.rev 5.6.6.2 (2013/07/19) EXEC_START_TAG の付け忘れ
    253         * @og.rev 6.4.4.2 (2016/04/01) StringBuilderの代わりに、OgBuilderを使用する。
    254         * @og.rev 8.1.0.3 (2022/01/21) EXEC_SQLに、exists属性追加。
    255         *
    256         * @param       clmNo   カラム番号配列
    257         * @param       data    １行分のデータ配列
    258         *
    259         * @return      ヘッダー部分の文字列
    260         * @og.rtnNotNull
    261         */
    262        protected String makeHeadLine( final int[] clmNo,final String[] data ) {
    263                final String TBL_NAME = data[clmNo[TABLE_NAME]];
    264
    265                final String LINE1 = TBL_NAME + " ( " + data[clmNo[NAME_JA]] + " )" ;
    266                final String LINE2 = data[clmNo[COMMENTS]] ;
    267                final String LINE3 = "Created : " + HybsSystem.getDate() ;
    268
    269                // 5.6.6.0 (2013/07/05) FixLengthData の簡易コンストラクタを使用
    270                final int[] addLen = new int[] { 0,0,0 };       // 各データ間のスペース
    271                final int[] type   = new int[] { X,K,X };       // 各データの種別 X:半角 S:空白前埋め K:全角混在
    272                final FixLengthData fixData = new FixLengthData( addLen,type );
    273
    274                final String[][] outData = new String[][] {
    275                        { "/**",        CMNT ,  "**/" },
    276                        { "/* ",        LINE1,  " */" },
    277                        { "/* ",        LINE2,  " */" },
    278                        { "/* ",        LINE3,  " */" },
    279                        { "/**",        CMNT ,  "**/" },
    280                };
    281
    282                fixData.addAllListData( outData );
    283
    284                // 6.4.4.2 (2016/04/01)
    285                final OgBuilder buf = new OgBuilder();
    286                fixData.getAllFixData( buf.getBuilder() );              // OgBuilder の内部 Builder に、fixData のデータを書き込む。
    287//              return buf.appendIfCR( isXml , EXEC_START_TAG )
    288//                                      .appendCR( "CREATE TABLE " , TBL_NAME , " (" )
    289//                                      .toString();
    290
    291                // 8.1.0.3 (2022/01/21) EXEC_SQLに、exists属性追加。
    292                return buf.appendIfCR( isXml , EXEC_EXISTS_0_TAG )
    293                                        .appendIfCR( isXml , execExistsSQL , TBL_NAME , "');" )         //  EXISTS_0 判定は、XML の場合のみ。
    294                                        .appendCR( "CREATE TABLE " , TBL_NAME , " (" )
    295                                        .toString();
    296        }
    297
    298        /**
    299         * 各行部分(カラム定義)の処理を実行します。
    300         * カンマ,カラム,クラス,(,桁数,),初期値,NOT_NULL,拡張機能,コメント開始,行番号,名称,コメント終了
    301         * の順に配列にセットします。
    302         *
    303         * @og.rev 5.5.1.9 (2012/04/18) useLen.length=0対応
    304         * @og.rev 5.9.13.2 (2016/10/28) シングルクォート対応
    305         *
    306         * @param       data    １行分のデータ配列
    307         * @param       first   最初の行かどうか[true:最初/false:それ以降]
    308         *
    309         * @return      各行部分(カラム定義)配列
    310         */
    311        protected String[] makeLineList( final String[] data,final boolean first ) {
    312                // カンマ,カラム,クラス(桁数),初期値,NOT_NULL,独自拡張,行番号,名称,終了
    313                final String[] outData = new String[13];                                // 6.3.9.1 (2015/11/27)
    314                final String clsName = data[GF05_CLS_NAME];
    315
    316                outData[0] = first ? "   " : " , " ;                                    // 0:カンマ
    317                outData[1] = data[GF05_CLM] ;                                                   // 1:カラム
    318
    319                if( clsName.startsWith( "CLOB" ) || clsName.startsWith( "DATE" ) ) {
    320                        data[GF05_USE_LENGTH] = null;
    321                }
    322                final String useLen = data[GF05_USE_LENGTH];
    323                if( useLen != null && ! useLen.equals( "0" ) && useLen.length() > 0 ) { // 5.5.1.9 (2012/04/18)
    324                        outData[2] = clsName ;                                                          // 2:クラス
    325                        outData[3] = " ( " ;                                                            // 3:(
    326                        outData[4] = useLen ;                                                           // 4:桁数
    327                        outData[5] = " )" ;                                                                     // 5:)
    328                }
    329                else {
    330                        outData[2] = clsName ;                                                          // NUMBER型の桁数指定なしのケース
    331                }
    332
    333                final String def = data[GF05_DATA_DEFAULT];
    334                if( def != null && def.length() > 0 ) {
    335                        final String comma = clsName.indexOf( "CHAR" ) >= 0 && def.indexOf( '\'' ) < 0 ? "'" : "" ;     // 5.9.13.2 (2016/10/28)
    336                        outData[6] = "DEFAULT " + comma + def + comma ;         // 6:初期値
    337                }
    338
    339                final String notNull = data[GF05_NOT_NULL];
    340                if( notNull != null && notNull.equals( "1" ) ) {
    341                        outData[7] = "NOT NULL" ;                                                       // 7:NOT_NULL
    342                }
    343
    344                final String options = data[GF05_OPTIONS];
    345                if( options != null ) {
    346                        outData[8] = options    ;                                                       // 8:拡張機能
    347                }
    348
    349                final String nameJA = data[GF05_NAME_JA] ;                                      // 名称
    350                if( nameJA != null ) {
    351                        outData[9]  = "/* " ;                                                           // 9:コメント開始
    352                        outData[10] = data[GF05_SEQNO] ;                                        // 10:行番号
    353                        outData[11] = nameJA ;                                                          // 11:名称
    354                        outData[12] = "*/" ;                                                            // 12:コメント終了
    355                }
    356
    357                return outData ;
    358        }
    359
    360        /**
    361         * 定義の最後の部分の処理を実行します。
    362         *
    363         * @og.rev 8.1.0.3 (2022/01/21) TableFilter_TABLE のORACLE部分をTableFilter_TABLE_ORACLEに移動する。
    364         *
    365         * @param       clmNo   カラム番号配列
    366         * @param       data    １行分のデータ配列
    367         *
    368         * @return      定義の最後の部分
    369         * @og.rtnNotNull
    370         */
    371        protected String makeEndLine( final int[] clmNo,final String[] data ) {
    372                return ")" + execEndTag ;                                               // 6.0.2.3 (2014/10/10) 改行を含める。
    373        }
    374
    375//      /**
    376//       * 定義の最後の部分の処理を実行します。
    377//       *
    378//       * 6.1.0.0 (2014/12/26) より、
    379//       *   １．TABLESPACE_NAME を指定しない場合は、TABLESPACE 句を出力しません。
    380//       *   ２．INITIAL_EXTENT を 0 で指定した場合は、STORAGE 句を出力しません。
    381//       *   ３．NEXT と PCTINCREASE は、出力しません。
    382//       *
    383//       * @og.rev 6.0.2.3 (2014/10/10) isXml で、CR + EXEC_END_TAG のキャッシュを作成します。
    384//       * @og.rev 6.1.0.0 (2014/12/26) TABLESPACE_NAME,INITIAL_EXTENT が未設定の場合、設定しません。
    385//       * @og.rev 6.4.4.1 (2016/03/18) StringBuilderの代わりに、OgBuilderを使用する。
    386//       *
    387//       * @param       clmNo   カラム番号配列
    388//       * @param       data    １行分のデータ配列
    389//       *
    390//       * @return      定義の最後の部分
    391//       * @og.rtnNotNull
    392//       */
    393//      protected String makeEndLine( final int[] clmNo,final String[] data ) {
    394//
    395//              // 6.1.0.0 (2014/12/26) TABLESPACE_NAME,INITIAL_EXTENT が未設定の場合、設定しません。
    396//              final String tblSpcse = data[clmNo[TABLESPACE_NAME]] ;
    397//              final String initExt  = data[clmNo[INITIAL_EXTENT]] ;
    398//
    399//              return new OgBuilder()
    400//                              .append( ")" )
    401//                              .appendIf( !StringUtil.isNull( tblSpcse )
    402//                                                      , CR , "TABLESPACE " , tblSpcse )
    403//                              .appendIf( !StringUtil.isNull( initExt ) && initExt.charAt(0) != '0'
    404//                                                      , CR , "STORAGE( INITIAL " , initExt , "K )" )
    405//                              .append( execEndTag )
    406//                              .toString();
    407//      }
    408
    409        /**
    410         * ユニークシーケンスの作成処理を実行します。
    411         *
    412         * @og.rev 8.1.0.3 (2022/01/21) 引数にtableNameを渡すように変更。
    413         * @og.rev 8.1.0.3 (2022/01/21) TableFilter_TABLE のORACLE部分をTableFilter_TABLE_ORACLEに移動する。
    414         *
    415//       * @param       clmNo   カラム番号配列
    416//       * @param       data    １行分のデータ配列
    417         * @param       tableName       ﾃｰﾌﾞﾙ名
    418         *
    419         * @return      ユニークシーケンス
    420         * @og.rtnNotNull
    421         */
    422//      protected String makeUniqSeq( final int[] clmNo,final String[] data ) {
    423        protected String makeUniqSeq( final String tableName ) {
    424                return "";
    425        }
    426
    427//      /**
    428//       * ユニークシーケンスの作成処理を実行します。
    429//       *
    430//       * @og.rev 5.1.9.0 (2010/08/01) シーケンス名を[TABLE_NAME]S00に変更
    431//       * @og.rev 6.0.2.3 (2014/10/10) isXml で、CR + EXEC_END_TAG のキャッシュを作成します。
    432//       * @og.rev 6.4.4.1 (2016/03/18) StringBuilderの代わりに、OgBuilderを使用する。
    433//       * @og.rev 8.1.0.3 (2022/01/21) 引数にtableNameを渡すように変更。
    434//       *
    435////     * @param       clmNo   カラム番号配列
    436////     * @param       data    １行分のデータ配列
    437//       * @param       tableName       ﾃｰﾌﾞﾙ名
    438//       *
    439//       * @return      ユニークシーケンス
    440//       * @og.rtnNotNull
    441//       */
    442////    protected String makeUniqSeq( final int[] clmNo,final String[] data ) {
    443//      protected String makeUniqSeq( final String tableName ) {
    444//              return new OgBuilder()
    445//                              .appendCR()
    446//                              .appendIfCR( isXml , EXEC_START_TAG )
    447////                            .appendCR( "CREATE SEQUENCE " , data[clmNo[TABLE_NAME]] , "S00 " )
    448//                              .appendCR( "CREATE SEQUENCE " , tableName , "S00 " )                            // 8.1.0.3 (2022/01/21)
    449//                              .append( "  INCREMENT BY 1 START WITH 1 MAXVALUE 999999999 CYCLE NOCACHE" )
    450//                              .append( execEndTag )
    451//                              .toString();
    452//      }
    453
    454        /**
    455         * ユニークシーケンスと関連付けるトリガの作成処理を実行します。
    456         *
    457//       * @param       clmNo           カラム番号配列
    458//       * @param       data            １行分のデータ配列
    459         * @param       tableName       ﾃｰﾌﾞﾙ名
    460         * @param   uniqName    ユニークトリガ名
    461         *
    462         * @og.rev 8.1.0.3 (2022/01/21) 引数にtableNameを渡すように変更。
    463         * @og.rev 8.1.0.3 (2022/01/21) TableFilter_TABLE のORACLE部分をTableFilter_TABLE_ORACLEに移動する。
    464         *
    465         * @return      ユニークシーケンスと関連付けるトリガ
    466         * @og.rtnNotNull
    467         */
    468//      protected String makeUniqTrig( final int[] clmNo,final String[] data, final String uniqName ) {
    469        protected String makeUniqTrig( final String tableName, final String uniqName ) {
    470                return "";
    471        }
    472
    473//      /**
    474//       * ユニークシーケンスと関連付けるトリガの作成処理を実行します。
    475//       *
    476//       * @og.rev 5.1.9.0 (2010/08/01) トリガー名を[TABLE_NAME]T00に変更
    477//       * @og.rev 6.4.4.1 (2016/03/18) StringBuilderの代わりに、OgBuilderを使用する。
    478//       * @og.rev 8.1.0.3 (2022/01/21) 引数にtableNameを渡すように変更。
    479//       *
    480////     * @param       clmNo   カラム番号配列
    481////     * @param       data    １行分のデータ配列
    482//       * @param       tableName       ﾃｰﾌﾞﾙ名
    483//       * @param   uniqName    ユニークトリガ名
    484//       *
    485//       * @return      ユニークシーケンスと関連付けるトリガ
    486//       * @og.rtnNotNull
    487//       */
    488////    protected String makeUniqTrig( final int[] clmNo,final String[] data, final String uniqName ) {
    489//      protected String makeUniqTrig( final String tableName, final String uniqName ) {
    490////            final String TBL_NAME = data[clmNo[TABLE_NAME]] ;
    491//
    492//              return new OgBuilder()
    493//                              .appendCR()
    494//                              .appendIfCR( isXml , EXEC_START_TAG )
    495//                              .appendCR( "CREATE OR REPLACE TRIGGER " , tableName , "T00 " )
    496//                              .appendCR( "  BEFORE INSERT ON "                , tableName )
    497//                              .appendCR( "  FOR EACH ROW " )
    498//                              .appendCR( "  BEGIN " )
    499//                              .append( "    SELECT "                                  , tableName , "S00.NEXTVAL INTO :NEW." )
    500//                              .appendCR( uniqName , " FROM DUAL; " )
    501//                              .appendCR( "  END; " )
    502//                              .appendCase( isXml , EXEC_END_TAG , "/" )               // isXmlで選択されます。true/false
    503//                              .toString();
    504//      }
    505}