it-swarm-eu.dev

Jak v prostředí Oracle uložím sekvenci. Nevšední v proměnné, která bude znovu použita ve více přílohách?

Píšu skript pro naplnění některých tabulek daty pro testování.

Chtěl bych napsat něco jako následující, ale nevím, jak na to (jsem 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);

Vím, že jsem mohl uspořádat dotazy a použít sequence.currval reference, ale já bych raději nechal id uložit ve správně pojmenovaných proměnných.

Možná bych měl skript skrýt do DECLARE ... BEGIN ... END; ale doufám, že existuje mnohem stručnější způsob, jak to udělat.


Přidání 27. května 2011 15:31

Zdá se, že v každém případě musím deklarovat proměnné v bloku DECLARE. Takže se snažím

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

ale dostanu následující chybu

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

To ukazuje na variabilní prohlášení.

Používám Java) k načtení skriptu ze souboru a jeho spuštění pomocí ovladače Oracle JDBC (ojdbc14-10.2.0.4.0.jar) na serveru Oracle 11g.

Tabulka TEST_USER byla vytvořena pomocí

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

Myslím, že to tak vypadá

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

To byste udělali s VRACÍ klauzuli v prvním INSERT příkazu.

UPDATE: Stalo se, že o tom píšeme v můj blog nedávno.

10
Gaius

Pokud deklarujete proměnné, budete potřebovat blok

S 11g, byla vylepšena podpora sekvencí , takže je můžete použít jako:

ENABLED_USER_ID := SEQ.NEXTVAL;

namísto použití příkazu select (ačkoli oba budou fungovat)

Mezi další možnosti, jak tyto hodnoty přetrvávat, patří jejich uložení do tabulky nebo vytvoření kontext , ale myslím, že sequence.currval Je zde opravdu 'správná odpověď'

SELECT seq.nextval 
   INTO ENABLED_USER_ID
FROM dual;
7

Myslím, že můžete skutečně dostat pryč bez dalších proměnných pomocí 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);
4
mustaccio