首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建实体化视图时的ORA-00600

创建实体化视图时的ORA-00600
EN

Stack Overflow用户
提问于 2021-11-15 01:44:03
回答 2查看 27关注 0票数 0

我正在尝试创建一个物化视图,如下所示:

代码语言:javascript
复制
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,并用常见的断开错误断开连接:

代码语言:javascript
复制
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子句是否存在错误?

EN

回答 2

Stack Overflow用户

发布于 2021-11-15 02:17:16

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

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

具体地说,您不能对dbms_random.value这样的表达式执行order by。您甚至不允许按算术表达式(例如,字符串表达式等)排序。这仅取决于在select列表中特别指定的列。

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

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

票数 3
EN

Stack Overflow用户

发布于 2021-11-15 07:49:49

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

代码语言:javascript
复制
.... 
No more data to read from socket

正如在其他答案中诊断的那样,这是可行的:

代码语言:javascript
复制
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;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69968665

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档