Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
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 22/06/2011, 10h10   #1
Nouveau Membre du Club
 
Avatar de logiciel_const
 
Inscription : octobre 2007
Messages : 167
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 167
Points : 31
Points : 31
Par défaut Index sur une colonne

Bonjour,
pour modifier la taille d'une colonne [Nom], qui est indexéé ,il fallait que je supprime d'abord tout index, j'ai supprimé un, mais il reste d'autres dont la "Column Expresion" se trouve cette colonne "Uper(Nom)" , est ce que je doit supprimer tous ces index,sinon comment je dois faire?
Merci
logiciel_const est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/06/2011, 10h46   #2
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Homme Laurent Schneider
Administrateur de base de données
Inscription : décembre 2005
Messages : 2 925
Détails du profil
Informations personnelles :
Nom : Homme Laurent Schneider
Localisation : Suisse

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : Finance

Informations forums :
Inscription : décembre 2005
Messages : 2 925
Points : 4 547
Points : 4 547
pas besoin de supprimer les index normaux.

Par contre les index de fonctions doivent être supprimés.

Le message d'erreur (que tu n'as pas donné) est assez clair :


Code :
1
2
3
4
SQL> ALTER TABLE t MODIFY (x varchar2(15))
ALTER TABLE t MODIFY (x varchar2(15))
Error at line 9
ORA-30556: either functional OR bitmap JOIN INDEX IS defined ON the COLUMN TO be modified
Code :
1
2
3
4
30556, 00000, "either functional or bitmap join index is defined on the column to be modified"
// *Cause : An ALTER TABLE MODIFY COLUMN was issued ON a COLUMN ON which
//          either a functional INDEX OR bitmap JOIN INDEX EXISTS.
// *Action: DROP the functional OR bitmap JOIN INDEX before attempting TO MODIFY the COLUMN.
PS: pour trouver les indexes, exécute
Code :
SELECT column_expression FROM USER_IND_EXPRESSIONS WHERE table_name='T';
__________________
Mon blog : laurentschneider.com
Mon livre : Advanced Oracle SQL Programming
laurentschneider est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 22/06/2011, 12h36   #3
Nouveau Membre du Club
 
Avatar de logiciel_const
 
Inscription : octobre 2007
Messages : 167
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 167
Points : 31
Points : 31
Merci pour ta réponse, mais le probleme est que j'ai supprimé manuelment le premier index, et lorsque j'ai voulu creer un enregistrement sur la table contenant cette colonne, impossible d'enregistrer !! pouvez vous me donner le patch exacte pour creer l'index supprimé: NONUNIQUE,ASC , en suite supprimer les autres indexes fonctionnels?
Merci d'avance
logiciel_const est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/06/2011, 13h37   #4
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Homme Laurent Schneider
Administrateur de base de données
Inscription : décembre 2005
Messages : 2 925
Détails du profil
Informations personnelles :
Nom : Homme Laurent Schneider
Localisation : Suisse

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : Finance

Informations forums :
Inscription : décembre 2005
Messages : 2 925
Points : 4 547
Points : 4 547
quand tu dis "impossible d'enregistrer", tu peux préciser?

ce que tu peux faire c'est d'abord exporter les indexes, les effacer puis les recréer.

Pour export un index, utilise TOAD, SQL*Developer, DBMS_METADATA ou tout autre outil. Sans doute est-ce inutile car tu as sûrement le code de création des indexes documenté quelque part

Ex avec DBMS_METADATA

Code :
1
2
3
4
5
6
7
8
SET PAGES 9999 LIN 2000 LONG 1000000 LONGC 2000 HEA off FEED OFF
EXEC dbms_metadata.set_transform_param(DBMS_METADATA.SESSION_TRANSFORM,'SQLTERMINATOR',TRUE)
SELECT dbms_metadata.get_ddl('INDEX',INDEX_NAME,user) 
FROM (
  SELECT DISTINCT index_name 
  FROM USER_IND_EXPRESSIONS 
  WHERE table_name='T'
);
output:
Code :
CREATE INDEX "SCOTT"."I" ON "SCOTT"."T" (UPPER("X"));
Pour effacer les indexes, DROP INDEX. Par exemple dynamiquement
Code :
1
2
3
4
5
6
7
8
SET serverout ON size 1000000
begin 
  FOR f IN (SELECT DISTINCT index_name FROM USER_IND_EXPRESSIONS WHERE table_name='T') loop
    dbms_output.put_line('DROP INDEX "'||f.index_name||'";');
    -- execute immediate 'DROP INDEX "'||f.index_name||'"';
  end loop; 
end;
/
Tu modifies ta table :
Code :
ALTER TABLE T MODIFY (X VARCHAR2(9))
Ensuite tu les recrées les index exportés
Code :
CREATE INDEX "SCOTT"."I" ON "SCOTT"."T" (UPPER("X"));

PS: Le drop dynamique, attention, si tu te plantes et que tu effaces tout, et bien zut!
__________________
Mon blog : laurentschneider.com
Mon livre : Advanced Oracle SQL Programming
laurentschneider est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/06/2011, 14h09   #5
Membre expérimenté
 
Homme Mohamed Houri
Inscription : mars 2010
Messages : 286
Détails du profil
Informations personnelles :
Nom : Homme Mohamed Houri
Localisation : France

Informations forums :
Inscription : mars 2010
Messages : 286
Points : 563
Points : 563
Citation:
Envoyé par logiciel_const Voir le message
Bonjour,
pour modifier la taille d'une colonne [Nom], qui est indexéé ,il fallait que je supprime d'abord tout index, j'ai supprimé un, mais il reste d'autres dont la "Column Expresion" se trouve cette colonne "Uper(Nom)" , est ce que je doit supprimer tous ces index,sinon comment je dois faire?
Merci
Voici un exemple simple

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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
 
 mhouri > CREATE TABLE t_fbi AS SELECT * FROM emp;
 
TABLE created.
 
 mhouri > DESC t_fbi;
 Name                                      NULL?    Type
 ----------------------------------------- -------- ----------------------------
 EMPNO                                     NOT NULL NUMBER(4)
 ENAME                                              VARCHAR2(10)
 JOB                                                VARCHAR2(9)
 MGR                                                NUMBER(4)
 HIREDATE                                           DATE
 SAL                                                NUMBER(7,2)
 COMM                                               NUMBER(7,2)
 DEPTNO                                             NUMBER(2)
 
 mhouri > CREATE INDEX id_ename ON t_fbi(ename);
 
INDEX created.
 
 mhouri > CREATE INDEX id_up_ename ON t_fbi(upper(ename));
 
INDEX created.
 
 mhouri > ALTER TABLE t_fbi MODIFY ename varchar2(30);
ALTER TABLE t_fbi MODIFY ename varchar2(30)
                         *
ERROR at line 1:
ORA-30556: functional INDEX IS defined ON the COLUMN TO be modified 
 
 
 mhouri > DROP INDEX id_up_ename;
 
INDEX dropped.
 
 mhouri > ALTER TABLE t_fbi MODIFY ename varchar2(30);
 
TABLE altered.
 
 mhouri > CREATE INDEX id_up_ename ON t_fbi(upper(ename));
 
INDEX created.
 
 mhouri >DESC t_fbi;
 Name                                      NULL?    Type
 ----------------------------------------- -------- ----------------------------
 EMPNO                                     NOT NULL NUMBER(4)
 ENAME                                              VARCHAR2(30)
 JOB                                                VARCHAR2(9)
 MGR                                                NUMBER(4)
 HIREDATE                                           DATE
 SAL                                                NUMBER(7,2)
 COMM                                               NUMBER(7,2)
 DEPTNO                                             NUMBER(2)
Vous êtes le seul à connaitre l'index (b-tree, bitmap,etc..) que vous avez accidentellement supprimé. Vous êtes donc le seul à savoir comment le recréér.

Bien à vous

Mohamed Houri
Mohamed.Houri 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 23h05.


 
 
 
 
Partenaires

Hébergement Web