Как проверить, существует ли представление Oracle в БД? Перед выполнением запроса

Мне нужно знать, как проверить приложение Java Desktop, если вид Oracle существует в текущей БД, прежде чем выполнять запрос, иначе я получу много неприятностей...

заблаговременно

7 ответов

Спасибо всем, наконец, я получил метод, который решает эту проблему, спасибо за ваши предложения, код выглядит следующим образом:

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

Это работает!:)


Вы всегда можете запросить словарь данных Oracle. Что-то вроде

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

сообщит вам, есть ли у вас доступ к представлению, принадлежащему указанному пользователю с указанным именем.

В качестве альтернативы вы можете использовать более ориентированный на Java подход. Вы можете создать DatabaseMetaData объект из Connection и вызвать getTables, чтобы получить список всех таблиц и представлений, которые у вас есть доступ к. Вы можете передать getTables конкретную таблицу или имя представления (или шаблон), чтобы ограничить результаты.


Если вы хотите видеть не только, если вид существует, и если разрешение просмотра для текущего пользователя, но если view VALID или INVALID вы можете использовать select из таблицы all_objects

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


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

Подробнее в руководстве:

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


Вы можете использовать user_views для всех представлений, принадлежащих вам или ALL_VIEWS, для всех видов, к которым у вас есть доступ. Я бы использовал all_views

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


Если это разовая проверка, я бы сказал, что это нормально, но если вы повторяете запрос на этом представлении, я бы сказал, что это плохая идея проверять снова и снова.


Просто запросите его. Если этого не существует или ваш сеанс не имеет необходимых привилегий, Oracle поднимет подходящее исключение.

licensed under cc by-sa 3.0 with attribution.