6

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

提前致谢

4

7 回答 7

6

您可以随时查询 Oracle 数据字典。就像是

SELECT COUNT(*)
  FROM all_views
 WHERE view_name = <<the name of the view>>
   AND owner     = <<the owner of the view>>

将告诉您是否有权访问具有指定名称的指定用户拥有的视图。

或者,您可以使用更加以 Java 为中心的方法。您可以从您的和调用创建一个DatabaseMetaData对象,以获取您有权访问的所有表和视图的列表。您可以传递特定的表或视图名称(或模式)来限制结果。ConnectiongetTablesgetTables

于 2012-04-13T20:02:17.877 回答
5
SELECT count(*)
FROM user_views
WHERE view_name = 'MY_VIEW'

手册中的更多详细信息:

http://docs.oracle.com/cd/E11882_01/server.112/e25513/statviews_5499.htm#i1635848

于 2012-04-13T19:56:32.480 回答
1

如果您不仅想查看视图是否存在以及是否为当前用户启用了视图,而且如果查看 VALID 或 INVALID,您可以使用 select from all_objects table

SELECT count(*)
FROM all_objects t
WHERE 
t.object_type = 'VIEW' 
and t.object_name = 'VIEW_NAME'
and t.status = 'VALID'
于 2012-04-14T06:57:29.570 回答
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;
}

这行得通!:)

于 2012-04-16T13:06:13.350 回答
0

如果是一次性检查,我会说没问题,但如果您反复对该视图执行查询,我会说一次又一次检查是个坏主意。

于 2012-04-13T19:58:41.323 回答
0

您可以将 user_views 用于您拥有的所有视图,或者将 ALL_VIEWS 用于您有权访问的所有视图。我会使用 all_views

SELECT COUNT(*)
FROM ALL_VIEWS
WHERE VIEW_NAME = '[YOUR VIEW NAME']
于 2012-04-13T20:01:00.857 回答
0

随便查询一下。如果它不存在,或者您的会话没有必要的权限,Oracle 将引发一个合适的异常。

于 2012-04-16T06:17:46.507 回答