[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.@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.열에 대한 오라클의 기능을 증가에는 자동이 없습니다. 당신은 SEQUENCE 객체를 생성해야합니다. 당신은 같은 순서를 사용할 수 있습니다 :
열에 대한 오라클의 기능을 증가에는 자동이 없습니다. 당신은 SEQUENCE 객체를 생성해야합니다. 당신은 같은 순서를 사용할 수 있습니다 :
insert into table(batch_id, ...) values(my_sequence.nextval, ...)
... 다음 수를 반환합니다. (세션)에 마지막으로 생성 된 시퀀스 NR을 확인하려면 다음을 사용 :
my_sequence.currval
이 사이트는 시퀀스를 사용하는 방법에 대한 몇 가지 완벽한 예제가 있습니다.
-
==============================
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.당신은 변수와 같은 일에 삽입 된 ID를 가져 문 아래에 사용할 수 있습니다.
당신은 변수와 같은 일에 삽입 된 ID를 가져 문 아래에 사용할 수 있습니다.
INSERT INTO YOUR_TABLE(ID) VALUES ('10') returning ID into :Inserted_Value;
이제 아래 문을 사용하여 값을 검색 할 수 있습니다
SELECT :Inserted_Value FROM DUAL;
-
==============================
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;
from https://stackoverflow.com/questions/5558979/inserting-into-oracle-and-retrieving-the-generated-sequence-id by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 어떻게 PostgreSQL 데이터베이스 테이블의 컬럼의 위치를 변경합니까? (0) | 2020.06.03 |
---|---|
[SQL] 안드로이드에서 준비된 문으로 쿼리? (0) | 2020.06.03 |
[SQL] 어떻게 NULL 값은 데이터베이스 검색의 성능에 영향을합니까? (0) | 2020.06.03 |
[SQL] 다른 테이블의 데이터를 하나 개의 테이블에서 업데이트 된 행이 각각 동일하고 하나의 열에 기초 (0) | 2020.06.03 |
[SQL] PL / SQL 블록 문제 : 없음 데이터 오류를 발견 (0) | 2020.06.03 |