让我们假设有一个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
是要更新的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 = 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
或集合修改为临时表。但我不确定它会如何发挥作用。
如何重写此程序来完成技巧?