2013-08-27 2 views
1

jdbc를 사용하여 실행하려고하는 Oracle 쿼리가 있습니다. 다음은 쿼리입니다.Oracle JDBC : 어떤 행이 고유 한 키 제약 조건을 던지는 지 어떻게 알 수 있습니까?

insert into bd_vehicles_temp select * from bd_vehicles_temp_1 

표 bd_vehicles_temp_1에는 약 7000-10000 행이 포함됩니다. bd_vehicles_temp_1의 기본 키가 이미 bd_vehicles_temp에 있으면 SQLException이 발생합니다. 고유 키 제약 조건.

예외 행은 내 코드에서 pstmt.executeUpdate() 오프 코스입니다. 예외를 발생시키는 bd_vehicles_temp_1 행을 정확히 찾아내는 방법이 있습니까?

또는 bd_vehicles_temp_1의 루프를 통해 루프를 수행하고 각 행을 하나씩 삽입해야합니까?

미리 감사드립니다.

답변

2

당신이 두 테이블에있는 모든 행을 식별하는 데 사용할 수있는 예외 (오라클 특정)

SELECT col FROM bd_vehicles_temp 
INTERSECT 
SELECT col FROM bd_vehicles_temp_1; 

을 일으킬 수있는 열을 알고있는 경우.

+1

그것을하지 컬럼에 대해. 나는 어느 행이 오류를 일으켰는지에 더 관심이있다. –

+0

어떻게 교차합니까? 데이터베이스 쿼리에 대한 지식이 부족합니다. 나는 프런트 엔드 개발자이다. –

+0

그리고이 코드를 사용하여 이것을 달성하고 싶다. 수동 직관이 필요 없습니다! –

2

테이블에 올바르게 삽입하려고하십니까? pstmt.execute() 대신 pstmt.executeUpdate()을 사용해야합니다. 테이블에 이미 존재하는 레코드가 있다면, 모든 행을 삭제하고이 명령문이 두 번 이상 실행될 경우 다시 추가하는 것이 좋습니다.

+0

수정하여 편집 –

+0

bd_vehicles_temp에 20,000 개가 넘는 레코드가 있습니다. bd_vehicles_temp_1에는 약 7000 개의 레코드가 있습니다. bd_vehicles_temp_1의 레코드를 bd_vehicles_temp에 추가하여 27,000 개의 레코드를 포함하고 싶습니다. –

+0

어떤 것이 공통 행인지 확인하려면'intersect'를 사용하십시오. 그런 다음 나머지 행들을'bd_vehicles_temp'에 추가하십시오. http://www.techonthenet.com/sql/intersect.php, http://technet.microsoft.com/en-us/library/ms188055.aspx – Aashray

5

문제의 원인이되는 행을 찾는 유일한 방법은 오라클의 "로그 오류"기능을 사용하는 것입니다. 그런 식으로 insert은 예외를 발생시키지 않으며 모든 제약 조건을 위반하는 행은 지정된 오류 테이블에 기록됩니다.

먼저 거부 된 행을 보유하고 로그 테이블을 만들 필요가 수행합니다

EXECUTE DBMS_ERRLOG.CREATE_ERROR_LOG('BD_VEHICLES_TEMP'); 
ERR$_BD_VEHICLES_TEMP

그런 다음이에 문을 변경 실행라는 이름의 테이블이 만들어집니다

:

insert into bd_vehicles_temp 
select * 
from bd_vehicles_temp_1 
LOG ERRORS REJECT LIMIT UNLIMITED; 

행이 제약 조건의 유효성을 검사하지 못한 경우에도 명령문은 계속됩니다. 명령문이 완료되면 오류 메시지와 값을 포함한 제약 조건을 위반 한 행에 대해 테이블 ​​ERR$_BD_VEHICLES_TEMP의 내용을 검사 할 수 있습니다.

(편집) : 첫 번째 오류에서 중지 (및 로그 테이블에서 해당 참조) 할 경우, REJECT LIMIT UNLIMITED 절을 둡니다.

자세한 내용은 사용 설명서에 있습니다 DBMS_ERRLOG http://docs.oracle.com/cd/B28359_01/appdev.111/b28419/d_errlog.htm#CEGBBABI 로그 오류에 대한

  • 에 대한

  • +0

    이러한 것들은 오라클이 제공합니다. 어떻게하면 jdbc를 사용하여 동일하게 사용할 수 있습니까? –

    +0

    REJECT LIMIT UNLIMITED가 부분 INSERT를 초래한다는 점은 주목할 가치가 있습니다. @AbishekSingh :이를 피하려면 REJECT LIMIT UNLIMITED 절을 생략하면됩니다. –

    +1

    @AbhishekSingh : JDBC로 표시된대로 INSERT를 실행하십시오. 오류 테이블의 생성은 SQL * Plus를 사용하여 수행 할 수 있습니다. 단 한번만 수행하면됩니다 (물론 JDBC를 통해 프로 시저를 호출 할 수도 있습니다). –

    관련 문제