Précédent   Forum des professionnels en informatique > Bases de données > Oracle
Oracle Forum Oracle : le serveur, les outils, ... Voir F.A.Q Oracle Tutoriels 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 26/04/2007, 16h16   #1
Invité régulier
 
Inscription : mars 2005
Messages : 32
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 32
Points : 8
Points : 8
Par défaut [oracle 10g] - 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.
Loïck est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/04/2007, 07h02   #2
Responsable Business Intelligence
 
Avatar de kalyparker
 
Femme
Consultant en Business Intelligence
Inscription : janvier 2007
Messages : 1 192
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Activité : Consultant en Business Intelligence

Informations forums :
Inscription : janvier 2007
Messages : 1 192
Points : 2 564
Points : 2 564
Bonjour,

Citation:
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
kalyparker est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/04/2007, 11h16   #3
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Homme Laurent Schneider
Administrateur de base de données
Inscription : décembre 2005
Messages : 2 927
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 927
Points : 4 549
Points : 4 549
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
 
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
laurentschneider est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/05/2007, 15h45   #4
Invité régulier
 
Inscription : mars 2005
Messages : 32
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 32
Points : 8
Points : 8
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.
Loïck est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/05/2007, 16h09   #5
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Homme Laurent Schneider
Administrateur de base de données
Inscription : décembre 2005
Messages : 2 927
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 927
Points : 4 549
Points : 4 549
avec un instr()

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
 
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;
/
laurentschneider 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 02h07.


 
 
 
 
Partenaires

Hébergement Web