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 :

Exec immediate d'un exec immediate


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mai 2005
    Messages
    77
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 77
    Par défaut Exec immediate d'un exec immediate
    Bonjour à tous
    Je dois créer une table TEMP identique à une table existante (colonnes + index), tout cela en dynamique.

    Voici ce que je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    CREATE TABLE CETEMP AS SELECT * FROM CECV WHERE 1=0;
     
    DECLARE
      Requete1        VARCHAR2(256) ;
      Requete2        VARCHAR2(1000) ;
    BEGIN
      Requete1:= 'select  REPLACE(DBMS_METADATA.get_dependent_ddl(''INDEX'',''CECV''),''CECV'',''CETEMP'') from dual';
      EXECUTE IMMEDIATE Requete1   into Requete2 ;
      EXECUTE IMMEDIATE Requete2 ;
    END ;
    create : pas de problème
    requete1 : pas de problème, je récupère la description des index de la table CECV et je remplace ensuite la chaine CECV par CETEMP (merci mnitu).
    Par contre je n'arrive pas à exécuter mon résultat2...

    Pouvez-vous m'aider ?
    d'avance merci.
    Iza

  2. #2
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 5 611
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    Connected to Oracle9i Enterprise Edition Release 9.2.0.5.0 
    Connected as mni
     
     
    SQL> 
    SQL> create table temp as select * from emp where 1 = 2
      2  /
     
    Table created
     
    SQL> Select index_name from all_indexes where table_name = 'TEMP'
      2  /
     
    INDEX_NAME
    ------------------------------
     
    SQL> DECLARE
      2    Requete1        VARCHAR2(256) ;
      3    Requete2        VARCHAR2(1000) ;
      4  BEGIN
      5    Requete1:= 'select  REPLACE(DBMS_METADATA.get_dependent_ddl(''INDEX'',''EMP''),''EMP"'',''TEMP"'') from dual';
      6    EXECUTE IMMEDIATE Requete1 INTO Requete2;
      7    EXECUTE IMMEDIATE Requete2 ;
      8  END;
      9  /
     
    PL/SQL procedure successfully completed
     
    SQL> Select index_name from all_indexes where table_name = 'TEMP'
      2  /
     
    INDEX_NAME
    ------------------------------
    PK_TEMP
     
    SQL>

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

    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
    Billets dans le blog
    4
    Par défaut
    Affiche par DBMS_OUTPUT la requête qui va être générée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    FOR i IN 1 .. CEIL(LENGTH(Requete2) / 255) 
    LOOP  
    	DBMS_OUTPUT.PUT_LINE( SUBSTR(Requete2,(i-1)*255 + 1,255)); 
    END LOOP;

  4. #4
    Membre confirmé
    Inscrit en
    Mai 2005
    Messages
    77
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 77
    Par défaut
    Bonjour McM
    Merci de ton aide. J'ai donc exécuté la boucle for et voici ce que j'obtiens :

    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
     
    CREATE INDEX "CENEO"."CETEMP_ACCOUNT" ON "CENEO"."CETEMP" ("IACCOUNTID", "IRECIPIENTID") 
      PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 
      STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
      PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
      TABLESPACE "TBS_INDEX" 
     
      CREATE UNIQUE INDEX "CENEO"."CETEMP_ID" ON "CENEO"."CETEMP" ("ICVID") 
      PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 
      STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
      PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
      TABLESPACE "TBS_INDEX" 
     
      CREATE INDEX "CENEO"."CETEMP_RECIPIENTID" ON "CENEO"."CETEMP" ("IRECIPIENTID") 
      PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 
      STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
      PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
      TABLESPACE "TBS_INDEX"
    Lorsque j'exécute ce code d'un bloc, j'ai le même message que lorsque je fais le execute immediate de requete2, càd : "invalid index option". Par contre, si j'exécute, les 3 blocs un par un ça marche...
    Faut-il que je découpe les blocs par morceau ou y-a-t-il une autre méthode ?

    Merci

    Iza

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

    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
    Billets dans le blog
    4
    Par défaut
    En fait il manque les / ou les ; à la fin des instructions create

    J'ai pas essayé de lancer l'ordre de création, mais tu peux faire comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT  LTRIM(REPLACE(DBMS_METADATA.get_dependent_ddl('INDEX','TARTICLE'),
     'CREATE INDEX', ';'||CHR(10)||'CREATE INDEX') ||';',
     '; '||CHR(10))
    FROM dual

  6. #6
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 5 611
    Par défaut
    Bref, je pense que c'est un peu plus compliqué que ça. Voilà un exemple.

Discussions similaires

  1. [RUNTIME][EXEC]
    Par adrien1977 dans le forum API standards et tierces
    Réponses: 7
    Dernier message: 30/09/2009, 16h28
  2. [Applet][Exec programme] Est ce possible sur un serveur ?
    Par gandalf_le_blanc dans le forum Applets
    Réponses: 31
    Dernier message: 11/05/2004, 14h15
  3. [Free Pascal] Comportement de Exec
    Par néo333 dans le forum Free Pascal
    Réponses: 3
    Dernier message: 01/11/2003, 17h46
  4. Comment utiliser Site Exec sous FTP
    Par phig dans le forum Développement
    Réponses: 2
    Dernier message: 12/08/2003, 17h11
  5. [POSTGRESQL] exec function
    Par peuh dans le forum Requêtes
    Réponses: 5
    Dernier message: 23/05/2003, 15h15

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