创建实体化视图时出现 ORA-00600
Posted
技术标签:
【中文标题】创建实体化视图时出现 ORA-00600【英文标题】:ORA-00600 when Creating Materialized View 【发布时间】:2021-11-15 01:44:02 【问题描述】:我正在尝试使用以下内容创建物化视图:
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 子句是否存在一些错误?
【问题讨论】:
ORA-00600 错误只能由 Oracle 支持部门诊断和解决。它们可能表明存在错误,但 Mathguy 的回答中也有很多很好的观察结果。我的猜测是,如果您遵循他的建议,内部错误将自行解决;否则准备打开服务请求。您将无法在此论坛上获得有关 ORA-00600 错误的详细帮助。 【参考方案1】:这与物化视图无关。您是否尝试在不创建视图的情况下自行运行select
?这将是试图弄清楚发生了什么的第一步。
在具有集合操作的查询(例如UNION
)中,order by
子句只能引用select
列表中的列:按编号,或者如果您明确列出列,则按名称(或按别名,如果你使用了别名)。
具体来说,你不能order by
像dbms_random.value
这样的表达式。甚至不允许您通过仅依赖于 select
列表中具体命名的列的算术表达式(例如,或字符串表达式等)进行排序。
所以:即使您命名了 select
列表中的所有列(而不是 select *
的不良做法),您也无法执行您尝试的操作。您仍然只能按 select
中的列排序 - 如果您尝试与 set 操作“在同一级别”进行排序。
相反,您需要三个级别的select
。在嵌套最深的子查询中,执行UNION
但不要尝试排序。在中间的select
语句中,将子查询的结果按dbms_random.value
排序。在rownum
的外部查询过滤器中。这也适用于select *
(这只是一种糟糕的做法,但它是有效的)。
【讨论】:
看起来 3 级查询有效。似乎他们在组合表中有 X 条记录,但在最终 MV 中只需要 5 个随机样本。所以,感谢提示。是的,我同意,列出列名总是比 *.非常感谢!【参考方案2】:您的问题可以在 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;
【讨论】:
以上是关于创建实体化视图时出现 ORA-00600的主要内容,如果未能解决你的问题,请参考以下文章
求教ORACLE的问题,我用的是ORACLE 9I,出现一个ORA-00600:内部错误代码,参数:[qernsRowP],[1],[]....
Oracle 创建触发器语句失败,内部错误代码 ORA-00600
ORA-00600: 内部错误代码,参数:[5213],[][][][],oracle 8
Oracle 11g XE "alter table drop column" 导致 ORA-00600
ORA-00600 [kpdbLoadCbk-bad-obj#] ORA-65106 手动修复PDB container$信息