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相当于PostgreSQL INSERT ... RETURNING *;
- 6. Oracle相当于INSERT IGNORE
- 7. Oracle相当于SQL Server DATEPART
- 8. 的MySQL相当于Oracle的SEQUENCE.NEXTVAL的
- 9. 相当于Oracle的TRUNC功能的Java?
- 10. PostgreSQL相当于Oracle的“批量收集”
- 11. 相当于PostgreSQL的Oracle批量插入
- 12. H2相当于Oracle的用户
- 13. 相当于Oracle'整数表'的SQL Server
- 14. 访问/ jet相当于Oracle的解码
- 15. Oracle相当于SQLite的quote()函数
- 16. 相当于Oracle最小的SQL Server?
- 17. SQL服务器相当于ORACLE INSTR
- 18. 打印相当于在Oracle PLSQL
- 19. Oracle SQL SELECT相当于多个AND
- 20. Oracle相当于SQL Server/Sybase DateDiff
- 21. MS SQL Server相当于oracle查询
- 22. SQL服务器相当于Oracle用户
- 23. 在JavaScript/jQuery中的Oracle NVL函数相当于
- 24. oracle teradata中的位置函数相当于
- 25. 相当于SQL Server中的Oracle外部表
- 26. Oracle在SQL Server 2005中的UTL_TCP相当于
- 27. 在hibernate 5.1.0中相当于@LazyGroup的hbm相当于hibernate 5.1.0
- 28. to_char相当于应该在oracle和mysql中工作
- 29. 在Teradata中找不到Oracle/PL SQL curosr%相当于
- 30. 相当于ODBC_中的mysql_affected_rows
不同意。这是必要的。这是启动视图的问题。您将列添加到基础表。视图保持有效,但不包括新列。这是我们支持的原因之一。 – 2010-12-17 14:49:33
我不认为在视图中使用*是一个特别好的主意。你可能最终会在那里发现你并不想要的东西。 – JOTN 2010-12-17 15:25:02
@bernd_k:如果你添加一列到你想要包含在视图中的表中,那么你应该在视图中明确包含新列。我也认为“选择*”视图定义不是一个好主意。它可能会导致意想不到的副作用。 – 2010-12-17 15:32:21