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 :

Recherche chaîne de caractère


Sujet :

PL/SQL Oracle

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 33
    Points : 28
    Points
    28
    Par défaut Recherche chaîne de caractère
    Bonjour à tous,
    y a-t'il un moyen simple de rechercher une chaîne de caractère contenue dans une table que l'on ne connait pas (et bien sûr, ni le nom de la colonne)?
    La seule chose que je connaisse est le nom du schéma ....
    En fait, ca ressemblerait à rechercher comme dans windows à partir d'un repertoire le fichier contenant la chaîne de caractère "xxx".
    Merci d'avance pour votre aide.

  2. #2
    Rédactrice

    Avatar de kalyparker
    Femme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Janvier 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 327
    Points : 2 998
    Points
    2 998
    Par défaut
    Bonjour,

    y a-t'il un moyen simple de rechercher une chaîne de caractère contenue dans une table que l'on ne connait pas (et bien sûr, ni le nom de la colonne)?
    Simple ? Non, du moins pas à ma connaissance...

    Par contre une procedure pl devrait faire l'affaire... Mais ce genre de chose serait une catastrophe en terme de perf
    It isn't that they can't see the solution, it's that they can't see the problem.
    Mes Articles et Traductions (Microstrategy, Css et Javascript)
    Si vous souhaitez contribuer à la rubrique BI, contactez-moi ou tout autre membre de l'équipe BI par MP.

  3. #3
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    SQL> create or replace function search_in_table(
      2    owner varchar2,
      3    table_name varchar2,
      4    search_string varchar2)
      5  return varchar2 is
      6    stmt varchar2(4000);
      7    col varchar2(4000);
      8  begin
      9    stmt := 'select ';
     10    for c in (
     11      select column_name
     12      from all_tab_columns
     13      where all_tab_columns.table_name=search_in_table.table_name
     14            and all_tab_columns.owner=search_in_table.owner
     15            and data_type like '%CHAR%' )
     16    loop
     17      stmt := stmt || 'max(decode("' || c.column_name || '",''' ||
     18        search_string || ''',''' || c.column_name || ' ''))||';
     19    end loop;
     20    stmt:= stmt||'nvl2(count(*),null,null) from "'||
     21      owner||'"."'||table_name||'"';
     22    execute immediate stmt into col;
     23    return col;
     24  end;
     25  /
     
    Function created.
     
    SQL> 
    SQL> show err
    No errors.
    SQL> 
    SQL> 
    SQL> select table_name,cols from (
      2  select rownum,
      3    table_name,
      4    search_in_table(owner,table_name,'KING') cols
      5    from all_tables where owner='SCOTT')
      6  where cols is not null;
    TABLE_NAME COLS
    ---------- -----------------------------------------------------------
    EMP        ENAME
    T          C
    T2         C1 C2

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 33
    Points : 28
    Points
    28
    Par défaut
    Merci, cette fonction marche parfaitement.
    Est-il possible de la modifier (et comment) pour permettre de rechercher non plus une chaine exacte mais une partie de son contenu, en faisant intervenir un LIKE ?
    Merci d'avance.

  5. #5
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    avec un instr()

    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
     
    CREATE OR REPLACE FUNCTION search_in_table(
        owner varchar2,
        table_name varchar2,
        search_string varchar2)
      RETURN varchar2 IS
        stmt varchar2(4000);
        col varchar2(4000);
      begin
        stmt := 'select ';
        FOR c IN (
          SELECT column_name
          FROM all_tab_columns
          WHERE all_tab_columns.table_name=search_in_table.table_name
                AND all_tab_columns.owner=search_in_table.owner
                AND data_type LIKE '%CHAR%' )
        loop
          stmt := stmt || 'max(decode(instr("' || c.column_name || '",''' ||
            search_string || '''),0,null,null,null,'''|| c.column_name || ' ''))||';
        end loop;
        stmt:= stmt||'nvl2(count(*),null,null) from "'||
          owner||'"."'||table_name||'"';
        execute immediate stmt INTO col;
        RETURN col;
      end;
    /

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2013
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2013
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Probléme avec le script
    J'ai créé une table de test:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SQL> select * from sonar.funk; 
     
            ID GROOVE 
    ---------- ------------------------------------------------------------ 
             2 getfunky 
             2 getdown 
             2 get¿groove
    Je lance ensuite votre fonction après l'avoir compilée sans souci avec une recherche sur une chaîne de caractère complète :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT table_name,cols 
    FROM ( 
    SELECT rownum, 
    table_name, 
    search_in_table('SONAR','FUNK','getfunky') cols 
    FROM all_tables WHERE owner='SONAR') 
    WHERE cols IS NOT NULL;
    Et la surprise il me renvoie une cinquantaine de tables mais toujours avec le bon nom de colonne même si cette colonne n'existe pas dans les autres tables indiquées autre que la table funk:

    TABLE_NAME                     COLS 
    ------------------------------ -------------------- 
    SCHEMA_MIGRATIONS              GROOVE 
    PROJECTS                       GROOVE 
    SNAPSHOTS                      GROOVE 
    METRICS                        GROOVE 
    PROJECT_MEASURES_OLD           GROOVE 
    RULES                          GROOVE 
    RULES_PARAMETERS               GROOVE 
    PROJECT_LINKS                  GROOVE 
    USERS                          GROOVE 
    RULES_PROFILES                 GROOVE 
    ACTIVE_RULES                   GROOVE 
    ACTIVE_RULE_PARAMETERS         GROOVE 
    SNAPSHOT_SOURCES               GROOVE 
    EVENTS                         GROOVE 
    ALERTS                         GROOVE 
    PROPERTIES                     GROOVE 
    MEASURE_DATA                   GROOVE 
    GROUPS                         GROOVE 
    GROUPS_USERS                   GROOVE 
    GROUP_ROLES                    GROOVE 
    USER_ROLES                     GROOVE 
    DEPENDENCIES                   GROOVE 
    QUALITY_MODELS                 GROOVE 
    CHARACTERISTICS                GROOVE 
    CHARACTERISTIC_EDGES           GROOVE 
    CHARACTERISTIC_PROPERTIES      GROOVE 
    ACTIVE_DASHBOARDS              GROOVE 
    DASHBOARDS                     GROOVE 
    WIDGETS                        GROOVE 
    WIDGET_PROPERTIES              GROOVE 
    ACTIVE_RULE_CHANGES            GROOVE 
    ACTIVE_RULE_PARAM_CHANGES      GROOVE 
    MANUAL_MEASURES                GROOVE 
    LOADED_TEMPLATES               GROOVE 
    ACTION_PLANS                   GROOVE 
    DOCUMENT                       GROOVE 
    SNAPSHOT_DATA                  GROOVE 
    DUPLICATIONS_INDEX             GROOVE 
    ISSUES                         GROOVE 
    ISSUE_CHANGES                  GROOVE 
    PROJECT_MEASURES               GROOVE 
    FUNK                           GROOVE 
    ACTIVE_RULE_NOTES              GROOVE 
    RULE_NOTES                     GROOVE 
    AUTHORS                        GROOVE 
    RESOURCE_INDEX                 GROOVE 
    SEMAPHORES                     GROOVE 
    MEASURE_FILTERS                GROOVE 
    MEASURE_FILTER_FAVOURITES      GROOVE 
    GRAPHS                         GROOVE 
    NOTIFICATIONS                  GROOVE 
    
    51 rows selected. 
    Je refais la même chose avec votre seconde fonction, celle avec le like (c'est celle qui m'intéresse) et la même chose, même résultat (50 tables dont 49 non concernée) ; en fait je voudrais rechercher l'ensemble des colonnes ayant été impactées par l'insert du caractère spécial ¿ dans la base :

    Pouvez vous svp m'aider ? J'utilise ORACLE version 11G. En vous remerciant d'avance.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    31
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2010
    Messages : 31
    Points : 57
    Points
    57
    Par défaut
    Bonsoir à tous,

    Pour avoir traité le cas une fois, j'ajouterais également le test sur une colonne de type 'CLOB'...

Discussions similaires

  1. recherche chaîne de caractères dans PDF
    Par KSuupp dans le forum VB.NET
    Réponses: 3
    Dernier message: 23/02/2012, 09h28
  2. [AC-2000] Recherche chaîne de caractères dans une table
    Par tibogaet dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 09/01/2011, 12h38
  3. recherche chaîne de caractères
    Par jager57 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 18/08/2008, 15h52
  4. [Word/BDD] Rechercher chaînes de caractères ?
    Par VectNolo dans le forum Word
    Réponses: 11
    Dernier message: 15/08/2008, 23h36
  5. [AS/400] Recherche chaînes de caractères
    Par DevDX dans le forum Cobol
    Réponses: 13
    Dernier message: 14/08/2008, 15h04

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