Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 当列值中不存在sys\U connect\U by\U路径分隔符时,为什么要获取Ora-30004_Oracle - Fatal编程技术网

Oracle 当列值中不存在sys\U connect\U by\U路径分隔符时,为什么要获取Ora-30004

Oracle 当列值中不存在sys\U connect\U by\U路径分隔符时,为什么要获取Ora-30004,oracle,Oracle,我已经在Oracle版本上对此进行了测试: 11.2.0.3.0 12.1.0.2.0 以下查询引发ORA-30004错误,但我的分隔符'->'未在任何列值中使用: with temptable as ( select '2624' as id, 'ninechars' as label, '' as parentid from dual union select '2625' as id, 'erewrettt' as label, '2624' as parentid from d

我已经在Oracle版本上对此进行了测试:
11.2.0.3.0
12.1.0.2.0

以下查询引发ORA-30004错误,但我的分隔符'->'未在任何列值中使用:

with temptable as (
  select '2624' as id, 'ninechars' as label, '' as parentid from dual union 
  select '2625' as id, 'erewrettt' as label, '2624' as parentid from dual union 
  select '2626' as id, 'Im stumped' as label, '' as parentid from dual union 
  select '2627' as id, '- Unknown -' as label, '' as parentid from dual
)
select sys_connect_by_path(label, ' -> ' ) 
from temptable
start with parentid is null 
connect by prior id = parentid;

一些观察结果:

  • 将值“ninechars”更改为“ninecharsx”允许查询工作
  • 将值“ninechars”更改为“abcdefghi”也会中断查询
    • 这里的九个字符值似乎都打破了查询

  • 将该值保留为“ninechars”,并删除最后一条未连接到任何其他记录的union语句,这将允许 查询是否正常工作
  • 将分隔符从“->”更改为“*>”将允许查询工作

问题
ORA-30004错误的来源是什么?为什么Oracle认为分隔符是列值的一部分


编辑:感谢bobdylan在评论中留下的这个链接,帮助说明问题

这闻起来像个bug。如果您需要解决此问题并实现您的逻辑,您也可以使用递归子查询分解(recursive With),它在11.2.0.4中正常工作:

SQL> with t (id, label, parentid, reportlevel, fake_connect_by_path) as (
  2  select id, label, parentid, 0 as reportlevel, ' -> ' || label as fake_connect_by_path
  3    from temptable
  4   where parentid is null
  5   union all
  6  select tt.id, tt.label, tt.parentid, reportlevel + 1, t.fake_connect_by_path || ' -> ' || tt.label as fake_connect_by_path
  7    from temptable tt
  8    join t on t.id = tt.parentid
  9  )
 10  select fake_connect_by_path
 11    from t;
FAKE_CONNECT_BY_PATH
--------------------------------------------------------------------------------
 -> ninechars
 -> Im stumped
 -> - Unknown -
 -> ninechars -> erewrettt

这可以在11.1.0.7.0上运行并产生结果,也可以在12.1.0.2.0上运行。在Linux上11.2.0.3.0和11.2.0.4.7上也可以正常运行。您确定这是服务器版本,而不是SQL*Plus版本吗?MOS上的这个错误有一些bug,但是看起来它不会影响任何一个版本。正在从哪个客户端运行此操作?如果它是可复制的,可能是时候提出服务请求了。我也在11.2.0.4上遇到了与User133371相同的错误,我已经有点明白了。问题来自最终的“-unknown-”值。它似乎将其视为某种函数,而不是字符串。我不确定这方面的技术:请参阅以获取线轴。正如您所看到的,您可以通过更改最终值来“打破”它。如果您有父id(而不是“”),但没有显示,它也会解决此问题。这是一种可接受的解决方法。最后,我选择了一种不同的解决方法,使用一个1个字符的分隔符,该分隔符不出现在任何列值和replace函数中。因此替换(系统连接路径(标签“|”)、“|”和“->”)