表或视图不存在 - Oracle抱怨逗号而不是实际的表或视图名称

时间:2011-04-12 14:19:33

标签: sql oracle oracle10g ora-00942

我以前从未见过这个......我的查询开头就是这样:

with q1 as
     (select a.V_ID, a.D_ID, a.C_ID,
               case when a.percent > 0 THEN 'Y' ELSE 'N' end L_val,
               a.C_val
       from ab_a_table a
       where a.C_ID =  '00000003' -- '00000007' --  test values
             and a.B_VAL = '6010001'
             and a.Q = '11234567')
select case
           when ... /* rest of query omitted */

当我尝试运行时,Oracle抱怨table or view does not exist。但它突出显示第3行的',',而不是实际的表/视图名称:

               case when a.percent > 0 THEN 'Y' ELSE 'N' end L_VAL,
                                                                  *
ERROR at line 3:
ORA-00942: table or view does not exist

我省略的其余查询是相当漫长而复杂的 - 我会清理并在必要时发布它 - 现在我只是说这个错误只在我添加引用{{1}的第三个子查询时才开始}。事实上,似乎我可以删除3个子查询中的任何一个,并且整个事情将执行(虽然结果不正确)所以感觉我遇到了某种Oracle错误而不是纯SQL错误。同样有趣的是,我可以将q1的主体作为一个独立的查询运行,当我这样做时它没有问题。只有当我运行整个查询时,它才会在q1中的案例后抱怨逗号。

有没有人经历过这个?

(使用Oracle 10g)。


修改:尝试添加了q1个关键字。结果现在是:

               case when a.perc_fault > 0 THEN 'Y' ELSE 'N' end AS L_VAL, a.C_VAL
                                                                     *
ERROR at line 3:
ORA-00942: table or view does not exist

看起来星号位于相同的位置,但在AS下,因为单词V已移动了3个字符。很奇怪......

2 个答案:

答案 0 :(得分:0)

我不确定我是否遇到Oracle错误5130732,但确实感觉就像这样。无论如何,我重写了这样的查询:

select case ... 
from
    (select ...
     from (select a.V_ID, a.D_ID, a.C_ID,
               case when a.percent > 0 THEN 'Y' ELSE 'N' end L_val,
               a.C_val
       from ab_a_table a
       where a.C_ID =  '00000003' -- '00000007' --  test values
             and a.B_VAL = '6010001'
             and a.Q = '11234567') q1,  <other tables>
    where ...) subquery1,
    (select ...
     from (select a.V_ID, a.D_ID, a.C_ID,
               case when a.percent > 0 THEN 'Y' ELSE 'N' end L_val,
               a.C_val
       from ab_a_table a
       where a.C_ID =  '00000003' -- '00000007' --  test values
             and a.B_VAL = '6010001'
             and a.Q = '11234567') q1,  <other tables>
    where ...) subquery2,
    (select ...
     from (select a.V_ID, a.D_ID, a.C_ID,
               case when a.percent > 0 THEN 'Y' ELSE 'N' end L_val,
               a.C_val
       from ab_a_table a
       where a.C_ID =  '00000003' -- '00000007' --  test values
             and a.B_VAL = '6010001'
             and a.Q = '11234567') q1,  <other tables>
    where ...) subquery3, <other tables>
where....

是的,我在每个使用它的子查询中都包含了q1的副本,现在一切正常。一个真实的观点也会起作用,但这更容易(政治上,就是 - 没有代码升级请求到需要进行分析的环境,没有关于数据库中最近添加的对象的会议等等)< / p>


<强>更新

现在我已经将查询添加到我的PL / SQL脚本中,Oracle给了我ORA-00600 [qcscpqbTxt], [600],这似乎与Oracle bug#5765958有关.... *叹气* ...任何人都可以建议一个解决方法?我没有metalink访问权限(好吧,我可以通过DBA,如果这可以以某种方式进入他们的雷达)。

答案 1 :(得分:0)

假设您遇到Oracle错误且无法修补数据库,您可以尝试将子查询移动到函数中。不完全确定这会起作用,并假设你的PL / SQL版本在一个包中,或者有一个可以添加一个功能:

在包规范中:

type q1_rec is record(
    d_id ab_a_table.v_id%TYPE,
    v_id ab_a_table.d_id%TYPE,
    c_id ab_a_table.c_id%TYPE,
    l_val char(1),
    c_val ab_a_table.c_val%TYPE);
type q1_arr is varray(9999); -- assuming you can pick a max size
function q1 return q1_arr pipelined;
pragma restrict_references(q1, wnds);

在包体中:

function q1 return q1_arr pipelined is
    cursor c is
        select a.V_ID, a.D_ID, a.C_ID,
               case when a.percent > 0 THEN 'Y' ELSE 'N' end L_val,
               a.C_val
       from ab_a_table a
       where a.C_ID =  '00000003' -- '00000007' --  test values
             and a.B_VAL = '6010001'
             and a.Q = '11234567');
begin
    for r in c loop
        pipe row(r);
    end loop;
end;

然后在主查询中将子查询替换为table(q1())

使用引用游标或嵌套表可能有点整洁,但需要在包外部构建一个表类型,我想根据你对使用视图的额外对象评论来避免这种情况。