Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
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 11/12/2007, 10h53   #1
Invité de passage
 
Inscription : décembre 2007
Messages : 15
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 15
Points : 2
Points : 2
Par défaut [PL/SQL] Create table dans un trigger

Bonjour,

J'ai effectué une recherche sans succès sur ce thème, donc j'ouvre un nouveau sujet.

Je voulais savoir s'il était possible techniquement de faire un "CREATE TABLE" à l'intérieur d'un trigger sur l'update d'un champ ?

Le compilateur m'envoie ballader donc j'aimerais savoir si ça sert à quelque chose que je m'acharne dessus ou pas.
CrazyLiam est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2007, 10h57   #2
Membre confirmé
 
Avatar de LBO72
 
Inscription : mai 2007
Messages : 385
Détails du profil
Informations personnelles :
Âge : 43
Localisation : France

Informations forums :
Inscription : mai 2007
Messages : 385
Points : 282
Points : 282
Merci de spécifier ta vesion Oracle...
Pourrais-tu nous envoyer le code de ton trigger ?

LBO72.
LBO72 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2007, 10h59   #3
Invité de passage
 
Inscription : décembre 2007
Messages : 15
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 15
Points : 2
Points : 2
Je m'entraîne sur l'application APEX disponible en ligne sur le site d'Oracle.

Code :
1
2
3
4
5
6
7
CREATE OR REPLACE TRIGGER "REGRESSION_T2"
BEFORE INSERT OR UPDATE ON "REGRESSION" FOR each row
BEGIN
     IF :new.resultat > 100 then
              CREATE TABLE nom_table AS SELECT * FROM REGRESSION;
     END IF;
END;
CrazyLiam est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2007, 11h06   #4
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
EXECUTE IMMEDIATE est ton ami
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2007, 11h07   #5
Rédacteur
 
Inscription : décembre 2002
Messages : 2 397
Détails du profil
Informations personnelles :
Localisation : France, Var (Provence Alpes Côte d'Azur)

Informations forums :
Inscription : décembre 2002
Messages : 2 397
Points : 3 298
Points : 3 298
Bonjour

Techniquement, il faut que vous utilisiez une transaction autonome.
Faites une recherche dans le forum sur AUTONOMOUS_TRANSACTION.

Fonctionnellement, votre besoin paraît à première vue douteux.
Vous pouvez préciser votre contexte ?
__________________
Consultant / formateur Oracle indépendant
Certifié OCP 10g et 11g, sécurité 11g
Pomalaix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2007, 11h07   #6
Invité de passage
 
Inscription : décembre 2007
Messages : 10
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : décembre 2007
Messages : 10
Points : 4
Points : 4
Ma question peut parètre idiote mais pourquoi créer un table à chaque insertion ou mise à jour dans une autre table ?

Cela peut être interessant de savoir pour trouver une solution différente de ton traitement.
Switch03 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2007, 11h09   #7
Invité de passage
 
Inscription : décembre 2007
Messages : 15
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 15
Points : 2
Points : 2
Citation:
Envoyé par orafrance Voir le message
EXECUTE IMMEDIATE est ton ami
Merci, je vais y jeter un coup d'oeil
Citation:
Envoyé par Pomalaix Voir le message
Bonjour
Fonctionnellement, votre besoin paraît à première vue douteux.
Vous pouvez préciser votre contexte ?
Pas vraiment de contexte, je m'auto-entraîne et je teste les possibilités des triggers que j'avais pas tellement eu l'occasion d'utiliser jusque là. Merci pour la réponse également.
Citation:
Envoyé par Switch03 Voir le message
Ma question peut parètre idiote mais pourquoi créer un table à chaque insertion ou mise à jour dans une autre table ?

Cela peut être interessant de savoir pour trouver une solution différente de ton traitement.
Je confirme que cela n'a aucun intérêt, juste des tests, aucune application concrète de prévue derrière. Sinon je précise, que le nom de la table changera à chaque insertion.
CrazyLiam est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2007, 12h55   #8
Invité de passage
 
Inscription : décembre 2007
Messages : 15
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 15
Points : 2
Points : 2
J'ai essayé le "execute immediate" et j'ai ce retour d'erreur :

Code :
ORA-04092: cannot COMMIT IN a TRIGGER
Je vais essayer le "autonomous transaction" pour voir si ça change quelque chose.
CrazyLiam est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2007, 13h37   #9
Membre confirmé
 
Avatar de LBO72
 
Inscription : mai 2007
Messages : 385
Détails du profil
Informations personnelles :
Âge : 43
Localisation : France

Informations forums :
Inscription : mai 2007
Messages : 385
Points : 282
Points : 282
Je ne pense pas qu'on puisse faire un execute immediate dans un trigger !

LBO72.
LBO72 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2007, 13h49   #10
Rédacteur
 
Inscription : décembre 2002
Messages : 2 397
Détails du profil
Informations personnelles :
Localisation : France, Var (Provence Alpes Côte d'Azur)

Informations forums :
Inscription : décembre 2002
Messages : 2 397
Points : 3 298
Points : 3 298
Bon, clarifions les choses pour ne pas voir fleurir les supputations fumeuses...

On veut ici créer une table au sein d'un déclencheur.
Pour ce faire, on doit résoudre deux problèmes :
- le fait qu'en PL/SQL, (et donc en particulier dans un déclencheur) on ne peut pas exécuter directement d'instructions DDL, telles que CREATE TABLE. Il faut effectivement utiliser la syntaxe EXECUTE IMMEDIATE.
- le fait que dans un déclencheur standard, le COMMIT (explicite ou non) est interdit. Or une instruction DDL provoque un COMMIT implicite avant de s'exécuter. On peut s'en sortir en utilisant une transaction autonome.

Il faut donc, au sein d'une transaction autonome, créer la table via EXECUTE IMMEDIATE.
__________________
Consultant / formateur Oracle indépendant
Certifié OCP 10g et 11g, sécurité 11g
Pomalaix 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 13h06.


 
 
 
 
Partenaires

Hébergement Web