web-dev-qa-db-fra.com

Création d'un déclencheur dans Oracle Express

J'essayais de faire quelque chose comme l'incrémentation automatique dans Oracle 11g Express et SQL Developer. Je connais très peu d'Oracle et je suis également nouveau dans les déclencheurs.

J'ai essayé de faire ça, mais je ne sais pas comment le faire correctement.

CREATE TABLE theschema.thetable
(id NUMBER PRIMARY KEY,
name VARCHAR2(30));

CREATE SEQUENCE theschema.test1_sequence
START WITH 1
INCREMENT BY 1;

create or replace trigger insert_nums
before insert on theschema.thetable
for each row
begin
select test1_sequence.nextval into :new.id from dual;
end;
/

Lorsque j'essaie de créer le déclencheur, j'obtiens un écran qui me demande des "liens". La boîte de dialogue n'a qu'une seule case à cocher "null". Qu'est-ce que cela signifie et comment créer un script qui fonctionne correctement?

Des précautions à prendre lors de ce type d '"auto-incrémentation"?

Enter binds

42
bread butter

Il semble que SQL Developer pense que vous exécutez un script DML (manipulation de données) simple, pas un DDL (définition de données). Il pense également que :new.id est une variable pouvant être liée.

Pourquoi cela se produit, je ne sais pas; Je ne peux pas le reproduire dans Oracle SQL Developer 2.1.

Essayez d'ouvrir une nouvelle fenêtre de feuille de calcul SQL dans le schéma theschema et exécutez un script "entier" (pas une instruction) en appuyant sur F5 (ne pas F9).

51
Michael T

Voici comment j'ai résolu ce problème, mettez "set define off"; avant la commande:

set define off;
create or replace trigger [...]
[...]
end;
/

Sélectionnez ensuite les deux commandes et appuyez sur F9 pour exécuter. Ou vous pouvez exécuter toutes les commandes avec F5.

Il semble que si les commandes sont exécutées séparément avec F9, alors le set define off ne prend pas effet.

15
doki42

Je suis novice dans ce domaine, alors gardez cela à l'esprit lorsque je donnerai ma réponse. Je pense que le problème est que le code

create or replace trigger insert_nums
before insert on theschema.thetable
for each row
begin
select test1_sequence.nextval into :new.id from dual;
end;

Est en fait un script et non une instruction SQL simple. Par conséquent, vous devez exécuter le "Run Script". J'ai découvert que lorsque j'avais une feuille de calcul ouverte dans SQL Developer que si j'avais n'importe où dans la feuille de calcul le code pour le déclencheur comme ci-dessus, j'essayais même d'exécuter une déclaration selon laquelle SQL Developer regarderait en arrière dans la feuille de calcul et tenterait d'exécuter le scénario. Pour empêcher que cela se produise, j'ai dû commenter le code. Et si je voulais exécuter le code du déclencheur, je devais ouvrir une nouvelle feuille de calcul, placez-y le code et exécutez un SCRIPT.

0
Rod Hittle

Pour mon cas, la solution consistait à saisir "nouvelle ligne" pour "nouveau" et "ancienne ligne" pour "ancien" comme valeurs pour les liaisons ...

0
VolkanT