【发布时间】:2017-05-16 12:01:00
【问题描述】:
我在同名的预建表上有一个物化视图。当尝试使用DBMS_METADATA.GET_DDL() 获取物化视图的 DDL 时,我得到 ORA-01427:单行子查询从DBMS_METADATA 中返回多于一行。这是一个最小的例子:
SQL> create table mv_test as select * from dual;
Table created.
SQL> create materialized view mv_test
2 on prebuilt table
3 refresh force on demand as
4 select *
5 from dual;
Materialized view created.
SQL> select dbms_metadata.get_ddl('MATERIALIZED_VIEW', 'MV_TEST', user) from dual;
ERROR:
ORA-01427: single-row subquery returns more than one row
ORA-06512: at "SYS.DBMS_METADATA", line 5746
ORA-06512: at "SYS.DBMS_METADATA", line 8333
ORA-06512: at line 1
no rows selected
SQL>
在 PL/SQL 中直接分配给变量时以及在 PL/SQL 中使用 SQL 时会发生同样的错误。
这不是特别理想...我假设发生错误是因为表和实体化视图具有相同的名称,并且GET_DDL() 将多行返回到我的 SELECT 中。
我只想要一行 - 物化视图的行。我在对GET_DDL() 的调用中指定了这一点。我不想返回表格的 DDL。
还有几点:
-
list of object types available in
DBMS_METADATA不区分物化视图和预建表上的物化视图 - 表格和实体化视图均未编辑
- Oracle 版本 12.1.0.1
我怎样才能只获得物化视图的DDL。
【问题讨论】:
-
DBMS_METADATA的第 5746 行和第 8333 行出了点问题(可能是 8333 的呼叫级联到 5746 的呼叫者)。只有甲骨文知道它在代码中的那个点要做什么。它在 12.1.0.2 中对我有用。为我的 sid 加入v$open_cursor与v$sql和dba_objects以列出匹配DBMS_METADATA%的对象的游标,我没有从这些行中看到任何内容。也许他们在 12.1.0.2 中修复了它。 -
有趣。但是,我不会有同名的表和视图。将您的表命名为
sometest和您的 MVsometest_mv。 -
似乎是一个错误,本。 MV 和建立 MV 的表必须具有相同的名称。所以这不是问题的原因。有一个类似的错误(#15922287 已注册,
ORA-01427在您尝试获取启用版本的视图的 DDL 时引发 - 在 12.1.0.2.0 中修复)。刚刚在 12.1.0.2.0 上测试过 - 没有错误。
标签: sql oracle dbms-metadata