Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Oracle. Подсчет удаленных/измененных строк в процедуре.  (Прочитано 14811 раз)
0 Пользователей и 4 Гостей смотрят эту тему.
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« : 26-03-2010 06:14 » 

Есть ли такая возможность в Oracle?

Например, в процедуре делаю

Код:
DELETE FROM ... WHERE ...

и хочу знать, сколько строк фактически удалено.

Можно, в принципе, сперва сделать SELECT FOR UPDATE, подсчитать строки, а потом удалять, но как-то не особо удобно.
Кстати, заблокируются ли строки, если сделать вот так?

Код:
SELECT COUNT(*) FROM ... WHERE ... FOR UPDATE

Использую Oracle 10g Standard Edition.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #1 : 26-03-2010 06:20 » 

RXL, ты это через oci делаешь? или в какой-то утилите?
Записан

Странно всё это....
PooH
Глобальный модератор

ru
Offline Offline
Пол: Мужской
... и можно без хлеба!


« Ответ #2 : 26-03-2010 06:22 » new

SQL%ROWCOUNT не подойдет?
Записан

Удачного всем кодинга! -=x[PooH]x=-
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #3 : 26-03-2010 06:33 » 

можно получит количество записей через returning
Код:
delete table_name returning count(any_field) into :count
Записан

Странно всё это....
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 26-03-2010 07:13 » 

Я это делаю в хранимой процедуре.

Спасибо. Не знал о таком способе.
Посмотрел в доке: у UPDATE такая же фича есть.

А по второму вопросу: сможет ли SELECT COUNT(*) ... FOR UPDATE (или любая другая группировка) заблокировать строки? Чисто для интереса.
« Последнее редактирование: 26-03-2010 07:15 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #5 : 26-03-2010 07:32 » 

блокируй если хочется Улыбаюсь
можешь дополнительно получить коллекцию rowid и делать удаление и обновление по rowid для ускорения (это даже в доках описано)
Записан

Странно всё это....
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 26-03-2010 09:51 » 

Доки объемные. По этому читаю их адресно, по мере нужды.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
McZim
Модератор

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #7 : 29-03-2010 20:53 » 

Цитата
select_statement
   FOR UPDATE [of column_list] [NOWAIT];

в select statement должно быть то что мы хотим изменить, может находиться и еще что нибудь (какое то поле), но обязательно то поле которое мы указываем в конструкции of.

Код:
SQL> select object_id from test1;                

 OBJECT_ID
----------
       100
       116
       117
       272
       357
       359
       360
       362
       363

9 rows selected.

SQL> select count(*) from test1 for update where object_id = 100;
select count(*) from test1 for update where object_id = 100
                           *
ERROR at line 1:
ORA-01786: в этом выражении запроса FOR UPDATE не допускается

По поводу подсчета количества строк. В PL/SQL будет верным использовать для этого курсоры.
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines