일부 행을 업데이트하는 PL/SQL 함수 (Oracle 10g에서 실행)가 있습니다. UPDATE의 영향을받은 행 수를 알 수있는 방법이 있습니까? 수동으로 쿼리를 실행할 때 영향을받는 행의 수를 알려주고 PL/SQL에서 그 수를 얻고 싶습니다.PL/SQL에서 UPDATE의 영향을받는 행 수
답변
sql%rowcount
변수를 사용합니다.
영향을받은 행 수를 찾아야하는 문장 다음에 바로 호출해야합니다.
DECLARE
i number;
BEGIN
UPDATE employees
SET status = 'fired'
WHERE name like '%Bloggs';
i := sql%rowcount;
END;
대안 SQL%ROWCOUNT
당신이 일반 명령의 결과,이 솔루션은 수를 원하는 사람들을 위해 변수
를 선언 할 필요없이 프로 시저 내에서 이것을 사용할 수 있습니다 : 예를 들어
be :
begin
DBMS_OUTPUT.PUT_LINE(TO_Char(SQL%ROWCOUNT)||' rows affected.');
end;
기본적으로 SQL % ROWCOUNT는 PL/SQL 변수 (또는 함수)이며 dir 일 수 없습니다 SQL 명령에서 액세스 할 수 있습니다. noname PL/SQL 블록을 사용하면이 작업을 수행 할 수 있습니다.
... 누군가가 SELECT 명령에서 사용할 솔루션이 있다면, 나는 흥미가있을 것이다.
행
실제로 업데이트 한 항목 수를 확인한 경우 업데이트 진술을 실행 한 후 - 일반 솔루션을 제공하지 않습니다. 예를 들어, 내 테이블 T가 "1"을 모두 값으로 포함하는 하나의 열 c1을 갖고 있고이 열의 모든 행을 "2"로 업데이트하면 null로 어떻게 분할 할 것인가? – nanosoft
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,
이 하나를 시도하십시오 ..
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
메시지를 올바르게 포맷 할 수 있습니까? –
- 1. 롤백의 영향을받는 행 수
- 2. 영향을받는 행 엔터티 프레임
- 3. PHP 영향을받는 행 제대로
- 4. MySQL의 영향을받는 행 -이 실행하려고하면
- 5. PL-SQL에서 영향을받는 행 얻기
- 6. SQL 트리거를 사용하여 영향을받는 열의 행 번호를
- 7. 업데이트의 영향을받는 행을 선택하십시오.
- 8. 커서를 PLSQL에서 TSQL로 변환
- 9. Zend_DB_table의 영향을받는 행을 얻는 방법?
- 10. 영향을받는 행 대신 MySQL에서 업데이트 된 값 가져 오기
- 11. LINQ to SQL에서 영향을받는 행 수를 찾는 방법은 무엇입니까?
- 12. UPDATE의 각 SET 명령에 대한 SQL - WHERE 절?
- 13. SQL Server에서 BULK INSERT의 영향을받는 행 수는 어떻게 얻습니까?
- 14. plsql에서 커서에 날짜 값을 전달하려면 어떻게합니까?
- 15. Quartz의 영향을받는 작업 DisallowConcurrentExecution
- 16. MySQL INSERT/UPDATE의 속도를 높이려면 어떻게해야합니까?
- 17. PLSQL에서 UPDATE 및 WITH를 사용하는 방법
- 18. coldfusion application.cfm 및 영향을받는 파일
- 19. 포인터가 함수 호출에 영향을받는 곳 :
- 20. 개체가 영향을받는 시점과 그 원인을 어떻게 알 수 있습니까?
- 21. dataprovider (배열 컬렉션)의 변경으로 인해 영향을받는 DataGrid 행 인덱스 검색
- 22. bash에서 MySQL 쿼리를 실행하는 동안 영향을받는 행 수를 얻는 방법은 무엇입니까?
- 23. MySQL 명령 줄 도구 : DELETE의 영향을받는 행 수를 찾는 방법은 무엇입니까?
- 24. 영향을받는 행 수가! = 1 일 때 CRUD 연산을 둘러싼 저장 프로 시저에서 예외를 발생시키는 것이 적절합니까?
- 25. 설정 될 값이 SELECT 인 SQL UPDATE의 올바른 구문 SELECT
- 26. 영향을받는 테이블의 확장 이벤트를 필터링 하시겠습니까?
- 27. 범위의 행 수 확인
- 28. Drupal보기의 행 수 표시
- 29. SimplePager 이상한 행 수
- 30. SSIS의 행 수 변환
SQL의 %의 ROWCOUNT는 그냥 "사용"할 수없는 함수입니다 :
1 클라이언트는 전체 라인 영향을받는 업데이트 작업의 10
번호 업데이트 - 변수에 저장하거나 다른 프로 시저에 입력으로 보내거나 다른 것으로 추가하는 경우. –
Ali H의 요지는 행 수에 영향을주는 또 다른 SQL 문이있을 때까지 변수에 할당 할 필요가 없다는 것입니다. 즉, 나중에 누군가가 다른 SQL 문을 호출해야만 버그가 발생하지 않도록 변수에 할당해야한다는 것에 동의합니다. 그리고 Ali H의이 대답은 별도의 답변으로 게시 된 것이 아니라 Clive의 대답에 대한 설명이되어야합니다. – Kirby