2014-11-27 2 views
0

Я хочу использовать функцию декодирования в курсоре с именами псевдонимов, чтобы избежать неоднозначности столбца, поэтому я использовал ниже подход.Декодировать с псевдонимом в курсоре

У меня есть код, такие как:

declare 
    cl number; 
    cursor c is 
     select c1.rowid,c1.col1, 
       DECODE(c1.col2, 'XYZ', c1.col3, 10) cl 
      from table1 d,table2 c1 where c1.process_id=13525 and d.col3(+)=cl; 
begin 
    for rec in c 
    loop 
    dbms_output.put_line(NVL(rec.cl,'-1')); 
    end loop; 
end; 

В этом годе, когда я буду срабатывать запрос, удалив состояние «и d.col3 (+) = сл» он будет получать мне данные со значением «п . Но когда я назначаю это условие, он не будет извлекать данные и не входить в цикл курсора. У меня есть соответствующие данные в d.col3.

Предположим, что если я получу cl как 5, то он также присутствует в d.col3, тогда он должен дать мне данные, я сделал это, потому что мне нужно удалить повторяющиеся записи. Поскольку с этим единственным условием я получу дубликаты записей. col3 in d table - это первичный ключ.

Так что я не понимаю, почему он не будет входить в цикл, поскольку он получает значение от запроса.

+0

Нет сообщений об ошибке. Он не входит в цикл, потому что он не извлекает никаких данных. – SNC

+0

Возможный дубликат [Использование псевдонима в предложении WHERE] (http://stackoverflow.com/questions/356675/using-an-alias-in-a-where-clause) –

ответ

1

Вы не можете использовать псевдоним в WHERE пункте: Using an Alias in a WHERE clause

В таких случаях подзапрос или CTE может помочь. Что-то как что (непроверенный!):

with V as (
    select c1.rowid rid, ,c1.col1, c1.process_id, 
     DECODE(c1.col2, 'XYZ', c1.col3, 10) cl 
    from table2 c1) 

select V.rid, V.col1, V.cl from table1 d,V 
    where V.process_id=13525 and d.col3(+)=V.cl; 
+0

Большое вам спасибо. Использование предложения With решило это. – SNC

0

После того, как предположение, что с помощью спецификатора моего подхода для получения данных через DECODE() с использованием альтернативного имени таблицы:

declare 
    cl number; 
    cursor c is 
     with V as (
      select c1.process_id, 
        DECODE(c1.col2, 'BANDM', c1.col3, 10) cl 
      from table2 c1) 
      select c1.rowid rid,c1.col1, V.cl from table1 d,V,table2 c1 
      where V.process_id=1 
       and d.col3(+)=V.cl 
       and c1.col3=V.cl; 

    begin 
    for rec in c 
    loop 
    dbms_output.put_line(NVL(rec.rid,'-1')); 
    dbms_output.put_line(NVL(rec.cl,'-1')); 
    end loop; 
    end; 

Другим решением без WITH:

declare 
    c2 number; 
    cursor c is 
      select c1.process_id 
       c1.rowid, 
       c1.col1, 
       DECODE(c1.col2, 'BANDM', c1.col3, 10) as c2 
      from table1 d, 
       table2 c1 
      where c1.process_id=1 
      and d.col3(+) = DECODE(c1.col2, 'BANDM', c1.col3, 10); 

    begin 
    for rec in c 
    loop 
    dbms_output.put_line(NVL(rec.rid,'-1')); 
    dbms_output.put_line(NVL(rec.c2,'-1')); 
    end loop; 
    end; 
Смежные вопросы