【问题标题】:Get the DDL of a materialized view on a pre-built table - getting single-row subquery在预建表上获取物化视图的 DDL - 获取单行子查询
【发布时间】: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。

还有几点:

我怎样才能只获得物化视图的DDL。

【问题讨论】:

  • DBMS_METADATA 的第 5746 行和第 8333 行出了点问题(可能是 8333 的呼叫级联到 5746 的呼叫者)。只有甲骨文知道它在代码中的那个点要做什么。它在 12.1.0.2 中对我有用。为我的 sid 加入 v$open_cursorv$sqldba_objects 以列出匹配 DBMS_METADATA% 的对象的游标,我没有从这些行中看到任何内容。也许他们在 12.1.0.2 中修复了它。
  • 有趣。但是,我不会有同名的表和视图。将您的表命名为 sometest 和您的 MV sometest_mv
  • 似乎是一个错误,本。 MV 和建立 MV 的表必须具有相同的名称。所以这不是问题的原因。有一个类似的错误(#15922287 已注册,ORA-01427 在您尝试获取启用版本的视图的 DDL 时引发 - 在 12.1.0.2.0 中修复)。刚刚在 12.1.0.2.0 上测试过 - 没有错误。

标签: sql oracle dbms-metadata


【解决方案1】:

关于物化视图的这个错误有一些错误,我认为表和物化视图上的相同名称无关紧要。 我认为你必须:

  • 在 Oracle Metalink 上查找错误;
  • 针对 Oracle 关于 Metalink 的说明进行调查;
  • 如有必要,向 Oracle 支持打开和管理 SR;
  • 为此错误/问题找到解决方法/补丁。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-11
    • 1970-01-01
    • 2021-11-21
    • 1970-01-01
    • 2021-07-03
    • 1970-01-01
    • 2018-07-19
    • 1970-01-01
    相关资源
    最近更新 更多