2010-01-08 3 views
8

엔터프라이즈 애플리케이션의 데이터 가져 오기 절차를 리팩토링하고 더 나은 해결책을 찾고 싶습니다. 데이터를 가져올 때 각 데이터 세트에 대해 고유 한 엔티티를 작성해야하며 필드에이 ID를 순차적으로 지정하는 데 사용되는 카운터가 있습니다. 당신은 그 다음 자유로운 신분을 얻고 다음에 준비하기 위해 그 후에 그것을 증가시키기 위해 들판을 읽습니다. 이 'C'로 작성된 원래 응용 프로그램에서이 단계에서 수행되는 순간Oracle SQL : 필드를 읽고 늘리는 방법

: 여러 프로세스가 동일한 일을 할 경우

SELECT idnext FROM mytable; 
    UPDATE mytable SET idnext = idnext + 1; 

은 물론, 여기에 경쟁 조건이 있습니다.

편집 : 중요한 공동 전정 : 데이터베이스/필드 정의를 건드릴 수 없으므로 시퀀스가 ​​제외됩니다.

우리는 펄에서 다시 쓰고 있으며, 나는 똑같은 것을하고 싶습니다. 그러나 더 좋습니다. 원자 적 해결책이 좋을 것이다. 불행히도 내 SQL 기술은 제한되어 있으므로 집단 지혜로 바뀌고 있습니다. :-)

+0

내가 업데이트 SQL에만 충분한 권한을 느낀다 '을 UPDATE MYTABLE SET의 idnext = idnext + 1;' 왜 idnext를 서버에 읽어야합니까? –

답변

9

이 특별한 경우에 시퀀스가 ​​언급 된 바른 해결책입니다. 미래의 어느 상황에서 둘 다 업데이트 뭔가 필요 같은 문에서 값을 반환하는 경우에, 당신은 RETURNING 절 사용할 수 있습니다 호출 코드가 PL/SQL 인 경우

UPDATE atable SET foo = do_something_with(foo) RETURNING foo INTO ? 

을의 교체? 로컬 PL/SQL 변수; 그렇지 않으면 프로그램에서 출력 매개 변수로 바인딩 할 수 있습니다.

편집 : 펄을 언급 한 이후,이 같은 뭔가 (테스트되지 않은) 작업을한다고 :

my $sth = $dbh->prepare('UPDATE mytable SET idnext = idnext + 1 returning idnext into ?'); 
my $idnext; 
$sth->bind_param_inout(1, \$idnext, 8); 
$sth->execute; # now $idnext should contain the value 

DBI를 참조하십시오.

+0

내 진술은 이렇게 보일 것입니다 : (?) 업데이트 mytable SET idnext = idnext + 1 반환 값 idnext; –

+0

내 전화 코드는 perl입니다. SQL 명령 줄에서이 문제를 시도했지만 구문에 문제가 있습니다. UPDATE mytable SET idnext = idnext + 1 idnext –

+0

INTO 부분이 필요합니다. 명령 줄에서는 작동하지 않습니다 (내가 아는 한). – Dan

4

sequence을 사용하지 않으시겠습니까?

SELECT mysequence.NEXTVAL 
    INTO idnext 
    FROM DUAL; 

:

CREATE SEQUENCE mysequence 
    START WITH 1 
    MAXVALUE 999999999999999999999999999 
    MINVALUE 1 
    NOCYCLE 
    NOCACHE 
    NOORDER; 

그런 다음 런타임에 응용 프로그램 코드에 당신이 다음 값을 얻기 위해이 문을 사용할 수 있습니다 : 당신이 원하는 값 WITH 어떤 START 사용

순서를 한 번 만들기, 업데이트 : 시퀀스를 사용하는 것이 좋습니다. 그러나 데이터베이스를 변경할 수 없으므로 반환 할 때 상황에 맞게 사용해야합니다.

UPDATE mytable 
     SET idnext = idnext + 1 
RETURNING idnext 
    INTO mylocalvariable; 
+0

필자는 기존 필드를 사용해야하며 해당 필드를 정의 할 수 없습니다. –

2

SELECT FOR UPDATE 문을 사용하십시오. 그것은 기록에 상호 배타적 권리 보장 :

"SELECT FOR UPDATE;

+0

전체 예제를 제공 할 수 있습니까? –

관련 문제