Давайте предположим, что у меня есть таблица t1
уникальных пар id
и col_value
, которые сами могут повторяться в соответствующих столбцах. Примерно так:
|id|col_value|
|--|---------|
| 1| 101|
| 1| 102|
| 1| 103|
| 2| 101|
| 2| 102|
| 2| 103|
Затем у меня есть процедура upd_t1_for_id (idToUpd number, par_values number)
, где idToUpd
- это идентификатор для обновления, а par_values
- это type list_of_numbers is table of number
коллекция значений для обновления t1
. Процедура идет так:
create or replace procedure upd_t1_for_id (idToUpd number, par_values list_of_numbers) is
begin
delete from t1
where t1.id = idToUpd
and col_value not exists (par_values); --doesn't work, throws an error
--and col_value not in (par_values);--also doesn't work
for i in 1..par_values.count loop
insert into t1 (id, col_value)
select idToUpd, par_values(i) from dual
where par_values(i) not in (select col_value from t1 where id = idToUpd);
end loop;
commit;
end upd_t1_for_id;
Как видите, upd_t1_for_id
должен удалять строки с id
из параметров, в которых col_value
отсутствует в par_values
.
Например, upd_t1_for_id(inputId, inputValues)
с inputId = 1
и inputValues = [102, 103, 500, 600]
должно измениться t1
, чтобы выглядеть так:
|id|col_value|
|--|---------|
| 1| 102|
| 1| 103|
| 1| 500|
| 1| 600|
| 2| 101|
| 2| 102|
| 2| 103|
Но это не так.
Например, я могу свободно изменять type list_of_numbers
или коллекцию, чтобы она стала временной таблицей. Но я не совсем уверен, как бы это закончилось.
Как переписать эту процедуру, чтобы добиться цели?