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 27/05/2011, 10h02   #1
Invité de passage
 
Inscription : octobre 2006
Messages : 26
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 26
Points : 4
Points : 4
Par défaut ALTER INDEX PL/SQL

Bonjour tout le monde,

Voila, j'ai des index qui ont été créés dans le TABLESPACE USERS et j'aimerais les déplacer dans le TABLESPACE INDX en une seule fois.

J'ai donc fait un peu de PL/SQL qui récupère tous les index et qui boucle pour les déplacer un par un.

Le problème est que dans la boucle, quand je demande d'exécuter le Alter Index, il me retourne une erreur comme quoi il ne devrait pas y avoir d'Alter à cet endroit.

Code :
1
2
3
4
5
6
7
8
9
10
11
ALTER INDEX C.index_name rebuild tablespace INDX ;
*
ERREUR à la ligne 9 :
ORA-06550: Ligne 9, colonne 1 :
PLS-00103: Symbole "ALTER" rencontré à la place d'un des symboles suivants :
begin declare exit for goto if loop mod null pragma raise
return select update while <an identifier>
<a double-quoted delimited-identifier> <a bind variable> <<
close current delete fetch lock insert open rollback
savepoint set sql execute commit forall
<a single-quoted SQL string>

Voila le code PL/SQL

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
DECLARE 
 
CURSOR C_INDEX IS (SELECT index_name FROM user_indexes WHERE table_name IN (SELECT table_name FROM user_tables));
 
BEGIN
 
FOR C IN C_INDEX LOOP
 
ALTER INDEX C.index_name REBUILD TABLESPACE INDX;
 
END LOOP;
 
END;
Lorsque je lui demande d'afficher les requêtes, elles sont bien formées et tout.


Au passage, j'aimerais avoir votre avis sur cette façon de faire car je ne suis pas certain que ce soit la meilleure façon de procéder.
Est-il mieux, niveau sécurité et intégrité de la base, de procéder d'une autre façon ? Par exemple, les changer un par un ?


Merci d'avance pour vos réponses et conseils
Gordon Freeman est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/05/2011, 10h05   #2
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
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 311
Points : 5 810
Points : 5 810
Alter c'est du DDL. Pour le DDL employez le SQL Dynamique: DBMS_SQL ou mieux dans votre cas Execute immediate.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/05/2011, 10h16   #3
Invité de passage
 
Inscription : octobre 2006
Messages : 26
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 26
Points : 4
Points : 4
Merci beaucoup pour votre réponse, j'ai trouvé la solution

Pour information si ça peut servir à quelqu'un :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
declare 
 
CURSOR C_INDEX IS (SELECT index_name FROM user_indexes WHERE table_name IN (SELECT table_name FROM user_tables));
 
requete VARCHAR2(512);
 
begin
 
FOR C IN C_INDEX loop
 
EXECUTE IMMEDIATE 'alter index '||C.index_name||' rebuild tablespace INDX';
 
 
end loop;
 
end;
J'ai juste appelé EXECUTE IMMEDIATE avec la chaine de la requête.

Merci encore
Bonne journée
Gordon Freeman est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h57.


 
 
 
 
Partenaires

Hébergement Web