    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 org.opengion.fukurou.util.StringUtil;                            // 8.1.0.3 (2022/01/21)
    019import org.opengion.fukurou.system.OgBuilder ;                          // 8.1.0.3 (2022/01/21)
    020
    021/**
    022 * TableFilter_TABLE_ORACLE は、TableUpda インターフェースを継承した、DBTableModel 処理用の
    023 * 実装クラスです。とくに、ORACLE用のDB定義スクリプトを作成します。
    024 *
    025 * ※ 他のデータベースと同じ形で扱いたいため、用意したクラスですが、内容は、TableFilter_TABLE と同じです。
    026 *
    027 * ここでは、テーブル一覧の検索結果より、GF05 のテーブルカラム定義テーブルから
    028 * 必要な情報を取得し、テーブル作成スクリプトを作成します。
    029 * 出力ファイルは、テーブル名＋"S.sql" という命名規則で作成します。
    030 * 検索では、(SYSTEM_ID,TBLSYU,TABLE_NAME,NAME_JA,TABLESPACE_NAME,INITIAL_EXTENT,COMMENTS)
    031 * の項目を取得する必要があります。
    032 *
    033 * @og.rev 6.5.0.0 (2016/09/30) 新規作成
    034 * @og.rev 8.1.0.3 (2022/01/21) TableFilter_TABLE のORACLE部分をTableFilter_TABLE_ORACLEに移動する。
    035 *
    036 * @version  6.5.0.0  2016/09/13
    037 * @author   Kazuhiko Hasegawa
    038 * @since    JDK1.8,
    039 */
    040public class TableFilter_TABLE_ORACLE extends TableFilter_TABLE {
    041        /** このプログラムのVERSION文字列を設定します。   {@value} */
    042        private static final String VERSION = "8.1.0.3 (2022/01/21)" ;
    043
    044        /**
    045         * デフォルトコンストラクター
    046         *
    047         * @og.rev 6.9.7.0 (2018/05/14) PMD Each class should declare at least one constructor
    048         */
    049        public TableFilter_TABLE_ORACLE() { super(); }          // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。
    050
    051        /**
    052         * ヘッダー部分の処理を実行します。
    053         *
    054         * @og.rev 8.1.0.3 (2022/01/21) EXEC_SQLに、exists属性追加。
    055         *
    056         * @param       clmNo   カラム番号配列
    057         * @param       data    １行分のデータ配列
    058         *
    059         * @return      ヘッダー部分の文字列
    060         * @og.rtnNotNull
    061         */
    062        @Override
    063        protected String makeHeadLine( final int[] clmNo,final String[] data ) {
    064                // 8.1.0.3 (2022/01/21) EXEC_SQLに、exists属性追加。
    065                execExistsSQL = "SELECT COUNT(*) FROM USER_TABLES WHERE TABLE_NAME=UPPER('" ;   // 大文字で比較
    066
    067                return super.makeHeadLine( clmNo,data );
    068        }
    069
    070        /**
    071         * 定義の最後の部分の処理を実行します。
    072         *
    073         * 6.1.0.0 (2014/12/26) より、
    074         *   １．TABLESPACE_NAME を指定しない場合は、TABLESPACE 句を出力しません。
    075         *   ２．INITIAL_EXTENT を 0 で指定した場合は、STORAGE 句を出力しません。
    076         *   ３．NEXT と PCTINCREASE は、出力しません。
    077         *
    078         * @og.rev 6.0.2.3 (2014/10/10) isXml で、CR + EXEC_END_TAG のキャッシュを作成します。
    079         * @og.rev 6.1.0.0 (2014/12/26) TABLESPACE_NAME,INITIAL_EXTENT が未設定の場合、設定しません。
    080         * @og.rev 6.4.4.1 (2016/03/18) StringBuilderの代わりに、OgBuilderを使用する。
    081         * @og.rev 8.1.0.3 (2022/01/21) TableFilter_TABLE のORACLE部分をTableFilter_TABLE_ORACLEに移動する。
    082         *
    083         * @param       clmNo   カラム番号配列
    084         * @param       data    １行分のデータ配列
    085         *
    086         * @return      定義の最後の部分
    087         * @og.rtnNotNull
    088         */
    089        protected String makeEndLine( final int[] clmNo,final String[] data ) {
    090
    091                // 6.1.0.0 (2014/12/26) TABLESPACE_NAME,INITIAL_EXTENT が未設定の場合、設定しません。
    092                final String tblSpcse = data[clmNo[TABLESPACE_NAME]] ;
    093                final String initExt  = data[clmNo[INITIAL_EXTENT]] ;
    094
    095                return new OgBuilder()
    096                                .append( ")" )
    097                                .appendIf( !StringUtil.isNull( tblSpcse )
    098                                                        , CR , "TABLESPACE " , tblSpcse )
    099                                .appendIf( !StringUtil.isNull( initExt ) && initExt.charAt(0) != '0'
    100                                                        , CR , "STORAGE( INITIAL " , initExt , "K )" )
    101                                .append( execEndTag )
    102                                .toString();
    103        }
    104
    105        /**
    106         * ユニークシーケンスの作成処理を実行します。
    107         *
    108         * @og.rev 5.1.9.0 (2010/08/01) シーケンス名を[TABLE_NAME]S00に変更
    109         * @og.rev 6.0.2.3 (2014/10/10) isXml で、CR + EXEC_END_TAG のキャッシュを作成します。
    110         * @og.rev 6.4.4.1 (2016/03/18) StringBuilderの代わりに、OgBuilderを使用する。
    111         * @og.rev 8.1.0.3 (2022/01/21) 引数にtableNameを渡すように変更。
    112         * @og.rev 8.1.0.3 (2022/01/21) TableFilter_TABLE のORACLE部分をTableFilter_TABLE_ORACLEに移動する。
    113         *
    114//       * @param       clmNo   カラム番号配列
    115//       * @param       data    １行分のデータ配列
    116         * @param       tableName       ﾃｰﾌﾞﾙ名
    117         *
    118         * @return      ユニークシーケンス
    119         * @og.rtnNotNull
    120         */
    121//      protected String makeUniqSeq( final int[] clmNo,final String[] data ) {
    122        protected String makeUniqSeq( final String tableName ) {
    123                final String execSeqSQL = "SELECT COUNT(*) FROM USER_SEQUENCES WHERE SEQUENCE_NAME=UPPER('" ;
    124
    125                return new OgBuilder()
    126                                .appendCR()
    127//                              .appendIfCR( isXml , EXEC_START_TAG )
    128//                              .appendCR( "CREATE SEQUENCE " , data[clmNo[TABLE_NAME]] , "S00 " )
    129                                .appendIfCR( isXml , EXEC_EXISTS_0_TAG )                //  EXISTS_0 判定は、XML の場合のみ。
    130                                .appendIfCR( isXml , execSeqSQL , tableName , "S00');" )
    131                                .appendCR( "CREATE SEQUENCE "   , tableName , "S00 " )                          // 8.1.0.3 (2022/01/21)
    132                                .append( "  INCREMENT BY 1 START WITH 1 MAXVALUE 999999999 CYCLE NOCACHE" )
    133                                .append( execEndTag )
    134                                .toString();
    135        }
    136
    137        /**
    138         * ユニークシーケンスと関連付けるトリガの作成処理を実行します。
    139         *
    140         * @og.rev 5.1.9.0 (2010/08/01) トリガー名を[TABLE_NAME]T00に変更
    141         * @og.rev 6.4.4.1 (2016/03/18) StringBuilderの代わりに、OgBuilderを使用する。
    142         * @og.rev 8.1.0.3 (2022/01/21) TableFilter_TABLE のORACLE部分をTableFilter_TABLE_ORACLEに移動する。
    143         *
    144//       * @param       clmNo   カラム番号配列
    145//       * @param       data    １行分のデータ配列
    146         * @param       tableName       ﾃｰﾌﾞﾙ名
    147         * @param   uniqName    ユニークトリガ名
    148         *
    149         * @return      ユニークシーケンスと関連付けるトリガ
    150         * @og.rtnNotNull
    151         */
    152//      protected String makeUniqTrig( final int[] clmNo,final String[] data, final String uniqName ) {
    153        protected String makeUniqTrig( final String tableName, final String uniqName ) {
    154//              final String TBL_NAME = data[clmNo[TABLE_NAME]] ;
    155
    156                return new OgBuilder()
    157                                .appendCR()
    158                                .appendIfCR( isXml , EXEC_START_TAG )
    159                                .appendCR( "CREATE OR REPLACE TRIGGER " , tableName , "T00 " )
    160                                .appendCR( "  BEFORE INSERT ON "                , tableName )
    161                                .appendCR( "  FOR EACH ROW " )
    162                                .appendCR( "  BEGIN " )
    163                                .append( "    SELECT "                                  , tableName , "S00.NEXTVAL INTO :NEW." )
    164                                .appendCR( uniqName , " FROM DUAL; " )
    165                                .appendCR( "  END; " )
    166                                .appendCase( isXml , EXEC_END_TAG , "/" )               // isXmlで選択されます。true/false
    167                                .toString();
    168        }
    169}