使用java中的连接对象检查表是否存在
我需要检查java程序中的数据库中是否存在具有特定“tablename”的表 数据库可以是不同的类型,即。MS SQL Server、Oracle、DB2。我有一个到数据库的连接对象。是否有一种方法可以适用于所有类型的数据库? 我可能需要扩展java程序以支持更多的db类型,因此,对所有db类型使用单一方法将非常有用 我正在使用的代码。这在SQL Server数据库中似乎可以正常工作,但在Oracle或DB2中找不到该表使用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
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