cancel
Showing results for 
Search instead for 
Did you mean: 
Read only

SAP DBTech JDBC: [262]: invalid query name: JDBC_GET_TABLES

WillemLiang
Newcomer
0 Kudos
861

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:

liang3p53_0-1723775520610.png

The "CALLQ" Statement:

liang3p53_1-1723775756625.png

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;
}

 

 

Accepted Solutions (0)

Answers (0)