Количество строк, затронутых обновлением в PL / SQL
У меня есть функция PL/SQL (работает на Oracle 10g), в которой я обновляю некоторые строки. Есть ли способ узнать, сколько строк были затронуты обновлением? При выполнении запроса вручную он говорит мне, сколько строк были затронуты, я хочу получить это число в PL/SQL.
6 ответов:
использовать
sql%rowcountпеременной.вам нужно вызвать его сразу после оператора, для которого вам нужно найти количество затронутых строк.
например:
DECLARE i number; BEGIN UPDATE employees SET status = 'fired' WHERE name like '%Bloggs'; i := sql%rowcount; END;
для тех, кто хочет получить результаты от простой команды, решение может быть:
begin DBMS_OUTPUT.PUT_LINE(TO_Char(SQL%ROWCOUNT)||' rows affected.'); end;основная проблема заключается в том, что SQL%ROWCOUNT является переменной PL/SQL (или функцией) и не может быть напрямую доступна из команды SQL. Это может быть достигнуто с помощью блока noname PL/SQL.
... Если у кого-то есть решение, чтобы использовать его в команде SELECT, мне было бы интересно.
кроме того,
SQL%ROWCOUNTвы можете использовать это в процедуре без необходимости объявлять переменную
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
пожалуйста, попробуйте этот..
create table client ( val_cli integer ,status varchar2(10) ); --------------------- begin 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; end; --------------------- select * from client; --------------------- declare counter integer := 0; begin 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.'); else dbms_output.put_line(sql%rowcount||' client updated for '||val); counter := counter + sql%rowcount; end if; end loop; dbms_output.put_line('Number of total lines affected update operation: '||counter); end; --------------------- select * from client; --------------------------------------------------------результат будет, как показано ниже:
2 Клиент обновлен для 1
нет клиента с 2 val_cli.
нет клиента с 3 val_cli.
1 клиент обновлен для 4
нет клиента с 5 val_cli.
1 клиент обновлен для 6
нет клиента с 7 val_cli.
нет клиента с 8 val_cli.
нет клиента с 9 val_cli.
1 клиент обновляется 10
Общее количество строк, затронутых операцией обновления: 5
используйте аналитическую функцию Count(*) над разбиением на NULL Это будет считать общее количество строк
Comments