2011-04-12 11 views
5

Estoy tratando de recuperar diferentes tipos de metadatos de mi Oracle DB desde el código de Java (utilizando JDBC básico). Por ejemplo, si quiero recuperar la lista de tablas con _FOO sufijo, puedo hacer algo como:Cómo recuperar metadatos de secuencias de JDBC?

Connection connection = dataSource.getConnection(); 
DatabaseMetaData meta = connection.getMetaData(); 
ResultSet tables = meta.getTables(connection.getCatalog(), null, "%_FOO", new String[] { "TABLE" }); 
// Iterate on the ResultSet to get information on tables... 

Ahora, quiero recuperar todos los secuencias de mi base de datos (por ejemplo, toda la secuencia nombrada S_xxx_FOO)

¿Cómo podría hacer eso, ya que no veo nada en DatabaseMetaData relacionado con las secuencias?

¿Tengo que ejecutar una consulta como select * from user_sequences?

Respuesta

3

No se puede hacer esto a través de la API de JDBC, porque algunas bases de datos (aún) no admiten secuencias.

La única manera de conseguirlos es para consultar el catálogo del sistema de su DBMS (supongo que es Oracle en su caso, como usted menciona user_sequences)

+0

Para los detalles de cómo hacer esto, vea mi respuesta. :-) –

3

tenía la misma pregunta. Es bastante fácil. Simplemente ingrese "SECUENCIA" en los parámetros getMetaData(). GetTables() param.

En su caso específico sería algo así como:

meta.getTables (connection.getCatalog(), null, "% _foo", nuevo String [] { "secuencia"});

+0

Esto no funciona con los controladores odjbc5.jar y ojdbc6.jar que limita los tipos a 'SYNONYM', 'TABLE' y 'VIEW' y genera una excepción si se llama con algo más. – zigarn

+0

Funcionó bien en la versión 12.1.0.1 del controlador ojdbc7, pero dejó de funcionar en la versión 12.1.0.2 porque, como dices, ahora ignora todo en el parámetro "tipos" que no es uno de los tipos devueltos por getTableTypes().He hecho una pregunta en su foro sobre si esto es intencional: https://community.oracle.com/message/14134247#14134247 –

0

Puede utilizar la aplicación api hibernate para recuperar el nombre de la secuencia. ver: http://docs.jboss.org/hibernate/orm/3.2/api/org/hibernate/dialect/Dialect.html

Desde abajo ejemplo, se puede ver cómo utilizar el dialecto de obtener nombres de secuencia

public static void main(String[] args) { 
     Connection jdbcConnection = null; 
     try { 
      jdbcConnection = DriverManager.getConnection("", "", ""); 
      printAllSequenceName(jdbcConnection); 
     } catch (SQLException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } finally { 
      if(jdbcConnection != null) { 
       try { 
        jdbcConnection.close(); 
       } catch (SQLException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
     } 
} 

public static void printAllSequenceName(Connection conn) throws JDBCConnectionException, SQLException { 
     DialectResolver dialectResolver = new StandardDialectResolver(); 
     Dialect dialect = dialectResolver.resolveDialect(conn.getMetaData()); 

     if (dialect.supportsSequences()) { 
      String sql = dialect.getQuerySequencesString(); 
      if (sql!=null) { 

       Statement statement = null; 
       ResultSet rs = null; 
       try { 
        statement = conn.createStatement(); 
        rs = statement.executeQuery(sql); 

        while (rs.next()) { 
         System.out.println("Sequence Name : " + rs.getString(1)); 
        } 
       } 
       finally { 
        if (rs!=null) rs.close(); 
        if (statement!=null) statement.close(); 
       } 

      } 
     } 
    } 

Si no desea utilizar hibernación, entonces usted tiene que cajón de aplicación específica personalizada secuencial.

Código de ejemplo para la implementación personalizada

interface SequenceQueryGenerator { 
    String getSelectSequenceNextValString(String sequenceName); 
    String getCreateSequenceString(String sequenceName, int initialValue, int incrementSize); 
    String getDropSequenceStrings(String sequenceName); 
    String getQuerySequencesString(); 
} 


class OracleSequenceQueryGenerator implements SequenceQueryGenerator { 

    @Override 
    public String getSelectSequenceNextValString(String sequenceName) { 
     return "select " + getSelectSequenceNextValString(sequenceName) + " from dual"; 
    } 

    @Override 
    public String getCreateSequenceString(String sequenceName, 
      int initialValue, int incrementSize) { 
     return "create sequence " + sequenceName + " start with " + initialValue + " increment by " + incrementSize; 
    } 

    @Override 
    public String getDropSequenceStrings(String sequenceName) { 
     return "drop sequence " + sequenceName; 
    } 

    @Override 
    public String getQuerySequencesString() { 
     return "select sequence_name from user_sequences"; 
    } 

} 


class PostgresSequenceQueryGenerator implements SequenceQueryGenerator { 

    @Override 
    public String getSelectSequenceNextValString(String sequenceName) { 
     return "select " + getSelectSequenceNextValString(sequenceName); 
    } 

    @Override 
    public String getCreateSequenceString(String sequenceName, 
      int initialValue, int incrementSize) { 
     return "create sequence " + sequenceName + " start " + initialValue + " increment " + incrementSize; 
    } 

    @Override 
    public String getDropSequenceStrings(String sequenceName) { 
     return "drop sequence " + sequenceName; 
    } 

    @Override 
    public String getQuerySequencesString() { 
     return "select relname from pg_class where relkind='S'"; 
    } 

} 

public void printSequenceName (SequenceQueryGenerator queryGenerator, Connection conn) throws SQLException { 
     String sql = queryGenerator.getQuerySequencesString(); 
     if (sql!=null) { 

      Statement statement = null; 
      ResultSet rs = null; 
      try { 
       statement = conn.createStatement(); 
       rs = statement.executeQuery(sql); 

       while (rs.next()) { 
        System.out.println("Sequence Name : " + rs.getString(1)); 
       } 
      } 
      finally { 
       if (rs!=null) rs.close(); 
       if (statement!=null) statement.close(); 
      } 

     } 
    } 

public static void main(String[] args) { 
     Connection jdbcConnection = null; 
     try { 
      jdbcConnection = DriverManager.getConnection("", "", ""); 
      printAllSequenceName(new OracleSequenceQueryGenerator(), jdbcConnection); 
     } catch (SQLException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     }finally { 
      if(jdbcConnection != null) { 
       try { 
        jdbcConnection.close(); 
       } catch (SQLException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
     } 
} 
0

Teniendo en cuenta que las versiones recientes de los controladores JDBC de Oracle (por ejemplo, 12.1.0.2) don't return sequence information cuando llame DatabaseMetaData#getTables con types conjunto de ["SEQUENCE"], la mejor opción es necesaria para ejecutar el consultar a sí mismo, por ejemplo:

SELECT o.owner AS sequence_owner, 
     o.object_name AS sequence_name 
    FROM all_objects o 
    WHERE o.owner LIKE 'someOwnerPattern' ESCAPE '/' 
    AND o.object_name LIKE 'someNamePattern' ESCAPE '/' 
    AND o.object_type = 'SEQUENCE' 
    ORDER BY 1, 2 

... donde someOwnerPattern y someNamePattern son patrones SQL como los que tendrá que utilizar con elEl operador(p. % coincide con cualquier cosa).

Esto es básicamente lo mismo que la consulta realizada por el propio controlador, excepto que consulta objetos del tipo SEQUENCE.

Cuestiones relacionadas