Oracle'da, bir sequ.nextval dosyasını birden çok ekte yeniden kullanmak üzere bir değişkene nasıl kaydedebilirim?


13

Bazı tabloları test için veri ile doldurmak için bir komut dosyası yazıyorum.

Aşağıdaki gibi bir şey yazmak istiyorum ama nasıl yapacağımı bilmiyorum (ben 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);

Sorguları yeniden düzenleyebilir ve sequence.currvalreferans kullanabilirsiniz biliyorum , ama kimliği düzgün adlandırılmış değişkenlere kaydedilmesini tercih ederim.

Belki de senaryoyu bir içine sarmalıyım DECLARE ... BEGIN ... END;ama bunu yapmanın daha kısa bir yolu olduğunu umuyorum.


İlave 27 Mayıs 2011 15:31

Her halükarda bir DECLAREbloktaki değişkenleri bildirmem gerekiyor gibi görünüyor . Bu yüzden deniyorum

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

ama şu hatayı alıyorum

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

Bu değişken beyanı gösterir.

Komut dosyasını bir dosyadan yüklemek ve Oracle 11g sunucusundaki Oracle JDBC sürücüsünü (ojdbc14-10.2.0.4.0.jar) kullanarak çalıştırmak için java kullanıyorum.

TEST_USER tablosu ile oluşturuldu

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

Yanıtlar:


11

Bence böyle gidiyor

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 bir beyan bloğuna gitmeli değil mi?
basilikode

@Xan: evet, değişkenler yalnızca bir DECLARE bölümünde tanımlanabilir, bu da yalnızca bir PL / SQL bloğunuz varsa geçerlidir
a_horse_with_no_name 27:11

4

Aslında kullanarak herhangi bir ekstra değişken olmadan kurtulmak düşünüyorum 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);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.