如何检查数据库中是否存在Oracle视图?在执行查询之前
我需要知道从Java桌面应用程序检查的一种方法,如果在执行查询之前Oracle存在于当前DB中,否则我将遇到很多麻烦......如何检查数据库中是否存在Oracle视图?在执行查询之前
thanks in推进
感谢大家,我终于得到了解决这个问题,感谢您的建议的方法,代码如下:
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
只有当视图由当前模式拥有时。 – 2012-04-16 06:16:47
@JeffreyKemp:这是大多数人希望看到的。至少OP没有声明不管所有者如何搜索视图。 Btw:user_views显示当前所有者拥有的视图,而不是当前模式。哪一个 - 尽管拥有者的模式非常相似 - 并不是一回事。 – 2012-04-16 06:49:33
谢谢,你是对的,我应该说当前的所有者。但是,应用程序使用不拥有对象的所有者/架构登录是非常常见的,因为这会带来安全问题,所以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']
当使用'ALL_VIEWS'时,您还应该在视图的所有者上添加一个条件。否则,您可能会得到“积极”的结果,但如果没有限定所有者的权利,仍然无法访问该视图。 – 2012-04-13 20:07:16
另外最后一行应该是: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会提出合适的异常。
你将如何进入“很多麻烦”? – APC 2012-04-13 19:59:02
为什么你会查询不存在的视图?一旦它在那里,它总是在那里;除非你在执行时动态地创建它,这不是一个好主意...... – Ben 2012-04-14 00:01:59