Обработка исключений PL\SQL

Rabbit99
Дата: 27.09.2004 11:34:24
Уважаемые знатоки PL\SQL/ Подскажите как правильно обработать исключение
Имеется следующая таблица:
desc r_rev_kat_lnr

NAME Null? Type
------------------------------- --------- -----
DA NOT NULL DATE
KAT NOT NULL VARCHAR2(4)
L_100 NUMBER(12,0)
L_110 NUMBER(12,0)
L_131 NUMBER(12,0)
L_140 NUMBER(12,0)
L_160 NUMBER(12,0)
L_200 NUMBER(12,0)
L_202 NUMBER(12,0)
... итд. Многие из этих полей равны нулю.
Пишу процедуру которая делала бы селект и возвращала только бы только те столбцы, в которых есть какие либо значения за определенный период (поле DA).
CREATE OR REPLACE
PROCEDURE roma (f_rom in date,t_o in date, vl out types.cursortype)
is
da_ date;
i number(3):=100;
begin
loop
exit when i>998;
execute immediate 'select '||'L_'||to_char(i)||' from r_rev_kat_lnr';
i:=i+1;
end loop;
end;
Как грамотно обработать exception, чтобы как только i=несуществующее название столбца (ORA-00904: invalid column name) был переход к началу лупа и переменной i присваивалось следующее значение?
Спасибо.
Vadim_Maximov
Дата: 27.09.2004 11:44:50
begin
loop
exit when i>998;
begin
execute immediate 'select '||'L_'||to_char(i)||' from r_rev_kat_lnr';
exception
  when others then
     if sqlcode = -904 then
       null;
     else
       raise;
     end if;
end;
i:=i+1;
end loop;
Rabbit99
Дата: 27.09.2004 12:00:47
Супер! Спасибо!
Elic
Дата: 27.09.2004 12:14:01
Rabbit99

loop
exit when i>998;
execute immediate 'select '||'L_'||to_char(i)||' from r_rev_kat_lnr';
i:=i+1;
end loop;
Зачем делать тупой перебор?
for cCol in 
( select * from user_tab_columns
    where table_name = 'R_REV_KAT_LNR'
      and column_name like 'L_%'
      and trunslate(substr(column_name, 3), '_0123456789', '_') is null
) loop
  execute immediate 'select '||cCol.column_name||' from r_rev_kat_lnr';
end loop;
Rabbit99
Дата: 27.09.2004 15:18:28
Спасибо, тоже верно. Но теперь возникает другой вопрос; a что в строке execute immediate нельзя не курсор открыть для селекта, не вставить результат селеста в какю либо переменную?
softwarer
Дата: 27.09.2004 16:36:49
Rabbit99
Спасибо, тоже верно. Но теперь возникает другой вопрос; a что в строке execute immediate нельзя не курсор открыть для селекта, не вставить результат селеста в какю либо переменную?

Можно и то, и другое. В доках расписано с кучей примеров.
Rabbit99
Дата: 27.09.2004 17:22:29
Краем глаза хоть бы взглянуть ;-(