SQL в представленном виде можно легко сжать в один оператор DELETE.Это связано с тем, что инструкция DELETE не создает исключение, когда не находит строк для удаления.
Учитывая данные этого теста:
SQL> select * from tbl1
2 /
ID NUM
---------- ----------
10 999
20 999
10 888
SQL> select * from tbl2
2 /
ID
----------
10
SQL>
Мы передаем одно и то же значение дважды;в первый раз, когда запись будет удалена, в следующий раз ничего не произойдет, но изящно ....
SQL> DELETE FROM tbl1 a
2 WHERE a.num = '&num'
3 and exists (select b.id
4 from tbl2 b
5 WHERE a.id = b.id )
6 /
Enter value for num: 999
old 2: WHERE a.num = '&num'
new 2: WHERE a.num = '999'
1 row deleted.
SQL> /
Enter value for num: 999
old 2: WHERE a.num = '&num'
new 2: WHERE a.num = '999'
0 rows deleted.
SQL>
Конечно, вы могли представить упрощенный случай здесь, и ваши реальные потребностисложно.Если да, пожалуйста, отредактируйте ваш вопрос, чтобы отразить что-то более реалистичное.