2012-09-08 2 views
2

면책 조항 : SQL 사용 경험이 그리 많지 않고 회사에서 사용하는 Oracle 버전을 알 수 없습니다.여러 개의 업데이트 쿼리에서 하나의 "레코드가 업데이트되었습니다"를 반환합니다.

내일은 업데이트해야하는 제품 가격표가 있습니다. 업데이트되는 수천 개의 레코드가 있지만 여전히 변경되지 않은 천 개 이상의 레코드가 있습니다.

지금은 모든 단일 레코드에 대한 업데이트 명령문이 있습니다. 스크립트로 모두 실행할 수는 있지만 얼마나 많은 레코드가 업데이트되었는지, 가능한 경우 어떤 명령문이 실패했는지에 대한 피드백을 받고 싶습니다.

내가 스크립트로 가지고있는 것을 실행하면 "0 행이 업데이트되었습니다"라는 메시지가 나타나면 실패한 부분이 하나도없는 "1 행 업데이트 된"메시지가 표시됩니다.

오류를 잡아 내거나 최소한 하나의 전체로 업데이트 된 행 수를 수집 할 수있는 어떤 형태의 스크립트가 있습니까?

답변

5

제품 가격표에 수정 날짜가 있습니까? 아니면 마지막으로 필드가 수정 되었습니까? 그렇다면 업데이트하고 있는지 확인하십시오.

또한 스크립트를 사용하는 경우 에코를 설정하고 스풀을 로그 파일로 설정해야합니다. 이 파일과 같은 디렉토리에서 SQLPLUS로

-- updates.sql 
set serveroutput on 
set echo on 
WHENEVER SQLERROR EXIT SQL.SQLCODE 
spool on 
spool updates.log 

-- put updates here 

commit; 
spool off 

로그인 및 사용하여 실행 : 스크립트 같은 것을 보일 것입니다 @를

updates.sql updates.log 파일을 실행할 때마다 문이있을 것이다.

개별 업데이트 문 목록에서 총계를 얻으려면 각 업데이트 후에 SQL % ROWCOUNT를 검사해야합니다. 비슷해 (안된)

declare 
    l_total pls_integer := 0; 
begin 
    update product set x = 'foo' where y='bar'; 
    l_total := l_total + SQL%ROWCOUNT; 

    update product set x = 'blah' where y='someval'; 
    l_total := l_total + SQL%ROWCOUNT; 

    commit; 
    dbms_output.put_line(l_total); 
end 
/

이 기본 PL/SQL 익명 블록이며, 상기 스풀 전략을 사용할 수있다.

마지막으로 메시지 필드, 로그 날짜 시간, 일부 컨텍스트 필드 (메시지가 오는 위치 등), 유형 (msg, 로그, 오류 등)을 포함하는 기본 로그 테이블을 설정하는 것이 일반적입니다. 로그 테이블에 삽입 (자율 트랜잭션)을 처리하고 통계 등을 추적해야 할 때마다 로그 프로 시저를 사용하는 프로 시저 (dbms_output은 매우 제한적 임). 당신의 환경은 이미 이와 비슷한 것을 가지고있을 것입니다. 단지 그것을 찾아야 만합니다 (또는 회사의 수석 개발자에게 물어보십시오).

+0

오늘 업데이트를 위해 첫 번째 예를 사용했는데 완벽하게 작동했습니다. 또한 다음 팀 회의에서 로그 테이블 아이디어를 가져와야합니다. 아직 가지고 있지 않다면 가지고있는 것이 좋을 것입니다. – Logarr

+0

@Logarr 잘 듣고 싶습니다. 로그 테이블 및 절차의 간단한 예제가 필요하면 http://stackoverflow.com/questions/4919437/dbms-output-putline을 참조하십시오. – tbone

관련 문제