Количество строк, затронутых ОБНОВЛЕНИЕМ в PL / SQL

129

У меня есть функция PL/SQL (работает на Oracle 10g), в которой я обновляю некоторые строки. Есть ли способ узнать, сколько строк повлияло на UPDATE? При выполнении запроса вручную он сообщает мне, сколько строк было затронуто, я хочу получить этот номер в PL/SQL.

Теги:
plsql
sql-update

5 ответов

200
Лучший ответ

Вы используете переменную sql%rowcount.

Вам нужно вызвать его прямо после утверждения, которое вам нужно найти для подсчета числа строк.

Например:

DECLARE
    i number;
BEGIN
    UPDATE employees
    SET status = 'fired'
    WHERE name like '%Bloggs';
    i := sql%rowcount;
END;
  • 4
    И назначение должно предшествовать любым коммитам
18

Для тех, кто хочет получить результаты из простой команды, решение может быть:

begin
  DBMS_OUTPUT.PUT_LINE(TO_Char(SQL%ROWCOUNT)||' rows affected.');
end;

Основная проблема заключается в том, что SQL% ROWCOUNT - это переменная (или функция) PL/SQL и не может быть напрямую доступна из команды SQL. Используя блок noname PL/SQL, это может быть достигнуто.

... Если у кого-то есть решение использовать его в команде SELECT, мне было бы интересно.

6

SQL%ROWCOUNT вы можете использовать это в процедуре без необходимости объявлять переменную

  • 3
    SQL% ROWCOUNT - это функция, вы не можете просто «использовать ее» - вам нужно что- то с ней делать - сохранять ли ее в переменной, или отправлять как ввод в другую процедуру, или добавлять ее во что-то еще.
  • 7
    Я думаю, что точка зрения Али Х состоит в том, что нет необходимости присваивать ее переменной, пока у вас не появится другой оператор SQL, который повлияет на количество строк. При этом я согласен с тем, что она должна быть назначена переменной, чтобы избежать возникновения ошибки позже, если кто-то добавит другой оператор SQL до его вызова. И этот ответ от Али Х должен быть комментарием к ответу Клайва, а не опубликован как отдельный ответ
1

SQL%ROWCOUNT также может использоваться без назначения (по крайней мере, от Oracle 11g).

Пока в текущем блоке не выполнялась никакая операция (обновления, удаления или вставки), значение SQL%ROWCOUNT равно null. Затем он остается с числом строк, затронутым последней операцией DML:

скажем, у нас есть таблица CLIENT

create table client (
  val_cli integer
 ,status varchar2(10)
)
/

Мы проверили бы это следующим образом:

begin
  dbms_output.put_line('Value when entering the block:'||sql%rowcount);

  insert into client 
            select 1, 'void' from dual
  union all select 4, 'void' from dual
  union all select 1, 'void' from dual
  union all select 6, 'void' from dual
  union all select 10, 'void' from dual;  
  dbms_output.put_line('Number of lines affected by previous DML operation:'||sql%rowcount);

  for val in 1..10
    loop
      update client set status = 'updated' where val_cli = val;
      if sql%rowcount = 0 then
        dbms_output.put_line('no client with '||val||' val_cli.');
      elsif sql%rowcount = 1 then
        dbms_output.put_line(sql%rowcount||' client updated for '||val);
      else -- >1
        dbms_output.put_line(sql%rowcount||' clients updated for '||val);
      end if;
  end loop;  
end;

Результат:

Value when entering the block:
Number of lines affected by previous DML operation:5
2 clients updated for 1
no client with 2 val_cli.
no client with 3 val_cli.
1 client updated for 4
no client with 5 val_cli.
1 client updated for 6
no client with 7 val_cli.
no client with 8 val_cli.
no client with 9 val_cli.
1 client updated for 10
-4

Используйте аналитическую функцию Count (*) OVER PARTITION by NULL Это будет считать общее количество строк

  • 0
    После запуска оператора обновления, если вы проверите счет того, что вы действительно обновили - это не дает никакого общего решения. Например, если в моей таблице T есть один столбец c1, который содержит «1» в качестве значения для всех, и теперь я обновляю все строки для этого столбца до «2», как поможет разделение по нулю?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню