我正在使用java中的AAA(身份验证等)应用程序,我想知道是否有一种方法可以通过错误代码或任何我希望在其中插入数据的表进行检查如果它被丢弃或发生任何类型的问题,程序会自动创建表 P.S:我已经检查了其他相关问题,答案不适合我想要的java程序检查。
答案 0 :(得分:3)
我会使用all_tables(字典):
--your procedure
--some logic
--check the table in the dictionary
SELECT count(*)
INTO v_count
FROM all_tables s
WHERE s.table_name = p_table_name;
IF v_count = 0 THEN
....
END IF;
--the rest of logic
答案 1 :(得分:2)
我知道的最有效的方法是:
public static boolean tableExists(String tableName, Connection con) {
try (Statement stmt = con.createStatement();
ResultSet trs = stmt.executeQuery(
String.format(
"SELECT count(*) from (SELECT 1 FROM %s WHERE ROWNUM = 1) T",
tableName
)
)
) {
return trs.next();
}
catch (SQLException e) {
if (LOG.isDebugEnabled()) {
LOG.debug("SQLException occurs while checking the table " + tableName, e);
}
return false;
}
}
NB:标准方法是使用connection.getMetaData().getTables(String catalog, String schemaPattern,String tableNamePattern, String types[])
,换句话说是数据库元数据,但是您需要指定模式名称,并且您需要使用oracle等数据库的其他权限上面你不必指定模式名称,因为它将使用默认名称,你不需要任何额外的权限。即使它被认为是一种有争议的方法,相信我它运作得很好,实际上我们有数百名客户正在生产它。
NB 2:如果您有点好奇,我们甚至推广了这种方法,以使其适用于最常用的数据库,只有查询会发生一些变化,如您所见{ {3}}