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 :

Fonction de recherche [11g]


Sujet :

PL/SQL Oracle

  1. #1
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut Fonction de recherche


    J'ai créé une procédure Pl/SQL qui permet de faire une recherche par rapport à une chaîne donnée. Son fonctionnement:
    • Split de la chaîne passée en argument
    • Parcours de la liste résultante
    • Pour chaque itération de boucle, on rempli une table temporaire avec le résultat de la recherche par rapport au mot courant
    • Remplissage d'un curseur qui servira à alimenter un DataTable sous Visual Studio


    Le problème c'est qu’apparemment, la variable qui contient le mot courant n'est pas accepté dans la recherche des occurrences avec le LIKE, voici le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
       PROCEDURE proc_chercher_noms_exploit (
          p_nom_exploitation   IN     VARCHAR2,
          p_cur                   OUT r_cursor)
       IS
       BEGIN
          FOR cword
             IN (    SELECT REGEXP_SUBSTR ( (SELECT p_nom_exploitation FROM DUAL),
                                           '[^ ]+',
                                           1,
                                           LEVEL)
                       FROM DUAL
                 CONNECT BY LEVEL <=
                                 LENGTH (
                                    REGEXP_REPLACE (
                                       (SELECT p_nom_exploitation FROM DUAL),
                                       '[^ ]*'))
                               + 1)
          LOOP
             INSERT INTO t_tmp_recherche_exploit
                  SELECT DISTINCT nom_exploitation, id_exploitation
                    FROM t_exploitations
                   WHERE nom_exploitation LIKE '%' || cword || '%'
                ORDER BY nom_exploitation;
          END LOOP;
     
          OPEN p_cur FOR
               SELECT *
                 FROM t_tmp_recherche_exploit
             ORDER BY nom_exploitation;
       END;
    Et voici l'erreur lors de la compilation:
    [Warning] ORA-24344: opération réussie avec erreur de compilation
    529/51 PLS-00382: expression du mauvais type
    (2: 0): Warning: compiled but with compilation errors
    Les champs id_exploitation et nom_exploitation sont du même type dans les deux tables utilisées soit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ID_EXPLOITATION    VARCHAR2 (20 BYTE) NOT NULL,
    NOM_EXPLOITATION   VARCHAR2 (50 BYTE)
    Si quelqu'un voit le problème ça m'aiderais, je suis sur ce problème depuis hier je vois plus trop où chercher


    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  2. #2
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Solution:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
       PROCEDURE proc_chercher_noms_exploit (
          p_nom_exploitation   IN     VARCHAR2,
          p_cur                   OUT r_cursor)
       IS
          CURSOR cword
          IS
                 SELECT REGEXP_SUBSTR ( (SELECT p_nom_exploitation FROM DUAL),
                                       '[^ ]+',
                                       1,
                                       LEVEL)
                           nom
                   FROM DUAL
             CONNECT BY LEVEL <=
                             LENGTH (
                                REGEXP_REPLACE (
                                   (SELECT p_nom_exploitation FROM DUAL),
                                   '[^ ]*'))
                           + 1;
       BEGIN
          FOR rword IN cword
          LOOP
             INSERT INTO t_tmp_recherche_exploit
                  SELECT DISTINCT id_exploitation, nom_exploitation
                    FROM t_exploitations
                   WHERE nom_exploitation LIKE '%' || rword.nom || '%'
                ORDER BY nom_exploitation;
          END LOOP;
     
          OPEN p_cur FOR
               SELECT *
                 FROM t_tmp_recherche_exploit
             ORDER BY nom_exploitation;
       END;
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  3. #3
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Utiliser une table temporaire c'est moche. La présence d'un order by dans l'insert c'est moche. Et finalement la procédure est un peu trop complexe: il suffit d'un open cursor for <la requête qui va bien>.

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

Discussions similaires

  1. Fonction de recherche
    Par lejimi dans le forum Mode d'emploi & aide aux nouveaux
    Réponses: 4
    Dernier message: 15/01/2006, 21h09
  2. Fonction de recherche de ligne...
    Par Zenol dans le forum Langage
    Réponses: 6
    Dernier message: 05/12/2005, 19h26
  3. fonction de recherche et recopie
    Par mavean dans le forum Access
    Réponses: 2
    Dernier message: 20/11/2005, 12h24
  4. Adapter la fonction de recherche de Plone/Zope
    Par StarNab dans le forum Zope
    Réponses: 2
    Dernier message: 07/04/2005, 16h04
  5. [String] Fonction de recherche de caractères numériques
    Par david71 dans le forum Général Java
    Réponses: 10
    Dernier message: 16/02/2005, 12h05

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