4

我以前从未见过这个......我有一个这样的查询:

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 行的“,”,而不是实际的表/视图名称:

               当 a.percent > 0 THEN 'Y' ELSE 'N' end L_VAL 时,
                                                                  *
第 3 行的错误:
ORA-00942: 表或视图不存在

我省略的查询的其余部分相当长且复杂——如有必要,我将对其进行清理并发布——现在我只想说这个错误仅在我添加第三个引用的子查询时才开始q1。事实上,似乎我可以删除 3 个子查询中的任何一个,整个事情都会执行(尽管结果不正确),所以感觉就像我遇到了某种 Oracle 错误而不是纯 SQL 错误。同样有趣的是,我可以将主体q1作为独立查询运行,并且这样做没有问题。只有当我运行整个查询时,它才会抱怨q1.

有没有人经历过这个?

(使用 Oracle 10g)。


编辑:尝试添加AS关键字。结果现在是:

               a.perc_fault > 0 THEN 'Y' ELSE 'N' end AS L_VAL, a.C_VAL 的情况
                                                                     *
第 3 行的错误:
ORA-00942: 表或视图不存在

看起来星号在同一个位置,但是在下面,V因为这个词L_VAL已经移动了 3 个字符。很奇怪...

4

2 回答 2

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现在一切正常。一个真实的视图也可以,但这更容易(从政治上讲,即 - 没有对需要进行分析的环境的代码提升请求,没有关于数据库中后期添加对象的会议等......)


更新

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

于 2011-04-12T20:37:01.840 回答
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()).

使用引用游标或嵌套表可能会更整洁,但需要在包之外构建表类型,我猜你想根据你关于使用视图的额外对象注释来避免这种情况。

于 2011-04-13T09:13:47.387 回答