복붙노트

[SQL] 오라클에 삽입하여 생성 된 시퀀스 ID를 입수

SQL

오라클에 삽입하여 생성 된 시퀀스 ID를 입수

나는 즉시 후 INSERT가 하나 개의 실행에서 모두 발생하는 특정의 INSERT를 위해 생성 된 ID를 검색하는 데 사용할 SCOPE_IDENTITY SQL Server에 대한 원시 SQL 쿼리의 소수를 가지고 ...

INSERT into Batch(
BatchName,
BatchType,
Source,
Area
) Values (
@strBatchName,
@strType,
@strSource,
@intArea
);

SELECT SCOPE_IDENTITY() BatchID;

질문은 ~이야:

Oracle 데이터베이스에 대해이 작업을 수행하는 가장 좋은 방법은 무엇입니까?

이 표준 SQL을 통해 오라클에서 수행 또는 내가이가 저장된 프로 시저의 본문에 유사한 저장 프로 시저 및 장소 뭔가를 사용하도록 전환해야 할 수 있습니까?

이 proc 디렉토리에 저장해야하는 경우, 다음, 마지막으로 생성 된 일련 번호를 검색하는이 메커니즘이 바로 생성 된 ID를 검색해야합니다 있도록 여러 스레드에 대한 가능성이 중복됩니다 실행을 고려 돌보는와의 사실상의 표준 방법은 무엇입니까 반드시 최후의 생성 ID.

두 가지가 동시에 실행하면 각은 각각의 호출에서 생성 된 정확한 ID를 반환한다. 공지 사항 난 SQL 서버의 "@@ IDENTITY"때문에 통화의 멀티 스레드 성격을 사용하지 않는.

그 날 (각 플랫폼의 SQL 블록을 포함하는 하나의 파일이 DBMS 식별 태그로 구분) 플랫폼에서 관리하기가 훨씬 쉽다 이후 가능하면 차라리 원시 SQL로 유지한다. 저장 발동 내가 관리 할 수있는 비트 더 일하지만, 그것이 유일한 방법은 가능하다면 그 길을 갈 수 있습니다.

해결법

  1. ==============================

    1.@Guru 및 @Ronnis의 대답에 조금 확장하면, 당신은 순서를 숨기고 더 트리거를 사용하여 자동 증가처럼 보이게, 그리고 밖으로 당신 반환을 위해 생성 된 ID를 삽입을하는 절차를 가질 수 있습니다 매개 변수입니다.

    @Guru 및 @Ronnis의 대답에 조금 확장하면, 당신은 순서를 숨기고 더 트리거를 사용하여 자동 증가처럼 보이게, 그리고 밖으로 당신 반환을 위해 생성 된 ID를 삽입을하는 절차를 가질 수 있습니다 매개 변수입니다.

    create table batch(batchid number,
        batchname varchar2(30),
        batchtype char(1),
        source char(1),
        intarea number)
    /
    
    create sequence batch_seq start with 1
    /
    
    create trigger batch_bi
    before insert on batch
    for each row
    begin
        select batch_seq.nextval into :new.batchid from dual;
    end;
    /
    
    create procedure insert_batch(v_batchname batch.batchname%TYPE,
        v_batchtype batch.batchtype%TYPE,
        v_source batch.source%TYPE,
        v_intarea batch.intarea%TYPE,
        v_batchid out batch.batchid%TYPE)
    as
    begin
        insert into batch(batchname, batchtype, source, intarea)
        values(v_batchname, v_batchtype, v_source, v_intarea)
        returning batchid into v_batchid;
    end;
    /
    

    그런 다음, 예를 들어, 대신 일반 삽입을하는 절차를 호출 할 수 있습니다 해, 익명 블록으로부터 :

    declare
        l_batchid batch.batchid%TYPE;
    begin
        insert_batch(v_batchname => 'Batch 1',
            v_batchtype => 'A',
            v_source => 'Z',
            v_intarea => 1,
            v_batchid => l_batchid);
        dbms_output.put_line('Generated id: ' || l_batchid);
    
        insert_batch(v_batchname => 'Batch 99',
            v_batchtype => 'B',
            v_source => 'Y',
            v_intarea => 9,
            v_batchid => l_batchid);
        dbms_output.put_line('Generated id: ' || l_batchid);
    end;
    /
    
    Generated id: 1
    Generated id: 2
    

    당신은, 예를 들어, 명시 적으로 익명 블록없이 전화를 걸 수 있습니다 SQL * 플러스에서 :

    variable l_batchid number;
    exec insert_batch('Batch 21', 'C', 'X', 7, :l_batchid);
    

    이후에 생성 된 값을 참조 l_batchid : ... 그리고 바인드 변수를 사용 :

    print l_batchid;
    insert into some_table values(:l_batch_id, ...);
    
  2. ==============================

    2.열에 대한 오라클의 기능을 증가에는 자동이 없습니다. 당신은 SEQUENCE 객체를 생성해야합니다. 당신은 같은 순서를 사용할 수 있습니다 :

    열에 대한 오라클의 기능을 증가에는 자동이 없습니다. 당신은 SEQUENCE 객체를 생성해야합니다. 당신은 같은 순서를 사용할 수 있습니다 :

    insert into table(batch_id, ...) values(my_sequence.nextval, ...)
    

    ... 다음 수를 반환합니다. (세션)에 마지막으로 생성 된 시퀀스 NR을 확인하려면 다음을 사용 :

    my_sequence.currval
    

    이 사이트는 시퀀스를 사용하는 방법에 대한 몇 가지 완벽한 예제가 있습니다.

  3. ==============================

    3.저장 프로 시저로 이렇게하면 장점을 많이 가지고있다. 당신은 반환 TABLE_NAME 값으로 구문 삽입을 사용하여 테이블에 삽입 순서를 얻을 수 있습니다.

    저장 프로 시저로 이렇게하면 장점을 많이 가지고있다. 당신은 반환 TABLE_NAME 값으로 구문 삽입을 사용하여 테이블에 삽입 순서를 얻을 수 있습니다.

    처럼:

    declare
    some_seq_val  number;
    lv_seq        number;
    begin
    some_seq_val := your_seq.nextval;
    insert into your_tab (col1, col2, col3) 
    values (some_seq_val, val2, val3) returning some_seq_val into lv_seq;
    
    dbms_output.put_line('The inserted sequence is: '||to_char(lv_seq));
    end;
    /
    

    아니면 그냥 some_seq_val 돌아갑니다. 당신이 SEQUENCE를 사용하고, 일부 계산의 순서를 도착하지 않는 경우에, 당신은 효과적으로로 돌아 이용하실 수 있습니다.

  4. ==============================

    4.당신은 변수와 같은 일에 삽입 된 ID를 가져 문 아래에 사용할 수 있습니다.

    당신은 변수와 같은 일에 삽입 된 ID를 가져 문 아래에 사용할 수 있습니다.

    INSERT INTO  YOUR_TABLE(ID) VALUES ('10') returning ID into :Inserted_Value;
    

    이제 아래 문을 사용하여 값을 검색 할 수 있습니다

    SELECT :Inserted_Value FROM DUAL;
    
  5. ==============================

    5.당신은 하나의 문이 작업을 수행 할 수 있습니다 - 당신이 IN / OUT 매개 변수 기능을 가진 JDBC와 같은 커넥터에서 호출하는 가정 :

    당신은 하나의 문이 작업을 수행 할 수 있습니다 - 당신이 IN / OUT 매개 변수 기능을 가진 JDBC와 같은 커넥터에서 호출하는 가정 :

    insert into batch(batchid, batchname) 
    values (batch_seq.nextval, 'new batch')
    returning batchid into :l_batchid;
    

    또는, PL-SQL 스크립트로 :

    variable l_batchid number;
    
    insert into batch(batchid, batchname) 
    values (batch_seq.nextval, 'new batch')
    returning batchid into :l_batchid;
    
    select :l_batchid from dual;
    
  6. from https://stackoverflow.com/questions/5558979/inserting-into-oracle-and-retrieving-the-generated-sequence-id by cc-by-sa and MIT license