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

SQL Oracle Discussion :

execute immediate + DROP TABLE


Sujet :

SQL Oracle

  1. #1
    Membre à l'essai
    Inscrit en
    Février 2007
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 13
    Points : 13
    Points
    13
    Par défaut execute immediate + DROP TABLE
    Bonjour,

    Dans une procédure stockée, je crée un table temporaire avec execute immediate. Ca fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    	select trunc(dbms_random.value(1,10000000)) num into tblRef from dual;
     
    	request := 'CREATE GLOBAL TEMPORARY TABLE NC_TEMP_DIAG_CODE_' || tblRef ||' (';
    	request := request || 'ncDiagCode VARCHAR2(20), ';
    	request := request || 'ncMotif VARCHAR2(60), ';
    	request := request || 'ncSousMotif VARCHAR2(60), ';
    	request := request || 'ncActionType VARCHAR2(30), ';
    	request := request || 'swDateCreated VARCHAR2(10), ';
    	request := request || 'ncDiagCodeId NUMBER(15,5) ';
    	request := request || ') ON COMMIT PRESERVE ROWS';
     
                 execute immediate request;
    Ensuite j'effectue des insert et des select, ca fonctionne toujours.

    Enfin, je la supprime:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    	request := 'DROP TABLE NC_TEMP_DIAG_CODE_' || tblRef ;
    	execute immediate request;
    Et là, ca ne fonctionne pas. La procédure stockée se plante.

    J'ai même essayé de rajouter CASCADE CONSTRAINTS, ca ne marche toujours pas.

    Je ne vois pas d'où viens le problème...je sèche...

    Par avance merci de votre aide !

    Greg

  2. #2
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 460
    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 460
    Points : 8 074
    Points
    8 074
    Par défaut
    Citation Envoyé par greg75 Voir le message
    Et là, ca ne fonctionne pas. La procédure stockée se plante.
    Et le message d'erreur ???


    Ce test simple fonctionne sans problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    SQL> create global temporary table ttemp as select * from dual;
     
    Table crÚÚe.
     
    SQL> declare request varchar2(2000);
      2  begin
      3  request:='drop table ttemp';
      4  execute immediate request;
      5  end;
      6  /
     
    ProcÚdure PL/SQL terminÚe avec succÞs.
     
    SQL> select * from ttemp;
    select * from ttemp
                  *
    ERREUR Ó la ligne 1 :
    ORA-00942: Table ou vue inexistante
    Consultant / formateur Oracle indépendant
    Certifié OCP 12c, 11g, 10g ; sécurité 11g

    Ma dernière formation Oracle 19c publiée sur Linkedin : https://fr.linkedin.com/learning/oracle-19c-l-administration

  3. #3
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Il y a un truc avec les tables temporaire pour le drop..
    Je crois que les sessions doivent s'arrêter ou alors un rollback avant le drop.
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  4. #4
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    CREATE GLOBAL TEMPORARY TABLE ttemp 
    ON COMMIT PRESERVE ROWS AS SELECT * FROM dual ;
     
     
    DECLARE 
    	request VARCHAR2(2000);
    	v NUMBER;
     BEGIN
    	SELECT COUNT(*) INTO v FROM ttemp;
    -- COMMIT; ROLLBACK;
      	request:='drop table ttemp';
      	EXECUTE IMMEDIATE request;
    END;
     
    ORA-14452: attempt TO CREATE, ALTER OR DROP an INDEX ON TEMPORARY TABLE already IN USE
    ORA-06512: AT line 7
    Avec ou sans le Commit ou le rollback : C'est pareil.
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  5. #5
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    l'aide de TOAD :
    Action: All the sessions using the session-specific temporary table have to truncate table and all the transactions using transaction specific temporary table have to end their transactions.
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  6. #6
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Ca marche.. Faut truncater ;-)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    CREATE GLOBAL TEMPORARY TABLE ttemp ON COMMIT PRESERVE ROWS AS SELECT * FROM dual ;
     
    DECLARE 
    	request VARCHAR2(2000);
    	v NUMBER;
     BEGIN
    	SELECT COUNT(*) INTO v FROM ttemp;
    	request:='truncate table ttemp';
      	EXECUTE IMMEDIATE request;
      	request:='drop table ttemp';
      	EXECUTE IMMEDIATE request;
    END;
     
    PL/SQL procedure successfully completed
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  7. #7
    Rédacteur

    Homme Profil pro
    Développeur et DBA Oracle
    Inscrit en
    Octobre 2006
    Messages
    878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur et DBA Oracle

    Informations forums :
    Inscription : Octobre 2006
    Messages : 878
    Points : 1 197
    Points
    1 197
    Par défaut
    salut

    Voici la démonstration de PlaineR pour supprimer une table temporaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    SQL> create global temporary table t1 (n number) on commit preserve rows;
    Table created.
     
    SQL> insert into t1 values (1);
    1 row created.
     
    SQL> drop table t1;
    drop table t1
               *
    ERROR at line 1:
    ORA-14452: attempt to create, alter or drop an index on temporary table 
    already in use
     
    SQL> commit;
    Commit complete.
     
    SQL> drop table t1;
    drop table t1
               *
    ERROR at line 1:
    ORA-14452: attempt to create, alter or drop an index on temporary table 
    already in use
     
    SQL> delete t1;
    1 row deleted.
     
    SQL> commit;
    Commit complete.
     
    SQL> drop table t1;
    drop table t1
               *
    ERROR at line 1:
    ORA-14452: attempt to create, alter or drop an index on temporary table 
    already in use
     
    SQL> truncate table t1;
    Table truncated.
     
    SQL> drop table t1;
    Table dropped.
     
     
    NB : quel est l'intérêt de créer une table temporaire dans un traitement, puis 
    de la supprimer ensuite ? Ne peux-tu pas la créer une fois pour toutes ?

  8. #8
    Membre à l'essai
    Inscrit en
    Février 2007
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 13
    Points : 13
    Points
    13
    Par défaut
    Merci à tous. Ca marche !!!!

  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
    J'avais le même besoin il y a fort bien longtemps et j'étais obligé de créer
    une table permanente !!!
    Merci pour le truncate

    LBO72.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 26/09/2014, 11h00
  2. Execute immediate truncate table
    Par Milo59000 dans le forum SQL
    Réponses: 5
    Dernier message: 08/09/2008, 17h43
  3. Execute immediate et rename de table
    Par Scrouik dans le forum Administration
    Réponses: 4
    Dernier message: 23/01/2008, 17h12
  4. execute immediate + create table
    Par olivanto dans le forum SQL
    Réponses: 7
    Dernier message: 03/05/2007, 15h41
  5. Creation de table via execute immediate.
    Par Vince7-7 dans le forum Oracle
    Réponses: 3
    Dernier message: 15/01/2007, 16h04

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