2008-10-01 3 views
6

SQLServer를 사용하면 일반적으로 삽입 끝에 SELECT SCOPE_IDENTITY()를 추가하면 새로 삽입 된 레코드의 PK를 반환하는 가장 좋은 방법입니다. pk.모범 사례 : .NET : Oracle 데이터베이스에 대해 PK를 반환하는 방법?

그러나 오라클과 동일한 기능을 찾을 수 없습니다.

최상의 방법은 시퀀스를 사용하여 PK를 생성하는 것으로 보이지만이를 구현하는 방법에는 여러 가지 옵션이 있습니다. sequence.nexval을 삽입하거나 트리거를 사용하려면 개발자에게 맡기시겠습니까?

두 경우 모두 새 ID를 가져 오는 것이 일반적인 문제인 것으로 보입니다. 나는 걸쳐 실행했습니다

제안 및 솔루션은 다음과 같습니다

  • 다음, seq.nextval에서 선택 ID를 실행하는 PK
  • 을 반환하는 저장된 프로 시저를 만들어 전달하는
  • 선택 삽입에 최대 (ID)를 삽입 한 후 (참고 :!이 작업을 수행하지 마십시오)
  • 는 삽입에 RETURNING 절을 추가

무엇 마에한다 그는이 상황을 위해 "모범 사례"솔루션을 제공합니까?

답변

9

Oracle 저장 프로 시저에서 RETURNING 절을 사용하여이를 수행 할 수 있습니다.

예를 들어 :

TABLEA는 이름과 EMP_ID 있습니다. EMP_ID는 레코드가 삽입 될 때 내부적으로 채워집니다.

값 ('BOB') 삽입 EMP_ID INTO o_EMP_ID;

출력 매개 변수가 o_EMP_ID 인 저장된 proc에 있다고 가정합니다.

http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14261/returninginto_clause.htm

+1

지금이 책을 읽는 사람은 누구나 데드 링크 =/ – Travis

+1

그 점을 지적 해 주셔서 감사합니다. 좀 더 안정적인 것으로 링크를 변경했습니다 (다소 덜 우호적 인 경우 - RETURNING 절의 오라클 문서) – ScottCher

4

RETURNING 절은 이러한 종류의 사용을위한 것으로,이를 사용하는 것이 좋습니다.

대신 삽입 후 seq.CURRVAL을 선택하는 것이 좋습니다. 그러면 시퀀스에서 얻은 마지막 값 세션을 반환합니다.

+0

그러나 동시 호출이 시퀀스를 증가 시키면주의해야합니다. – Liam

+0

아니요, CURRVAL은이 세션의 시퀀스에서 마지막으로 얻은 값입니다. –

+0

Java : 삽입 전에 sequence.nextval을 선택하고 SQL 문에 값을 설정하고 삽입 전에 테이블에서 트리거를 사용하지 마십시오. Java RETURN_GENERATED_KEYS가 Oracle JDBC 드라이버의 PreparedStatement에 구현되지 않았기 때문입니다. – JeeBee

2

저장 프로 시저 및 반환 절은 단일 데이터베이스의 뚜렷한 장점은 다른 솔루션 열등 전화를 가지고하는 데 도움이 ...하지 않을 경우, 여기보다 상세한 예입니다

희망. 스토어드 프로 시저를 통해 수행하든 리턴하는 절을 사용하든 상관없이 전체적으로 웜 자체가 가능합니다.