如何检查 Oracle 数据库中是否存在视图?在执行查询之前

6
我需要知道一种方法,在执行查询之前,从Java桌面应用程序中检查Oracle视图是否存在于当前数据库中,否则我将会遇到很多麻烦...提前感谢。

4
你会如何陷入“很多麻烦”之中? - APC
1
为什么会查询一个不存在的视图?一旦它存在,它就一直存在;除非你在执行时动态创建它,但这不是一个好主意... - Ben
7个回答

6
您可以随时查询Oracle数据字典。类似于:
SELECT COUNT(*)
  FROM all_views
 WHERE view_name = <<the name of the view>>
   AND owner     = <<the owner of the view>>

该方法将告诉您是否可以访问特定用户拥有的指定视图。或者,您可以使用更加Java-centric的方法。您可以从Connection创建一个DatabaseMetaData对象,并调用getTables获取您可以访问的所有表和视图的列表。您可以传递getTables特定的表或视图名称(或模式)以限制结果。

5

1
仅当视图归当前模式所有时。 - Jeffrey Kemp
@JeffreyKemp:这正是大多数人想要看到的。至少OP没有声明视图应该被搜索,而不考虑所有者。顺便说一句:user_views显示当前所有者拥有的视图,而不是当前模式。尽管所有者和模式非常相似,但并不是同一回事。 - user330315
谢谢,你说得对,我应该说当前所有者。然而,由于安全问题,许多应用程序使用拥有零对象的所有者/模式进行登录,因此对于所述要求(查询访问),all_views更为合适。 - Jeffrey Kemp
@JeffreyKemp:好吧,如果MadMad666不澄清他/她的应用程序是如何完成的,我们将永远不会知道。 - user330315

1
如果您不仅想查看视图是否存在以及当前用户是否启用视图,而且还想知道视图是否有效或无效,您可以使用从all_objects表中选择的方法。
SELECT count(*)
FROM all_objects t
WHERE 
t.object_type = 'VIEW' 
and t.object_name = 'VIEW_NAME'
and t.status = 'VALID'

1
感谢大家,最终我找到了解决这个问题的方法,感谢你们的建议,以下是代码:
    public boolean existViewInDB(String viewName) {
    logger.debug("[boolean existViewInDB(String viewName[" + viewName
        + "])]");
    boolean existView = false;
    try {
        String sql =
            "SELECT count(*) FROM user_views WHERE view_name = :viewName";
        SQLQuery query = getSession().createSQLQuery(sql);
        query.setString("viewName", viewName);
        BigDecimal totalOfViews = (BigDecimal) query.uniqueResult();
        existView = (totalOfViews.longValue() > 0);
    } catch (Exception e) {
        logger.error(e, e);
    }
    logger.debug("Exist View [" + viewName + "] ? -> " + existView);
    return existView;
}

这个可以运行!:)


0
如果只是一次性的检查,那么我认为这样做没问题,但如果你要反复查询该视图,那么每次都进行检查就不是一个好主意。

0

只需查询它。如果不存在,或者您的会话没有必要的权限,Oracle将引发适当的异常。


0

你可以使用user_views查看你拥有的所有视图,或者使用ALL_VIEWS查看你有权限访问的所有视图。我会选择使用all_views。

SELECT COUNT(*)
FROM ALL_VIEWS
WHERE VIEW_NAME = '[YOUR VIEW NAME']

4
当使用 ALL_VIEWS 时,你应该在视图的所有者上添加一个条件。否则,你可能会得到一个“正面”的结果,但仍然无法访问视图而需要限定所有者。 - user330315
同时,最后一行应该是:WHERE VIEW_NAME = '在此处输入你的视图名称'。不需要括号。 - vanchagreen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接