暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 递归查询引发ORA-01789

ASKTOM 2020-10-07
966

问题描述

这是复杂递归查询的最小化版本。当递归成员中的列被显式列出时,该查询工作:

with t (c,p) as (
  select 2,1 from dual
), rec (c,p) as (
  select c,p from t
  union all
  select t.c,t.p from rec join t on rec.c = t.p
)
select * from rec


我不明白为什么会出错ORA-01789: query block has incorrect number of result columns在指定t.* 时引发。

with t (c,p) as (
  select 2,1 from dual
), rec (c,p) as (
  select c,p from t
  union all
  select t.* from rec join t on rec.c = t.p
)
select * from rec


为什么t.* 在这里不等同于t.c,t.p?您能指出我的文档以进行任何推理吗?

在11g,18分贝小提琴上测试https://dbfiddle.uk/?rdbms=oracle_18&fiddle=6b44cda99ae2a3d5486d14b28206f289和19 (livesql)。

专家解答

文档确实指定了此限制,但也许可以更明确地措辞

“带有query_name的列别名的数量以及锚点和递归查询块的选择列表中的列数必须相同。”

我们在扩展之前的处理中 * 非常 * 早期进行此检查。

例如

SQL> with t (c,p) as (
  2    select 2,1 from dual
  3  ), rec (c,p) as (
  4    select c,p from t
  5    union all
  6    select blahblahblah.* from rec join t on rec.c = t.p
  7  )
  8  select * from rec
  9  /
  select blahblahblah.* from rec join t on rec.c = t.p
  *
ERROR at line 6:
ORA-01789: query block has incorrect number of result columns

文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论