Попытка сохранить несколько значений из SELECT для использования в DELETE - PullRequest
1 голос
/ 28 февраля 2012

Хорошо, поэтому в основном мне нужно выбрать несколько идентификаторов из одного столбца, а затем использовать эти идентификаторы для удаления из таблицы.

В данный момент я пытаюсь сделать что-то подобное, но я неконечно, если я делаю что-то не так или даже в правильном поле.

--this will return multiple rows
select user_group_user_id, user_group_id
bulk collect into USERGROUPUSERID, USERGROUPID
from user_group_user_tab
where user_id = USERID; --USERID is argument passed in

--Attemting to delete multiple rows where the above results are found 
delete from user_group_user_tab 
where user_group_user_id in USERGROUPUSERID;

delete from user_group_tab
where user_group_id in USERGROUPID;

Это все часть хранимой процедуры в Oracle (11g).USERGROUPUSERID и USERGROUPID объявлены ранее.

У кого-нибудь есть какие-либо предложения о том, как этого добиться?Я не уверен, что этот массовый сбор - это то, что нужно, или совершенно другой подход, или я просто ошибаюсь.

Спасибо!

Ответы [ 2 ]

3 голосов
/ 28 февраля 2012

Я бы обычно использовал

BEGIN TRANS
delete from OrderItems where OrderId in ( SELECT OrderId FROM Orders WHERE CustomerName like '%peter%'); 
DELETE FROM Orders WHERE CustomerName like '%peter%'; 
COMMIT; 

, т. Е. Просто выполнение удаляет результаты подзапроса.Временные таблицы в соответствии с «спросить Тома» не используются в оракуле, и курсор над каждой строкой будет намного медленнее, чем простое соединение.Вдобавок ко всему, я думаю, что oracle оптимизатор является умным средством для кэширования временного набора данных (SELECT OrderId FROM Orders WHERE CustomerName наподобие '% peter%')

Спросите Тома о временных таблицах и курсорах

1 голос
/ 28 февраля 2012

Вы можете сделать это с помощью курсора, чтобы получить все ваши значения и использовать WHERE CURRENT OF предложение .

Ваш курсор будет выглядеть так:

cursor c1 (USERID number(10))
    is
    select user_group_user_id, user_group_id
    from user_group_user_tab
    where user_id = USERID
    for update of user_group_user_tab;

РЕДАКТИРОВАТЬ: Логика для этой проблемы может быть такой:

  1. Создать курсор со значениями, которые вы хотите удалить
  2. Открыть его
  3. Начать выборку каждой строкикурсор.
  4. В поле fect удалите фактическую строку.

Ссылка на слово предложение может помочь вам сделать это.

Если у вас есть проблемы с использованием курсоров, вот хорошее введение в Oracle 11g Cursors .Кроме того, у этой записи в блоге есть хороший пример использования курсора с параметрами.

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