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}