2009-05-14 4 views
124

일부 행을 업데이트하는 PL/SQL 함수 (Oracle 10g에서 실행)가 있습니다. UPDATE의 영향을받은 행 수를 알 수있는 방법이 있습니까? 수동으로 쿼리를 실행할 때 영향을받는 행의 수를 알려주고 PL/SQL에서 그 수를 얻고 싶습니다.PL/SQL에서 UPDATE의 영향을받는 행 수

답변

194

sql%rowcount 변수를 사용합니다.

영향을받은 행 수를 찾아야하는 문장 다음에 바로 호출해야합니다.

DECLARE 
    i number; 
BEGIN 
    UPDATE employees 
    SET status = 'fired' 
    WHERE name like '%Bloggs'; 
    i := sql%rowcount; 
END; 
6

대안 SQL%ROWCOUNT 당신이 일반 명령의 결과,이 솔루션은 수를 원하는 사람들을 위해 변수

+3

SQL의 %의 ROWCOUNT는 그냥 "사용"할 수없는 함수입니다 :
1 클라이언트는 전체 라인 영향을받는 업데이트 작업의 10
번호 업데이트 - 변수에 저장하거나 다른 프로 시저에 입력으로 보내거나 다른 것으로 추가하는 경우. –

+7

Ali H의 요지는 행 수에 영향을주는 또 다른 SQL 문이있을 때까지 변수에 할당 할 필요가 없다는 것입니다. 즉, 나중에 누군가가 다른 SQL 문을 호출해야만 버그가 발생하지 않도록 변수에 할당해야한다는 것에 동의합니다. 그리고 Ali H의이 대답은 별도의 답변으로 게시 된 것이 아니라 Clive의 대답에 대한 설명이되어야합니다. – Kirby

18

를 선언 할 필요없이 프로 시저 내에서 이것을 사용할 수 있습니다 : 예를 들어

be :

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

기본적으로 SQL % ROWCOUNT는 PL/SQL 변수 (또는 함수)이며 dir 일 수 없습니다 SQL 명령에서 액세스 할 수 있습니다. noname PL/SQL 블록을 사용하면이 작업을 수행 할 수 있습니다.

... 누군가가 SELECT 명령에서 사용할 솔루션이 있다면, 나는 흥미가있을 것이다.

-3

+0

실제로 업데이트 한 항목 수를 확인한 경우 업데이트 진술을 실행 한 후 - 일반 솔루션을 제공하지 않습니다. 예를 들어, 내 테이블 T가 "1"을 모두 값으로 포함하는 하나의 열 c1을 갖고 있고이 열의 모든 행을 "2"로 업데이트하면 null로 어떻게 분할 할 것인가? – nanosoft

1

SQL%ROWCOUNT의 총 #을 계산합니다 카운트 (*) NULL 이 BY PARTITION OVER 분석 함수를 사용하여도 (적어도 오라클 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 
012 3,516,
0

이 하나를 시도하십시오 ..


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; 

-------------------------------------------------------- 

결과는 아래와 같이 될 것입니다 : 1
없이 클라이언트를 업데이트


2 클라이언트 2 val_cli.
3 개의 val_cli가있는 클라이언트가 없습니다.
1 명의 클라이언트가 4 개를 업데이트했습니다.
5 명의 val_cli가있는 클라이언트가 없습니다.
1 명의 클라이언트가 6 개의 업데이트되었습니다.
7 명의 val_cli가있는 클라이언트가 없습니다.
8 개의 val_cli가있는 클라이언트가 없습니다.
9 개의 val_cli가있는 클라이언트가 없습니다. - 당신이 * 함께 * 뭔가를해야 할 5


+0

메시지를 올바르게 포맷 할 수 있습니까? –

관련 문제