Похоже, что вы пытаетесь извлечь из курсора непосредственно в Missinginventory
таблицу (если это таблица). Ну, это не сработает. Сначала выберите переменные курсора, затем вставьте эти переменные в таблицу.
Я не знаю, что это делает:
fzkfims.P_set_inventory_id@develop_sw(inventory_ids_rec.id);
;выглядит как вызов какой-то процедуры. Я предполагаю, что это устанавливает какую-то «среду», но я не знаю, как это отражается на написанном вами коде.
В любом случае: почему вы используете циклы курсора? Вы не можете напрямую вставить данные в таблицу? Это было бы быстрее и, надеюсь, проще.
Кроме того, если вы объявите что-то , сделайте это в том же месте, в начале этой процедуры PL / SQL. Если вы разбросали объявления по всему коду, поддерживать их сложно. Кроме того, посмотрите, являются ли петли курсора FOR
опцией, поскольку они проще в использовании - Oracle многое для вас делает. Как? Хотя вам все еще нужно написать оператор курсора SELECT
, вам не нужно объявлять переменные курсора, открывать курсор, выбирать, заботиться о выходе из цикла, закрывать курсор. Я постараюсь переписать ваш код, посмотрю (как видите, никакого раздела declare
!).
begin
for cur_1 in (select distinct fzrfbth_status status,
fzbfbth_inventory_id id
from fzbfbth@develop_sw
join fzrfbth@develop_sw
on fzbfbth_inventory_id = fzrfbth_inventory_id
order by fzrfbth_status,
fzbfbth_inventory_id
)
loop
fzkfims.p_set_inventory_id@develop_sw(cur_1.id);
for cur_2 in (select *
from fzvfims@develop_sw
)
loop
-- I shortened it to just a few columns
insert into missinginventory
(last_inventory_date,
atype_title,
asset_type)
values (cur_2.last_inventory_date,
cur_2.atype_title,
cur_2.asset_type);
end loop;
end loop;
end;