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 17/09/2008, 16h06   #1
Membre à l'essai
 
Inscription : mai 2005
Messages : 71
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 71
Points : 24
Points : 24
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 :
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
iza76 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/09/2008, 16h44   #2
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 320
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 320
Points : 5 839
Points : 5 839
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
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>
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/09/2008, 10h07   #3
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 459
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 459
Points : 4 226
Points : 4 226
Affiche par DBMS_OUTPUT la requête qui va être générée.

Code :
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;
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/09/2008, 09h26   #4
Membre à l'essai
 
Inscription : mai 2005
Messages : 71
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 71
Points : 24
Points : 24
Bonjour McM
Merci de ton aide. J'ai donc exécuté la boucle for et voici ce que j'obtiens :

Code :
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
iza76 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/09/2008, 09h56   #5
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 459
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 459
Points : 4 226
Points : 4 226
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 :
1
2
3
4
SELECT  LTRIM(REPLACE(DBMS_METADATA.get_dependent_ddl('INDEX','TARTICLE'),
 'CREATE INDEX', ';'||CHR(10)||'CREATE INDEX') ||';',
 '; '||CHR(10))
FROM dual
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/09/2008, 11h41   #6
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 320
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 320
Points : 5 839
Points : 5 839
Bref, je pense que c'est un peu plus compliqué que ça. Voilà un exemple.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/09/2008, 12h16   #7
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 459
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 459
Points : 4 226
Points : 4 226
Tu peux redonner le lien
Citation:
The requested URL could not be retrieved
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/09/2008, 14h27   #8
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 320
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 320
Points : 5 839
Points : 5 839
J'avais pris la doc en local
C'est du Oracle 9 et peut être qu'il faut revisiter le sujet en 10
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 06h05.


 
 
 
 
Partenaires

Hébergement Web