开发者

Table or view does not exist - Oracle complains about a comma rather than an actual table or view name

I've never seen this before... I have a query that starts off like this:

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'开发者_如何学C
             and a.Q = '11234567')
select case
           when ... /* rest of query omitted */

When I try to run this, Oracle complains about that a table or view does not exist. But it highlights the ',' on line 3, rather than an actual table/view name:

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

The rest of the query I omitted is rather long and complex - I'll sanitize and post it if necessary - for now I'll just say that this error only started when I added a third subquery that referenced q1. In fact, it seems I can remove any one of the 3 subqueries and the whole thing will execute (though with incorrect results) so it feels like I've hit some kind of Oracle error rather than a pure SQL error. It's also interesting that I can run the body of q1 as a stand-alone query and it has no problems when I do that. Only when I run the entire query does it complain about the comma after the case in q1.

Has anyone ever experienced this?

(using Oracle 10g).


Edit: Tried added AS keyword. Results are now:

               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

It looks like the asterisk is in the same position, but under the V because the word L_VAL has been shifted by 3 characters. Very strange...


Assuming you are hitting the Oracle bug(s) and can't patch the database, you could try moving the subquery to a function. Not entirely sure this will work, and assumes your PL/SQL version is in a package, or there's one available that can have a function added:

In the package spec:

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);

In the package body:

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;

And then in your main query replace the subquery with table(q1()).

Using a ref cursor or nested table might be a bit neater but would need a table type built outside the package, which I guess you want to avoid based on your extra-object comment about using a view.


I don't know for sure if I'm experience Oracle bug 5130732 but it sure feels like it. Anyway, I rewrote the query like this:

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....

Yes, I included a copy of q1 in every subquery that used it and everything works fine now. A real view would have worked too, but this was easier (politically, that is - no code-promotion requests to the environment where the analysis needs to be done, no meetings about late-added object in database, etc...)


UPDATE

And now that I've added the query to my PL/SQL script, Oracle gives me ORA-00600 [qcscpqbTxt], [600], which seems to be related to Oracle bug #5765958.... * sigh *... Can anyone suggest a workaround? I don't have metalink access (well, I might, through a DBA, if this can somehow get onto their radar).

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜