Если это должен быть курсор l oop, см. Другой подход - курсор FOR
l oop. Писать и поддерживать намного проще, так как Oracle делает большинство вещей за вас, то есть вам не нужно явно объявлять курсор и переменную (и) курсора, открывать его, извлекать из него, обращать внимание, когда выходить из l oop, закройте курсор. Все, что грязная работа сделана для вас.
Все, о чем вам нужно беспокоиться, это то, что select
, который вы написали, на самом деле возвращает несколько строк, потому что я видел комментарий, который вы написали, - хотя процедура был скомпилирован, он не вставил никаких строк. Поскольку у нас нет ваших данных, мы не можем с этим поделать.
Здесь вы go (при условии, что таблицы и столбцы действительно существуют):
create or replace procedure fiber_transm_valid_data as
begin
for cur_r in (select rj_span_id,
rj_maintenance_zone_name
from app_fttx.transmedia@sat
where length(rj_span_id) = 21
and inventory_status_code = 'IPL'
and regexp_like(rj_span_id, 'SP(N|Q|R|S).*_(BU|MP)$')
and rj_maintenance_zone_code in ('INMUNVMB01')
)
loop
if cur_r.rj_span_id > '0' then
insert into tbl_fiber_valid_trans_data
(span_id, maintenance_zone_name)
values (cur_r.rj_span_id, cur_r.rj_maintenance_zone_name);
end if;
end loop;
end fiber_transm_valid_data;
Еще несколько замечаний: не COMMIT
в l oop, поскольку это вызывает проблемы (например, снимок слишком старый ошибка). Подумайте об удалении из процедуры и позвольте вызывающему абоненту решить, следует ли совершать или нет.
Вы действительно выполняли процедуру? Вы создали его, но - если вы никогда не вызывали его, это может быть причиной, по которой вы не видите вставляемых строк. Итак:
begin
fiber_transm_valid_data ;
end;
/