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 Firebird Discussion :

Rechercher une chaine dans toutes les tables de la db


Sujet :

SQL Firebird

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2009
    Messages : 23
    Points : 21
    Points
    21
    Par défaut Rechercher une chaine dans toutes les tables de la db
    Bonjour à tous,

    j'ai un souci, je voudrais recherche les occurences d'une chaine de caractère dans tous les champs de toutes les table de ma db

    j'ai une db avec plus de 100 tables. La chaine que je cherche se trouve dans un champs d'une de mes tables, que je ne connais pas

    Merci pour votre aide et conseil

    Cordialement

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 801
    Points
    30 801
    Par défaut
    Tu n'as guère d'autre solution que d'écrire une procédure qui parcourra les tables système pour en extraire le nom des colonnes de type textuel (et celui des tables auxquelles elles appartiennent) pour construire à la volée tes requêtes de recherche...
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2009
    Messages : 23
    Points : 21
    Points
    21
    Par défaut oui
    oui, je pense aussi, un select de la table system RDS$RELATION me donne RDS&NAME_FIELDS
    mais comment boucler sur chacune des réponses de mon select ?

    J'ai besoin d'un coup de pouce

    Cordialement

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 042
    Points : 40 955
    Points
    40 955
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    je me suis piqué au jeu, voici un brouillon

    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
    SET TERM !;
    EXECUTE BLOCK 
    RETURNS (DANSTABLE CHAR(31), DANSCOLONNE CHAR(31) )
    AS
    DECLARE VARIABLE STMT VARCHAR(250) = 'SELECT 1 FROM :DT WHERE :DC = :CS'; 
    DECLARE VARIABLE CHAINE VARCHAR(50);
    DECLARE VARIABLE RESULT SMALLINT;
    BEGIN
     CHAINE='ACHERCHER';
     FOR SELECT r.RDB$FIELD_NAME,
        r.RDB$RELATION_NAME
        FROM RDB$RELATION_FIELDS r LEFT JOIN RDB$FIELDS F ON r.RDB$FIELD_SOURCE = f.RDB$FIELD_NAME
        WHERE r.RDB$SYSTEM_FLAG=0 AND f.RDB$FIELD_TYPE IN (37,14) INTO :DANSCOLONNE,:DANSTABLE
     DO BEGIN 
       EXECUTE STATEMENT (STMT) (DT:=DANSTABLE,DC:=DANSCOLONNE,CS:=CHAINE) INTO :RESULT;    
       IF (RESULT IS NOT NULL) THEN SUSPEND;
     END  
    END!
    SET TERM ; !
    Qui hélas ne fonctionne pas au niveau du EXECUTE STATEMENT je ne sais pas pour quelle raison cela bloque sur les paramètres de ce dernier

    [Edit] passer à la manière plus "classique" a donné de meilleurs résultats, à noter qu'il faut aussi tester la taille de la colonne en fonction de la taille de la chaine à rechercher
    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
    SET TERM !;
    EXECUTE BLOCK 
    RETURNS (DANSTABLE CHAR(31), DANSCOLONNE CHAR(31) )
    AS
    DECLARE VARIABLE STMT VARCHAR(250); 
    DECLARE VARIABLE CHAINE VARCHAR(50);
    DECLARE VARIABLE RESULT SMALLINT;
    BEGIN
     CHAINE='ACHERCHER';
     FOR SELECT r.RDB$FIELD_NAME,
        r.RDB$RELATION_NAME
        FROM RDB$RELATION_FIELDS r LEFT JOIN RDB$FIELDS F ON r.RDB$FIELD_SOURCE = f.RDB$FIELD_NAME
        WHERE r.RDB$SYSTEM_FLAG=0 AND f.RDB$FIELD_TYPE IN (37,14) AND f.RDB$FIELD_LENGTH>=9 
        INTO :DANSCOLONNE,:DANSTABLE
     DO BEGIN 
       STMT='SELECT 1 FROM '||:DANSTABLE||' WHERE '||:DANSCOLONNE||' = ?';
       EXECUTE STATEMENT (STMT) (CHAINE) INTO :RESULT;    
       IF (RESULT IS NOT NULL) THEN SUSPEND;
     END  
    END!
     
    SET TERM ; !
    N.B. je n'ai mis de recherche que dans les variables de type Char et Varchar (37,14) et pas dans les blob text
    N.B. Bis à noter que une seule occurrence de la chaine est cherchée dans chaque table (postulat) si cette chaine peut se retrouver plusieurs fois dans la même table une erreur de "multiple rows in singleton select" va être levée. Dans ce cas deux solutions : soit rajouter changer STMT en SELECT FIRST 1 1 FROM .... soit faire un for select sur le Execute Statement et utiliser par exemple RDB$DB_KEY (char(8)) pour obtenir les "numeros de lignes"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    EXECUTE BLOCK 
    RETURNS (DANSTABLE CHAR(31), DANSCOLONNE CHAR(31),DBKEY CHAR(8) )
    ...
    --DECLARE VARIABLE RESULT SMALLINT;
    ...
       STMT='SELECT RDB$DB_KEY FROM '||:DANSTABLE||' WHERE '||:DANSCOLONNE||' = ?';
       FOR EXECUTE STATEMENT (STMT) (CHAINE) INTO :DBKEY DO   
        IF (DBKEY IS NOT NULL) THEN SUSPEND;
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  5. #5
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 381
    Points : 19 065
    Points
    19 065
    Par défaut
    Salut SergioMaster.

    Dans la forme du "Execute statement" que vous utilisez, cela ne fonctionne pas pour les noms de colonnes ou de tables.
    La substitution de la chaîne de caractères se fait en mettant des quote (ou apostrophe).
    La substitution numérique, quand à elle ne pose aucun problème.

    De ce fait, un nom de colonne ou de table entre quote ne fonctionnera pas.
    Ce genre de substitution ne fonctionne que pour des paramètres comme dans la clause where.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 042
    Points : 40 955
    Points
    40 955
    Billets dans le blog
    62
    Par défaut
    @Artemus, Salut
    Oui je pense que ton explication est la bonne en ce qui concerne mes premiers essais
    (soit le EXECUTE STATEMENT ('SELECT 1 FROM :DT WHERE :DC = :CS') (DT:=DANSTABLE,DC:=DANSCOLONNE,CS:=CHAINE) INTO :RESULT;)
    ce qui est étrange c'est que j'étais persuadé d'avoir vu les remplacements de table et nom de colonne dans un exemple de la doc (comme quoi il faut lire plusieurs fois )
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  7. #7
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 042
    Points : 40 955
    Points
    40 955
    Billets dans le blog
    62
    Par défaut
    Bonjour,
    Après quelques tests plus poussés le RDB$DB_KEY ne donnant pas les résultats escomptés, je me suis rabattu sur ce code qui permet d'obtenir en plus une valeur unique pour rechercher ensuite la ligne dans la table
    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
     
    SET TERM !;
    EXECUTE BLOCK 
    RETURNS (DANSTABLE CHAR(31), DANSCOLONNE CHAR(31),DBKEY CHAR(260))
    AS
    DECLARE VARIABLE STMT VARCHAR(1024); 
    DECLARE VARIABLE CHAINE VARCHAR(250);
    DECLARE VARIABLE RESULT VARCHAR(60);
    DECLARE VARIABLE PK VARCHAR(1024);
     
    BEGIN
     CHAINE='LC60'; -- Chaine à chercher
     FOR SELECT r.RDB$FIELD_NAME,
        r.RDB$RELATION_NAME
        FROM RDB$RELATION_FIELDS r LEFT JOIN RDB$FIELDS F ON r.RDB$FIELD_SOURCE = f.RDB$FIELD_NAME
        WHERE r.RDB$SYSTEM_FLAG=0 AND f.RDB$FIELD_TYPE IN (37,14) AND f.RDB$FIELD_LENGTH>=CHAR_LENGTH(:CHAINE)
        INTO :DANSCOLONNE,:DANSTABLE
     DO BEGIN 
       -- Obtention d'une clé unique  
       STMT='SELECT LIST(TRIM(r.RDB$FIELD_NAME),"||")
             FROM RDB$INDEX_SEGMENTS r 
             WHERE r.RDB$INDEX_NAME=(SELECT i.RDB$INDEX_NAME FROM RDB$INDICES i WHERE i.RDB$RELATION_NAME=? AND i.RDB$UNIQUE_FLAG=1 ROWS 1)';
       EXECUTE STATEMENT (STMT) (:DANSTABLE) INTO :PK;
       IF (PK IS NULL) THEN PK='RDB$DB_KEY';
       -- Recherche   
       STMT='SELECT '||:DANSCOLONNE||','||:PK||' FROM '||:DANSTABLE||' WHERE '||:DANSCOLONNE||' SIMILAR TO "%'||:CHAINE||'%" ';
       FOR EXECUTE STATEMENT STMT INTO :RESULT,:DBKEY 
         DO IF (RESULT IS NOT NULL) THEN SUSPEND;
     END  
    END!
     
    SET TERM ; !
    Seul bémol, pour des clés unique (primaire ou non) composées, toutes les valeurs sont concaténées
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2009
    Messages : 23
    Points : 21
    Points
    21
    Par défaut
    Super merci ça marche !

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2009
    Messages : 23
    Points : 21
    Points
    21
    Par défaut
    oups....

    au fait j'ai un souci, si je veux rechercher un entier plutôt qu'une chaine de caractère : voici mon block d'excution, le problème c'est que je n'ai aucun résultat alors que ma valeur est bien présente

    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
    SET TERM !;
    EXECUTE BLOCK 
    RETURNS (DANSTABLE CHAR(31), DANSCOLONNE CHAR(31) )
    AS
    DECLARE VARIABLE STMT VARCHAR(250); 
    DECLARE VARIABLE CHAINE INTEGER;
    DECLARE VARIABLE RESULT SMALLINT;
    BEGIN
     CHAINE='17044';
     FOR SELECT r.RDB$FIELD_NAME,
        r.RDB$RELATION_NAME
        FROM RDB$RELATION_FIELDS r LEFT JOIN RDB$FIELDS F ON r.RDB$FIELD_SOURCE = f.RDB$FIELD_NAME
        WHERE r.RDB$SYSTEM_FLAG=0 AND f.RDB$FIELD_TYPE IN (37,14) AND f.RDB$FIELD_LENGTH>=5
        INTO :DANSCOLONNE,:DANSTABLE
     DO BEGIN 
       STMT='SELECT FIRST 1 1 FROM '||:DANSTABLE||' WHERE '||:DANSCOLONNE||' = ?';
       EXECUTE STATEMENT (STMT) (CHAINE) INTO :RESULT;    
       IF (RESULT IS NOT NULL) THEN SUSPEND;
     END  
    END!
     
    SET TERM ; !

  10. #10
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 042
    Points : 40 955
    Points
    40 955
    Billets dans le blog
    62
    Par défaut
    PS. merci de ne pas oublier de baliser le code (bouton #)

    Pour un entier, bien que partant sur le même principe, il y a pas mal de chose à changer
    déjà une erreur dans le code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    DECLARE VARIABLE CHAINE INTEGER;
    DECLARE VARIABLE RESULT SMALLINT;
    BEGIN
     CHAINE=17044; // un entier
    ensuite la partie concernant le type de colonne RDB$FIELD_TYPE
    WHEN 7 THEN 'SMALLINT'
    WHEN 8 THEN 'INTEGER'
    WHEN 9 THEN 'QUAD'
    WHEN 10 THEN 'FLOAT'
    WHEN 11 THEN 'D_FLOAT'
    WHEN 12 THEN 'DATE'
    WHEN 13 THEN 'TIME'
    WHEN 14 THEN 'CHAR'
    WHEN 16 THEN 'INT64'
    WHEN 27 THEN 'DOUBLE'
    WHEN 35 THEN 'TIMESTAMP'
    WHEN 37 THEN 'VARCHAR'
    WHEN 40 THEN 'CSTRING'
    WHEN 261 THEN 'BLOB'
    ELSE 'UNKNOWN'
    donc pour ta demande
    il faut que la ligne 13 soit changée ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       WHERE r.RDB$SYSTEM_FLAG=0 AND f.RDB$FIELD_TYPE IN (7,8,16)
    enfin, pour l'EXECUTE STATEMENT j'ai un petit doute, logiquement puisque CHAINE est devenu un ENTIER le remplacement devrait se faire correctement
    au pire lignes 16,17

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    STMT='SELECT FIRST 1 1 FROM '||:DANSTABLE||' WHERE '||:DANSCOLONNE||' = '||:CHAINE;
    EXECUTE STATEMENT (STMT) (CHAINE) INTO :RESULT;
    [Edit] ne sont pas pris en compte les champs calculés,
    de même il serait peut judicieux d'utiliser le RDB$SUB_TYPE plutôt que le RDB$FIELD_TYPE ou ajouter la condition comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AND RDB$SUB_TYPE IN ('SMALLINT','INTEGER','BIGINT')
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  11. #11
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 381
    Points : 19 065
    Points
    19 065
    Par défaut
    Salut à tous.

    Voici ma version sur la recherche dans une chaîne de caractères :
    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    CREATE DATABASE '..\Data\Base.fdb' page_size 4096 DEFAULT CHARACTER SET WIN1252;
     
    -- ***********************
    -- *                     *
    -- *     Jeu d'Essai     *
    -- *                     *
    -- ***********************
     
    -- =============================
    -- Création de la table 'TABONE'
    -- =============================
     
    create table tabone (
        id      integer generated by default as identity not null,
        rang    integer                                  not null,
        chaine  varchar(20)                              not null,
        lib     varchar(20)                              not null,
        primary key (id,rang)
    );
     
    -- =======================
    -- Insertion dans 'TABONE'
    -- =======================
     
    insert into tabone (rang,chaine,lib) values (33,'one',  'un');
    insert into tabone (rang,chaine,lib) values (25,'two',  'deux');
    insert into tabone (rang,chaine,lib) values (12,'three','trois');
    insert into tabone (rang,chaine,lib) values ( 7,'four', 'quatre');
    insert into tabone (rang,chaine,lib) values ( 2,'five', 'trente-trois');
     
    -- ==================
    -- Vidage de 'TABONE'
    -- ==================
     
    select * from tabone;
     
              ID         RANG CHAINE               LIB
    ============ ============ ==================== ====================
               1           33 one                  un
               2           25 two                  deux
               3           12 three                trois
               4            7 four                 quatre
               5            2 five                 trente-trois
     
    commit;
     
    -- =============================
    -- Création de la table 'TABTWO'
    -- =============================
     
    create table tabtwo (
        clef  integer generated by default as identity not null primary key,
        mess  varchar(20)                              not null
    );
     
    -- =======================
    -- Insertion dans 'TABTWO'
    -- =======================
     
    insert into tabtwo (mess) values ('trois-cent');
    insert into tabtwo (mess) values ('quatre-cent');
    insert into tabtwo (mess) values ('cinq-cent');
     
    -- ==================
    -- Vidage de 'TABTWO'
    -- ==================
     
    select * from tabtwo;
     
            CLEF MESS
    ============ ====================
               1 trois-cent
               2 quatre-cent
               3 cinq-cent
     
    commit;
     
    -- ***********************************************
    -- *                                             *
    -- *     Recherche des chaines de caractères     *
    -- *                                             *
    -- ***********************************************
     
    -- =================
    -- Procédure stockée
    -- =================
     
    set term #;
     
    create procedure test (oldstring varchar(20),
                           newstring varchar(20))
    returns  (tab   varchar(20),
              clef  varchar(20),
              tri   varchar(20),
              col   varchar(20),
              id    varchar(20))
    as
      declare stmt  varchar(1024);
    begin
      for select  f.rdb$relation_name,
                  cast(list(trim(s.rdb$field_name),           ',') as varchar(20)),
                  cast(list(trim(s.rdb$field_name), '|| ''-'' ||') as varchar(20))
            from    rdb$relation_fields      as f
      inner join    rdb$relation_constraints as r
              on  r.rdb$relation_name = f.rdb$relation_name
      inner join    rdb$index_segments       as s
              on  s.rdb$index_name = r.rdb$index_name
           where  f.rdb$system_flag = 0
             and  f.rdb$field_id    = 0
             and  r.rdb$constraint_type = 'PRIMARY KEY'
        group by    rdb$relation_name
            into  :tab, :clef, :tri
              do
           begin
     
      for select  r.rdb$field_name
            from    rdb$relation_fields as r
      inner join    rdb$fields          as f
              on  f.rdb$field_name  = r.rdb$field_source
           where  r.rdb$relation_name = :tab
             and  r.rdb$system_flag   = 0
             and  f.rdb$field_type in (14,37)
            into  :col
              do
           begin
     
                  id = null;
                  stmt = 'select cast(list(' || tri || ','','') as varchar(255)) from ' || trim(tab) || ' where ' || trim(col) || ' like ''%' || trim(oldstring) || '%'';';
                  execute statement stmt into :id;
     
                  if (id is not null) then
                  begin
                      stmt = 'update ' || trim(tab) || ' set ' || trim(col) || ' = replace(' || trim(col) || ',''' || trim(oldstring) || ''',''' || trim(newstring) || ''');';
                      execute statement stmt;
                      suspend;
                  end
             end
             end
    end#
     
    set term ;#
     
    commit;
     
    -- =========
    -- Exécution
    -- =========
     
    select tab, clef, col, id from test('trois','huit');
     
    TAB                  CLEF                 COL                  ID
    ==================== ==================== ==================== ====================
    TABONE               ID,RANG              LIB                  3-12,5-2
    TABTWO               CLEF                 MESS                 1
     
     
    -- ========
    -- Résultat
    -- ========
     
    select * from tabone;
     
              ID         RANG CHAINE               LIB
    ============ ============ ==================== ====================
               1           33 one                  un
               2           25 two                  deux
               3           12 three                huit
               4            7 four                 quatre
               5            2 five                 trente-huit
     
    select * from tabtwo;
     
            CLEF MESS
    ============ ====================
               1 huit-cent
               2 quatre-cent
               3 cinq-cent
     
     
    exit;
     
    Appuyez sur une touche pour continuer...
    Pour passer à une valeur numérique, voici le même exemple adapté à cette nouvelle problématique.
    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    CREATE DATABASE '..\Data\Base.fdb' page_size 4096 DEFAULT CHARACTER SET WIN1252;
     
    -- ***********************
    -- *                     *
    -- *     Jeu d'Essai     *
    -- *                     *
    -- ***********************
     
    -- =============================
    -- Création de la table 'TABONE'
    -- =============================
     
    create table tabone (
        id      integer generated by default as identity not null,
        rang    integer                                  not null,
        val     smallint                                 not null,
        primary key (id,rang)
    );
     
    -- =======================
    -- Insertion dans 'TABONE'
    -- =======================
     
    insert into tabone (rang,val) values (33,25);
    insert into tabone (rang,val) values (25,33);
    insert into tabone (rang,val) values (44,12);
    insert into tabone (rang,val) values ( 7,17);
    insert into tabone (rang,val) values (12,45);
     
    -- ==================
    -- Vidage de 'TABONE'
    -- ==================
     
    select * from tabone;
     
              ID         RANG     VAL
    ============ ============ =======
               1           33      25
               2           25      33
               3           44      12
               4            7      17
               5           12      45
     
    commit;
     
    -- =============================
    -- Création de la table 'TABTWO'
    -- =============================
     
    create table tabtwo (
        clef  integer generated by default as identity not null primary key,
        mont  integer                                  not null
    );
     
    -- =======================
    -- Insertion dans 'TABTWO'
    -- =======================
     
    insert into tabtwo (mont) values (17);
    insert into tabtwo (mont) values (12);
    insert into tabtwo (mont) values (25);
     
    -- ==================
    -- Vidage de 'TABTWO'
    -- ==================
     
    select * from tabtwo;
     
            CLEF         MONT
    ============ ============
               1           17
               2           12
               3           25
     
    commit;
     
    -- ********************************************
    -- *                                          *
    -- *     Recherche d'une valeur numérique     *
    -- *                                          *
    -- ********************************************
     
    -- =================
    -- Procédure stockée
    -- =================
     
    set term #;
     
    create procedure test (oldnum integer,
                           newnum integer)
    returns  (tab   varchar(20),
              clef  varchar(20),
              tri   varchar(20),
              col   varchar(20),
              id    varchar(20))
    as
      declare stmt  varchar(1024);
    begin
      for select  f.rdb$relation_name,
                  cast(list(trim(s.rdb$field_name),           ',') as varchar(20)),
                  cast(list(trim(s.rdb$field_name), '|| ''-'' ||') as varchar(20))
            from    rdb$relation_fields      as f
      inner join    rdb$relation_constraints as r
              on  r.rdb$relation_name = f.rdb$relation_name
      inner join    rdb$index_segments       as s
              on  s.rdb$index_name = r.rdb$index_name
           where  f.rdb$system_flag = 0
             and  f.rdb$field_id    = 0
             and  r.rdb$constraint_type = 'PRIMARY KEY'
        group by    rdb$relation_name
            into  :tab, :clef, :tri
              do
           begin
     
      for select  r.rdb$field_name
            from    rdb$relation_fields as r
      inner join    rdb$fields          as f
              on  f.rdb$field_name  = r.rdb$field_source
           where  r.rdb$relation_name = :tab
             and  r.rdb$system_flag   = 0
             and  f.rdb$field_type in (7,8)
            into  :col
              do
           begin
     
                  id = null;
                  stmt = 'select cast(list(' || tri || ','','') as varchar(255)) from ' || trim(tab) || ' where ' || trim(col) || ' = ' || oldnum || ';';
                  execute statement stmt into :id;
     
                  if (id is not null) then
                  begin
                      stmt = 'update ' || trim(tab) || ' set ' || trim(col) || ' = ' || newnum || ' where ' || trim(col) || ' = ' || oldnum || ';';
                      execute statement stmt;
                      suspend;
                  end
             end
             end
    end#
     
    set term ;#
     
    commit;
     
    -- =========
    -- Exécution
    -- =========
     
    select tab, clef, col, id from test(12,128);
     
    TAB                  CLEF                 COL                  ID
    ==================== ==================== ==================== ====================
    TABONE               ID,RANG              RANG                 5-12
    TABONE               ID,RANG              VAL                  3-44
    TABTWO               CLEF                 MONT                 2
     
     
    -- ========
    -- Résultat
    -- ========
     
    select * from tabone;
     
              ID         RANG     VAL
    ============ ============ =======
               1           33      25
               2           25      33
               3           44     128
               4            7      17
               5          128      45
     
    select * from tabtwo;
     
            CLEF         MONT
    ============ ============
               1           17
               2          128
               3           25
     
     
    exit;
     
    Appuyez sur une touche pour continuer...
    Hormis les tables qui ne sont pas pareil, il faut changer les lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    create procedure test (oldstring varchar(20),
                           newstring varchar(20))
    par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    create procedure test (oldnum integer,
                           newnum integer)
    Puis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    and  f.rdb$field_type in (14,37)
    par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    and  f.rdb$field_type in (7,8)
    et enfin :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    stmt = 'select cast(list(' || tri || ','','') as varchar(255)) from ' || trim(tab) || ' where ' || trim(col) || ' like ''%' || trim(oldstring) || '%'';';
    stmt = 'update ' || trim(tab) || ' set ' || trim(col) || ' = replace(' || trim(col) || ',''' || trim(oldstring) || ''',''' || trim(newstring) || ''');';
    par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    stmt = 'select cast(list(' || tri || ','','') as varchar(255)) from ' || trim(tab) || ' where ' || trim(col) || ' = ' || oldnum || ';';
    stmt = 'update ' || trim(tab) || ' set ' || trim(col) || ' = ' || newnum || ' where ' || trim(col) || ' = ' || oldnum || ';';
    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2009
    Messages : 23
    Points : 21
    Points
    21
    Par défaut
    Thanks SergioMaster

    ça marche nickel

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

Discussions similaires

  1. Rechercher une valeur dans toutes les tables
    Par okdadi dans le forum Informix
    Réponses: 2
    Dernier message: 20/12/2014, 09h27
  2. rechercher une valeur dans toutes les tables
    Par touness dans le forum Débuter
    Réponses: 1
    Dernier message: 01/12/2011, 11h58
  3. recherche de texte dans toutes les tables d'une DATABASE
    Par pcouas dans le forum Langage SQL
    Réponses: 1
    Dernier message: 23/09/2010, 08h43
  4. Réponses: 1
    Dernier message: 06/11/2009, 16h54
  5. Rechercher une donnée dans toutes les tables d'une BDD
    Par TheYoMan dans le forum Paradox
    Réponses: 2
    Dernier message: 23/10/2008, 20h24

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