Oracle에서는 여러 삽입에서 재사용 할 수 있도록 sequence.nextval을 변수에 어떻게 저장합니까?


13

테스트 할 데이터로 일부 테이블을 채우는 스크립트를 작성 중입니다.

다음과 같은 것을 작성하고 싶지만 어떻게 해야할지 모르겠습니다 (Oracle 11g입니다)

SET ENABLED_USER_ID = SEQ.NEXTVAL; // PSEUDOCODE
SET DISABLED_USER_ID = SEQ.NEXTVAL; // PSEUDOCODE

INSERT INTO USERS
        (ID,      USR_NAME)
VALUES  (:ENABLED_USER_ID, 'ANDREW');
INSERT INTO CAR
       (CAR_ID,         CAR_NAME, USR_ID)
VALUES (CARSEQ.NEXTVAL, 'FORD',   :ENABLED_USER_ID);

INSERT INTO USERS
        (ID,      USR_NAME)
VALUES  (:DISABLED_USER_ID, 'ANDREW');
INSERT INTO CAR
       (CAR_ID,         CAR_NAME, USR_ID)
VALUES (CARSEQ.NEXTVAL, 'FORD',   :DISABLED_USER_ID);

쿼리를 재정렬하고 sequence.currval참조를 사용할 수 있다는 것을 알고 있지만 ID를 올바르게 명명 된 변수에 저장하는 것이 좋습니다.

어쩌면 스크립트를 감싸 DECLARE ... BEGIN ... END;야하지만 더 간결한 방법이 있기를 바랍니다.


추가 2011 년 5 월 27 일 15:31

어떤 경우에도 변수를 DECLARE블록 으로 선언해야합니다 . 그래서 나는 노력하고있다.

DECLARE
  USER_ID NUMBER(10,0) := 1;
BEGIN   
  insert into TEST_USER
  values (user_id, 'andrew', sysdate);   
END;

하지만 다음과 같은 오류가 발생합니다

Caused by: java.sql.SQLException: ORA-06550: **line 2, column 27:**
PLS-00103: Encountered the symbol "end-of-file" when expecting one of the following:

  * & = - + ; < / > at in is mod remainder not rem
  <an exponent (**)> <> or != or ~= >= <= <> and or like like2
  like4 likec between || multiset member submultiset

변수 선언을 가리 킵니다.

java를 사용하여 파일에서 스크립트를로드하고 Oracle 11g 서버에서 Oracle JDBC 드라이버 (ojdbc14-10.2.0.4.0.jar)를 사용하여 스크립트를 실행하고 있습니다.

TEST_USER 테이블이 생성되었습니다

create table TEST_USERS (
    id number(10, 0) not null,
    name varchar2(100),
    date_ins date default sysdate,
    primary key (id)
);

답변:


11

이런 식으로 생각합니다

DECLARE
    ENABLED_USER_ID PLS_INTEGER;
    DISABLED_USER_ID PLS_INTEGER;
BEGIN
    ENABLED_USER_ID := SEQ.NEXTVAL;
    DISABLED_USER_ID := SEQ.NEXTVAL;

    INSERT INTO USERS (ID, USR_NAME)
    VALUES  (ENABLED_USER_ID, 'ANDREW');

    INSERT INTO CAR (CAR_ID, CAR_NAME, USR_ID)
    VALUES (CARSEQ.NEXTVAL, 'FORD', ENABLED_USER_ID);

    INSERT INTO USERS (ID, USR_NAME)
    VALUES  (DISABLED_USER_ID, 'ANDREW');

    INSERT INTO CAR (CAR_ID, CAR_NAME, USR_ID)
    VALUES (CARSEQ.NEXTVAL, 'FORD', DISABLED_USER_ID);
END;
/



7
SELECT seq.nextval 
   INTO ENABLED_USER_ID
FROM dual;

ENABLED_USER_ID가 선언 블록에 들어가야합니까?
basilikode

@Xan : 예, 변수 만이 PL / SQL 블록이있는 경우 다시에만 유효 선언 섹션에서 정의 할 수 있습니다
a_horse_with_no_name

4

나는 당신이 실제로 추가 변수없이 도망 갈 수 있다고 생각합니다 currval:

INSERT INTO USERS
    (ID,      USR_NAME)
VALUES  (SEQ.NEXTVAL, 'ANDREW');
INSERT INTO CAR
   (CAR_ID,         CAR_NAME, USR_ID)
VALUES (CARSEQ.NEXTVAL, 'FORD',   SEQ.CURRVAL);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.