1
A
回答
2
据我所知没有。而且我通常会看到只有保存在数据库中的展开表单中的select *。我认为你不可能将一列添加到一个底层表中,并将这个列添加到视图中,而不是改变视图。
对于这里的ORACLE用户您可以使用SQL-服务器(因为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不存储定义,它不能刷新视图。
3
在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.
并通过从视图中选择,它标志着又认为有效的:
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.
如果变化影响,使得基础查询不能再执行view:
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.
希望这有助于。
Regards, Rob。
相关问题
- 1. DBMS_SQL.TO_REFCURSOR相当于Oracle 10g中
- 2. @ oracle相当于postgres
- 3. JPA:相当于Oracle的REGEXP_SUBSTR
- 4. Oracle中的SQL Server相当于
- 5. 相当于Oracle中的IF NOT EXISTS吗?
- 6. Oracle相当于SQL Server DATEPART
- 7. Oracle相当于INSERT IGNORE
- 8. Oracle相当于Postgres EXPLAIN ANALYZE
- 9. Java相当于Oracle翻译
- 10. Oracle相当于PostgreSQL INSERT ... RETURNING *;
- 11. 在oracle中相当于sql server GO
- 12. 在Oracle sql中相当于`show create table`
- 13. 的MySQL相当于Oracle的SEQUENCE.NEXTVAL的
- 14. 相当于Oracle的PERCENTILE_CONT函数的PostgreSQL
- 15. 相当于Oracle的TRUNC功能的Java?
- 16. Oracle相当于Postgres的DISTINCT ON?
- 17. 相当于Oracle'整数表'的SQL Server
- 18. PostgreSQL相当于Oracle的“批量收集”
- 19. H2相当于Oracle的用户
- 20. Oracle相当于SQLite的quote()函数
- 21. 访问/ jet相当于Oracle的解码
- 22. 相当于Oracle最小的SQL Server?
- 23. 相当于PostgreSQL的Oracle批量插入
- 24. SQL服务器相当于ORACLE INSTR
- 25. Oracle相当于T-SQL SET @var = @var +'';
- 26. 打印相当于在Oracle PLSQL
- 27. SQL服务器相当于Oracle用户
- 28. MS SQL Server相当于oracle查询
- 29. Oracle相当于Ingres inquire_sql或inquire_ingres?
- 30. Oracle相当于SQL Server/Sybase DateDiff
不同意。这是必要的。这是启动视图的问题。您将列添加到基础表。视图保持有效,但不包括新列。这是我们支持的原因之一。 – 2010-12-17 14:49:33
我不认为在视图中使用*是一个特别好的主意。你可能最终会在那里发现你并不想要的东西。 – JOTN 2010-12-17 15:25:02
@bernd_k:如果你添加一列到你想要包含在视图中的表中,那么你应该在视图中明确包含新列。我也认为“选择*”视图定义不是一个好主意。它可能会导致意想不到的副作用。 – 2010-12-17 15:32:21