db2常见建表脚本生成
DB2数据库建表脚本生成程序,支持常见建表方式,参数暂不支持非表名称;
另此程序所用数据库连接方式为连接池,根据各自喜好使用连接池
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package move;
/**
*
* @author liuzf
*/
import java.sql.Clob;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import move.bean.ConstraintStatement;
import move.bean.FunctionStatement;
import move.bean.IndexStatement;
import move.bean.TriggerStatement;
import move.bean.ViewStatement;
import bass.DBManager;
import bass.util.dbbean;
public class Table {
private static Log log = LogFactory.getLog(Table.class);
private static DBManager dbm = DBManager.getInstance();
private static String poolName = "dfpool";
private String tabFullName = null;
private String tabSchema = null;
private String tabname = null;
private String tmpTabFullName = null;
private String tmpTabSchema = null;
private String tmpTabname = null;
private String newTbspace = null;
private String newindexTbspace = null;
public Table(String tableFullName)
{
this.tabFullName = tableFullName.trim().toUpperCase();
String[] arrayTemp = this.tabFullName.split("\.");
this.tabSchema = arrayTemp[0];
this.tabname = arrayTemp[1];
this.tmpTabFullName = this.tabFullName;
this.tmpTabSchema = this.tabSchema;
this.tmpTabname = this.tabname;
}
public Table(String tableFullName, String tmpTabFullName, String newTbspace, String newindexTbspace)
{
this.tabFullName = tableFullName.trim().toUpperCase();
String[] arrayTemp = this.tabFullName.split("\.");
this.tabSchema = arrayTemp[0];
this.tabname = arrayTemp[1];
this.tmpTabFullName = tmpTabFullName.trim().toUpperCase();
String[] arrayTemp2 = this.tmpTabFullName.split("\.");
this.tmpTabSchema = arrayTemp2[0];
this.tmpTabname = arrayTemp2[1];
this.newTbspace = newTbspace;
this.newindexTbspace = newindexTbspace;
}
/**
* 将类似pt.area的表全名,拆分成两个字段pt area,并全部转化为大写
*/
private String[] splitTableFullName(String tableFullName) {
tableFullName = tableFullName.trim().toUpperCase();
return tableFullName.split("\.");
}
/**
* 获取建表脚本,包括建表语句,表注释、字段注释
* @param tabFullName
* @return
*/
public ArrayList<String> getTableSqlList()
{
ArrayList<String> tableSqlList = new ArrayList<String>();
dbbean colQuery = new dbbean(Table.poolName);
dbbean tableQuery = new dbbean(Table.poolName);
// 表
String tableSql = "Select tbspace,index_tbspace,compression,partition_mode,pctfree,append_mode,locksize,volatile,remarks from syscat.tables where tabschema=""
+ this.tabSchema + "" and tabname="" + this.tabname + "" with ur";
//System.out.println(tableSql);
tableQuery.execute(tableSql);
if(tableQuery.getRowCount()>0)
{
//QHESOP.V_SYS_OP_LVL_AUTH 物化视图,建表方式不一样:Select * from syscat.tables where tabname in ("V_SYS_OP_LVL_AUTH","AREA") with ur
//syscat.tables type字段
//A = Alias
//G = Global temporary table
//H = Hierarchy table
//L = Detached table
//N = Nickname
//S = Materialized query table
//T = Table (untyped)
//U = Typed table
//V = View (untyped)
//W = Typed view
// 字段,自增字段
String sql = "Select colno,colname,typename,length,scale,default,nulls,logged,compact,partkeyseq,identity,generated from syscat.columns where tabschema=""
+ this.tabSchema
+ "" and tabname=""
+ this.tabname
+ "" order by colno with ur";
//System.out.println(sql);
colQuery.execute(sql);
// System.out.println(query.getRowCount());
StringBuffer sb = new StringBuffer("CREATE TABLE ").append(this.tmpTabFullName).append(" (
");
for (int i = 0; i < colQuery.getRowCount(); i++) {
//字段类型、字段长度
String typename = colQuery.getFieldValue("typename", i);
if (typename.equals("CHARACTER")) {
sb.append(" ").append(colQuery.getFieldValue("colname", i))
.append(" ").append("CHAR")
.append("(").append(colQuery.getFieldValue("length", i)).append(")");
} else if(typename.equals("VARCHAR")) {
sb.append(" ").append(colQuery.getFieldValue("colname", i))
.append(" ")
.append(colQuery.getFieldValue("typename", i))
.append("(")
.append(colQuery.getFieldValue("length", i))
.append(")");
} else if (colQuery.getFieldValue("typename", i).equals("DECIMAL")) {
sb.append(" ").append(colQuery.getFieldValue("colname", i))
.append(" ")
.append(colQuery.getFieldValue("typename", i))
.append("(")
.append(colQuery.getFieldValue("length", i))
.append(",").append(colQuery.getFieldValue("scale", i))
.append(")");
} else if (colQuery.getFieldValue("typename", i).equals("CLOB")) {
sb.append(" ").append(colQuery.getFieldValue("colname", i))
.append(" ")
.append(colQuery.getFieldValue("typename", i))
.append("(")
.append(colQuery.getFieldValue("length", i))
.append(")");
//logged
char[] logged = Table.getChar(colQuery.getFieldValue("logged", i));
if (logged.length > 0) {
switch (logged[0]) {
case "Y":
sb.append(" LOGGED ");
break;
case "N":
sb.append(" NOT LOGGED ");
break;
default:
sb.append("");
}
}
//compact
char[] compact = Table.getChar(colQuery.getFieldValue("compact", i));
if (compact.length > 0) {
switch (compact[0]) {
case "Y":
sb.append(" ");
break;
case "N":
sb.append(" NOT COMPACT ");
break;
default:
sb.append("");
}
}
} else if (colQuery.getFieldValue("typename", i).equals("BLOB")) {
sb.append(" ").append(colQuery.getFieldValue("colname", i))
.append(" ")
.append(colQuery.getFieldValue("typename", i))
.append("(")
.append(colQuery.getFieldValue("length", i))
.append(")");
//logged
char[] logged = Table.getChar(colQuery.getFieldValue("logged", i));
if (logged.length > 0) {
switch (logged[0]) {
case "Y":
sb.append(" LOGGED ");
break;
case "N":
sb.append(" NOT LOGGED ");
break;
default:
sb.append("");
}
}
//compact
char[] compact = Table.getChar(colQuery.getFieldValue("compact", i));
if (compact.length > 0) {
switch (compact[0]) {
case "Y":
sb.append(" ");
break;
case "N":
sb.append(" NOT COMPACT ");
break;
default:
sb.append("");
}
}
} else {
sb.append(" ").append(colQuery.getFieldValue("colname", i))
.append(" ")
.append(colQuery.getFieldValue("typename", i));
}
//是否非空
if (colQuery.getFieldValue("nulls", i).equals("N")) {
sb.append(" NOT NULL");
}
//缺省值
if (colQuery.getFieldValue("default", i).length() > 0) {
sb.append(" WITH DEFAULT ");
sb.append(colQuery.getFieldValue("default", i));
}
//自增字段
if (colQuery.getFieldValue("identity", i).equals("Y"))
{
sb.append(" GENERATED");
if (colQuery.getFieldValue("generated", i).equals("A"))
{
sb.append(" ALWAYS");
}
else if(colQuery.getFieldValue("generated", i).equals("D"))
{
sb.append(" BY DEFAULT");
}
else
{
sb.append(" ALWAYS");
}
sb.append(" AS IDENTITY (");
String identitySql = "Select colname, start, increment, minvalue, maxvalue, cycle, cache, order, nextcachefirstvalue, seqid from SYSCAT.COLIDENTATTRIBUTES where tabschema=""
+ this.tabSchema
+ "" and tabname=""
+ this.tabname
+ "" and colname=""
+ colQuery.getFieldValue("colname", i) +
"" with ur";
//System.out.println(identitySql);
dbbean identityQuery = new dbbean(Table.poolName);
identityQuery.execute(identitySql);
sb.append(" START WITH ").append(identityQuery.getFieldValue("start", 0));
sb.append(" INCREMENT BY ").append(identityQuery.getFieldValue("increment", 0));
sb.append(" MINVALUE ").append(identityQuery.getFieldValue("minvalue", 0));
sb.append(" MAXVALUE ").append(identityQuery.getFieldValue("maxvalue", 0));
if (identityQuery.getFieldValue("cycle", 0).equals("Y"))
{
sb.append(" CYCLE");
} else if(identityQuery.getFieldValue("cycle", 0).equals("N")){
sb.append(" NO CYCLE");
} else {
}
sb.append(" CACHE ").append(identityQuery.getFieldValue("cache", 0));
if (identityQuery.getFieldValue("order", 0).equals("Y"))
{
sb.append(" ORDER");
} else if(identityQuery.getFieldValue("order", 0).equals("N")){
sb.append(" NO ORDER");
} else {
}
sb.append(")");
}
sb.append(" ,
");
}
sb.deleteCharAt(sb.length() - 2);
sb.append(")
");
//是否压缩
char[] compress = Table.getChar(tableQuery.getFieldValue("compression", 0));
if (compress.length > 0) {
switch (compress[0]) {
case "B":
sb.append("COMPRESS YES VALUE COMPRESSION
");
break;
case "R":
sb.append("COMPRESS YES
");
break;
case "V":
sb.append("VALUE COMPRESSION
");
break;
default:
sb.append("");
}
}
// 分区键
String partitionSql = "Select colno,colname,partkeyseq from syscat.columns where tabschema=""
+ this.tabSchema
+ "" and tabname=""
+ this.tabname
+ "" and partkeyseq>0 order by partkeyseq with ur";
//System.out.println(partitionSql);
dbbean partitionQuery = new dbbean(Table.poolName);
partitionQuery.execute(partitionSql);
StringBuffer partitionSb = new StringBuffer();
for (int i = 0; i < partitionQuery.getRowCount(); i++) {
if (i > 0) {
partitionSb.append(", ");
partitionSb.append(partitionQuery.getFieldValue("colname", i));
} else
partitionSb.append(partitionQuery.getFieldValue("colname", i));
}
char[] partition_mode = Table.getChar(tableQuery.getFieldValue(
"partition_mode", 0));
if (partition_mode.length > 0) {
// System.out.println(partition_mode);
switch (partition_mode[0]) {
case "H":
sb.append("DISTRIBUTE BY HASH (");
sb.append(partitionSb);
sb.append(")
");
break;
case "R":
log.error("不支持");// Replicated across database
// partitions
break;
default:
sb.append("");
}
}
// 表空间
sb.append("IN ");
if( (this.newTbspace!=null) && (this.newTbspace.length()>0) )
{
sb.append(this.newTbspace);
if (this.newindexTbspace!=null && this.newindexTbspace.length()>0) {
sb.append(" INDEX IN ");
sb.append(this.newindexTbspace);
}
} else {
sb.append(tableQuery.getFieldValue("tbspace", 0));
if (tableQuery.getFieldValue("index_tbspace", 0).length() > 0) {
sb.append(" INDEX IN ");
sb.append(tableQuery.getFieldValue("index_tbspace", 0));
}
}
// 最后添加不记录日志?
sb.append(";
");
tableSqlList.add(sb.toString());
//PCTFREE
String pctfree = tableQuery.getFieldValue("pctfree", 0);
if (!pctfree.equals("-1")) {
StringBuffer pctfreeSb = new StringBuffer();
pctfreeSb.append("ALTER TABLE ").append(this.tmpTabFullName)
.append(" PCTFREE ").append(pctfree).append(";
");
tableSqlList.add(pctfreeSb.toString());
}
//APPEND ON
char[] append_mode = Table.getChar(tableQuery.getFieldValue("append_mode", 0));
if (append_mode.length > 0) {
switch (append_mode[0]) {
case "Y":
StringBuffer appendSb = new StringBuffer();
appendSb.append("ALTER TABLE ").append(this.tmpTabFullName).append(" APPEND ON;
");
tableSqlList.add(appendSb.toString());
break;
case "N":
break;
default:
}
}
//LOCKSIZE
char[] locksize = Table.getChar(tableQuery.getFieldValue("locksize", 0));
if (locksize.length > 0) {
switch (locksize[0]) {
case "T":
StringBuffer locksizeSb = new StringBuffer();
locksizeSb.append("ALTER TABLE ").append(this.tmpTabFullName).append(" LOCKSIZE TABLE;
");
tableSqlList.add(locksizeSb.toString());
break;
case "R":
break;
case "I":
break;
default:
}
}
//ALTER TABLE "NWH "."DW_AI_CS_OUTCALL_DM_200903" VOLATILE CARDINALITY;
char[] volatileChar = Table.getChar(tableQuery.getFieldValue("volatile", 0));
if (volatileChar.length > 0) {
switch (volatileChar[0]) {
case "C":
StringBuffer volatileSb = new StringBuffer();
volatileSb.append("ALTER TABLE ").append(this.tmpTabFullName).append(" VOLATILE CARDINALITY;
");
tableSqlList.add(volatileSb.toString());
break;
default:
}
}
//表注释
if(tableQuery.getFieldValue("remarks", 0).length()>0)
{
sb = new StringBuffer();
sb.append("COMMENT ON TABLE ");
sb.append(this.tmpTabFullName);
sb.append(" IS "");
sb.append(tableQuery.getFieldValue("remarks", 0).replaceAll(""", """"));
sb.append("";
");
tableSqlList.add(sb.toString());
}
// 字段注释
String remarkColSql = "Select tabschema,tabname,colname,remarks from syscat.columns where tabschema=""
+ this.tabSchema
+ "" and tabname=""
+ this.tabname
+ "" and remarks is not null order by partkeyseq with ur";
//System.out.println(remarkColSql);
dbbean remarkColQuery = new dbbean(Table.poolName);
remarkColQuery.execute(remarkColSql);
for (int i = 0; i < remarkColQuery.getRowCount(); i++) {
StringBuffer remarkColSb = new StringBuffer();
remarkColSb.append("COMMENT ON COLUMN ");
remarkColSb.append(this.tmpTabFullName).append(".");
remarkColSb.append(remarkColQuery.getFieldValue("colname", i));
remarkColSb.append(" IS "");
remarkColSb.append(remarkColQuery.getFieldValue("remarks", i).replaceAll(""", """"));
remarkColSb.append("";
");
tableSqlList.add(remarkColSb.toString());
}
}
return tableSqlList;
}
/**
* 主键 & 约束 等用alter体现的语句,不包括外键等涉及其他表的操作
* unique referential check
* @param tabFullName
* @return
*/
public ArrayList<ConstraintStatement> getPrimaryUniqueConstraintSqlList()
{
//Select tabschema,tabname,PARENTS,CHILDREN,SELFREFS,KEYUNIQUE,CHECKCOUNT from syscat.tables where tabname="STAT_REP_CONTENT" with ur;
//PARENTS 该表的父表数目(该表在其中充当子表的参照约束数目)
//CHILDREN 该表的子表数目(该表在其中充当父表的参照约束数目)
//SELFREFS 该表的自引用参照约束数目(该表在其中既充当父表又充当子表的参照约束数目)
//KEYUNIQUE 在该表上所定义的惟一约束(除了主键)的数目
//CHECKCOUNT 在该表上所定义的检查约束的数目
//判断表中是否存在约束:SYSCAT.TABCONST,惟一约束(U)、主键约束(P)、外键约束(F)或表检查约束(K)
//SYSCAT.KEYCOLUSE 为惟一、主键或外键约束定义的键中所包含的每个列包含一行记录
// 主键约束 & 唯一性约束
ArrayList<ConstraintStatement> constraintSqlList = new ArrayList<ConstraintStatement>();
String constraintSql = "Select * from SYSCAT.TABCONST where type in ("P","U") and tabschema=""
+ this.tabSchema
+ "" and tabname=""
+ this.tabname
+ "" order by type with ur";
//System.out.println(constraintSql);
dbbean constraintQuery = new dbbean(Table.poolName);
constraintQuery.execute(constraintSql);
for (int i = 0; i < constraintQuery.getRowCount(); i++) {
ConstraintStatement constraintStmt = new ConstraintStatement();
StringBuffer constraintDropSb = new StringBuffer();
constraintDropSb.append("ALTER TABLE ").append(this.tabSchema).append(".").append(this.tabname).append("
");
StringBuffer constraintSb = new StringBuffer();
constraintSb.append("ALTER TABLE ");
constraintSb.append(this.tabFullName).append("
");
char[] uniquerule = Table.getChar(constraintQuery.getFieldValue("type", i));
String constname = constraintQuery.getFieldValue("constname", i);
constraintStmt.fullName = constname;
switch(uniquerule[0])
{
case "P":
constraintDropSb.append(" DROP PRIMARY KEY ").append(";");
if(constname.startsWith("SQL") && constname.length()==18)
{
constraintSb.append(" ADD PRIMARY KEY
");
}
else
{
constraintSb.append(" ADD CONSTRAINT ");
constraintSb.append(constname);
constraintSb.append(" PRIMARY KEY
");
}
break;
case "U":
constraintDropSb.append(" DROP UNIQUE ").append(constraintQuery.getFieldValue("constname", i)).append(";");
if(constname.startsWith("SQL") && constname.length()==18)
{
constraintSb.append(" ADD UNIQUE
");
}
else
{
constraintSb.append(" ADD CONSTRAINT ");
constraintSb.append(constname);
constraintSb.append(" UNIQUE
");
}
break;
default:
log.error("不支持");
}
constraintSb.append(" (");
constraintSb.append(this.getConstraintCol(constname,this.tabSchema,this.tabname));
constraintSb.append(");");
constraintStmt.dropSql = constraintDropSb.toString();
constraintStmt.createSql = constraintSb.toString();
constraintSqlList.add(constraintStmt);
}
return constraintSqlList;
}
/**
* 获取惟一、主键或外键约束定义的列
* SYSCAT.KEYCOLUSE 为惟一、主键或外键约束定义的键中所包含的每个列包含一行记录
* @param constname
* @return
*/
private String getConstraintCol(String constname, String tabSchema, String tabname)
{
String constraintColSql = "Select * from SYSCAT.KEYCOLUSE " +
"where constname="" + constname +
"" and tabschema="" + tabSchema +
"" and tabname="" + tabname +
"" order by colseq with ur";
//System.out.println(constraintColSql);
dbbean constraintColQuery = new dbbean(Table.poolName);
constraintColQuery.execute(constraintColSql);
StringBuffer constraintColSb = new StringBuffer();
for (int i = 0; i < constraintColQuery.getRowCount(); i++) {
if(i>0)
constraintColSb.append(", ").append(constraintColQuery.getFieldValue("colname", i));
else
constraintColSb.append(constraintColQuery.getFieldValue("colname", i));
}
return constraintColSb.toString();
}
/**
* 外键、检查等约束的语句
* @param tabFullName
* @return
*/
public ArrayList<ConstraintStatement> getForeignCheckConstraintSqlList()
{
//判断表中是否存在约束:SYSCAT.TABCONST,惟一约束(U)、主键约束(P)、外键约束(F)或表检查约束(K)
//Select tabschema,tabname,PARENTS,CHILDREN,SELFREFS,KEYUNIQUE,CHECKCOUNT from syscat.tables where tabname="STAT_REP_CONTENT" with ur;
//PARENTS 该表的父表数目(该表在其中充当子表的参照约束数目)
//CHILDREN 该表的子表数目(该表在其中充当父表的参照约束数目)
//SELFREFS 该表的自引用参照约束数目(该表在其中既充当父表又充当子表的参照约束数目)
//KEYUNIQUE 在该表上所定义的惟一约束(除了主键)的数目
//CHECKCOUNT 在该表上所定义的检查约束的数目
//外键
//SYSCAT.REFERENCES 目录视图中包含引用完整性(外键)约束信息。
ArrayList<ConstraintStatement> constraintSqlList = new ArrayList<ConstraintStatement>();
//SYSCAT.REFERENCES : Each row represents a referential integrity (foreign key) constraint.
String foreignKeySql = "Select constname, tabschema,tabname, reftabschema,reftabname, deleterule, updaterule, fk_colnames, pk_colnames from SYSCAT.REFERENCES " +
"where (tabschema="" + this.tabSchema + "" and tabname="" + this.tabname + "") "
+ "or "
+ "(reftabschema="" + this.tabSchema + "" and reftabname="" + this.tabname + "") "
+ "with ur";
//System.out.println(foreignKeySql);
dbbean foreignKeyQuery = new dbbean(Table.poolName);
foreignKeyQuery.execute(foreignKeySql);
for(int i=0; i<foreignKeyQuery.getRowCount(); i++) {
ConstraintStatement foreignKeyStmt = new ConstraintStatement();
foreignKeyStmt.fullName = foreignKeyQuery.getFieldValue("constname", i);
StringBuffer foreignKeyDropSb = new StringBuffer();
foreignKeyDropSb.append("ALTER TABLE ").append(foreignKeyQuery.getFieldValue("tabschema", i)).append(".").append(foreignKeyQuery.getFieldValue("tabname", i)).append("
");
foreignKeyDropSb.append(" DROP FOREIGN KEY ").append(foreignKeyQuery.getFieldValue("constname", i)).append(";");
foreignKeyStmt.dropSql = foreignKeyDropSb.toString();
StringBuffer foreignKeySb = new StringBuffer();
foreignKeySb.append("ALTER TABLE ").append(foreignKeyQuery.getFieldValue("tabschema", i)).append(".").append(foreignKeyQuery.getFieldValue("tabname", i)).append("
");
foreignKeySb.append(" ADD CONSTRAINT ").append(foreignKeyQuery.getFieldValue("constname", i)).append(" FOREIGN KEY (");
String[] fk_colnames = foreignKeyQuery.getFieldValue("fk_colnames", i).split(" ");
for (int j = 0; j < fk_colnames.length; j++) {
if(fk_colnames[j].length()==0)
continue;
if(j==0)
foreignKeySb.append(fk_colnames[j]);
else
foreignKeySb.append(", ").append(fk_colnames[j]);
}
foreignKeySb.append(")
");
foreignKeySb.append(" REFERENCES ").append(foreignKeyQuery.getFieldValue("reftabschema", i))
.append(".").append(foreignKeyQuery.getFieldValue("reftabname", i));
foreignKeySb.append(" (");
String[] pk_colnames = foreignKeyQuery.getFieldValue("pk_colnames", i).split(" ");
for (int j = 0; j < pk_colnames.length; j++) {
if(pk_colnames[j].length()==0)
continue;
if(j==0)
foreignKeySb.append(pk_colnames[j]);
else
foreignKeySb.append(", ").append(pk_colnames[j]);
}
foreignKeySb.append(")
");
char[] deleterule = Table.getChar(foreignKeyQuery.getFieldValue("deleterule", i));
if (deleterule.length > 0) {
switch (deleterule[0]) {
case "A":
foreignKeySb.append(" ON DELETE NO ACTION
");
break;
case "C":
foreignKeySb.append(" ON DELETE CASCADE
");
break;
case "N":
foreignKeySb.append(" ON DELETE SET NULL
");
break;
case "R":
foreignKeySb.append(" ON DELETE RESTRICT
");
break;
default:
foreignKeySb.append("");
}
}
char[] updaterule = Table.getChar(foreignKeyQuery.getFieldValue("updaterule", i));
if (updaterule.length > 0) {
switch (updaterule[0]) {
case "A":
foreignKeySb.append(" ON UPDATE NO ACTION
");
break;
case "R":
foreignKeySb.append(" ON UPDATE RESTRICT
");
break;
default:
foreignKeySb.append("");
}
}
foreignKeySb.append(" ENFORCED
");//syscat.tabconst ENFORCED
foreignKeySb.append(" ENABLE QUERY OPTIMIZATION;");//syscat.tabconst ENABLEQUERYOPT
foreignKeyStmt.createSql = foreignKeySb.toString();
constraintSqlList.add(foreignKeyStmt);
}
//check约束
String checkSql = "Select constname,tabschema,tabname,text from SYSCAT.CHECKS " +
"where tabschema=""
+ this.tabSchema
+ "" and tabname=""
+ this.tabname
+ "" with ur";
//System.out.println(checkSql);
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
conn = Table.dbm.getConnection(Table.poolName);
stmt = conn.createStatement();
rs = stmt.executeQuery(checkSql);
while(rs.next()) {
ConstraintStatement checkStmt = new ConstraintStatement();
checkStmt.fullName = rs.getString("constname");
StringBuffer checkDropSb = new StringBuffer();
checkDropSb.append("ALTER TABLE ").append(this.tabSchema).append(".").append(this.tabname).append("
");
checkDropSb.append(" DROP CHECK ").append(rs.getString("constname")).append(";");
checkStmt.dropSql = checkDropSb.toString();
StringBuffer checkSb = new StringBuffer();
checkSb.append("ALTER TABLE ").append(rs.getString("tabschema")).append(".").append(rs.getString("tabname")).append("
");
checkSb.append(" ADD CONSTRAINT ").append(rs.getString("constname")).append(" CHECK
");
Clob text_clob = rs.getClob("text");
String text_str = text_clob.getSubString( 1, (int)(text_clob.length()) );
checkSb.append(" (").append(text_str).append(")
");
checkSb.append(" ENFORCED").append("
");
checkSb.append(" ENABLE QUERY OPTIMIZATION").append(";
");
checkStmt.createSql = checkSb.toString();
constraintSqlList.add(checkStmt);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
rs.close();
stmt.close();
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
dbbean checkQuery = new dbbean(Table.poolName);
checkQuery.execute(checkSql);
return constraintSqlList;
}
/**
* 索引
* @param tabFullName
* @return
*/
public ArrayList<IndexStatement> getIndexSqlList()
{
//索引
//SYSCAT.INDEXES 视图的 UNIQUERULE 列指示索引的特征。如果此列的值为 P,那么索引为主键;如果该值为 U,那么索引是唯一索引(但不是主键)。
ArrayList<IndexStatement> indexSqlList = new ArrayList<IndexStatement>();
String indexSql = "Select indschema, indname,tabschema,tabname,colnames,uniquerule,made_unique,pctfree,iid,reverse_scans from SYSCAT.INDEXES " +
"where tabschema=""
+ this.tabSchema
+ "" and tabname=""
+ this.tabname
+ "" and user_defined=1 order by iid with ur";
//+ "" and indname not in (Select constname from SYSCAT.TABCONST) order by iid with ur";
//"" and uniquerule<>"P" and indname not in (Select constname from SYSCAT.TABCONST) order by iid with ur";
//System.out.println(indexSql);
dbbean indexQuery = new dbbean(Table.poolName);
indexQuery.execute(indexSql);
for (int i = 0; i < indexQuery.getRowCount(); i++) {
String indname = indexQuery.getFieldValue("indname", i);
/**
if(indexQuery.getFieldValue("uniquerule", i).equals("P"))
{
//经测试,不管是不是sql开头的索引,只要uniquerule=P都不能够删除,但是db2look生成sql的时候,这些创建sql有些会生成
continue;
}
**/
IndexStatement indexStmt = new IndexStatement();
indexStmt.fullName = indexQuery.getFieldValue("indschema", i) + "." + indexQuery.getFieldValue("indname", i);
indexStmt.dropSql = "drop index " + indexStmt.fullName + ";";
StringBuffer indexSb = new StringBuffer();
char[] uniquerule = Table.getChar(indexQuery.getFieldValue("uniquerule", i));
indexSb.append("CREATE ");
/**
Unique rule.
D = Permits duplicates
U = Unique
P = Implements primary key
**/
switch(uniquerule[0])
{
case "D":
indexSb.append("INDEX ");
break;
case "U":
if(indexQuery.getFieldValue("indschema", i).startsWith("SYSIBM"))
{
//System.out.println("系统建立UNIQUE,归属UNIQUE,此处不予处理");//这样此处会报错
}
else
{
indexSb.append("UNIQUE INDEX ");
}
break;
case "P":
//if(indname.startsWith("SQL") && indname.length()==18)//此种索引考虑屏蔽掉,此类索引不能删除
char[] madeUnique = Table.getChar(indexQuery.getFieldValue("made_unique", i));
switch(madeUnique[0])
{
case "Y"://通过此种方式更好,存在一些不是SQL开头的照样没有unique修饰词
indexSb.append("INDEX ");
break;
case "N":
indexSb.append("UNIQUE INDEX ");
break;
default:
log.error("不支持" + madeUnique[0]);
}
break;
default:
log.error("不支持" + uniquerule[0]);
}
indexSb.append(indexQuery.getFieldValue("indschema", i));
indexSb.append(".");
indexSb.append(indexQuery.getFieldValue("indname", i));
indexSb.append(" ON ");
indexSb.append(this.tabSchema).append(".").append(this.tabname).append("
");
String indexColSql = "select indschema, indname, colname, colseq, colorder, collationschema, collationname from SYSCAT.INDEXCOLUSE " +
"where indschema="" +
indexQuery.getFieldValue("indschema", i) +
""and indname="" +
indexQuery.getFieldValue("indname", i) +
"" order by colseq with ur";
//System.out.println(indexColSql);
dbbean indexColQuery = new dbbean(Table.poolName);
indexColQuery.execute(indexColSql);
indexSb.append(" (");
for (int j = 0; j < indexColQuery.getRowCount(); j++) {
if(j!=0)
indexSb.append(", ");
indexSb.append(indexColQuery.getFieldValue("colname", j));
char[] colorder = Table.getChar(indexColQuery.getFieldValue("colorder", j));
switch(colorder[0])
{
case "A":
indexSb.append(" ASC");
break;
case "D":
indexSb.append(" DESC");
break;
case "I":
log.error("不支持的类型");
break;
default:
log.error("不支持的类型");
}
}
indexSb.append(")
");
int pctfree = Integer.parseInt(indexQuery.getFieldValue("pctfree", i));
if(pctfree!=-1)
{
indexSb.append(" PCTFREE ");
indexSb.append(pctfree);
indexSb.append(" ");
}
char[] reverse_scans = Table.getChar(indexQuery.getFieldValue("reverse_scans", i));
switch(reverse_scans[0])
{
case "Y":
indexSb.append("ALLOW REVERSE SCANS");
break;
case "N":
indexSb.append("DISALLOW REVERSE SCANS");
break;
default:
log.error("不支持的类型");
}
indexSb.append(";
");
indexStmt.createSql = indexSb.toString();
indexSqlList.add(indexStmt);
}
return indexSqlList;
}
/**
* 视图
* @param tabFullName
* @return
*/
public ArrayList<ViewStatement> getViewSqlList()
{
ArrayList<ViewStatement> viewSqlList = new ArrayList<ViewStatement>();
String viewSql = "Select a.viewschema, a.viewname, a.dtype, a.owner, a.btype, a.bschema, a.bname, a.tabauth, a.definer from SYSCAT.VIEWDEP a,SYSCAT.TABLES b " +
"where a.viewschema=b.tabschema and a.viewname=b.tabname and a.dtype="V" and a.bschema=""
+ this.tabSchema
+ "" and a.bname=""
+ this.tabname
+ "" order by b.create_time with ur";
//System.out.println(viewSql);
dbbean viewQuery = new dbbean(Table.poolName);
viewQuery.execute(viewSql);
for (int i = 0; i < viewQuery.getRowCount(); i++) {
viewSqlList.add( this.getViewDDL(viewQuery.getFieldValue("viewschema", i), viewQuery.getFieldValue("viewname", i)) );
}
return viewSqlList;
}
/**
* 获取建视图脚本
*/
public ViewStatement getViewDDL(String viewFullName)
{
String[] viewNameArray = this.splitTableFullName(viewFullName);
return this.getViewDDL(viewNameArray[0],viewNameArray[1]);
}
/**
* 获取建视图脚本
*/
public ViewStatement getViewDDL(String viewSchema, String viewName)
{
//ArrayList<String> viewSqlList = new ArrayList<String>();
String viewSql = "Select viewschema, viewname, owner, ownertype, seqno, viewcheck, readonly, valid, qualifier, func_path, text, definer from SYSCAT.VIEWS where viewschema=""
+ viewSchema
+ "" and viewname=""
+ viewName
+ "" with ur";
//System.out.println(viewSql);
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
ViewStatement viewStatement = new ViewStatement();
viewStatement.fullName = viewSchema.trim() + "." + viewName.trim();
try {
conn = dbm.getConnection(Table.poolName);
stmt = conn.createStatement();
rs = stmt.executeQuery(viewSql);
while (rs.next()) {
Clob func_path_clob = rs.getClob("func_path");
Clob text_clob = rs.getClob("text");
String qualifier_str = rs.getString("qualifier");
String func_path_str = func_path_clob.getSubString( 1, (int)(func_path_clob.length()) );
String text_str = text_clob.getSubString( 1, (int)(text_clob.length()) );
viewStatement.schemaSql = "SET CURRENT SCHEMA = " + qualifier_str + ";";
viewStatement.pathSql = "SET CURRENT PATH = " + func_path_str.replaceAll(""", "") + ";";
viewStatement.createSql = text_str + ";";
viewStatement.dropSql = "drop view " + viewStatement.fullName + ";";
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally{
try {
rs.close();
stmt.close();
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return viewStatement;
}
/**
* materialized query table 物化查询表
* @param tabFullName
* @return
*/
public ArrayList<ViewStatement> getMQTSqlList()
{
//相关视图,物化视图在此表关系中都可以体现,另外物化视图还有表注释等信息
ArrayList<ViewStatement> viewSqlList = new ArrayList<ViewStatement>();
String viewSql = "Select viewschema, viewname, dtype, owner, btype, bschema, bname, tabauth, definer from SYSCAT.VIEWDEP " +
"where dtype="S" and bschema=""
+ this.tabSchema
+ "" and bname=""
+ this.tabname
+ "" with ur";
//System.out.println(viewSql);
dbbean viewQuery = new dbbean(Table.poolName);
viewQuery.execute(viewSql);
for (int i = 0; i < viewQuery.getRowCount(); i++) {
viewSqlList.add( this.getMQTDDL(viewQuery.getFieldValue("viewschema", i), viewQuery.getFieldValue("viewname", i)) );
}
return viewSqlList;
}
/**
* 获取建物化视图脚本
*/
public ViewStatement getMQTDDL(String viewSchema, String viewName)
{
//ArrayList<String> viewSqlList = new ArrayList<String>();
String viewSql = "Select viewschema, viewname, owner, ownertype, seqno, viewcheck, readonly, valid, qualifier, func_path, text, definer from SYSCAT.VIEWS where viewschema=""
+ viewSchema
+ "" and viewname=""
+ viewName
+ "" with ur";
//System.out.println(viewSql);
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
ViewStatement viewStatement = new ViewStatement();
viewStatement.fullName = viewSchema.trim() + "." + viewName.trim();
try {
conn = dbm.getConnection(Table.poolName);
stmt = conn.createStatement();
rs = stmt.executeQuery(viewSql);
while (rs.next()) {
Clob func_path_clob = rs.getClob("func_path");
Clob text_clob = rs.getClob("text");
String qualifier_str = rs.getString("qualifier");
String func_path_str = func_path_clob.getSubString( 1, (int)(func_path_clob.length()) );
String text_str = text_clob.getSubString( 1, (int)(text_clob.length()) );
viewStatement.schemaSql = "SET CURRENT SCHEMA = " + qualifier_str + ";";
viewStatement.pathSql = "SET CURRENT PATH = " + func_path_str.replaceAll(""", "") + ";";
viewStatement.createSql = text_str + ";";
viewStatement.dropSql = "drop table " + viewStatement.fullName + ";";
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally{
try {
rs.close();
stmt.close();
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return viewStatement;
}
/**
* 获取建触发器脚本
* 暂未实现
*/
public ArrayList<TriggerStatement> getTriggerSqlList()
{
//Select * from SYSCAT.TRIGDEP with ur;
//Select * from SYSCAT.TRIGGERS with ur;
/**
* 目前只有整个仓库只有两张表有触发器,暂不考虑:
* "PT " "USER_GROUP_RELATION"
* "PT " "USER"
*/
ArrayList<TriggerStatement> triggerSqlList = new ArrayList<TriggerStatement>();
String triggerSql = "Select trigschema, trigname, btype, bschema, bname, tabauth from SYSCAT.TRIGDEP where bschema=""
+ this.tabSchema
+ "" and bname=""
+ this.tabname
+ "" with ur";
//System.out.println(viewSql);
dbbean triggerQuery = new dbbean(Table.poolName);
triggerQuery.execute(triggerSql);
for (int i = 0; i < triggerQuery.getRowCount(); i++) {
triggerSqlList.add( this.getTriggerDDL(triggerQuery.getFieldValue("trigschema", i), triggerQuery.getFieldValue("trigname", i)) );
}
return triggerSqlList;
}
/**
* 获取建触发器脚本
*/
public TriggerStatement getTriggerDDL(String trigSchema, String trigName)
{
//ArrayList<String> viewSqlList = new ArrayList<String>();
String trigSql = "Select trigschema,trigname,owner,ownertype,tabschema,tabname,trigtime,trigevent,func_path,qualifier,text from SYSCAT.TRIGGERS where trigschema=""
+ trigSchema
+ "" and trigname=""
+ trigName
+ "" with ur";
//System.out.println(viewSql);
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
TriggerStatement trigStatement = new TriggerStatement();
trigStatement.fullName = trigSchema.trim() + "." + trigName.trim();
trigStatement.dropSql = "DROP TRIGGER " + trigStatement.fullName + ";";
try {
conn = dbm.getConnection(Table.poolName);
stmt = conn.createStatement();
rs = stmt.executeQuery(trigSql);
while (rs.next()) {
Clob func_path_clob = rs.getClob("func_path");
Clob text_clob = rs.getClob("text");
String qualifier_str = rs.getString("qualifier");
String func_path_str = func_path_clob.getSubString( 1, (int)(func_path_clob.length()) );
String text_str = text_clob.getSubString( 1, (int)(text_clob.length()) );
trigStatement.schemaSql = "SET CURRENT SCHEMA = " + qualifier_str + ";";
trigStatement.pathSql = "SET CURRENT PATH = " + func_path_str.replaceAll(""", "") + ";";
trigStatement.createSql = text_str + ";";
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally{
try {
rs.close();
stmt.close();
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return trigStatement;
}
/**
* 获取引用表函数脚本
*
*/
public ArrayList<FunctionStatement> getFunctionSqlList()
{
//Select * from SYSCAT.FUNCDEP with ur;
//Select * from SYSCAT.FUNCTIONS with ur;
//Select * from SYSCAT.ROUTINES with ur;
//Select * from SYSCAT.ROUTINEDEP with ur;
//Select * from SYSCAT.ROUTINEPARMS with ur;
ArrayList<FunctionStatement> funcSqlList = new ArrayList<FunctionStatement>();
// String funcSql = "Select routineschema, specificname, btype, bschema, bname, tabauth, routinename from SYSCAT.ROUTINES where bschema=""
// + this.tabSchema
// + "" and bname=""
// + this.tabname
// + "" with ur";
String funcSql = "Select funcschema, funcname, btype, bschema, bname, tabauth from SYSCAT.FUNCDEP where bschema=""
+ this.tabSchema
+ "" and bname=""
+ this.tabname
+ "" with ur";
//System.out.println(viewSql);
dbbean funcQuery = new dbbean(Table.poolName);
funcQuery.execute(funcSql);
for (int i = 0; i < funcQuery.getRowCount(); i++) {
funcSqlList.add( this.getFunctionDDL(funcQuery.getFieldValue("funcschema", i), funcQuery.getFieldValue("funcname", i)) );
}
return funcSqlList;
}
/**
* 获取建函数脚本
*/
public FunctionStatement getFunctionDDL(String routineSchema, String routineName)
{
//ArrayList<String> viewSqlList = new ArrayList<String>();
String funcSql = "Select routineschema,routinename,routinetype,specificname,func_path,qualifier,text from SYSCAT.ROUTINES where routinetype="F" and routineschema=""
+ routineSchema
+ "" and specificname=""
+ routineName
+ "" with ur";
//System.out.println(viewSql);
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
FunctionStatement funcStatement = new FunctionStatement();
funcStatement.fullName = routineSchema.trim() + "." + routineName.trim();
funcStatement.dropSql = "DROP SPECIFIC FUNCTION " + funcStatement.fullName + ";";
try {
conn = dbm.getConnection(Table.poolName);
stmt = conn.createStatement();
rs = stmt.executeQuery(funcSql);
while (rs.next()) {
Clob func_path_clob = rs.getClob("func_path");
Clob text_clob = rs.getClob("text");
String qualifier_str = rs.getString("qualifier");
String func_path_str = func_path_clob.getSubString( 1, (int)(func_path_clob.length()) );
String text_str = text_clob.getSubString( 1, (int)(text_clob.length()) );
funcStatement.schemaSql = "SET CURRENT SCHEMA = " + qualifier_str + ";";
funcStatement.pathSql = "SET CURRENT PATH = " + func_path_str.replaceAll(""", "") + ";";
funcStatement.createSql = text_str + ";";
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally{
try {
rs.close();
stmt.close();
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return funcStatement;
}
/**
*
* @param sql
* @return
*/
public boolean createTable(String tabFullName) {
// 创建表,如果存在但没有数据,则删除重建,否则报异常处理
dbbean createBean = new dbbean(Table.poolName);
createBean.setUpdateFlag(true);
return createBean.execute("");
}
public static char[] getChar(String str) {
if ((str == null) || (str.length() == 0))
return new char[0];
else
return str.toCharArray();
}
/**
* 主函数,测试
*
* @param args
*/
public static void main(String[] args) {
Table ob = new Table("NWH.DEPART","NWH.DEPART",null,null);
//ob.getTableSql("QHESOP.EXPLAIN_STATEMENT");
ArrayList<String> list = ob.getTableSqlList();
//ArrayList<String> list = ob.getPrimaryUniqueConstraintSqlList();
//ArrayList<String> list = ob.getForeignCheckConstraintSqlList();
//ArrayList<String> list = ob.getIndexSqlList();
for (String str : list) {
System.out.println(str);
// for (char c : str.toCharArray()) {
// System.out.print(c);
// System.out.print("----");
// System.out.println((int)c);
// }
// System.out.println("------------------------");
// for (byte b : str.getBytes()) {
// System.out.println(b);
// }
// System.out.println("------------------------");
// String pstr = "(.|
|
)*;\s*";
// Pattern p = Pattern.compile(pstr);
// Matcher m = p.matcher(str);
// while(m.find())
// System.out.println("gggg----" + m.group());
//
// System.out.println(Pattern.matches(pstr, str));
//System.out.println("sql=" + str);
//System.out.println("tightSql=" + str.replaceAll("\s|"", ""));
}
ArrayList<ConstraintStatement> primaryUniqueConstraintList = ob.getPrimaryUniqueConstraintSqlList();
for (ConstraintStatement str : primaryUniqueConstraintList) {
System.out.println(str);
}
ArrayList<ConstraintStatement> foreignCheckConstraintSqlList = ob.getForeignCheckConstraintSqlList();
for (ConstraintStatement str : foreignCheckConstraintSqlList) {
System.out.println(str);
}
ArrayList<IndexStatement> indexList = ob.getIndexSqlList();
for (IndexStatement str : indexList) {
System.out.println(str);
}
ArrayList<ViewStatement> viewList = ob.getViewSqlList();
for (ViewStatement str : viewList) {
System.out.println(str);
}
ArrayList<FunctionStatement> funcList = ob.getFunctionSqlList();
for (FunctionStatement str : funcList) {
System.out.println(str);
}
ArrayList<TriggerStatement> trigList = ob.getTriggerSqlList();
for (TriggerStatement str : trigList) {
System.out.println(str);
}
ArrayList<ViewStatement> mqtList = ob.getMQTSqlList();
for (ViewStatement str : mqtList) {
System.out.println(str);
}
// ob.createTable("PT.USER");
// char[] cc = new char[0];
// System.out.println(cc[0]);
// ob.createTable("NWH.ACCT_ITEM_200709");
}
}
package move.bean;
public class ConstraintStatement extends StatementBean {
public String toString()
{
StringBuffer sb = new StringBuffer();
sb.append(this.fullName).append("
");
sb.append(" ").append(this.createSql).append("
");
sb.append(" ").append(this.dropSql).append("
");
return sb.toString();
}
}
package move.bean;
public class FunctionStatement extends StatementBean {
//public String fullName = null;
public String schemaSql = null;
public String pathSql = null;
//public String createSql = null;
//public String dropSql = null;
public String toString()
{
StringBuffer sb = new StringBuffer();
sb.append(this.fullName).append("
");
sb.append(" ").append(this.schemaSql).append("
");
sb.append(" ").append(this.pathSql).append("
");
sb.append(" ").append(this.createSql).append("
");
return sb.toString();
}
}
package move.bean;
public class IndexStatement extends StatementBean {
//public String indexFullName = null;
public String createSql = null;
public String toString()
{
StringBuffer sb = new StringBuffer();
sb.append(this.fullName).append("
");
sb.append(" ").append(this.createSql).append("
");
sb.append(" ").append(this.dropSql).append("
");
return sb.toString();
}
}
package move.bean;
public class StatementBean {
public String fullName = null;
public String createSql = null;
public String dropSql = null;
public String toString()
{
StringBuffer sb = new StringBuffer();
sb.append(this.fullName).append("
");
sb.append(" ").append(this.createSql).append("
");
sb.append(" ").append(this.dropSql).append("
");
return sb.toString();
}
}
package move.bean;
public class TriggerStatement extends StatementBean {
//public String triggerFullName = null;
public String schemaSql = null;
public String pathSql = null;
//public String createSql = null;
public String toString()
{
StringBuffer sb = new StringBuffer();
sb.append(this.fullName).append("
");
sb.append(" ").append(this.schemaSql).append("
");
sb.append(" ").append(this.pathSql).append("
");
sb.append(" ").append(this.createSql).append("
");
sb.append(" ").append(this.dropSql).append("
");
return sb.toString();
}
}
package move.bean;
public class ViewStatement extends StatementBean {
//public String viewFullName = null;
public String schemaSql = null;
public String pathSql = null;
//public String createSql = null;
public String toString()
{
StringBuffer sb = new StringBuffer();
sb.append(this.fullName).append("
");
sb.append(" ").append(this.schemaSql).append("
");
sb.append(" ").append(this.pathSql).append("
");
sb.append(" ").append(this.createSql).append("
");
sb.append(" ").append(this.dropSql).append("
");
return sb.toString();
}
}
声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。
- 上一篇:没有了
- 下一篇:没有了
