Таблица или представление не существует - Oracle жалуется на запятую, а не на имя таблицы или представления - PullRequest
4 голосов
/ 12 апреля 2011

Я никогда не видел этого раньше ... У меня есть запрос, который начинается примерно так:

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

Остальная часть опущенного мной запроса довольно длинная и сложная - I 'Я проведу его дезинфекцию и опубликую, если необходимо - сейчас я просто скажу, что эта ошибка возникла только тогда, когда я добавил третий подзапрос со ссылкой q1.На самом деле, кажется, что я могу удалить любой из 3 подзапросов, и все это будет выполнено (хотя и с неверными результатами), поэтому создается впечатление, что я столкнулся с какой-то ошибкой Oracle, а не чисто ошибкой SQL.Также интересно, что я могу запустить тело q1 как отдельный запрос, и у меня нет проблем, когда я это делаю.Только когда я запускаю весь запрос, он жалуется на запятую после случая в q1.

Кто-нибудь когда-либо сталкивался с этим?

(используя Oracle 10g).


Редактировать: попробовал добавить AS ключевое слово.Теперь результаты:

               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

Похоже, что звездочка находится в той же позиции, но под V, потому что слово L_VAL было смещено на 3 символа.Очень странно ...

Ответы [ 2 ]

0 голосов
/ 13 апреля 2011

Предполагая, что вы сталкиваетесь с ошибками 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()).

Использование курсора ссылки или вложенной таблицы может быть немного лучше, но потребуетсяТип таблицы, созданный вне пакета, который, я полагаю, вы хотите избежать, основываясь на вашем дополнительном объектном комментарии об использовании представления.

0 голосов
/ 13 апреля 2011

Я точно не знаю, сталкиваюсь ли я с ошибкой 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 в каждый подзапрос, который использовал его, и теперь все работает нормально. Реальное представление тоже сработало бы, но это было проще (политически, то есть - нет запросов на продвижение кода в среду, где необходимо выполнить анализ, нет встреч по поводу позднего добавления объекта в базу данных и т. Д ...)


UPDATE

И теперь, когда я добавил запрос в свой сценарий PL / SQL, Oracle дает мне ORA-00600 [qcscpqbTxt], [600], который, похоже, связан с ошибкой Oracle # 5765958 .... * вздох * ... Может кто-нибудь предложить обходной путь? У меня нет доступа к metalink (ну, я мог бы через администратора баз данных, если это каким-то образом попасть на их радары).

...