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