2016-05-10 106 views
1

我想寫一個方法來檢查我的數據庫中是否存在一個表,在java中。一些四處張望後,我發現一個答案,說我需要運行SELECT COUNT(*)FROM tableName;這樣做,所以我寫了下面的代碼。SQL查詢返回不同的結果在java和運行時

public static boolean isEmpty(Connection con) throws SQLException, ClassNotFoundException{ 
     PreparedStatement stm = con.prepareStatement("SELECT COUNT(*) FROM Cities"); 
     String[] tables = {"Cities", "Connections"}; 
     ResultSet rs = null; 
     //for(String table : tables){ 
      //stm.setString(1, "Cities"); 
      rs = stm.executeQuery(); 
      rs.next(); 
      System.out.println(rs.getInt(1)); 
      if(rs.getInt(1) != 0){ 
       return false; 
      } 
     //} 
     return true; 
    } 

說明:我正在使用oracle sql。 另外,如果一個表實際上不存在,該查詢不應該返回0嗎?在這種情況下,我得到一個異常,我的理解是,當表不存在或爲空時,它返回0。

我想問的另一個問題,儘管只是提供了信息:在搜索表格存在問題的解決方案之前,我想運行SELECT * FROM tableName查詢,並且處理「表不存在」錯誤SQL會拋出我作爲例外。什麼「粉碎」我的計劃是SQLexception.getCause();返回null,而不是實際的原因,我想會是「表或視圖不存在」,或類似的東西。儘管如此,這是否是檢查存在的有效方法?也就是說,我接受除SELECT COUNT(*)FROM tableName方法以外的其他建議,如果這不正確/無效,它將適用於我想要執行的操作。

由於提前,LukeSykpe

+0

您可以使用'DatabaseMetaData'獲取有關架構的信息(包括表名稱)。你不能從一個不存在的表中計數,所以建議的解決方案是完全垃圾。 – Kayaman

+1

你確定你是連接到相同的數據庫作爲同一個用戶,或至少看相同的模式?你最近是否創建並填充了表格,如果有,是否提交了插入內容? (另外,你爲什麼要看'getCause()'而不是''getErrorCode()'](https://docs.oracle.com/javase/7/docs/api/java/sql/SQLException)。 html#getErrorCode())?) –

+0

謝謝你的回答。正如我所說,我是一個完全新手。你將不得不詳細說明,我如何知道DatabaseMetaData中是否存在表? –

回答

1

像這樣的東西應該爲Oracle工作:

public static boolean doesTableExist(Connection con, String tableName) throws SQLException { 

    ResultSet rs = null; 

    PreparedStatement stm = con.prepareStatement("SELECT * FROM user_objects WHERE object_type = 'TABLE' and object_name=?"); 
    stm.setString(1,tableName.toUpperCase()); //case sensitive 
    rs = stm.executeQuery(); 
    if(rs.next()) { 
     return true; 
     } 
    return false; 
} 

注:如果表中存在這將返回true,而不論其是否爲空。

+0

這裏真正的「目標」是確定數據庫是否有數據。問題是,這是我在課堂上使用的同一個數據庫,所以它總是有數據。爲了規避這一點,我只檢查應用程序使用的表。也就是說,我可以只運行2個檢查,既用於tableExists也用於isEmpty。 –

相關問題