在表中删除集合中不存在列值的表的过程?

时间:2018-10-31 09:58:06

标签: plsql oracle11g

让我们假设有一个t1id唯一对的表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是要更新的ID,而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 = 1inputValues = [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或集合修改为临时表。但我不确定它会如何发挥作用。

如何重写此程序来完成技巧?

0 个答案:

没有答案