2024 Aug 16 4:06 AM - edited 2024 Aug 16 4:37 AM
Hi, there
I got a JDBC Driver error when trying to get table metadata by JDBC DatabaseMetadata. It seems there's no proc or function named "JDBC_GET_TABLES":
com.sap.db.jdbc.exceptions.JDBCDriverException: SAP DBTech JDBC: [262]: invalid query name: JDBC_GET_TABLES
As I dived deeper into its source code, more query names with the prefix "JDBC_GET_" emerged and they were all called by a strange statement "CALLQ", which I had never seen before.
Since I do not have direct access to connect with the HANA DB, troubleshooting becomes difficult. Same as connecting HANA DB, connecting the other DBs like MySQL, Oracle, and MSSQL also needs a jump server, but they work well. I enquired to the system admin and he told me there's no proc or function found in the HANA DB, this confused me more and wondering what "CALLQ" can be and how it works.
What caused this and how to solve it?
The query names:
The "CALLQ" Statement:
Java codes work well on Oracle, MySQL, and Microsoft SQL Server.
// Get connected DB Info
DatabaseMetaData dbMetaData = connection.getMetaData();
String dbType = dbMetaData.getDatabaseProductName();
String dbVersion = dbMetaData.getDatabaseProductVersion();
String dbUser = dbMetaData.getUserName();
// Get Table Metadata
String catalog=null, schemaPattern=null, tbl="T001", columnNamePattern=null;
String tblComment = null,tblCatalog = null,tblType = null,tblSchema = null;
ResultSet rs = dbMetaData.getTables(null, schemaPattern, tbl, new String[]{"TABLE", "VIEW", "SYSTEM TABLE", "GLOBAL TEMPORARY", "LOCAL TEMPORARY", "ALIAS", "SYNONYM"});
while (rs.next()) {
tblCatalog = rs.getString("TABLE_CAT");
tblSchema = rs.getString("TABLE_SCHEM");
tblType = rs.getString("TABLE_TYPE");
tblComment = rs.getString("REMARKS");
System.out.println("Found [" + tblType + "] in Catalog [" + tblCatalog + "], Schema [" + tblSchema + "]: " + rs.getString("TABLE_NAME") + "(" + tblComment + ")");
}
rs.close();
// Get Column Metadata
List<TableColumnMetadata> metadataList = new ArrayList<>();
ResultSet columnsResultSet = dbMetaData.getColumns(catalog, schemaPattern, tbl, columnNamePattern);
while (columnsResultSet.next()) {
TableColumnMetadata metadata = new TableColumnMetadata();
String tblName = columnsResultSet.getString("TABLE_NAME")==null?tbl:columnsResultSet.getString("TABLE_NAME");
metadata.setDbType(dbType);
metadata.setDbVersion(dbVersion);
metadata.setDbUser(dbUser);
metadata.setDbCatalog(tblCatalog);
metadata.setDbSchema(tblSchema);
metadata.setTableType(tblType);
metadata.setTableName(tblName);
metadata.setTableComment(tblComment);
metadata.setColumnPosition(columnsResultSet.getInt("ORDINAL_POSITION"));
metadata.setColumnName(columnsResultSet.getString("COLUMN_NAME"));
metadata.setColumnComment(columnsResultSet.getString("REMARKS"));
metadata.setColumnType(columnsResultSet.getString("TYPE_NAME"));
metadata.setColumnLength(columnsResultSet.getInt("COLUMN_SIZE"));
metadata.setColumnPrecision(columnsResultSet.getInt("COLUMN_SIZE"));
metadata.setColumnScale(columnsResultSet.getInt("DECIMAL_DIGITS"));
metadataList.add(metadata);
}
columnsResultSet.close();
The Data Class:
import lombok.Data;
@Data
public class TableColumnMetadata {
private String dbType;
private String dbVersion;
private String dbUser;
private String dbCatalog;
private String dbSchema;
private String tableType;
private String tableName;
private String tableComment;
private int columnPosition;
private String columnName;
private String columnComment;
private String columnType;
private int columnLength;
private int columnPrecision;
private int columnScale;
}
Request clarification before answering.
| User | Count |
|---|---|
| 14 | |
| 8 | |
| 6 | |
| 6 | |
| 3 | |
| 3 | |
| 2 | |
| 2 | |
| 2 | |
| 2 |
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.