IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PL/SQL Oracle Discussion :

[PL/SQL] Create table dans un trigger


Sujet :

PL/SQL Oracle

  1. #1
    Futur Membre du Club
    Inscrit en
    Décembre 2007
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 15
    Points : 6
    Points
    6
    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.

  2. #2
    Membre averti Avatar de LBO72
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Points : 342
    Points
    342
    Par défaut
    Merci de spécifier ta vesion Oracle...
    Pourrais-tu nous envoyer le code de ton trigger ?

    LBO72.

  3. #3
    Futur Membre du Club
    Inscrit en
    Décembre 2007
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 15
    Points : 6
    Points
    6
    Par défaut
    Je m'entraîne sur l'application APEX disponible en ligne sur le site d'Oracle.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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;

  4. #4
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    EXECUTE IMMEDIATE est ton ami

  5. #5
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 461
    Points : 8 079
    Points
    8 079
    Par défaut
    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 ?

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    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.

  7. #7
    Futur Membre du Club
    Inscrit en
    Décembre 2007
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 15
    Points : 6
    Points
    6
    Par défaut
    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.

  8. #8
    Futur Membre du Club
    Inscrit en
    Décembre 2007
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 15
    Points : 6
    Points
    6
    Par défaut
    J'ai essayé le "execute immediate" et j'ai ce retour d'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ORA-04092: cannot COMMIT in a trigger
    Je vais essayer le "autonomous transaction" pour voir si ça change quelque chose.

  9. #9
    Membre averti Avatar de LBO72
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Points : 342
    Points
    342
    Par défaut
    Je ne pense pas qu'on puisse faire un execute immediate dans un trigger !

    LBO72.

  10. #10
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 461
    Points : 8 079
    Points
    8 079
    Par défaut
    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.

Discussions similaires

  1. Create table dans une loop PL/SQL
    Par neo.51 dans le forum PL/SQL
    Réponses: 5
    Dernier message: 04/03/2009, 10h59
  2. Create table dans une fonction SQL
    Par mimi0501 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 07/02/2008, 13h25
  3. Réponses: 1
    Dernier message: 15/05/2007, 12h01
  4. Create table dans le mauvais schema
    Par Daark dans le forum Administration
    Réponses: 3
    Dernier message: 19/12/2006, 14h11
  5. [Sql] Create table
    Par Jerem76 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 25/07/2005, 17h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo