0

我正在尝试创建一个物化视图,例如使用以下内容:

CREATE MATERIALIZED VIEW orders_mv AS
  SELECT *
  FROM (SELECT * FROM table1
        UNION
        SELECT * FROM table2
        ORDER BY DBMS_RANDOM.VALUE)
  WHERE rownum <= 5;

但它给了我一个 ORA-00600 并用通常的断开错误断开我的连接:

CREATE MATERIALIZED VIEW orders_mv
                   *
ERROR at line 1:
ORA-03113: end-of-file on communication channel
Process ID: 89299
Session ID: 11416 Serial number: 40331

我们正在运行 Oracle 12c。以这种方式创建物化视图和使用 order by 子句是否存在一些错误?

4

2 回答 2

3

这与物化视图无关。您是否尝试在select不创建视图的情况下自行运行?这将是试图弄清楚发生了什么的第一步。

在具有集合操作的查询(例如UNION)中,order by子句只能引用列表中的select列:按编号,或者如果您明确列出列,则按名称(如果使用别名,则按别名)。

具体来说,你不能order bydbms_random.value. 您甚至不允许通过仅依赖于select列表中特别命名的列的算术表达式(例如,或字符串表达式等)进行排序。

因此:即使您命名了列表中的所有列select(而不是 的不良做法select *),您也无法执行您尝试的操作。您仍然只能按列排序select- 如果您尝试与 set 操作“在同一级别”进行排序。

相反,您将需要三个级别的select. 在嵌套最深的子查询中,执行UNION但不要尝试排序。在中间select语句中,子查询的结果按dbms_random.value. 并在外部查询过滤器中rownum。这也适用select *(这只是一种糟糕的做法,但它是有效的)。

于 2021-11-15T02:17:15.603 回答
0

您的问题可以在 Windows 上的 Oracle XE 版本 18.4.0.0.0 中重现(请注意,如果ORA-0600是相关信息)

.... 
No more data to read from socket

正如在其他答案中诊断的那样,这有效:

CREATE MATERIALIZED VIEW orders_mv AS
  SELECT *
  FROM (SELECT DBMS_RANDOM.VALUE rnd, table1.* FROM table1
        UNION
        SELECT DBMS_RANDOM.VALUE rnd, table2.* FROM table2
        ORDER BY 1)
  WHERE rownum <= 5;
于 2021-11-15T07:49:48.920 回答