programing

Oracle에 삽입하여 생성된 시퀀스 ID 검색

showcode 2023. 4. 5. 22:27
반응형

Oracle에 삽입하여 생성된 시퀀스 ID 검색

SQL Server용 원시 SQL 쿼리가 몇 개 있습니다.SCOPE_IDENTITY를 사용하여 INSERT가 실행된 직후에 특정 INSERT에 대해 생성된 ID를 취득합니다.

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

SELECT SCOPE_IDENTITY() BatchID;

문제는 다음과 같습니다.

Oracle 데이터베이스에 가장 적합한 방법은 무엇입니까?

이는 표준 SQL을 통해 Oracle에서 실행할 수 있습니까?아니면 스토어드 프로시저를 사용하여 스토어드 프로시저를 사용하여 스토어드 프로시저 본체에 비슷한 것을 배치하기 위해 전환해야 합니까?

저장된 proc여야 하는 경우 마지막으로 생성된 시퀀스 번호를 취득하기 위한 사실상의 표준 방법은 무엇입니까?여러 스레드에서 중복되는 실행이 있을 수 있으므로 이 메커니즘은 올바르게 생성된 ID를 취득할 필요가 있으며 반드시 마지막으로 생성된 ID를 취득할 필요는 없습니다.

2개가 동시에 실행되는 경우 각 콜에서 생성된 올바른 ID를 반환해야 합니다.콜의 멀티스레드 특성 때문에 SQL Server의 "@@IDENTY"를 사용하지 않습니다.

플랫폼(DBMS 식별 태그로 구분된 각 플랫폼의 SQL 블록이 포함된 단일 파일)을 관리하기 쉽기 때문에 가능하면 원시 SQL로 유지하고 싶습니다.스토어드·프로세서는, 조금 더 관리가 필요하지만, 그것만이 가능하다면 그렇게 할 수 있습니다.

@Guru 및 @Ronnis의 응답에 대한 비트를 확장하면 시퀀스를 숨기고 트리거를 사용하여 자동 증분처럼 보이게 할 수 있습니다.또한 삽입을 수행하여 생성된 ID를 out 파라미터로 반환하는 절차를 갖출 수 있습니다.

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;
/

그런 다음 일반 삽입(예: anoymous block)을 수행하는 대신 절차를 호출할 수 있습니다.

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*Plus에서 다음과 같이 명시적인 익명 블록을 사용하지 않고 전화를 걸 수 있습니다.

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, ...);

Oracle에는 열에 대한 자동 증분 기능이 없습니다.SEQUENCE 객체를 작성해야 합니다.시퀀스는 다음과 같이 사용할 수 있습니다.

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

...다음 번호를 반환합니다.(세션에서) 마지막으로 작성된 시퀀스 nr을 확인하려면 다음 명령을 사용합니다.

my_sequence.currval

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

편집: 이 답변이 작성된 지 2년 후 Oracle은 "ID 열"을 도입했습니다.

다음 문을 사용하여 삽입된 ID를 변수와 유사한 것으로 가져올 수 있습니다.

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

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

SELECT :Inserted_Value FROM DUAL;

저장 프로시저로 하면 많은 이점이 있습니다.는 구문을 수 .insert into table_name values returning.

예를 들어 다음과 같습니다.

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를 할 수 returning into유효하게

입력/출력 파라미터 기능을 갖춘 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;

보다 우아한 솔루션은 RETURNING 스테이트먼트를 사용하는 것입니다.

DECLARE
V_ID_RETURN NUMBER;
BEGIN

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

DBMS_OUTPUT.PUT_LINE('V_ID_RETURN:'||V_ID_RETURN);

END;

도움이 됐으면 좋겠다

언급URL : https://stackoverflow.com/questions/5558979/inserting-into-oracle-and-retrieving-the-generated-sequence-id

반응형