【问题标题】:SQL Query returns different results in java and when ranSQL Query 在 java 和运行时返回不同的结果
【发布时间】:2016-09-05 17:54:13
【问题描述】:

我正在尝试用java编写一个方法来检查我的数据库中是否存在一个表。环顾四周后,我找到了一个答案,说明我需要运行 SELECT COUNT(*) FROM tableName;为此,我编写了以下代码。

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

【问题讨论】:

  • 您可以使用DatabaseMetaData 获取有关架构的信息(包括表名)。您无法从不存在的表中获得计数,因此建议的解决方案完全是垃圾。
  • 你确定你和同一个用户连接到同一个数据库,或者至少查看同一个模式?您最近是否创建并填充了表,如果是,您是否提交了插入? (另外,你为什么看getCause() 而不是getErrorCode()?)
  • 感谢您的回答。正如我所说,我完全是新手。您将不得不详细说明,我如何确定DatabaseMetaData中是否存在表?
  • 在 Oracle 上,您可以使用字典视图检查表是否存在 -SELECT TABLE_NAME FROM USER_TABLES WHERE TABLE_NAME='CITIES'
  • 查看stackoverflow.com/a/2942795/984823 更好的数据库独立答案和完整代码。

标签: java oracle oracle-sqldeveloper


【解决方案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。

【讨论】:

  • 这里真正的“目的”是获取数据库是否有数据。问题是,那是我在课堂上使用的同一个数据库,所以它总是有数据。为了避免这种情况,我只检查应用程序使用的表。也就是说,我可以对 tableExists 和 isEmpty 运行 2 次检查。
猜你喜欢
  • 2016-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多