Поскольку у вас нет базы данных для работы, трудно быть на 100% уверенным, но, на мой взгляд, строка, которая гласит:
rc rc%rowtype;
должна сказать
rc txt%rowtype;
Вы определили курсор v_rc
как возвращающий txt%rowtype
, и ваш оператор SQL, используемый с этим курсором, равен select * from txt
, но этот тип данных расходится с определением rc
.Таким образом, кажется, вам нужно изменить rc
, как показано.
Это также похоже на оператор LOOP
, который следует сразу после удаления exit when v_rc%notfound;
, поскольку после этого нет ничего, что могло бы завершить этот цикл.,
Кроме того, у вас есть много ссылок на столбцы в таблице txt
, например, IF txt.col1 = rc.col1
.Вы не можете ссылаться на значения в таблице таким образом.Я не совсем уверен, что вы пытаетесь сделать здесь, поэтому я не могу ничего предложить.
Кроме того, утверждение
select col1 from tbl1
Where EXISTS (select col1 from tbl1 where tbl1.col1 = rc.col1);
выбирает столбец из базы данных,но никуда не денетсяЭто должен быть либо одиночный SELECT (SELECT..INTO
), либо курсор.
Еще одна вещь: вы не можете использовать distinct *
.Вам нужно использовать список столбцов с distinct
.
Возможно, следующее будет близко к тому, что вы пытаетесь сделать:
create or replace procedure sp_ex
AS
begin
FOR rc IN (SELECT * FROM TXT)
LOOP
FOR t1 IN (SELECT *
FROM TBL1
WHERE TBL1.COL1 = rc.COL1)
LOOP
IF t1.COL1 = rc.COL1 AND
t1.COL2 = rc.COL2
THEN
insert into main_table
select *
from txt
where txt.col2 = rc.col2;
ELSIF t1.col1 = rc.col1 AND
t1.col2 = rc.col2 AND
t1.col3 = rc.col3
THEN
insert into main_table
select *
from txt
where txt.col2 = rc.col2;
ELSE
insert into main_table
select *
from txt
where txt.col4 = rc.col4;
END IF;
END LOOP; -- t1
END LOOP; -- rc
end sp_ex;
Best of luck.