Oracle:如何在“物化”视图中获取列列表?

Oracle:如何在“物化”视图中获取列列表?,oracle,Oracle,看起来我们的数据库中有两个同名的对象“X”。一个是物化视图,另一个是表。我相信MV首先出现,然后开发人员转而使用传统的表类型对象。在我们的数据库中,我看到MV的定义与表中的列相匹配 当我执行以下查询时 从所有_选项卡_列c中选择*其中c.TABLE_NAME='X'按c.COLUMN_ID排序 我得到一个列列表。我假设我得到的是表中所有列的列表,而不是物化视图,它可能包含与同名表不同的列,但在我的例子中,正如前面提到的,每个列中的列恰好匹配 我猜我希望这两组列,一组用于MV,一组用于表格,将从A

看起来我们的数据库中有两个同名的对象“X”。一个是物化视图,另一个是表。我相信MV首先出现,然后开发人员转而使用传统的表类型对象。在我们的数据库中,我看到MV的定义与表中的列相匹配

当我执行以下查询时

从所有_选项卡_列c中选择*其中c.TABLE_NAME='X'按c.COLUMN_ID排序

我得到一个列列表。我假设我得到的是表中所有列的列表,而不是物化视图,它可能包含与同名表不同的列,但在我的例子中,正如前面提到的,每个列中的列恰好匹配

我猜我希望这两组列,一组用于MV,一组用于表格,将从ALL_TAB_columns视图返回,并且它们将由存储父项类型的字段分隔,例如,父对象类型='MATERIALIZED VIEW'或父对象类型='TABLE',这将是所有对象表(所有者、对象名称、对象类型)键的一部分,但情况并非如此


如何获取物化视图中的列列表?或者我的假设是错误的,不可能为两个同名的对象拥有两个不同的集合列,一个是MV,另一个是表?我无法在数据库中创建对象来测试后一种情况。

您已经获得了这些列。Oracle就是这样设置的

下面是一个例子:

在我的架构中没有名为
LF
的对象:

SQL> select object_name, object_type from user_objects where object_name = 'LF';

no rows selected
我将创建一个物化视图:

SQL> create materialized view lf as select * From dept;

Materialized view created.
我有什么

SQL> select object_name, object_type from user_objects where object_name = 'LF';

OBJECT_NAME                    OBJECT_TYPE
------------------------------ -------------------
LF                             TABLE
LF                             MATERIALIZED VIEW

SQL>
看到了吗?一个表和一个物化视图。为什么?因为Oracle使用

  • 表来实际存储数据(具体化视图确实有数据,而“普通”视图只是存储查询)
  • 物化视图,其中包含有关刷新选项的信息
因此,当您查询
所有选项卡列时,您确实得到了您想要的:

SQL> select column_name, data_type from user_tab_columns where table_name = 'LF';

COLUMN_NAME                    DATA_TYPE
------------------------------ --------------------
DEPTNO                         NUMBER
DNAME                          VARCHAR2
LOC                            VARCHAR2

SQL>

关于预构建表的一点信息:

先放下旧MV:

SQL> drop materialized view lf;

Materialized view dropped.
创建一个表,该表将用作物化视图查询的“目标”;它将保存以下数据:

SQL> create table lf as select * From dept where 1 = 2;

Table created.

SQL> select * From lf;

no rows selected
在预构建表上使用
选项:

SQL> create materialized view lf on prebuilt table
  2  as select * From dept;

Materialized view created.

SQL> select * From lf;

no rows selected
空的;刷新它(按需,对吗?):


你已经有那些专栏了。Oracle就是这样设置的

下面是一个例子:

在我的架构中没有名为
LF
的对象:

SQL> select object_name, object_type from user_objects where object_name = 'LF';

no rows selected
我将创建一个物化视图:

SQL> create materialized view lf as select * From dept;

Materialized view created.
我有什么

SQL> select object_name, object_type from user_objects where object_name = 'LF';

OBJECT_NAME                    OBJECT_TYPE
------------------------------ -------------------
LF                             TABLE
LF                             MATERIALIZED VIEW

SQL>
看到了吗?一个表和一个物化视图。为什么?因为Oracle使用

  • 表来实际存储数据(具体化视图确实有数据,而“普通”视图只是存储查询)
  • 物化视图,其中包含有关刷新选项的信息
因此,当您查询
所有选项卡列时,您确实得到了您想要的:

SQL> select column_name, data_type from user_tab_columns where table_name = 'LF';

COLUMN_NAME                    DATA_TYPE
------------------------------ --------------------
DEPTNO                         NUMBER
DNAME                          VARCHAR2
LOC                            VARCHAR2

SQL>

关于预构建表的一点信息:

先放下旧MV:

SQL> drop materialized view lf;

Materialized view dropped.
创建一个表,该表将用作物化视图查询的“目标”;它将保存以下数据:

SQL> create table lf as select * From dept where 1 = 2;

Table created.

SQL> select * From lf;

no rows selected
在预构建表上使用
选项:

SQL> create materialized view lf on prebuilt table
  2  as select * From dept;

Materialized view created.

SQL> select * From lf;

no rows selected
空的;刷新它(按需,对吗?):


您是否检查了“所有视图.查询”列?在阅读@Littlefoot的优秀答案后,请同时检查视图“所有视图”的
MVIEW\u NAME
CONTAINER\u NAME
列。第一个是物化视图的名称,第二个是基础表的名称。是否检查了所有的\u MVIEWS.QUERY列?在阅读@Littlefoot的优秀答案后,请检查视图“所有\u MVIEWS”的
MVIEW\u name
CONTAINER\u name
列。第一个是物化视图的名称,第二个是基础表的名称。如果我理解正确,该表就是物化视图存储视图查询结果的基础表。我知道,对于MV,差异数据被具体化到一个表中,但我不认为该表名是用一个始终与MV相同的表对象公开的。我认为它是隐藏的,只有通过MV名称才能访问。所以,你不能有一个MV和一个具有不同列集的表,对吗?我假设如果你试图创建一个名为“X”的MV“,如果已经存在名为X的表,您会收到一条错误消息,因为Oracle在创建MV时希望创建对应的表X?”?我是在遵循还是完全误解?你不能有一个MV和一个包含不同列集的表。如果您试图创建一个名为“X”的MV,并且存在表“X”,那么如果您使用了on prebuilded table选项,则不会出现错误。否则,你会。我加了一个例子;请看一看。更正(如果重要的话):由于可以在多个表的联接上创建物化视图,因此其(MV)列列表可能(通常)与所有源表中的列列表不同。@Littlefoot解释得很好!如果我理解正确,那么表就是物化视图存储视图查询结果的基础表。我知道,对于MV,差异数据被具体化到一个表中,但我不认为该表名是用一个始终与MV相同的表对象公开的。我认为它是隐藏的,只有通过MV名称才能访问。所以,你不能有一个MV和一个具有不同列集的表,对吗?我假设如果你试图创建一个名为“X”的MV“,如果已经存在名为X的表,您会收到一条错误消息,因为Oracle在创建MV时希望创建对应的表X?”?我是在遵循还是完全误解?你不能有一个MV和一个包含不同列集的表。如果您试图创建一个名为“X”的MV,并且存在表“X”,那么如果您使用了on prebuilded table选项,则不会出现错误。否则,你会。我