Ну, OPEN..FETCH..LOOP
стал довольно старомодным. Вы должны просто использовать один оператор вставки / обновления / удаления, основанный на параметре. Он будет гораздо более эффективным, чем ваши циклические конструкции.
CREATE OR replace PROCEDURE sp_cs (p_var txt.col1%TYPE)
IS
BEGIN
CASE p_var
WHEN 'I' THEN
INSERT INTO main_tbl
SELECT *
FROM txt;
WHEN 'D' THEN
DELETE FROM main_tbl m
WHERE EXISTS (SELECT 1
FROM txt t
WHERE m.col2 = t.col2);
WHEN 'U' THEN
UPDATE main_tbl m
SET m.col2 = (SELECT v_rc.col2
FROM txt
WHERE m.somecol = t.somecol); -- the column you want to compare while updating
END CASE;
END;
/
Хотя из вашего запроса на обновление не ясно, чего вы пытаетесь достичь, я предполагаю, что у вас есть общий столбец в txt
при обновлении col2 с main_tbl
. Более того, я использовал ваш параметр в качестве аргумента процедуры p_var
. Вы можете использовать его как локальную переменную, если не хотите передавать его.