Précédent   Forum des professionnels en informatique > Bases de données > Oracle
Oracle Forum Oracle : le serveur, les outils, ... Voir F.A.Q Oracle Tutoriels Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 07/02/2012, 10h59   #1
Invité de passage
 
Homme
Injenieur informatique
Inscription : janvier 2012
Messages : 2
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Tunisie

Informations professionnelles :
Activité : Injenieur informatique

Informations forums :
Inscription : janvier 2012
Messages : 2
Points : 0
Points : 0
Par défaut Trigger avec Oracle

Bonjour,

S'il-vous-plaît, lorsque j'exécute cette requête :
Code :
1
2
3
4
5
6
7
8
CREATE OR REPLACE TRIGGER RAHT_a 
BEFORE INSERT 
ON AA 
REFERENCING NEW AS New OLD AS Old 
FOR EACH ROW 
BEGIN 
SELECT RAH.NEXTVAL INTO :new.ID FROM dual; 
END ;
Une erreur s'affiche :
Citation:
ORA-01036: numéro/nom de variable interdit
mohamed_rahmani est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2012, 11h14   #2
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 688
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 688
Points : 10 439
Points : 10 439
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Pas de soucis en 11g :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
CREATE TABLE aa (id integer, col varchar2(10));
-- Table created.
 
CREATE sequence RAH;
-- Sequence created.
 
CREATE OR REPLACE TRIGGER RAHT_a 
BEFORE INSERT ON AA 
REFERENCING NEW AS New OLD AS Old 
FOR EACH ROW 
BEGIN 
SELECT RAH.NEXTVAL INTO :new.ID FROM dual; 
END;
/
-- Trigger created.
 
INSERT INTO aa (id, col) VALUES (42355634, 'Test1');
-- 1 row created.
 
INSERT INTO aa (col)     VALUES ('Test2');
-- 1 row created.
 
SELECT * FROM aa;
 
        ID COL       
---------- ----------
         1 Test1     
         2 Test2     
 
/*drop table aa;
 
drop sequence rah;*/
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2012, 11h46   #3
Rédacteur
 
Inscription : décembre 2002
Messages : 2 396
Détails du profil
Informations personnelles :
Localisation : France, Var (Provence Alpes Côte d'Azur)

Informations forums :
Inscription : décembre 2002
Messages : 2 396
Points : 3 294
Points : 3 294
Citation:
Envoyé par Waldar Voir le message
Pas de soucis en 11g
Peut-être voulais-tu dire, à demi-mot, que ce n'est devenu possible qu'à partir d'Oracle 11 ?

C'est effectivement une nouveauté notable de la 11.1 : on peut utiliser une séquence à tout endroit où une valeur numérique est valide.
En particulier, on peut faire une affectation directe entre une variable et le NEXTVAL d'une séquence, sans passer par un SELECT INTO.
http://docs.oracle.com/cd/E11882_01/...c.htm#CIHCBFIJ


Par ailleurs, Tim Hall fournit un petit test qui montre que les deux syntaxes sont équivalentes du point de vue des performances.
http://www.oracle-base.com/articles/...ql_expressions
__________________
Consultant / formateur Oracle indépendant
Certifié OCP 10g et 11g, sécurité 11g
Pomalaix est actuellement connecté   Envoyer un message privé Réponse avec citation 10
Vieux 07/02/2012, 11h52   #4
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 688
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 688
Points : 10 439
Points : 10 439
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Citation:
Envoyé par Pomalaix Voir le message
Peut-être voulais-tu dire, à demi-mot, que ce n'est devenu possible qu'à partir d'Oracle 11 ?
Non, j'ai simplement testé sur 11g (11.1.0.7) !
Ce que je voulais faire comprendre, c'était surtout "quelle est votre version ?"

Cela dit j'ai bien utilisé le SELECT INTO.

Merci pour les liens !

Edit : testé avec succès également sur 9.2.0.8
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2012, 12h02   #5
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 448
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 448
Points : 4 192
Points : 4 192
ORA-01036: numéro/nom de variable interdit
C'est un problème d'exécution de requête avec un : qui est aussi un indicateur de bind variable.

Je pense que c'est du à une mauvaise exécution du code. Comment est-il lancé ? Sous sql+, sqldev, etc.. ?
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2012, 12h10   #6
Rédacteur
 
Inscription : décembre 2002
Messages : 2 396
Détails du profil
Informations personnelles :
Localisation : France, Var (Provence Alpes Côte d'Azur)

Informations forums :
Inscription : décembre 2002
Messages : 2 396
Points : 3 294
Points : 3 294
Citation:
Envoyé par Waldar Voir le message
... Cela dit j'ai bien utilisé le SELECT INTO...
En V11, on peut désormais faire ceci :
Code :
1
2
3
4
5
6
7
8
CREATE OR REPLACE TRIGGER RAHT_a 
BEFORE INSERT ON AA 
REFERENCING NEW AS New OLD AS Old 
FOR EACH ROW 
BEGIN 
    :new.ID := RAH.NEXTVAL; 
END;
/
Mais effectivement, lecture trop rapide et idées confuses n'aidant pas, ma réponse ne correspond pas au problème signalé !
__________________
Consultant / formateur Oracle indépendant
Certifié OCP 10g et 11g, sécurité 11g
Pomalaix est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2012, 16h30   #7
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 316
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 316
Points : 5 822
Points : 5 822
Citation:
Envoyé par Pomalaix Voir le message
En V11, on peut désormais faire ceci :
Code :
1
2
3
4
5
6
7
8
CREATE OR REPLACE TRIGGER RAHT_a 
BEFORE INSERT ON AA 
REFERENCING NEW AS New OLD AS Old 
FOR EACH ROW 
BEGIN 
    :new.ID := RAH.NEXTVAL; 
END;
/
...
Oui, mais si je ne me trompe pas, en interne cela est traduit en
Code :
1
2
 
SELECT sequence.NEXTVAL INTO :variable FROM dual
Fait un tkprof.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 18h39.


 
 
 
 
Partenaires

Hébergement Web