Эквивалент sp_refreshview в оракуле - PullRequest
1 голос
/ 17 декабря 2010

Есть ли у Oracle что-то вроде sp_refreshview на SQL Server?

Спасибо заранее, Goran

Ответы [ 2 ]

4 голосов
/ 17 декабря 2010

В Oracle есть эквивалент, но использовать его не обязательно. Вот пример:

Стол:

SQL> create table t (id,name)
  2  as
  3  select 1, 'StackOverflow' from dual
  4  /

Table created.

Вид:

SQL> create view v
  2  as
  3  select id
  4       , name
  5    from t
  6  /

View created.

Что действительно:

SQL> select *
  2    from v
  3  /

        ID NAME
---------- -------------
         1 StackOverflow

1 row selected.

SQL> select status
  2    from user_objects
  3   where object_name = 'V'
  4  /

STATUS
-------
VALID

1 row selected.

Теперь сделайте что-нибудь с базовой таблицей:

SQL> alter table t add (description varchar2(100))
  2  /

Table altered.

Поскольку Oracle хранит зависимости (см. Представления DBA / ALL / USER_DEPENDENCIES), представление помечается как недействительное:

SQL> select status
  2    from user_objects
  3   where object_name = 'V'
  4  /

STATUS
-------
INVALID

1 row selected.

Но вы все равно можете выбрать из него. Oracle все равно пытается выполнить его, даже если знает, что представление помечено как НЕДОПУСТИМО:

SQL> select *
  2    from v
  3  /

        ID NAME
---------- -------------
         1 StackOverflow

1 row selected.

И, выбрав из вида, он снова пометил вид VALID:

SQL> select status
  2    from user_objects
  3   where object_name = 'V'
  4  /

STATUS
-------
VALID

1 row selected.

Вы также можете скомпилировать вид, чтобы убедиться, что он действителен заранее:

SQL> alter table t add (description2 varchar2(100))
  2  /

Table altered.

SQL> select status
  2    from user_objects
  3   where object_name = 'V'
  4  /

STATUS
-------
INVALID

1 row selected.

SQL> alter view v compile
  2  /

View altered.

«Компиляция» представления помечает его как действительный:

SQL> select status
  2    from user_objects
  3   where object_name = 'V'
  4  /

STATUS
-------
VALID

1 row selected.

Если изменение влияет на представление таким образом, что базовый запрос больше не может выполняться:

SQL> alter table t drop column name
  2  /

Table altered.

SQL> select status
  2    from user_objects
  3   where object_name = 'V'
  4  /

STATUS
-------
INVALID

1 row selected.

Тогда вы получите ошибку во время выполнения:

SQL> select *
  2    from v
  3  /
  from v
       *
ERROR at line 2:
ORA-04063: view "OWNER.V" has errors


SQL> select status
  2    from user_objects
  3   where object_name = 'V'
  4  /

STATUS
-------
INVALID

1 row selected.

Надеюсь, это поможет.

С уважением, Роб.

2 голосов
/ 17 декабря 2010

Насколько я знаю, нет.И я обычно вижу для представлений, как select * из единственной расширенной формы, сохраненной в базе данных.Я думаю, что нет никаких шансов, что вы можете добавить столбец в базовую таблицу и получить этот столбец в представлении, чем изменить представление.

Для пользователей ORACLE приведен пример того, что вы можете сделать с SQL-Server (начиная с SQL2008), но неизмененное определение также хранилось в syscomments во времена sysbase:

Внимание, это T-SQL

create table t1 (i int, c1 int);
create view v1 as select * from t1;
alter table t1 add c2 int;
select * from v1;   -- c2 is not present here
sp_refreshview v1;
select * from v1;   -- c2 is present here 

Я полагаю, что Oracle этого не делаетНе сохраняйте определение, оно не может обновить представление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...