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 :

ORA-30553 lors de la creation d'un index


Sujet :

PL/SQL Oracle

  1. #1
    Membre actif Avatar de snipes
    Inscrit en
    Septembre 2004
    Messages
    547
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 547
    Points : 295
    Points
    295
    Par défaut ORA-30553 lors de la creation d'un index
    Salut tout le monde,

    J'ai un ensemble d'instruction me permettant d'effectuer une comparaison sans tenir compte de la casse, des accents et quelques autres caractères

    Je voudrais creer un index sur un champ en utilisant cet ensemble d'instruction afin que le traitement soit plus rapide cependant la fonction utl_raw.cast_to_varchar2 me retourne l'erreur suivante :
    ORA-30553 : The function is not deterministic

    Auriez-vous un equivalent ? ou une piste qui me permettrait de passer outre cette erreur ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CREATE INDEX TOTO.MON_IDX ON TOTO.MA_TABLE
       (  TRANSLATE(NLS_UPPER(utl_raw.cast_to_varchar2(NLSSORT(ccfname,'NLS_SORT=BINARY_AI'))), '1' || TRANSLATE(NLS_UPPER(utl_raw.cast_to_varchar2(NLSSORT(ccfname,'NLS_SORT=BINARY_AI'))),' ABCDEFGHIJKLMNOPQRSTUVWXYZ',' '),'1') ASC, TRANSLATE(NLS_UPPER(utl_raw.cast_to_varchar2(NLSSORT(cclname,'NLS_SORT=BINARY_AI'))), '1' || TRANSLATE(NLS_UPPER(utl_raw.cast_to_varchar2(NLSSORT(cclname,'NLS_SORT=BINARY_AI'))),' ABCDEFGHIJKLMNOPQRSTUVWXYZ',' '),'1') ASC  )

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Il suffit d'encapsuler l'appel à utl_raw dans une fonction spécifiée comme déterministe :

    http://asktom.oracle.com/pls/asktom/...50737314125980
    And one CORRECT implementation is exactly to wrap the function which Oracle did not define as
    deterministic, but you know to be deterministic with your own function.

  3. #3
    Membre actif Avatar de snipes
    Inscrit en
    Septembre 2004
    Messages
    547
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 547
    Points : 295
    Points
    295
    Par défaut
    Merci pour ta reponse skuatamad
    Je voulais justement eviter de creer une fonction uniquement pour ca en cherchant éventuellement un equivalent ou une autre façon de faire

    (si vraiment je ne trouve pas d autres solutions j'aurais pas le choix )

  4. #4
    Membre actif Avatar de snipes
    Inscrit en
    Septembre 2004
    Messages
    547
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 547
    Points : 295
    Points
    295
    Par défaut
    N'ayant pas trouvé d'autre solution j'ai finalement créé la fonction
    Cependant je me trouve confronté a un nouveau probleme

    ORA-01450: longueur maximum de clé (6394) dépassée

    A priori la creation d'index n'autorise pas l'utilisation de fonction qui retourne une chaine de longueur aléatoire
    Je suis du coup un peu embeté car le resultat de la fonction NLSSORT n'est pas fixe

    NB : Mon besoin en fait c'est de creer un index insensible a la casse, aux accents et qui remplace les '-' par ' '

    Modification du PL initiale (apparement BINARY_AI est insensible a la casse et aux accents)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CREATE INDEX TOTO.MON_IDX ON TOTO.MA_TABLE
       (  TRANSLATE(utl_raw.cast_to_varchar2(NLSSORT(ccfname,'NLS_SORT=BINARY_AI')), '1' || TRANSLATE(utl_raw.cast_to_varchar2(NLSSORT(ccfname,'NLS_SORT=BINARY_AI')),' ABCDEFGHIJKLMNOPQRSTUVWXYZ',' '),'1') ASC, TRANSLATE(utl_raw.cast_to_varchar2(NLSSORT(cclname,'NLS_SORT=BINARY_AI')), '1' || TRANSLATE(utl_raw.cast_to_varchar2(NLSSORT(cclname,'NLS_SORT=BINARY_AI')),' ABCDEFGHIJKLMNOPQRSTUVWXYZ',' '),'1') ASC  )

  5. #5
    Membre actif Avatar de snipes
    Inscrit en
    Septembre 2004
    Messages
    547
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 547
    Points : 295
    Points
    295
    Par défaut
    J'ai abandonné l'idee du cast_to_char je compare directement le resultat de NLSSORT

    La solution au cas ou ca aiderait quelqu'un d'autre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     NLSSORT(TRANSLATE(ccfname,'-.',' '),'NLS_SORT=BINARY_AI')

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

Discussions similaires

  1. comment eviter ora-00942 lors d'un drop table
    Par sqlakf76 dans le forum Oracle
    Réponses: 22
    Dernier message: 11/10/2005, 15h48
  2. probleme lors de la creation du device
    Par 180degrés dans le forum DirectX
    Réponses: 5
    Dernier message: 18/08/2005, 17h26
  3. [8i]ORA-00600 lors d'un export
    Par neo.51 dans le forum Oracle
    Réponses: 9
    Dernier message: 15/04/2005, 19h44
  4. [SAX] erreur lors de la creation du XMLReader
    Par vir dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 19/08/2004, 01h12
  5. erreur "ORA-22905" lors de l'execution d'un requet
    Par benji999 dans le forum Administration
    Réponses: 26
    Dernier message: 14/04/2004, 11h47

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