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

问题描述:

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

thanks in推进

+4

你将如何进入“很多麻烦”? – APC 2012-04-13 19:59:02

+1

为什么你会查询不存在的视图?一旦它在那里,它总是在那里;除非你在执行时动态地创建它,这不是一个好主意...... – Ben 2012-04-14 00:01:59

感谢大家,我终于得到了解决这个问题,感谢您的建议的方法,代码如下:

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; 
} 

这工作! :)

SELECT count(*) 
FROM user_views 
WHERE view_name = 'MY_VIEW' 

更多细节的手册中:

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

+0

只有当视图由当前模式拥有时。 – 2012-04-16 06:16:47

+0

@JeffreyKemp:这是大多数人希望看到的。至少OP没有声明不管所有者如何搜索视图。 Btw:user_views显示当前所有者拥有的视图,而不是当前模式。哪一个 - 尽管拥有者的模式非常相似 - 并不是一回事。 – 2012-04-16 06:49:33

+0

谢谢,你是对的,我应该说当前的所有者。但是,应用程序使用不拥有对象的所有者/架构登录是非常常见的,因为这会带来安全问题,所以all_views对于所述的要求(查询访问)更有意义。 – 2012-04-16 06:53:58

如果它是一个一次性检查我会说这是好的,但如果你反复在该视图上执行查询我会小号唉,一次又一次检查是一个坏主意。

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

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

当使用'ALL_VIEWS'时,您还应该在视图的所有者上添加一个条件。否则,您可能会得到“积极”的结果,但如果没有限定所有者的权利,仍然无法访问该视图。 – 2012-04-13 20:07:16

+0

另外最后一行应该是:WHERE VIEW_NAME ='您的查看名称' 不需要括号。 – vanchagreen 2014-04-18 21:47:28

您可以随时查询Oracle数据字典。类似于

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

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

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

如果你想看到的不仅是是否存在看法,如果视图使当前用户,但如果视图有效或无效,你可以使用select从ALL_OBJECTS表

SELECT count(*) 
FROM all_objects t 
WHERE 
t.object_type = 'VIEW' 
and t.object_name = 'VIEW_NAME' 
and t.status = 'VALID' 

只是查询。如果它不存在,或者您的会话没有必要的权限,Oracle会提出合适的异常。