Процедура удаления строки в таблице, где значение столбца не существует в коллекции? - PullRequest
0 голосов
/ 31 октября 2018

Давайте предположим, что у меня есть таблица 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 или коллекцию, чтобы она стала временной таблицей. Но я не совсем уверен, как бы это закончилось.

Как переписать эту процедуру, чтобы добиться цели?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...