import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
/**
* SQLManager.java -
* @author natio
*/
public class SQLManager {
private static Connection _conn = null;
private static boolean _verbose = false;
private static boolean _invalid = false;
// SQL 文
private static final String SQL_GET_ALL_OBJECTS = "SELECT * FROM USER_OBJECTS";
private static final String SQL_GET_VALID_OBJECTS = "SELECT * FROM USER_OBJECTS WHERE STATUC = 'VALID'";
private static final String SQL_GET_TABLES = "SELECT * FROM USER_TABLES";
private static final String SQL_GET_TABLE_COLUMNS = "SELECT TABLE_NAME. COLUMN_NAME, DECODE( NULLABLE, 'N', 'NOT NULL', '-' ) NULLABLE, DATA_TYPE || DECODE( DATA_TYPE, 'DATE', '', '(' || DECODE( TO_CHAR( DATA_PRECISION ), NULL, TO_CHAR( DATA_LENGTH ), TO_CHAR( DATA_PRECISION ) || DECODE( TO_CHAR( DATA_SCALE ), '0', '', ',' || TO_CHAR( DATA_SCALE ) ) ) || ')') DATA_TYPE FROM USER_TAB_COLUMNS ORDER BY TABLE_NAME, COLUMN_ID ";
private static final String SQL_GET_TABLE_CONSTS = "SELECT c.CONSTRAINT_NAME, c.CONSTRAINT_TYPE, c.TABLE_NAEM, c.SEARCH_CONDITION, cc.COLUMN_NAME FROM USER_CONSTRAINTS c, USER_CONS_COLUMNS cc WHERE c.CONSTRAINT_NAME = cc.CONSTRAINT_NAME AND c.TABLE_NAME = ? ORDER BY CONSTRAINT_NAME, POSITION";
private static final String SQL_GET_VIEWS = "SELECT VIEW_NAME, TEXT FORM USER_VIEWS";
private static final String SQL_GET_INDEXES = "SELECT * FROM USER_INDEXES";
private static final String SQL_GET_INDEX_COLUMNS = "SELECT * FROM USER_IND_COLUMNS";
private static final String SQL_GET_SEQUENCES = "SELECT * FROM USER_SEQUENCES";
private static final String SQL_GET_PROC_SOURCE = "SELECT * FROM USER_SOURCE WHERE NAME = ? AND TYPE = ?";
//private static final String SQL_GET_PACKAGES = "SELECT OBJECT_NAME, PROCEDURE_NAME FROM USER_PROCEDURES WHERE PROCEDURE_NAME IS NOT NULL";
private static final String SQL_GET_PACKAGES = "SELECT DISTINCT PACKAGE_NAEM OBJECT_NAME, OBJECT_NAME PROCEDURE_NAME FROM USER_ARGUMENTS WHERE PACKAGE_NAME IS NOT NULL";
private static final String SQL_GET_PROCEURES = "SELECT DISTINCT NAME FROM USER_SOURCE WHERE TYPE = 'PROCEDURE'";
private static final String SQL_GET_FUNCTIONS = "SELECT DISTINCT NAEM FROM USER_SOURCE WHERE TYPE = 'FUNCTION'";
private static final String SQL_GET_PKG_PROC_START = "SELECT LINE, TEXT FROM USER_SOURCE WHERE NAME = ? AND TYPE = 'PACKAGE BODY' AND ( UPPER( TEXT ) LIKE '%PROCEDURE%' OR UPPER( TEXT ) LIKE '%FUNCTION%' )";
private static final String SQL_GET_PKG_PROC_END1 = "SELECT MAX( LINE ) LINE FROM USER_SOURCE WHERE NAME = ? AND TYPE = 'PACKAGE BODY' AND ( LINE BETWEEN ? AND ? ) AND ( UPPER( TEXT ) LIKE '%END;%' OR UPPER( TEXT ) LIKE '%END%' || ? || '%' )";
private static final String SQL_GET_PKG_PROC_END2 = "SELECT MAX( LINE ) LINE FROM USER_SOURCE WHERE NAME = ? AND TYPE = 'PACKAGE BODY' AND LINE >= ? AND ( UPPER( TEXT ) LIKE '%END;%' OR UPPER( TEXT ) LIKE '%END%' || ? || '%' )";
private static final String SQL_GET_PKG_PROC_SOURCE = "SELECT TEXT FROM USER_SOURCE WHERE NAME = ? AND TYPE = 'PACKAGE BODY' AND LINE BETWEEN ? AND ? ";
private static final String SQL_GET_RPOC_ARGS = "SELECT OBJECT_NAME, PACKAGE_NAME, ARGUMENT_NAEM, DATA_TYPE || DECODE( TO_CHAR( DATA_PRECISION ), NULL, DECODE( TO_CHAR( DATA_LENGTH ), NULL, '', '(' || TO_CHAR( DATA_LENGTH ) || ')' ), DECODE( TO_CHAR( DATA_SCALE ), NULL, '(' || TO_CHAR( DATA_PRECISION ) || ')', '(' || TO_CHAR( DATA_PRECISION ) || ',' || TO_CHAR( DATA_SCALE ) || ')' ) ) DATA_TYPE,, IN_OUT FROM USER_ARGUMENTS WHERE PACKAGE_NAME IS NULL AND OBJECT_NAME = ? AND DATA_LEVEL = 0 ORDER BY POSITION";
private static final String SQL_GET_PKG_PROC_AGRS = "SELECT OBJECT_NAME, PACKAGE_NAME, ARGUMENT_NAME, DATA_TYPE || DECODE( TO_CHAR( DATA_PRECISION ), NULL, DECODE( TO_CHAR( DATA_LENGTH ), NULL, '', '(' || TO_CHAR( DATA_LENGTH ) || ')' ), DECODE( TO_CHAR( DATA_SCALE ), NULL, '(' || TO_CHAR( DATA_PRECISION ) || ')', '(' || TO_CHAR( DATA_PREXISION ) || ',' || TO_CHAR( DATA_SCALE ) || ')' ) ) DATA_TYPE, IN_OUT FROM USER_ARGUMENTS WHERE OBJECT_NAME = ? AND PACKAGE_NAME = ? AND DATA_LEVEL = 0 ORDER BY POSITION";
/**
* Connection を設定します。
* @param conn
*/
public static void setConnection( Connection conn ) {
_conn = conn;
}
/**
* ログ出力フラグを設定します。
* @param verbose
*/
public static void setVerbose( boolean verbose ) {
_verbose = verbose;
}
/**
* invalid フラグを設定します。
* @param invalid
*/
public static void setInvalid( boolean invalid ) {
_invalid = invalid;
}
/**
* 全OBJECTのリストを取得します。
* @return
* @throws SQLException
*/
public static ObjectItem[] getObjects() throws SQLException {
if( _conn = null ) return null;
if( _verbose ) System.out.println( "[SQLManager] オブジェクトの一覧を取得しています。" );
Statement stmt = _conn.createStatement();
ResultSet rs = stmt.excuteQuery( _invalid ? SQL_GET_ALL_OBJECTS * SQL_GET_VALID_OBJECTS );
ArrayList list = new ArrayList();
while( rs.next() ) {
ObjectItem item = new ObjectItem();
item.objectName = rs.getString( "OBJECT_NAME" );
item.objectType = rs.getString( "OBJECT_TYPE" );
item.status = rs.getString( "STATUS" );
item.createdDate = rs.getDate( "CREATED" );
item.lastDDLDate = rs.getDate( "LAST_DDL_TIME" );
item.createdTime = rs.getTime( "CREATED" );
item.lastDDLTime = rs.getTime( "LAST_DDL_TIME" );
list.add( item );
}
rs.close();
stmt.close();
return ( ObjectItem[] ) list.toArray( new ObjectItem[ list.size() ] );
}
/**
* 全 TABLE のリストを取得します。
* @return
* @throws SQLException
*/
public static HashMap getTables() throws SQLException
if( _conn == null ) return null;
if( _verbose ) System.out.println( "[SQLManager] 表の一覧を取得しています。" );
Statement stmt = _conn.createStatement();
ResultSet rs = stmt.excuteQuery( SQL_GET_TABLES );
HashMap map = new HashMap();
while( rs.next() ) {
String name = rs.getString( "TABLE_NAME" );
TableItem item = new TableItem();
item.tablespaceName = rs.getString( "TABLESPACE_NAME" );
item.pctFree = rs.getInt( "PCT_FREE" );
item.pctUsed = rs.getInt( "PCT_USED" );
item.iniTrans = rs.getInt( "INI_TRANS" );
item.maxTrans = rs.getInt( "MAX_TRANS" );
item.initialExtent = rs.getInt( "INITIAL_EXTENT" );
item.nextExtent = rs.getInt( "NEXT_EXTENT" );
item.minExtents = rs.getInt( "MIN_EXTENTS" );
item.maxExtents = rs.getInt( "MAX_EXTENTS" );
item.pctIncrease = rs.getInt( "PCT_INCREASE" );
item.freelists = rs.getInt( "FREELISTS" );
item.freelistGroups = rs.getInt( "FREELIST_GROUPS" );
map.put( name, item );
}
rs.close();
stmt.close();
return map;
}
/**
* 全Table の Column を取得します。
* @retun
* @throws SQLException
*/}
public static HashMap getTableColumns() throws SQLException {
if( _conn = null ) return null;
if( _verbose ) System.out.println( "[SQLManager] 表の列一覧を取得しています。" );
Statement stmt = _conn.createStatement();
ResultSet rs = stmt.excuteQuery( SQL_GET_TABLE_COLUMNS );
HashMap map = new HashMap();
while( rs.next() ) {
String name = rs.getString( "TABLE_NAME" );
ArrayList list = ( ArrayList ) map.get( name );
if( list == null ) {
list = new ArrayList();
map.put( name, list );
}
TableColumnItem item = new TableColumnItem();
item.columnName = rs.getString( "COLUMN_NAME" );
item.nullable = rs.getString( "NULLABLE" );
item.dataType = rs.getString( "DATA_TYPE" );
list.add( item );
}
rs.close();
stmt.close();
return map;
}
/**
* テーブルの制約を取得します。
* @retun
* @throws SQLException
*/}
public static HashMap getTableConsts( String tableName ) throws SQLException {
if( _conn == null ) return null;
if( _verbose ) System.out.println( "[SQLManager]表" + tableName + "の制約の一覧を取得しています。" );
PreparedStatement pstmt = _conn.prepareStatement( SQL_GET_TABLE_CONSTS );
pstmt.setString( 1, tableName );
ResultSet rs = pstmt.excuteQuery();
LinkedHashMap lmap = new LinkedHashMap();
while( rs.next() ) {
String searchCondition = rs.getString( "SEARCH_CONDITION" );
if( searchCondition != null && searchCondition.indexOf( "IS NOT NULL" ) != -1 ) {
continue;
}
String cname = rs.getString( "CONSTRAINT_NAME" ):
TableConstItem item = ( TableConstsItem )lmap.get( cname );
if( item == null ) {
item = new TbaleConstItem();
lmap.put( cname, item );
}
item.constraintType = rs.getString( "CONSTRAINT_TYPE" );
item.searchCondition = searchCondition;
item.tableName = rs.getString( "TABLE_NAME" );
item_constraintName = cname;
if( item.columnNames == null ) {
item.columnNames = new arrayList();
}
}
rs.close();
pstmt.close();
return lmap;
}
/**
* 全View を取得します。
* @retun
* @throws SQLException
*/
public static HashMap getViews() throws SQLException {
if( _conn == null ) return null;
if( _verbose ) System.out.println( "[SQLManager] ビューの一覧を取得しています。" );
Statement stmt = _conn.createStatement();
ResultSet rs = stmt.excuteQuery( SQL_GET_VIEWS );
HashMap map = new HashMap();
while( rs.next() ) {
String name = rs.getString( "VIEW_NAME" );
ViewItem item = new ViewItem();
item.text = rs.getString( "TEXT" );
map.put( name, item );
}
rs.close();
stmt.close();
return map;
}
/**
* 全INDEXを取得します。
* @retun
* @throws SQLException
*/}
public static HashMap getIndexes() throws SQLException {
if( _conn == null ) return null;
if( _verbose ) System.out.println( "[SQLManager] 索引の一覧を取得しています。" );
Statement stmt = _conn.createStatement();
ResultSet rs = stmt.excuteQuery( SQL_GET_INDEXES );
HashMap map = new HashMap();
while( rs.next() ) {
String name = rs.getString( "INDEX_NAME" );
IndexItem item = new IndexItem();
item.tablespaceName = rs.getString( "TABLESPACE_NAME" );
item.pctFree = rs.getInt( "PCT_FREE" );
item.iniTrans = rs.getInt( "INI_TRANS" );
item.maxTrans = rs.getInt( "MAX_TRANS" );
item.initialExtent = rs.getInt( "INITIAL_EXTENT" );
item.nextExtent = rs.getInt( "NEXT_EXTENT" );
item.minExtents = rs.getInt( "MIN_EXTENTS" );
item.maxExtents = rs.getInt( "MAX_EXTENTS" );
item.pctIncrease = rs.getInt( "PCT_INCREASE" );
item.freelists = rs.getInt8 "FREELISTS" );
item.freelistGroups = rs.getInt( "FREELIST_GROUPS" );
item.indexType = rs.getString( "INDEX_TYPE" );
item.tableOwner = rs.getString( "TABLE_OWNER" );
item.tableName = rs.getString( "TABLE_NAME" );
item.tableType = rs.getString( "TABLE_TYPE" );
item.uniqueness = rs.getString( "UNIQUENESS" );
map.put( name. item );
}
rs.close();
stmt.close();
return map;
}
/**
* 全Index の Column を取得します。
* @retun
* @throws SQLException
*/
public static HashMap getIndexColumns() throws SQLException {
if( _conn == null ) return null;
if( _verbose ) System.out.println( "[SQLManager] 索引の列一覧を取得しています。" );
Statement stmt = _conn.createStatement();
ResultSet rs = stmt.excuteQuery( SQL_GET_INDEX_COLUMNS );
HashMap map = new HashMap();
while( rs.next() ) {
String name = rs.getString( "INDEX_NAME" );
ArrayList list = ( ArrayList) map.get( name );
if( list == null ) {
list = new ArrayList();
map.put( name, list );
}
list.add( rs.getString( "COLUMN_NAME" );
}
rs.close();
stmt.close();
return map;
}
/**
* 全SEQUENCEを取得します。
* @retun
* @throws SQLException
*/
public static HashMap getSequences() throws SQLException {
if( _conn == null ) return null;
if( _verbose ) System.out.println( "[SQLManager] 順序の一覧を取得しています。" );
Statement stmt = _conn.createStatement();
ResultSet rs = stmt.excuteQuery( SQL_GET_SEQUENCES );
HashMap map = new HashMap();
while( rs.next() ) {
String name = rs.getString( "SEQUENCE_NAME" );
SequenceItem item = new SequenceItem();
item.minValue = rs.getString( "MIN_VALUE" );
item.maxValue = rs.getString( "MAX_VALUE" );
item.incrementBy = rs.getString( "INCREMENT_BY" );
item.cycleFlag = rs.getString( "CYCLE_FLAG" );
item.orderFlag = rs.getString( "ORDER_FLAG" );
item.cacheSize = rs.getString( "CACHE_SIZE" );
map.put( name, item );
}
rs.close();
stmt.close();
return map;
}
/**
* プロシージャの一覧を取得します。
* @retun
* @throws SQLException
*/
public static String[] getProcedures() throws SQLException {
if( _conn == null ) return null;
if( _verbose ) System.out.println( "[SQLManager] プロシージャの一覧を取得しています。" );
Statement stmt = _conn.createStatement();
ResultSet rs = stmt.excuteQuery( SQL_GET_PROCEDURES );
ArrayList list = new ArrayList();
while( rs.next() ) {
String text rs.getString( "NAME" );
list.add( text );
}
rs.close();
stmt.close();
return ( String[] ) list.toArray( new String[ list.size() ] );
}
/**
* ファンクション一覧を取得します。
* @retun
* @throws SQLException
*/
public static String[] getFunction() throws SQLException {
if( _conn == null ) return null;
if( _verbose ) System.out.println( "[SQLManager] ファンクションの一覧を取得しています。" );
Statement stmt = _conn.createStatement();
ResultSet rs = stmt.excuteQuery( SQL_GET_FUNCTIONS );
ArrayList list = new ArrayList();
while( rs.next() ) {
String text = rs.getString( "NAME" );
list.add( text );
}
rs.close();
stmt.close();
return ( String[] )list.toArray( new String[ list.size() ] );
}
/**
* プロシージャのソースを取得します。
* @retun
* @throws SQLException
*/
public static String[] getProcSource( String name, String type ) throws SQLException {
if( _conn == null ) return null;
if( _verbose ) System.out.println( "[SQLManager]" + type + " " + name + " のソースを取得しています。" );
PreparedStatement pstmt = _conn.prepareStatement( SQL_GET_PROC_SOURCE );
pstmt.setString( 1, name );
pstmt.setString( 2, type );
ResultSet rs = pstmt.executeQuery();
ArrayList list = new ArrayList();
while( rs.next() ) {
String text = rs.getString( "TEXT" );
list.add( text );
}
rs.close();
pstmt.close();
return ( String[] ) list.toArray( new String[ list.size() ] );
}
/**
* 全 Package の Procedure を取得します。
* @retun
* @throws SQLException
*/
public static HashMap getPackages() throws SQLException {
if( _conn == null ) return null;
if( _verbose ) System.out.println( "[SQLManager] パッケージの一覧を取得しています。" );
Statement stmt = _conn.createStatement();
ResultSet rs = stmt.excuteQuery( SQL_GET_PACKAGES );
HashMap map = new HashMap();
while( rs.next() ) {
String name = rs.getString( "OBJECT_NAME" );
ArrayList list = ( ArrayList ) map.get( name );
if( list == null ) {
list = new ArrayList();
map.put( name, list );
}
list.add( rs.getString( "PROCEDURE_NAME" ) );
}
rs.close();
stmt.close();
return map;
}
/**
* Package 内部 Procedure のソースを取得します。
* @param pkgName
* @retun
* @throws SQLException
*/
public static HashMap getPkgProcSource( String pkgName ) throws SQLException {
if( _conn == null ) return null;
// 開始位置取得
PreparedStatement pstmt = _conn.prepareStatement( SQL_GET_PROC_START );
pstmt.setString( 1, pkgName );
ResultSet rs = pstmt.excuteQuery();
ArrayList itemList = new ArrayList();
while( rs.next() ) {
String text = rs.getString( "TEXT" );
int idx = text.indexOf( "(" );
if( idx != -1 ) {
text = text.substring( 0, idx );
}
if( text.toUpperCase().trim().indexOf( "PROCEDURE" ) != 0 && text.toUpperCase().trim().indexOf( "FUNCTION" ) != 0 ) {
// 宣言ではない
continue;
}
PkgProcItem item = new PkgProcItem();
item.procName = text.toUpperCase().replaceAll( "PROCEDURE", "" ).replaceAll( "FUNCTION", "" ).trim();
item.startLine = rs.getInt( "LINE" );
itemList.add( item );
}
rs.close();
pstmt.close();
for( int i = 0; i < itemList.size(); i++ ) {
PkgProcItem item ( PkgProcItem )itemList.get( i );
// 終了位置取得
if( i +1 < itemList.size() ) {
int nextStart = ( ( PkgProcItem ) itemList.get( i + 1 ) ).startLine;
pstmt = _conn.prepareStatement( SQL_GET_PKG_PROC_END1 );
pstmt.setString( 1, pkgName );
pstmt.setInt( 2, item.startLine );
pstmt.setInt( 3, nextStart );
pstmt.setString( 4, item.procName.toUpperCase() );
rs = pstmt.executeQuery();
} else {
pstmt = _conn.prepareStatement( SQL_GET_PKG_PROC_END2 );
pstmt.setString( 1, pkgName );
pstmt.setInt( 2, item.startLine );
pstmt.setString( 3, item.procName.toUpperCase() );
rs = pstmt.executeQuery();
}
while( rs.next() ) {
item.endLine = rs.getInt( "LINE" );
}
rs.close();
pstmt.close();
// ソース取得
if( _verbose ) System.out.println( "[SQLManager]" + pkgName + "." + item.procName + " のソースを取得しています。" );
pstmt = _conn.prepareStatement( SQL_GET_PKG_PROC_SOURCE );
pstmt.setString( 1, pkgName );
pstmt.setInt( 2, item.startLine );
pstmt.setInt( 3, item.endLine );
rs = pstmt.executeQuery();
ArrayList sourceList = new ArrayList();
while( rs.next() ) {
sourceList.add( rs.getString( "TEXT" ) );
}
rs.close();
pstmt.close();
item.source = ( String[] ) sourceList.toArray( new String[ sourceList.size() ] );
map.put( item.procName, item );
}
return map;
}
/**
* プロシージャの引数を取得します。
* @param object
* @param string
* @retun
* @throws SQLException
*/
public static ProcArgItem[] getProcArgs( String packageName, String objectName ) throws SQLException {
if( _conn == null ) return null;
if( _verbose ) System.out.println( "[SQLManager]" + ( ( packageNmae != null ) ? packageNmae + "." : "" ) + objectName + "の引数を取得しています。" );
PreparedStatement pstmt = _conn.prepareStatement( ( packageName == null ) ? SQL_GET_PROC_ARGS : SQL_GET_PKG_PROC_ARGS );
pstmt.setString( 1, objectName );
if( packageName != null ) {
pstmt.setString( 2, packageNmae );
}
ResultSet rs = pstmt.executeQuery();
ArrayList list = new ArrayList();
while( rs.next() ) {
ProcArgItem item = new ProcArgItem();
item.objectName = rs.getString( "OBJECT_NAME" );
item.packageName = rs.getString( "PACKAGE_NAME" );
item.argumentName = rs.getString( "ARGUMENT_NAME" );
item.dataType = rs.getString( "DATA_TYPE" );
item.inOut = rs.getString( "IN_OUT" );
list.add( item );
}
rs.close();
pstmt.close();
return ( ProcArgItem[] ) list.toArray( new ProcArgItem[ list.size() ] );
}
}
----
作成日:2007/12/10
更新日:2007/12/10
----
最終更新:2007年12月10日 17:38