📄 jtdsdatabasemetadata.java
字号:
}
/**
* Get a comma separated list of math functions.
*
* @return the list
* @throws SQLException if a database-access error occurs.
*/
public String getNumericFunctions() throws SQLException {
// I don't think either Sybase or SQL have a truncate maths function
// so I have removed it from the list.
// Also all other drivers return this list in lower case. Should we?
return "abs,acos,asin,atan,atan2,ceiling,cos,cot,degrees,exp,floor,log,"
+ "log10,mod,pi,power,radians,rand,round,sign,sin,sqrt,tan";
}
/**
* Get a description of a table's primary key columns. They are ordered by
* COLUMN_NAME. <P>
*
* Each primary key column description has the following columns:
* <OL>
* <LI> <B>TABLE_CAT</B> String =>table catalog (may be null)
* <LI> <B>TABLE_SCHEM</B> String =>table schema (may be null)
* <LI> <B>TABLE_NAME</B> String =>table name
* <LI> <B>COLUMN_NAME</B> String =>column name
* <LI> <B>KEY_SEQ</B> short =>sequence number within primary key
* <LI> <B>PK_NAME</B> String =>primary key name (may be null)
* </OL>
*
* @param catalog a catalog name; "" retrieves those without a
* <code>null</code> means drop catalog name from the selection criteria
* @param schema a schema name; "" retrieves those without a schema
* @param table a table name
* @return ResultSet - each row is a primary key column description
* @throws SQLException if a database-access error occurs.
*/
public java.sql.ResultSet getPrimaryKeys(String catalog,
String schema,
String table)
throws SQLException {
String colNames[] = {"TABLE_CAT", "TABLE_SCHEM",
"TABLE_NAME", "COLUMN_NAME",
"KEY_SEQ", "PK_NAME"};
int colTypes[] = {Types.VARCHAR, Types.VARCHAR,
Types.VARCHAR, Types.VARCHAR,
Types.SMALLINT, Types.VARCHAR};
String query = "sp_pkeys ?, ?, ?";
CallableStatement s = connection.prepareCall(syscall(catalog, query));
s.setString(1, table);
s.setString(2, schema);
s.setString(3, catalog);
JtdsResultSet rs = (JtdsResultSet)s.executeQuery();
CachedResultSet rsTmp = new CachedResultSet((JtdsStatement)s, colNames, colTypes);
rsTmp.moveToInsertRow();
int colCnt = rs.getMetaData().getColumnCount();
while (rs.next()) {
for (int i = 1; i <= colCnt; i++) {
rsTmp.updateObject(i, rs.getObject(i));
}
rsTmp.insertRow();
}
rs.close();
rsTmp.moveToCurrentRow();
rsTmp.setConcurrency(ResultSet.CONCUR_READ_ONLY);
return rsTmp;
}
/**
* Get a description of a catalog's stored procedure parameters and result
* columns. <P>
*
* Only descriptions matching the schema, procedure and parameter name
* criteria are returned. They are ordered by PROCEDURE_SCHEM and
* PROCEDURE_NAME. Within this, the return value, if any, is first. Next
* are the parameter descriptions in call order. The column descriptions
* follow in column number order. <P>
*
* Each row in the ResultSet is a parameter description or column
* description with the following fields:
* <OL>
* <LI> <B>PROCEDURE_CAT</B> String =>procedure catalog (may be null)
*
* <LI> <B>PROCEDURE_SCHEM</B> String =>procedure schema (may be null)
*
* <LI> <B>PROCEDURE_NAME</B> String =>procedure name
* <LI> <B>COLUMN_NAME</B> String =>column/parameter name
* <LI> <B>COLUMN_TYPE</B> Short =>kind of column/parameter:
* <UL>
* <LI> procedureColumnUnknown - nobody knows
* <LI> procedureColumnIn - IN parameter
* <LI> procedureColumnInOut - INOUT parameter
* <LI> procedureColumnOut - OUT parameter
* <LI> procedureColumnReturn - procedure return value
* <LI> procedureColumnResult - result column in ResultSet
* </UL>
*
* <LI> <B>DATA_TYPE</B> short =>SQL type from java.sql.Types
* <LI> <B>TYPE_NAME</B> String =>SQL type name
* <LI> <B>PRECISION</B> int =>precision
* <LI> <B>LENGTH</B> int =>length in bytes of data
* <LI> <B>SCALE</B> short =>scale
* <LI> <B>RADIX</B> short =>radix
* <LI> <B>NULLABLE</B> short =>can it contain NULL?
* <UL>
* <LI> procedureNoNulls - does not allow NULL values
* <LI> procedureNullable - allows NULL values
* <LI> procedureNullableUnknown - nullability unknown
* </UL>
*
* <LI> <B>REMARKS</B> String =>comment describing parameter/column
* </OL>
* <P>
*
* <B>Note:</B> Some databases may not return the column descriptions for a
* procedure. Additional columns beyond REMARKS can be defined by the
* database.
*
* @param catalog a catalog name; "" retrieves those without a
* <code>null</code> means drop catalog name from the selection criteria
* @param schemaPattern a schema name pattern; "" retrieves those
* without a schema
* @param procedureNamePattern a procedure name pattern
* @param columnNamePattern a column name pattern
* @return ResultSet - each row is a stored procedure parameter or column description
* @throws SQLException if a database-access error occurs.
* @see #getSearchStringEscape
*/
public java.sql.ResultSet getProcedureColumns(String catalog,
String schemaPattern,
String procedureNamePattern,
String columnNamePattern)
throws SQLException {
String colNames[] = {"PROCEDURE_CAT", "PROCEDURE_SCHEM",
"PROCEDURE_NAME", "COLUMN_NAME",
"COLUMN_TYPE", "DATA_TYPE",
"TYPE_NAME", "PRECISION",
"LENGTH", "SCALE",
"RADIX", "NULLABLE",
"REMARKS"};
int colTypes[] = {Types.VARCHAR, Types.VARCHAR,
Types.VARCHAR, Types.VARCHAR,
Types.SMALLINT, Types.INTEGER,
Types.VARCHAR, Types.INTEGER,
Types.INTEGER, Types.SMALLINT,
Types.SMALLINT, Types.SMALLINT,
Types.VARCHAR};
String query = "sp_sproc_columns ?, ?, ?, ?, ?";
CallableStatement s = connection.prepareCall(syscall(catalog,query));
s.setString(1, processEscapes(procedureNamePattern));
s.setString(2, processEscapes(schemaPattern));
s.setString(3, catalog);
s.setString(4, processEscapes(columnNamePattern));
s.setInt(5, 3); // ODBC version 3
JtdsResultSet rs = (JtdsResultSet)s.executeQuery();
ResultSetMetaData rsmd = rs.getMetaData();
CachedResultSet rsTmp = new CachedResultSet((JtdsStatement)s, colNames, colTypes);
rsTmp.moveToInsertRow();
while (rs.next()) {
int offset = 0;
for (int i = 1; i + offset <= colNames.length; i++) {
if (i == 5 && !"column_type".equalsIgnoreCase(rsmd.getColumnName(i))) {
// With Sybase 11.92 despite what the documentation says, the
// column_type column is missing!
// Set the output value to 0 and shift the rest along by one.
String colName = rs.getString(4);
if ("RETURN_VALUE".equals(colName)) {
rsTmp.updateInt(i, DatabaseMetaData.procedureColumnReturn);
} else {
rsTmp.updateInt(i, DatabaseMetaData.procedureColumnUnknown);
}
offset = 1;
}
if (i == 3) {
String name = rs.getString(i);
if (name != null && name.length() > 0) {
int pos = name.lastIndexOf(';');
if (pos >= 0) {
name = name.substring(0, pos);
}
}
rsTmp.updateString(i + offset, name);
} else if ("data_type".equalsIgnoreCase(rsmd.getColumnName(i))) {
int type = TypeInfo.normalizeDataType(rs.getInt(i), connection.getUseLOBs());
rsTmp.updateInt(i + offset, type);
} else {
rsTmp.updateObject(i + offset, rs.getObject(i));
}
}
if (serverType == Driver.SYBASE && rsmd.getColumnCount() >= 22) {
//
// For Sybase 12.5+ we can obtain column in/out status from
// the mode column.
//
String mode = rs.getString(22);
if (mode != null) {
if (mode.equalsIgnoreCase("in")) {
rsTmp.updateInt(5, DatabaseMetaData.procedureColumnIn);
} else
if (mode.equalsIgnoreCase("out")) {
rsTmp.updateInt(5, DatabaseMetaData.procedureColumnInOut);
}
}
}
if (serverType == Driver.SYBASE
|| tdsVersion == Driver.TDS42
|| tdsVersion == Driver.TDS70) {
//
// Standardise the name of the return_value column as
// @RETURN_VALUE for Sybase and SQL < 2000
//
String colName = rs.getString(4);
if ("RETURN_VALUE".equals(colName)) {
rsTmp.updateString(4, "@RETURN_VALUE");
}
}
rsTmp.insertRow();
}
rs.close();
rsTmp.moveToCurrentRow();
rsTmp.setConcurrency(ResultSet.CONCUR_READ_ONLY);
return rsTmp;
}
/**
* Get a description of stored procedures available in a catalog. <P>
*
* Only procedure descriptions matching the schema and procedure name
* criteria are returned. They are ordered by PROCEDURE_SCHEM, and
* PROCEDURE_NAME. <P>
*
* Each procedure description has the the following columns:
* <OL>
* <LI> <B>PROCEDURE_CAT</B> String =>procedure catalog (may be null)
*
* <LI> <B>PROCEDURE_SCHEM</B> String =>procedure schema (may be null)
*
* <LI> <B>PROCEDURE_NAME</B> String =>procedure name
* <LI> reserved for future use
* <LI> reserved for future use
* <LI> reserved for future use
* <LI> <B>REMARKS</B> String =>explanatory comment on the procedure
* <LI> <B>PROCEDURE_TYPE</B> short =>kind of procedure:
* <UL>
* <LI> procedureResultUnknown - May return a result
* <LI> procedureNoResult - Does not return a result
* <LI> procedureReturnsResult - Returns a result
* </UL>
* </OL>
*
* @param catalog a catalog name; "" retrieves those without a
* <code>null</code> means drop catalog name from the selection criteria
* @param schemaPattern a schema name pattern; "" retrieves those
* without a schema
* @param procedureNamePattern a procedure name pattern
* @return ResultSet - each row is a procedure description
* @throws SQLException if a database-access error occurs.
*
* @see #getSearchStringEscape
*/
public java.sql.ResultSet getProcedures(String catalog,
String schemaPattern,
String procedureNamePattern)
throws SQLException {
String colNames[] = {"PROCEDURE_CAT", "PROCEDURE_SCHEM",
"PROCEDURE_NAME", "RESERVED_1",
"RESERVED_2", "RESERVED_3",
"REMARKS", "PROCEDURE_TYPE"};
int colTypes[] = {Types.VARCHAR, Types.VARCHAR,
Types.VARCHAR, Types.INTEGER,
Types.INTEGER, Types.INTEGER,
Types.VARCHAR, Types.SMALLINT};
String query = "sp_stored_procedures ?, ?, ?";
CallableStatement s = connection.prepareCall(syscall(catalog, query));
s.setString(1, processEscapes(procedureNamePattern));
s.setString(2, processEscapes(schemaPattern));
s.setString(3, catalog);
JtdsResultSet rs = (JtdsResultSet)s.executeQuery();
CachedResultSet rsTmp = new CachedResultSet((JtdsStatement)s, colNames, colTypes);
rsTmp.moveToInsertRow();
int colCnt = rs.getMetaData().getColumnCount();
//
// Copy results to local result set.
//
while (rs.next()) {
rsTmp.updateString(1, rs.getString(1));
rsTmp.updateString(2, rs.getString(2));
String name = rs.getString(3);
if (name != null) {
// Remove grouping integer
if (name.endsWith(";1")) {
name = name.subst
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -