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    1行分のデータ配列
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         *   1.TABLESPACE_NAME を指定しない場合は、TABLESPACE 句を出力しません。
075         *   2.INITIAL_EXTENT を 0 で指定した場合は、STORAGE 句を出力しません。
076         *   3.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    1行分のデータ配列
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    1行分のデータ配列
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    1行分のデータ配列
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}