J'écris un script pour remplir certaines tables avec des données à tester.
Je voudrais écrire quelque chose comme ceci mais je ne sais pas comment le faire (je suis 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);
Je sais que je pourrais réorganiser les requêtes et utiliser le sequence.currval
référence, mais je préférerais que l'id soit enregistré dans des variables correctement nommées.
Peut-être que je devrais juste envelopper le script dans un DECLARE ... BEGIN ... END;
mais j'espère qu'il y a une façon plus concise de le faire.
Il semble que dans tous les cas je dois déclarer les variables dans un bloc DECLARE
. Donc j'essaye avec
DECLARE
USER_ID NUMBER(10,0) := 1;
BEGIN
insert into TEST_USER
values (user_id, 'andrew', sysdate);
END;
mais j'obtiens l'erreur suivante
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
Cela pointe vers la déclaration de variable.
J'utilise Java pour charger le script à partir d'un fichier et l'exécuter en utilisant le pilote Oracle JDBC (ojdbc14-10.2.0.4.0.jar) sur un serveur Oracle 11g.
La table TEST_USER a été créée avec
create table TEST_USERS (
id number(10, 0) not null,
name varchar2(100),
date_ins date default sysdate,
primary key (id)
);
Je pense que ça va comme ça
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;
/
Vous aurez besoin d'un bloc si vous déclarez des variables
Avec 11g, le support des séquences a été amélioré pour que vous puissiez les utiliser comme:
ENABLED_USER_ID := SEQ.NEXTVAL;
plutôt que d'utiliser une instruction select
(bien que les deux fonctionnent)
D'autres options pour conserver les valeurs incluent leur enregistrement dans une table ou création d'un contexte , mais je pense que sequence.currval
est vraiment la "bonne réponse" ici
SELECT seq.nextval
INTO ENABLED_USER_ID
FROM dual;
Je pense que vous pouvez réellement vous en sortir sans variables supplémentaires en utilisant 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);