Search code examples
javasqljdbcsap-ase

Calling Sybase Adaptive Server Enterprise's "sp_help" from JDBC


In order to query the database meta data in Sybase ASE, I found this relevant answer (not the accepted one), to be ideal:

From a Sybase Database, how I can get table description ( field names and types)?

Unfortunately, I can't seem to find any documentation, how I'm supposed to call sp_help from JDBC. According to the documentation, sp_help returns several cursors / result sets. The first one contains information about the table itself, the second one about the columns, etc. When I do this:

PreparedStatement stmt = getConnection().prepareStatement("sp_help 't_language'");
ResultSet rs = stmt.executeQuery();

while (rs.next()) {
    System.out.println(rs.getObject(1));
    // ...
}

I only get the results from the first cursor. How to access the other ones?


Solution

  • When you have multiple result sets you need to use the execute() method rather than executeQuery(). Here's an example:

    CallableStatement cstmt;
    ResultSet rs;
    int i;
    String s;
    ...
    cstmt.execute();                        // Call the stored procedure       1 
    rs = cstmt.getResultSet();              // Get the first result set        2 
    while (rs.next()) {                     // Position the cursor             3 
     i = rs.getInt(1);                      // Retrieve current result set value
     System.out.println("Value from first result set = " + i);  
                                            // Print the value
    }
    cstmt.getMoreResults();                 // Point to the second result set  4a 
                                            // and close the first result set
    rs = cstmt.getResultSet();              // Get the second result set       4b 
    while (rs.next()) {                     // Position the cursor             4c 
     s = rs.getString(1);                   // Retrieve current result set value
     System.out.println("Value from second result set = " + s); 
                                            // Print the value
    }
    rs.close();                             // Close the result set
    cstmt.close();                          // Close the statement