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 :

Récupérer le texte de création d'un index contenant une fonction


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    120
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 120
    Par défaut Récupérer le texte de création d'un index contenant une fonction
    Bonjour,

    J'aimerais savoir s'il est possible de récupérer dans Oracle (11gR2) le texte de création d'un index contenant une fonction.

    Depuis SQL Developer, je peux récupérer ce texte dans l'onglet "Index" de ma table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    INDEX_OWNER  INDEX_NAME  UNIQUENESS STATUS INDEX_TYPE             TEMPORARY  PARTITIONED  FUNCIDX_STATUS  JOIN_INDEX  COLUMNS                     COLUMN_EXPRESSION
    NOM_PROP      IDX_MONIDX  NONUNIQUE  VALID  FUNCTION-BASED NORMAL  N         NO             ENABLED        NO          SYS_NC00057$,SYS_NC00058$   TO_CHAR("DATE_SORTIE",'yyyy')
    NOM_PROP      IDX_MONIDX  NONUNIQUE  VALID  FUNCTION-BASED NORMAL  N         NO             ENABLED        NO          SYS_NC00057$,SYS_NC00058$   TO_CHAR("DATE_SORTIE",'mm')

    Depuis SQL Developer, voici le descriptif de mon index (onglet "Colonnes" lorsque je choisis l'index)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    INDEX_OWNER INDEX_NAME  TABLE_OWNER  TABLE_NAME  COLUMN_NAME  COLUMN_POSITION DESCEND
    NOM_PROP     NOM_INDEX  NOM_PROP     NOM_TABLE   SYS_NC00057$  1               ASC
    NOM_PROP     NOM_INDEX  NOM_PROP     NOM_TABLE   SYS_NC00058$  2               ASC
    Depuis SQL Developer, voici le texte que je récupère depuis l'onglet "SQL"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CREATE INDEX NOM_PROP.NOM_INDEX ON NOM_PROP.NOM_TABLE (TO_CHAR("DATE_SORTIE",'yyyy'), TO_CHAR("DATE_SORTIE",'mm'));
    Ma question est : comment récupérer dans les métadonnées Oracle le texte complet de création de l'index (avec la "traduction" entre les colonnes "SYS_NC00057$" et TO_CHAR("DATE_SORTIE",'yyyy') et "SYS_NC00058$" et TO_CHAR("DATE_SORTIE",'mm').

    Merci beaucoup pour les solutions que vous pourriez me proposer.

    MarieO

  2. #2
    Expert confirmé
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : Developer Advocate YugabyteDB
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 822
    Billets dans le blog
    1
    Par défaut
    Dans quel but? SYS_NC00057$ est un nom généré. On ne doit pas le mettre dans le CREATE. Imaginez que ce no existe déjà par exemple.

  3. #3
    Membre Expert
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 167
    Par défaut
    Bonjour,

    Tu peux retrouver le texte des FBI (Function-Based-Indexes) dans la vue ALL_IND_EXPRESSIONS:

    https://docs.oracle.com/cd/E18283_01...views_1101.htm

    Sinon pour reconstruire l'instruction DDL d'un index tu peux utiliser la fonction DBMS_METADATA.GET_DDL:

    https://docs.oracle.com/cd/E11882_01...htm#ARPLS66885

  4. #4
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    120
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 120
    Par défaut
    Bonjour,

    Je viens de tester la requête suivante sur ma base de données:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT table_owner, index_owner, table_name, index_name, 
         listagg(column_expression,',') within group 
    	   (order by table_owner, table_name, index_name, column_position) as list_columns
       FROM all_ind_expressions where index_owner='NOM_PROP';
    et j'ai le message d'erreur ci-dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ORA-00932: types de données incohérents ; attendu : NUMBER ; obtenu : LONG
    00932. 00000 -  "inconsistent datatypes: expected %s got %s"
    *Cause:    
    *Action:
    Erreur à la ligne 2, colonne 14

    A quoi cela est-il dû et comment faire pour corriger cette anomalie ?

    Merci beaucoup.

  5. #5
    Membre Expert
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 167
    Par défaut
    Bonjour,

    Tu obtiens l'erreur car tu appliques une fonction sur une colonne de type LONG. Ce type de données n'est pas du tout pratique à manipuler, et pourtant Oracle continue de l'utiliser dans son dictionnaire de données!
    Il faut que tu passes par du pl/sql. Par exemple:
    https://blog.mclaughlinsoftware.com/...t-long-to-clob

    De plus, ta requête ne fonctionnera pas car il manquera un GROUP BY.

  6. #6
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    120
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 120
    Par défaut
    Effectivement, il manque la ligne GROUP BY à ma requête SQL

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT table_owner, index_owner, table_name, index_name, 
         listagg(column_expression,',') within group 
    	   (order by table_owner, table_name, index_name, column_position) as list_columns
       FROM all_ind_expressions where index_owner='NOM_PROP'
    GROUP BY table_owner, index_owner, table_name, index_name
    ORDER BY table_name, index_name;

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

Discussions similaires

  1. Ecriture jointure réflexive compatible avec la création d'un index sur une vue
    Par Christophe Charron dans le forum Développement
    Réponses: 8
    Dernier message: 28/11/2018, 09h09
  2. Erreur lors de la création d'un index sur une vue
    Par Christophe Charron dans le forum Développement
    Réponses: 2
    Dernier message: 02/09/2018, 11h30
  3. Réponses: 7
    Dernier message: 02/12/2011, 10h49
  4. Création des bons index pour une requête
    Par genova dans le forum Requêtes
    Réponses: 2
    Dernier message: 21/12/2008, 14h47
  5. Création d'un index sur une grosse table
    Par Jester dans le forum SQL Procédural
    Réponses: 5
    Dernier message: 02/04/2008, 12h44

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