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 : {@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 *      ① <og:tableFilter classId="TABLE" keys="DIR,XML" vals='"{@BASE_DIR}/sql/install/01_TABLE,"' />
058 *
059 *      ② <og:tableFilter classId="TABLE" >
060 *               {
061 *                   DIR : {@BASE_DIR}/sql/install/01_TABLE ;
062 *                   XML : false ;
063 *               }
064 *         </og:tableFilter>
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    1行分のデータ配列
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    1行分のデータ配列
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    1行分のデータ配列
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//       *   1.TABLESPACE_NAME を指定しない場合は、TABLESPACE 句を出力しません。
380//       *   2.INITIAL_EXTENT を 0 で指定した場合は、STORAGE 句を出力しません。
381//       *   3.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    1行分のデータ配列
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    1行分のデータ配列
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    1行分のデータ配列
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            1行分のデータ配列
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    1行分のデータ配列
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}