2011-04-12 13 views
5

मैं जावा कोड (मूल जेडीबीसी का उपयोग करके) से अपने ओरेकल डीबी के विभिन्न प्रकार के मेटाडेटा को पुनः प्राप्त करने का प्रयास कर रहा हूं। उदाहरण के लिए, अगर मैं _FOO प्रत्यय के साथ तालिकाओं की सूची प्राप्त करना चाहते हैं, मैं कुछ कर सकते हैं की तरह:जेडीबीसी से अनुक्रम मेटाडेटा कैसे प्राप्त करें?

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... 

अब, मैं अपने डेटाबेस से सभी दृश्यों प्राप्त करना चाहते हैं (उदाहरण के लिए सभी अनुक्रम S_xxx_FOO नामित)।

मैं यह कैसे करूँगा, क्योंकि मुझे DatabaseMetaData में कुछ भी दृश्यों से संबंधित नहीं दिख रहा है?

क्या मुझे select * from user_sequences जैसी कोई क्वेरी चलाने की ज़रूरत है?

उत्तर

3

आप जेडीबीसी एपीआई के माध्यम से ऐसा नहीं कर सकते हैं, क्योंकि कुछ डेटाबेस (अभी भी) अनुक्रमों का समर्थन नहीं करते हैं।

उन्हें प्राप्त करने का एकमात्र तरीका है अपने डीबीएमएस (मुझे लगता है कि यह आपके मामले में ओरेकल के रूप में आप user_sequences उल्लेख)

+0

यह कैसे करें इसके विवरण के लिए, मेरा उत्तर देखें। :-) –

3

एक ही सवाल था की प्रणाली सूची क्वेरी करने के लिए है। यह काफी आसान है। GetMetaData() में बस "SEQUENCE" में पास करें। GetTables() प्रकार param।

अपने विशिष्ट मामले में यह कुछ इस तरह होगा:

meta.getTables (connection.getCatalog(), अशक्त, "% _FOO", नई String [] { "अनुक्रम"});

+0

यह odjbc5.jar और ojdbc6.jar ड्राइवरों के साथ काम नहीं करता है जो 'सिनोनीम', 'टेबल' और 'दृश्य' के प्रकार को सीमित करते हैं और किसी अन्य चीज़ के साथ बुलाए जाने पर अपवाद उठाते हैं। – zigarn

+0

यह ojdbc7 ड्राइवर के संस्करण 12.1.0.1 में ठीक काम करता है, लेकिन संस्करण 12.1.0.2 में काम करना बंद कर दिया क्योंकि जैसा कि आप कहते हैं, अब यह "प्रकार" पैरामीटर में कुछ भी अनदेखा करता है जो getTableTypes() द्वारा लौटाए गए प्रकारों में से एक नहीं है।मैंने अपने मंच में एक प्रश्न पूछा है कि क्या यह जानबूझकर है: https://community.oracle.com/message/14134247#14134247 –

0

आप अनुक्रम नाम पुनर्प्राप्त करने के लिए हाइबरनेट डायलेक्ट एपीआई का उपयोग कर सकते हैं। देखें: http://docs.jboss.org/hibernate/orm/3.2/api/org/hibernate/dialect/Dialect.html

उदाहरण नीचे से, आप तो आप कस्टम अनुक्रमिक विशिष्ट कार्यान्वयन टोकरा करने के लिए है कि कैसे बोली का उपयोग करने के अनुक्रम नाम

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

      } 
     } 
    } 

पाने के लिए देखते हैं, आप हाइबरनेट उपयोग करने के लिए नहीं देना चाहते हैं कर सकते हैं। कस्टम कार्यान्वयन के लिए

नमूना कोड

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

को देखते हुए ओरेकल JDBC ड्राइवर को (जैसे 12.1.0.2) के हाल के संस्करणों don't return sequence information जब आप ["SEQUENCE"] को types सेट के साथ DatabaseMetaData#getTables कहते हैं, आपका सर्वश्रेष्ठ दांव आवश्यक चलाने के लिए है कि अपने आप को क्वेरी, जैसे:

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 

... जहां someOwnerPattern और someNamePattern जिन्हें आपसाथ प्रयोग करेंगे की तरह एसक्यूएल पैटर्न हैंऑपरेटर (उदा। % कुछ भी मेल खाता है)।

यह मूल रूप से ड्राइवर द्वारा चलाए गए क्वेरी के समान ही है, सिवाय इसके कि यह SEQUENCE प्रकार की वस्तुओं के लिए पूछताछ करता है।

संबंधित मुद्दे