2016-05-10 109 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。 –

相关问题