【问题标题】:check if table exists, using a connection object in java使用java中的连接对象检查表是否存在
【发布时间】:2012-10-15 09:29:11
【问题描述】:

我需要通过我的 java 程序检查数据库中是否存在具有特定“表名”的表。

数据库可能是不同的类型,即。 MS SQL Server、甲骨文、DB2。我有一个到数据库的连接对象。是否有一种方法可以适用于所有类型的数据库? 我可能需要扩展 java 程序以支持更多的数据库类型,因此对所有数据库类型采用单一方法会非常有帮助。

我正在使用的代码。这似乎对 SQL Server 数据库正常工作,但在 Oracle 或 DB2 中找不到表

DatabaseMetaData meta = conn.getMetaData(); 
ResultSet res = meta.getTables(null, null, "TABLE_NAME", null); 
if(!res.next()){ 
  //table does not exist. 
} else{
   //table exists. 
}

【问题讨论】:

    标签: java sql-server database oracle db2


    【解决方案1】:

    您可以使用DatabaseMetaData.getTables() 过程在数据库中搜索具有特定模式的表。如果您搜索确切的名称,您将得到一个空的 ResultSetResultSet,其中有一行告诉您该表存在。

    无论该表是由当前用户还是其他用户拥有,这对我都适用于 Oracle 数据库。

    import java.sql.*;
    import oracle.jdbc.*;
    public class TableExists
    {
     public static String exists(String tableName)
         throws SQLException
     {
        Connection       conn = new OracleDriver().defaultConnection();
        DatabaseMetaData meta = conn.getMetaData(); 
        ResultSet res = meta.getTables(null, null, tableName, null); 
        if(!res.next()){ 
          return "Nope";
        } else{
          return "Yup";
        }
     }
    }
    

    【讨论】:

    • 我试过了。它适用于 MS SQL Server,但不适用于 Oracle 或 DB2
    • @ShubhamMaheshwari - 你能帮我们发布代码并告诉我们什么“不起作用”吗?我可以告诉你,getTables 肯定适用于 Oracle——我不得不假设你传递的参数不正确,但是如果不看代码就很难猜出错误是什么。
    • DatabaseMetaData meta = conn.getMetaData(); ResultSet res = meta.getTables(null, null, "TABLE_NAME", null); if(!res.next()){ ` //表不存在。` } else{ ` //表存在。` }
    • @ShubhamMaheshwari - 我编辑了您的问题以包含代码。我猜“不起作用”意味着它告诉您该表不存在,而您相信它确实存在。如果猜测不正确,请进一步编辑问题。
    • 是的,在 Oracle 中,它说该表实际上不存在。
    【解决方案2】:

    你可以试试DatabaseMetaDatagetTables()方法。

    【讨论】:

    • 我尝试过使用 DatabaseMetaData 类,它适用于 MS SQL Server,但不适用于 Oracle 和 DB2
    • 过去,我将 DatabaseMetaData 类与 MSSQL 和 Oracle 一起使用,它对我来说效果很好。解释你的问题。
    • @StephenC - 请查看更新后的问题以获取有关该问题的更多信息。
    • 此方法在某些 Oracle DB 上对我有效,但在其他数据库上无效具有用户权限,但我还没有弄清楚是什么..
    【解决方案3】:

    非常简单:

    SELECT
        1
    FROM
        TABLE
    ;
    

    如果它抛出异常,则表不存在(或其他错误)。 否则:

    http://docs.oracle.com/javase/6/docs/api/java/sql/DatabaseMetaData.html#getTables(java.lang.String, java.lang.String, java.lang.String, java.lang.String[])

    【讨论】:

    • 我尝试过使用 DatabaseMetaData 类,它适用于 MS SQL Server,但不适用于 Oracle 和 DB2。您提到的查询不适用于所有数据库类型。我必须为不同的数据库类型切换它。
    • 如果 select 1 对于某些 DB 类型有问题,则使用 select count(*) from your_table;这应该得到所有人的支持
    • 或更好:select * from your_table where 1 = 0
    猜你喜欢
    • 1970-01-01
    • 2018-05-07
    • 2016-04-02
    • 2018-01-06
    • 2012-07-27
    • 2013-09-26
    • 1970-01-01
    • 1970-01-01
    • 2010-11-26
    相关资源
    最近更新 更多