分层查询:来自dual是好的,但是来自物理表是" ORA-01436"

时间:2014-07-22 10:41:17

标签: sql oracle oracle11g date-range

我通过这种方式使用递归获得范围没有问题:

    WITH T1 AS (
     SELECT 1 ID, DATE '2010-08-10' STARTDATE, DATE '2010-08-12' UPTODATE FROM DUAL UNION ALL
     SELECT 2 ID, DATE '2010-08-08' STARTDATE, DATE '2010-08-15' UPTODATE FROM DUAL
    )
    SELECT STARTDATE + LEVEL - 1 DT FROM T1
    CONNECT BY LEVEL <= UPTODATE - STARTDATE
       AND PRIOR ID = ID
       AND PRIOR SYS_GUID() IS NOT NULL;

从物理表

CREATE TABLE T2 (ID NUMBER(1), STARTDATE DATE, UPTODATE DATE);

INSERT INTO T2 VALUES (1, DATE '2010-08-10', DATE '2010-08-12');
INSERT INTO T2 VALUES (2, DATE '2010-08-08', DATE '2010-08-15');

SELECT STARTDATE + LEVEL - 1 DT FROM T2
CONNECT BY LEVEL <= UPTODATE - STARTDATE
   AND PRIOR ID = ID
   AND PRIOR SYS_GUID() IS NOT NULL;

出现周期错误 ORA-01436 ,但我发现这些数据和请求完全相同。

可能是什么问题,要找什么?

Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - 64bit Production

1 个答案:

答案 0 :(得分:1)

这似乎是错误6451127,它特定于您正在使用的Oracle版本。

错误报告中的示例在prior子句prevent cycling but still generate all the rows in the range中使用了不同的非确定性函数,但对我来说看起来也是同样的问题。

您可以从My Oracle Support获取该错误的详细信息,可能的解决方法以及有关补丁的信息;从文档ID 732871.1开始,链接到bug和补丁。我无法在这里复制来自MOS的任何信息,所以不幸的是,这将是模糊的。

如果您想确认它是同一件事,您可能需要或想要提出服务请求。