【问题标题】:Subquery using JSON_TABLE gives ORA-0600 error使用 JSON_TABLE 的子查询给出 ORA-0600 错误
【发布时间】:2019-08-26 15:47:33
【问题描述】:

甲骨文 12。

我运行这个查询:

select *
from   json_table('[1244, 1188]', '$[*]' columns(id number path '$'));

它可以工作,但是当我尝试以下操作时

select *
from   some_table
where  id in
       ( select *
         from   json_table('[1244, 1188]', '$[*]' columns(id number path '$')));

我收到一个错误

ORA-0600:内部错误代码,参数:[%s]、[%s]、[%s]、[%s]、[%s]、[%s]、[%s]、[% s]、[%s]、[%s]、[%s]、[%s]

原因:这是 Oracle 程序异常的一般内部错误号。它表明一个进程遇到了一个低级的、意外的情况。第一个参数是内部消息号。此参数和数据库版本号对于确定根本原因和对系统的潜在影响至关重要。

我该如何解决?

【问题讨论】:

  • 将此错误报告给 Oracle 支持服务。它在db,.fiddle 中运行良好
  • 是的,这是一个内部 oracle 错误,您必须联系支持。
  • 完整的 ORA-0600 消息是什么?应该有数字值代替其中的一个或两个 %s 占位符。
  • @WilliamRobertson - JSON_TABLE 返回在其 COLUMNS 子句中明确写入的列。在 OP 的代码中,COLUMNS 子句创建数据类型为 NUMBER 的单个列 ID。
  • @WilliamRobertson - 关于您的其他评论,完整的错误消息包括以下内容:SQL Error: ORA-00600: internal error code, arguments: [qmxptAddDependency1], [], [], [], [], [], [], [], [], [], [], []。这有帮助吗?据我所知,只有 Oracle 知道这意味着什么(例如,qmxptAddDependency1 是什么意思)。这在与 Oracle 支持人员沟通时可能会有所帮助,尽管操作系统应该能够重现错误并自己查看完整的错误消息。

标签: oracle


【解决方案1】:

这很可能是 Oracle 错误; ORA-00600 通常表示 Oracle 开发人员编写的内部代码中存在未处理的异常(不是由“用户”引起的错误,在这种情况下是您)。最好的办法是与 Oracle Support 交谈(例如,如果您是付费客户;我不是)。他们可能会很快识别出错误,并告诉您应用哪个补丁,假设已经有一个补丁。否则他们将不得不努力。

同时,您可以将子查询移至 WITH 子句。它在那里也不起作用,但您可以使用(未​​记录的?)提示 MATERIALIZE,如下所示:

with
  list (id) as 
       ( select /*+ materialize */ id                -- notice the hint here!
         from   json_table('[1244, 1188]', '$[*]' columns(id number path '$')))
select *
from   your_table
where  id in (select id from list)
;

这确实有效。如果您与 Oracle Support 交谈,您也可以提及这一点;它会让他们对可能出现的问题有一些想法(尽管他们可能能够像我一样自己做到这一点)。问题是“查询转换”——优化器尝试将子查询合并到查询中,这种方式被 Oracle 开发人员错误地编码(很可能)。

当然,这不是一个解决方案,它只是一个解决方法

【讨论】:

    猜你喜欢
    • 2016-07-07
    • 2019-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-30
    相关资源
    最近更新 更多