使用java中的连接对象检查表是否存在

使用java中的连接对象检查表是否存在,java,sql-server,database,oracle,db2,Java,Sql Server,Database,Oracle,Db2,我需要检查java程序中的数据库中是否存在具有特定“tablename”的表 数据库可以是不同的类型,即。MS SQL Server、Oracle、DB2。我有一个到数据库的连接对象。是否有一种方法可以适用于所有类型的数据库? 我可能需要扩展java程序以支持更多的db类型,因此,对所有db类型使用单一方法将非常有用 我正在使用的代码。这在SQL Server数据库中似乎可以正常工作,但在Oracle或DB2中找不到该表 DatabaseMetaData meta = conn.getMetaD

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

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

我正在使用的代码。这在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. 
}
您可以使用该过程在数据库中搜索具有特定模式的表。如果搜索确切的名称,您将得到一个空的
ResultSet
,或者一个
ResultSet
,其中一行告诉您该表存在

对于我来说,无论表是由当前用户还是其他用户拥有,这都适用于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";
    }
 }
}
您可以使用该过程在数据库中搜索具有特定模式的表。如果搜索确切的名称,您将得到一个空的
ResultSet
,或者一个
ResultSet
,其中一行告诉您该表存在

对于我来说,无论表是由当前用户还是其他用户拥有,这都适用于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";
    }
 }
}

您可以尝试
getTables()
数据库元数据的方法
DatabaseMetaData

您可以尝试
getTables()
数据库元数据的方法
非常简单:

SELECT
    1
FROM
    TABLE
;
如果抛出异常,则该表不存在(或者其他错误)。 否则:

,java.lang.String,java.lang.String,java.lang.String[])

非常简单:

SELECT
    1
FROM
    TABLE
;
如果抛出异常,则该表不存在(或者其他错误)。 否则:



,java.lang.String,java.lang.String,java.lang.String[])

我试过了。它适用于MS SQL Server,但不适用于Oracle或OracleDB2@ShubhamMaheshwari-你能帮我们发布代码并准确地告诉我们什么“不起作用”吗?我可以告诉您,
getTables
最适合Oracle——我必须假设您传递的参数不正确,但如果不查看代码,很难猜出错误是什么。
DatabaseMetaData meta=conn.getMetaData()
ResultSet res=meta.getTables(null,null,“表名”,null)
如果(!res.next()){
`//table不存在,`
}否则{
`//table存在。`
}
@ShubhamMaheshwari-我编辑了您的问题以包含代码。我猜“不起作用”意味着它告诉你,当你相信它存在的时候,表是不存在的。如果这个猜测不正确,请进一步编辑这个问题。是的,在Oracle中,它说该表实际上不存在。我已经尝试过了。它适用于MS SQL Server,但不适用于Oracle或OracleDB2@ShubhamMaheshwari-你能帮我们发布代码并准确地告诉我们什么“不起作用”吗?我可以告诉您,
getTables
最适合Oracle——我必须假设您传递的参数不正确,但如果不查看代码,很难猜出错误是什么。
DatabaseMetaData meta=conn.getMetaData()
ResultSet res=meta.getTables(null,null,“表名”,null)
如果(!res.next()){
`//table不存在,`
}否则{
`//table存在。`
}@ShubhamMaheshwari-我编辑了您的问题以包含代码。我猜“不起作用”意味着它告诉你,当你相信它存在的时候,表是不存在的。如果这个猜测不正确,请进一步编辑这个问题。是的,在Oracle中,它说该表实际上不存在。我尝试过使用DatabaseMetaData类,它对MS SQL Server很好,但对Oracle和DB2In不起作用。在过去,我将DatabaseMetaData类与MSSQL和Oracle一起使用,它对我很好。解释您的问题。@StephenC-请检查更新的问题以了解有关该问题的详细信息。此方法在某些Oracle DB上对我有效,但在其他DB上无效,列出了在某些Oracle实例中指定“%”作为表名的所有表。我得到的结果集为空,它可能与用户权限有关,但我仍然没有弄清楚是什么..我尝试过使用DatabaseMetaData类,它对MS SQL Server很好,但对Oracle和db2i不起作用在过去,我对MSSQL和Oracle使用DatabaseMetaData类,它对我很好。解释您的问题。@StephenC-请检查更新的问题以了解有关该问题的详细信息。此方法在某些Oracle DB上对我有效,但在其他DB上无效,列出了在某些Oracle实例中指定“%”作为表名的所有表。我得到的结果集为空,它可能与用户权限有关,但我仍然没有弄清楚是什么。我尝试过使用DatabaseMetaData类,它对MS SQL Server很好,但对Oracle和DB2不起作用。您提到的查询将无法处理所有的DB类型。我将不得不为不同的DB类型切换大小写。如果select 1对于某些DB类型是一个问题,那么使用您的_表中的select count(*);这应该得到allor better的支持:从您的_表中选择*,其中1=0我尝试过使用DatabaseMetaData类,它对MS SQL Server很好,但对Oracle和DB2不起作用。您提到的查询将无法处理所有的DB类型。我将不得不为不同的DB类型切换大小写。如果select 1对于某些DB类型是一个问题,那么使用您的_表中的select count(*);这应该得到allor更好的支持:从您的_表中选择*,其中1=0