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

  1. #1
    Membre confirmé Avatar de cantador
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2006
    Messages : 569
    Points : 484
    Points
    484
    Par défaut procédure stockée : mise à jour de deux champs, l'un avec une valeur, l'autre avec le contenu d'un autre champ
    Bonjour à tous,

    petit souci avec une procédure stockée :

    j'ai deux tables :

    PACMAN avec quatre champs :

    ICOM varchar(5)
    RCAD varchar(6)
    VIG INTEGER
    DPL DATE

    et une autre

    PLAYER avec trois champs:

    ICOM varchar(5)
    RCAD varchar(6)
    DPL DATE

    lorsque la relation est vraie entre les champs ICOM et RCAD, je souhaite stocker à la fois 1 dans le champ VIG de PACMAN et
    mettre la date de DPL de PLAYER dans le champ DPL de PACMAN.

    j'ai pour habitude d'utiliser EMS, comme gestionnaire de base de données (avec Firebird 2.5)
    Or, ma version ne supporte pas ni les SET TERM, ni le EXECUTE BLOCK

    seule solution créer une PROCEDURE :

    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
     
    CREATE PROCEDURE UPDATE_PACMAN
     
    AS
      declare variable V_ICOM CHAR(05);
      declare variable V_RCAD (06);
      declare variable V_DPL DATE;
     
    BEGIN
     
    FOR SELECT icom, rcad, dpl FROM PLAYER
     
    INTO :v_icom, :v_rcad, :v_dpl
     
    DO BEGIN
     
    UPDATE PACMAN
    SET dpl =:v_dpl, vig=1
    WHERE icom =:v_icom and rcad =:v_rcad;
     
    END
     
    SUSPEND;
    END
    ;
    la compilation est bonne et la procédure est bien créée
    MAIS à l'exécution, elle boucle indéfiniment et bien entendu ne stocke rien dans PACMAN..
    ??

    merci de votre aide

  2. #2
    Membre confirmé Avatar de cantador
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2006
    Messages : 569
    Points : 484
    Points
    484
    Par défaut
    à noter qu'avec un EXECUTE BLOCK sur FlameRobin, la compilation est bonne
    mais elle boucle également indéfiniment..

  3. #3
    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 378
    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 378
    Points : 19 054
    Points
    19 054
    Par défaut
    Salut Cantador.

    Je suis sous FireBird 3.0.0.
    Voici un exemple qui fonctionne très bien chez moi :
    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
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    CREATE DATABASE '..\Data\Base.fdb' page_size 4096 DEFAULT CHARACTER SET ISO8859_1;
     
    -- =============================
    -- Création de la table 'PACMAN'
    -- =============================
     
    CREATE TABLE pacman (
      ICOM        CHAR(05)   NOT NULL,
      RCAD        CHAR(06)   NOT NULL,
      VIG         INTEGER,
      DPL         DATE
    );
     
    -- =======================
    -- Insertion dans 'PACMAN'
    -- =======================
     
    insert into pacman (icom, rcad, vig, dpl) values ('aaaaa', 'xxxxxx', NULL, NULL);
    insert into pacman (icom, rcad, vig, dpl) values ('bbbbb', 'xxxxxx', NULL, NULL);
    insert into pacman (icom, rcad, vig, dpl) values ('ccccc', 'yyyyyy', NULL, NULL);
    insert into pacman (icom, rcad, vig, dpl) values ('ddddd', 'yyyyyy', NULL, NULL);
     
    insert into pacman (icom, rcad, vig, dpl) values ('ddddd', 'yyyyyy', NULL, NULL);
    insert into pacman (icom, rcad, vig, dpl) values ('ccccc', 'yyyyyy', NULL, NULL);
    insert into pacman (icom, rcad, vig, dpl) values ('bbbbb', 'xxxxxx', NULL, NULL);
    insert into pacman (icom, rcad, vig, dpl) values ('aaaaa', 'xxxxxx', NULL, NULL);
     
    -- ==================
    -- Vidage de 'PACMAN'
    -- ==================
     
    select * from pacman;
     
    ICOM   RCAD            VIG         DPL
    ====== ====== ============ ===========
    aaaaa  xxxxxx       <null>      <null>
    bbbbb  xxxxxx       <null>      <null>
    ccccc  yyyyyy       <null>      <null>
    ddddd  yyyyyy       <null>      <null>
    ddddd  yyyyyy       <null>      <null>
    ccccc  yyyyyy       <null>      <null>
    bbbbb  xxxxxx       <null>      <null>
    aaaaa  xxxxxx       <null>      <null>
     
     
    -- =============================
    -- Création de la table 'PLAYER'
    -- =============================
     
    CREATE TABLE player (
      ICOM        CHAR(05)   NOT NULL,
      RCAD        CHAR(06)   NOT NULL,
      DPL         DATE
    );
     
    -- =======================
    -- Insertion dans 'PLAYER'
    -- =======================
     
    insert into player (icom, rcad, dpl) values ('aaaaa', 'xxxxxx', '2016-09-14');
    insert into player (icom, rcad, dpl) values ('bbbbb', 'xxxxxx', '2016-09-13');
    insert into player (icom, rcad, dpl) values ('ddddd', 'yyyyyy', '2016-09-11');
     
    -- ==================
    -- Vidage de 'PLAYER'
    -- ==================
     
    select * from player;
     
    ICOM   RCAD           DPL
    ====== ====== ===========
    aaaaa  xxxxxx 2016-09-14
    bbbbb  xxxxxx 2016-09-13
    ddddd  yyyyyy 2016-09-11
     
     
    -- ==================================
    -- Requête N°1 : version FireBird 3.0
    -- ==================================
     
    update        pacman as t1
             set  t1.dpl = (select dpl from player as t2 where t2.icom = t1.icom and t2.rcad = t1.rcad),
                  t1.vig = (select 1   from player as t2 where t2.icom = t1.icom and t2.rcad = t1.rcad)
    where exists           (select 1   from player as t2 where t2.icom = t1.icom and t2.rcad = t1.rcad);
     
    commit;
     
    -- ========
    -- Résultat
    -- ========
     
    select * from pacman;
     
    ICOM   RCAD            VIG         DPL
    ====== ====== ============ ===========
    aaaaa  xxxxxx            1 2016-09-14
    bbbbb  xxxxxx            1 2016-09-13
    ccccc  yyyyyy       <null>      <null>
    ddddd  yyyyyy            1 2016-09-11
    ddddd  yyyyyy            1 2016-09-11
    ccccc  yyyyyy       <null>      <null>
    bbbbb  xxxxxx            1 2016-09-13
    aaaaa  xxxxxx            1 2016-09-14
     
    select * from player;
     
    ICOM   RCAD           DPL
    ====== ====== ===========
    aaaaa  xxxxxx 2016-09-14
    bbbbb  xxxxxx 2016-09-13
    ddddd  yyyyyy 2016-09-11
     
     
    -- =======================
    -- Insertion dans 'PACMAN'
    -- =======================
     
    delete from pacman;
     
    insert into pacman (icom, rcad, vig, dpl) values ('aaaaa', 'xxxxxx', NULL, NULL);
    insert into pacman (icom, rcad, vig, dpl) values ('bbbbb', 'xxxxxx', NULL, NULL);
    insert into pacman (icom, rcad, vig, dpl) values ('ccccc', 'yyyyyy', NULL, NULL);
    insert into pacman (icom, rcad, vig, dpl) values ('ddddd', 'yyyyyy', NULL, NULL);
     
    insert into pacman (icom, rcad, vig, dpl) values ('ddddd', 'yyyyyy', NULL, NULL);
    insert into pacman (icom, rcad, vig, dpl) values ('ccccc', 'yyyyyy', NULL, NULL);
    insert into pacman (icom, rcad, vig, dpl) values ('bbbbb', 'xxxxxx', NULL, NULL);
    insert into pacman (icom, rcad, vig, dpl) values ('aaaaa', 'xxxxxx', NULL, NULL);
     
    -- ==================
    -- Vidage de 'PACMAN'
    -- ==================
     
    select * from pacman;
     
    ICOM   RCAD            VIG         DPL
    ====== ====== ============ ===========
    aaaaa  xxxxxx       <null>      <null>
    bbbbb  xxxxxx       <null>      <null>
    ccccc  yyyyyy       <null>      <null>
    ddddd  yyyyyy       <null>      <null>
    ddddd  yyyyyy       <null>      <null>
    ccccc  yyyyyy       <null>      <null>
    bbbbb  xxxxxx       <null>      <null>
    aaaaa  xxxxxx       <null>      <null>
     
     
    commit;
     
    -- ==================================
    -- Requête N°2 : version FireBird 2.0
    -- ==================================
     
    SET TERM $;
     
    execute block
    as
      declare variable v_icom char(05);
      declare variable v_rcad char(06);
      declare variable v_dpl  date;
     
    begin
      for select icom, rcad, dpl from player
      into :v_icom, :v_rcad, :v_dpl
      do update pacman set dpl = :v_dpl, vig=1 where icom = :v_icom and rcad = :v_rcad;
    end$
     
    SET TERM ;$
     
    commit;
     
    -- ========
    -- Résultat
    -- ========
     
    select * from pacman;
     
    ICOM   RCAD            VIG         DPL
    ====== ====== ============ ===========
    aaaaa  xxxxxx            1 2016-09-14
    bbbbb  xxxxxx            1 2016-09-13
    ccccc  yyyyyy       <null>      <null>
    ddddd  yyyyyy            1 2016-09-11
    ddddd  yyyyyy            1 2016-09-11
    ccccc  yyyyyy       <null>      <null>
    bbbbb  xxxxxx            1 2016-09-13
    aaaaa  xxxxxx            1 2016-09-14
     
    select * from player;
     
    ICOM   RCAD           DPL
    ====== ====== ===========
    aaaaa  xxxxxx 2016-09-14
    bbbbb  xxxxxx 2016-09-13
    ddddd  yyyyyy 2016-09-11
     
     
    -- =======================
    -- Insertion dans 'PACMAN'
    -- =======================
     
    delete from pacman;
     
    insert into pacman (icom, rcad, vig, dpl) values ('aaaaa', 'xxxxxx', NULL, NULL);
    insert into pacman (icom, rcad, vig, dpl) values ('bbbbb', 'xxxxxx', NULL, NULL);
    insert into pacman (icom, rcad, vig, dpl) values ('ccccc', 'yyyyyy', NULL, NULL);
    insert into pacman (icom, rcad, vig, dpl) values ('ddddd', 'yyyyyy', NULL, NULL);
     
    insert into pacman (icom, rcad, vig, dpl) values ('ddddd', 'yyyyyy', NULL, NULL);
    insert into pacman (icom, rcad, vig, dpl) values ('ccccc', 'yyyyyy', NULL, NULL);
    insert into pacman (icom, rcad, vig, dpl) values ('bbbbb', 'xxxxxx', NULL, NULL);
    insert into pacman (icom, rcad, vig, dpl) values ('aaaaa', 'xxxxxx', NULL, NULL);
     
    -- ==================
    -- Vidage de 'PACMAN'
    -- ==================
     
    select * from pacman;
     
    ICOM   RCAD            VIG         DPL
    ====== ====== ============ ===========
    aaaaa  xxxxxx       <null>      <null>
    bbbbb  xxxxxx       <null>      <null>
    ccccc  yyyyyy       <null>      <null>
    ddddd  yyyyyy       <null>      <null>
    ddddd  yyyyyy       <null>      <null>
    ccccc  yyyyyy       <null>      <null>
    bbbbb  xxxxxx       <null>      <null>
    aaaaa  xxxxxx       <null>      <null>
     
     
    commit;
     
    -- ===============================
    -- Requête N°3 : procédure stockée
    -- ===============================
     
    SET TERM $;
     
    create procedure maj (i_rcad char(06))
    as
      declare variable v_icom char(05);
      declare variable v_rcad char(06);
      declare variable v_dpl  date;
     
    begin
      for select icom, rcad, dpl from player where rcad = :i_rcad
      into :v_icom, :v_rcad, :v_dpl
      do update pacman set dpl = :v_dpl, vig=1 where icom = :v_icom and rcad = :v_rcad;
    end$
     
    SET TERM ;$
     
    commit;
     
    execute procedure maj('xxxxxx');
     
    -- ========
    -- Résultat
    -- ========
     
    select * from pacman;
     
    ICOM   RCAD            VIG         DPL
    ====== ====== ============ ===========
    aaaaa  xxxxxx            1 2016-09-14
    bbbbb  xxxxxx            1 2016-09-13
    ccccc  yyyyyy       <null>      <null>
    ddddd  yyyyyy       <null>      <null>
    ddddd  yyyyyy       <null>      <null>
    ccccc  yyyyyy       <null>      <null>
    bbbbb  xxxxxx            1 2016-09-13
    aaaaa  xxxxxx            1 2016-09-14
     
    select * from player;
     
    ICOM   RCAD           DPL
    ====== ====== ===========
    aaaaa  xxxxxx 2016-09-14
    bbbbb  xxxxxx 2016-09-13
    ddddd  yyyyyy 2016-09-11
     
     
    exit;
     
    Appuyez sur une touche pour continuer...
    Comme nous n'avons pas le même environnement, c'est peut-être que la différence ce fait.

    Quel est la volumétrie que tu dois traiter (en nombre de ligne) ?
    Tu dis qu'elle boucle indéfiniment. Au bout de combien de temps tu considères que c'est infinie ?
    1 minute, 10 minutes, 1 heure ... Je sais, c'est très relatif pour chacun, mais j'aimerai connaitre ton opinion à ce sujet ?

    Pourquoi dans ta procédure stockée, as-tu mis un "suspend" ?
    C'est utile si tu fais un "select * from nom_de_ta_procédure".
    Mais si tu fais un "execute procedure nom_de_ta_procédure;" cela va ralentir ton traitement de mise à jour.

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

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 030
    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 030
    Points : 40 928
    Points
    40 928
    Billets dans le blog
    62
    Par défaut
    Ote le SUSPEND car ta procédure ne renvoi rien
    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
    Membre confirmé Avatar de cantador
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2006
    Messages : 569
    Points : 484
    Points
    484
    Par défaut
    Comme nous n'avons pas le même environnement, c'est peut-être que la différence ce fait.
    oui, c'est vraisemblable.
    il faudra néanmoins que je fasse la Maj avec la Firebird-2.5.6.27020_0 qui vient de sortir..(la version 3 attendra )

    Quel est la volumétrie que tu dois traiter (en nombre de ligne) ?
    taille des tables :

    PLAYER : 121819
    PACMAN: 242633

    ce n'est pas très volumineux et de plus je n'ai saisi que deux dates dans PLAYER pour tester..

    Pourquoi dans ta procédure stockée, as-tu mis un "suspend" ?
    sauf erreur de ma part, le SUSPEND permet de renvoyer des valeurs..non ?
    j'ai écrit d'autres procédure UPDATE et SUSPEND qui marchent bien...

    Mais, je viens de voir un détail..
    dans la table PACMAN, j'ai des enregistrements avec des valeurs Null dans les champs
    ICOM varchar(5)
    RCAD varchar(6)

    La jointure n'est-elle pas perturbée de ce fait ?
    @+

  6. #6
    Membre confirmé Avatar de cantador
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2006
    Messages : 569
    Points : 484
    Points
    484
    Par défaut
    j'ai dupliqué la table PACMAN et viré tous les enregistrements avec des liens Null
    cela ne change rien..

  7. #7
    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 378
    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 378
    Points : 19 054
    Points
    19 054
    Par défaut
    Salut Cantador.

    Peux-tu nous communiquer le descriptif exacte de tes deux tables, avec un jeu d'essai représentatif de ce que tu essayes de faire ?

    Ce que tu peux faire, si le NULL te perturbe, c'est de faire un rejet dans le select :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for select icom, rcad, dpl from player where rcad = :i_rcad and icom is not null
    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  8. #8
    Membre confirmé Avatar de cantador
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2006
    Messages : 569
    Points : 484
    Points
    484
    Par défaut
    Peux-tu nous communiquer le descriptif exacte de tes deux tables, avec un jeu d'essai représentatif de ce que tu essayes de faire ?
    il n'a que deux enregistrements de la table PACMAN (pour l'instant..) qui répondent à la condition des deux jointures

    Ce que tu peux faire, si le NULL te perturbe, c'est de faire un rejet dans le select :
    J'ai testé ce point (voir mon post précédent)

    Tu as raison pour le SUSPEND
    http://www.janus-software.com/fbmanu...psql&topic=104

    ce qui donne maintenant :

    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
     
    CREATE PROCEDURE UPDATE_PACMAN
     
    AS
      declare variable V_ICOM CHAR(05);
      declare variable V_RCAD (06);
      declare variable V_DPL DATE;
     
    BEGIN
     
    FOR SELECT icom, rcad, dpl FROM PLAYER
    WHERE icom is not Null                            (je  ne teste que icom puisque si icom est null alors rcad est null aussi)
     
    INTO :v_icom, :v_rcad, :v_dpl
     
    DO BEGIN
     
    UPDATE PACMAN
    SET dpl =:v_dpl, vig=1
    WHERE icom =:v_icom and rcad =:v_rcad;
     
    END
     
    ;
    MAIS à l'exécution, c'est toujours pareil..
    ?
    @+

  9. #9
    Membre confirmé Avatar de cantador
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2006
    Messages : 569
    Points : 484
    Points
    484
    Par défaut
    Si je filtre les deux tables avec les critères de PLAYER (icom et rcad)
    j'obtiens bien les deux enregistrements

  10. #10
    Membre confirmé Avatar de cantador
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2006
    Messages : 569
    Points : 484
    Points
    484
    Par défaut
    je viens d'avancer un peu :

    ce code marche :

    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
     
     
    CREATE PROCEDURE UPDATE_PACMAN
     
    AS
      declare variable V_ICOM CHAR(05);
      declare variable V_RCAD (06);
      declare variable V_DPL DATE;
     
    BEGIN
     
    FOR SELECT icom, rcad, dpl FROM PLAYER
    WHERE dpl is not Null                            (je  teste si la date n''est pas nulle !} 
     
    INTO :v_icom, :v_rcad, :v_dpl
     
    DO BEGIN
     
    UPDATE PACMAN
    SET dpl =:v_dpl, vig=1
    WHERE icom =:v_icom and rcad =:v_rcad;
     
    END
     
    ;
    En fait les deux conditions sont indépendantes l'une de l'autre
    si la jointure est bonne alors vig doit stocker 1 sans conditions supplémentaires
    mais si et seulement si la date n'est pas nulle alors on la stocke..

    le code fonctionne mais le WHERE en entrée fait que seuls les enregistrements ayant une date non nulle stockent 1 dans Vig
    aie !

    il faudrait pouvoir écrire :
    SET dpl =:v_dpl si la jointure est VRAIE

    et

    SET vig=1, si la jointure est VRAIE et si la date n'est pas nulle

    ?

  11. #11
    Membre confirmé Avatar de cantador
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2006
    Messages : 569
    Points : 484
    Points
    484
    Par défaut
    Nom : sieste.jpg
Affichages : 378
Taille : 12,7 Ko

    rrrrrrrrrrrrhhhhhhhhhhh...

  12. #12
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 030
    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 030
    Points : 40 928
    Points
    40 928
    Billets dans le blog
    62
    Par défaut
    c'est peut être un UPDATE OR INSERT que tu veux faire plutôt ?
    Quelle jointure ? j'en voit pas dans le code
    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

  13. #13
    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 378
    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 378
    Points : 19 054
    Points
    19 054
    Par défaut
    Salut à tous.

    @ Cantador : Je trouve que tes explications sont nébuleuses (rien à voir avec le cloud).

    1) il y a une erreur dans ta procédure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    declare variable V_RCAD (06);
    Tu as oublié de mettre char.

    2) pour ce qui est de mon exemple, j'ai mis partout char.
    C'est-à-dire dans la table et dans la procédure stockée.
    Le mieux est de toujours mettre la même chose, pour rester cohérent.
    Si tu mets varchar alors dans la procédure, il faut aussi mettre varchar.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    declare variable V_ICOM VARCHAR(05);
    declare variable V_RCAD VARCHAR(06);
    3) tu ne vas pas me faire croire que si la date est à null que la procédure se met à boucler ?

    4) De quelle condition parles-tu ?
    Citation Envoyé par Cantador
    En fait les deux conditions sont indépendantes l'une de l'autre
    Je te ferais remarquer que dans le select que je t'ai donné, la seule condition est celle du passage du paramètre sur la colonne "rcad".
    Mais je suppose que ce n'est pas de cela dont tu parles.

    5) Encore une fois, que veux dire sans condition supplmentaire ?
    Citation Envoyé par Cantador
    si la jointure est bonne alors vig doit stocker 1 sans conditions supplémentaires
    mais si et seulement si la date n'est pas nulle alors on la stocke..
    Surtout que là, tu dis "sans condition supplémentaire , mais tu en as une sur la date.

    Pas très clair !

    6) De quel where parles-tu, vu qu'il y en as deux ?
    [quote="Cantador"]le code fonctionne mais le WHERE en entrée fait que seuls les enregistrements ayant une date non nulle stockent 1 dans Vig[.quote]
    Celui du select ou celui de l'update ?

    7) une jointure, dans cet exemple, n'est ni vrai ni fausse.
    Citation Envoyé par Cantador
    il faudrait pouvoir écrire : SET dpl =:v_dpl si la jointure est VRAIE
    On récupère la ligne sélectionnable à partir la table "Player".
    Le couple (icom ; rcad) extrait de la table "Player" va servir à faire la jointure sur la table "Pacman".
    Seul les lignes répondant à ce critère seront impactées par le update.

    J'espère que tu as mis le couple (icom ; rcad) en tant que clef primaire de ta table "Pacman".

    Donc si tu veux forcer la colonne dpl à 1 dans tous les cas, il n'est nulle besoin de faire "where dpl is not null" sur la table "Player".

    8) là, tu n'es pas très logique.
    Citation Envoyé par Cantador
    SET vig=1, si la jointure est VRAIE et si la date n'est pas nulle
    On ne vient pas modifier une ligne, en mettant par exemple la date à null, puis dire que la colonne vig ne sera pas impacté.
    C'est soit tu mets vig=1 et tu renseignes la date.
    Ou si la date est nulle, tu ne modifies rien dans la ligne.

    @ SergioMaster : Cantador nomme jointure, la relation qui a été faite entre le select et l'update, par l'intermédiaire des variables v_icom et v_rcad.

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

  14. #14
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 030
    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 030
    Points : 40 928
    Points
    40 928
    Billets dans le blog
    62
    Par défaut
    Bonjour,
    Citation Envoyé par Artemus24 Voir le message
    @ Cantador : Je trouve que tes explications sont nébuleuses.

    @ SergioMaster : Cantador nomme jointure, la relation qui a été faite entre le select et l'update, par l'intermédiaire des variables v_icom et v_rcad.
    j'avais bien compris que c'était le cas mais le terme de jointure me parait inapproprié, la clause WHERE de l'update

    En fait les deux conditions sont indépendantes l'une de l'autre
    si la jointure est bonne alors vig doit stocker 1 sans conditions supplémentaires
    mais si et seulement si la date n'est pas nulle alors on la stocke..
    Stocker !?
    le code fonctionne mais le WHERE en entrée fait que seuls les enregistrements ayant une date non nulle stockent 1 dans Vig
    Normal c'est qui est demandé, puisque seules les lignes ayant la colonne date non nulle sont sélectionnées
    il faudrait pouvoir écrire :
    SET dpl =:v_dpl si la jointure est VRAIE
    rien n'empêche de le rajouter , ce qui est d'ailleurs écrit dans cette procédure
    SET vig=1, si la jointure est VRAIE et si la date n'est pas nulle
    c'est obligatoirement le cas puisque seule les dates non nulles sont sélectionnées

    et puis, s'il y a des conditions supplémentaires le IF (condition) THEN .... ELSE ça existe
    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

  15. #15
    Membre confirmé Avatar de cantador
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2006
    Messages : 569
    Points : 484
    Points
    484
    Par défaut
    Bonjour Artemus24,

    tout d'abord, c'est de la faute de SergioMaster qui m'a refilé le virus des procédure stockées..
    Du coup, j'en use et j'en abuse dans mes constructions !
    Enfin, j'exagère un peu, je les trouve agréables en tant que développeur et administrateur dès l'instant où elle ne me servent que ponctuellement.
    On peut les lancer directement sur le serveur et bénéficier de sa puissance de calcul.

    Je te rejoins sur un point :
    S'il faut faire des clics tous les jours, ça devient rasoir et donc il faut imaginer d'autre solutions
    (ce que je fais d'ailleurs, en les lançant à travers des services ou des tâche windows via Delphi)
    j'ai mis dans mes tablettes également le CREATE FUNCTION avec la version 3 de Firebird..

    après ce petit aparté, revenons à nos moutons :

    1) il y a une erreur dans ta procédure :
    c'est un mauvais copier coller..

    Si tu mets varchar alors dans la procédure, il faut aussi mettre varchar.
    oui, c'est bien des VARCHAR que j'utilise.

    On ne vient pas modifier une ligne, en mettant par exemple la date à null, puis dire que la colonne vig ne sera pas impacté.
    C'est soit tu mets vig=1 et tu renseignes la date.
    Ou si la date est nulle, tu ne modifies rien dans la ligne.
    Les choses sont bien claires dans ma tête.
    Cette procédure ne sortant rien, j'ai tenté de mettre un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    WHERE dpl is not Null
    juste pour voir ce que ça faisait..
    et il s'avère que ça fonctionne (les deux en enregistrements se sont bien stockés dans PACMAN, date et vig)
    car ce n'est pas tout à fait ce que veux faire !
    cet essai m'a permis de voir que les conditions de cette procédure ne sont pas bonnes..

    En fait, lorsque la relation entre les champs ICOM et RCAD est établie.
    la procédure doit faire deux choses :

    - un INSERT INTO de 1 systématique dans le champ VIG de PACMAN
    et
    - un UPDATE du champ DPL de PACMAN, si le champ DPL de PLAYER n'est pas Nul.

    Autrement dit, ça veut dire, une fois cette procédure exécutée, il devra apparaître dans PACMAN
    trois types d'enregistrements :

    - VIG = Null et DPL = Null (ceux qui ne sont pas en relation)

    - VIG = 1 et DPL = Null (ceux en relation mais avec DPL = Nul de PLAYER)

    - VIG = 1 et DPL non Null (ceux en relation et DPL non Nul de PLAYER)

    PS: quand j'écris DPL non Nul, cela signifie qu'une date est renseignée.
    Je précise également que les champs VIG de PACMAN et DPL de PACMAN et PLAYER
    sont vidés au préalable.
    je préfère un UPDATE pour le champ DPL, car il est possible que certaine dates bougent après coup
    alors que VIG est béton.

    voilà !

  16. #16
    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 378
    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 378
    Points : 19 054
    Points
    19 054
    Par défaut
    Salut à Tous.

    Citation Envoyé par Cantador
    tout d'abord, c'est de la faute de SergioMaster qui m'a refilé le virus des procédure stockées..
    Et alors ? En quoi est-ce mal ? J'aime bien les procédures stockées aussi !

    Citation Envoyé par Cantador
    Du coup, j'en use et j'en abuse dans mes constructions !
    Coté performance, ce n'est pas ce qu'il y a de mieux à faire.
    Une bonne requête fait tout aussi bien l'affaire.
    La procédure stockée doit être utilisé quand tu ne peux pas faire autrement par les requêtes.

    Citation Envoyé par Cantador
    je les trouve agréables en tant que développeur et administrateur dès l'instant où elle ne me servent que ponctuellement.
    En somme, tu veux écrire un traitement où tu peux mettre des "if ... then ... else", des boucles, et autres instructions programmables.

    Citation Envoyé par Cantador
    S'il faut faire des clics tous les jours, ça devient rasoir et donc il faut imaginer d'autre solutions
    Sous windows, il y a le "planificateur des tâches" et sous linux, il y a la "crontab".
    Tu mets en relation une heure dans ta journée et un script, et il va se déclencher régulièrement.
    Sous MySql, tu as les événements. C'est pareil dans le principe.

    Citation Envoyé par Cantador
    oui, c'est bien des VARCHAR que j'utilise.
    Ta réponse est incomplète. Si tu mets des varchar dans les tables, pour resté cohérent, il faut aussi mettre des varchar dans la procédure stockée.

    Citation Envoyé par Cantador
    Cette procédure ne sortant rien, ...
    C'est là où tu es nébuleux. Pourquoi n'obtiens-tu pas des résultats ?
    Tu dis simplement que la procédure boucle indéfiniment. Or, le test que j'ai fait chez moi, démontre qu'il n'y a aucun problème avec la procédure.
    C'est pourquoi, j'ai demandé la volumétrie de ta table, et tu m'as indiqué une petite volumétrie. Donc ce n'est pas cela. Alors c'est quoi le problème ?
    As-tu un ordinateur qui rame, une priorité extrêmement faible à l'exécution, ou je ne sais quoi d'autre ?

    Citation Envoyé par Cantador
    et il s'avère que ça fonctionne ...
    Donc, la procédure ne boucle plus indéfiniement, c'est bien cela ? Et en plus, tu obtiens le résultat attendu !
    Tu as de la chance, car je reste sur ma faim, de ne pas connaitre les causes de tes problèmes.

    Citation Envoyé par Cantador
    car ce n'est pas tout à fait ce que veux faire ! cet essai m'a permis de voir que les conditions de cette procédure ne sont pas bonnes.
    C'était ta demande initiale. Comment veux-tu que je devine ce que tu as dans la tête ?

    Citation Envoyé par Cantador
    En fait, lorsque la relation entre les champs ICOM et RCAD est établie.
    Ce ne sont pas des champs mais des colonnes, ce ne sont pas des enregistrements mais des lignes.
    Et on ne parle pas de relation, mais de jointures entre tables.
    Tu n'es pas en phase avec le jargon des bases de données.

    Citation Envoyé par Cantador
    - un INSERT INTO de 1 systématique dans le champ VIG de PACMAN
    et
    - un UPDATE du champ DPL de PACMAN, si le champ DPL de PLAYER n'est pas Nul.
    Un "et" logique signifie que la première et seconde condition doivent être toutes les deux vraies.
    Je prends des précautions car tu n'es pas très clair dans tes explications.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Si j'ai trouvé la ligne dans la table Player alors
    faire
    	mettre 1 dans la colonne "vig".
    
    	Si la date (dpl) de la table Player est différente de NULL alors
    	faire
    		renseigner la colonne dpl de la table Pacman à partir de la colonne dpl de la table Player.
    	fin_faire
    	sinon
    	faire
    		ne pas modifier la colonne dpl de la table Pacman.
    	fin_faire
    fin_faire.
    Et voici la 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
    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
    CREATE DATABASE '..\Data\Base.fdb' page_size 4096 DEFAULT CHARACTER SET ISO8859_1;
     
    -- =============================
    -- Création de la table 'PACMAN'
    -- =============================
     
    CREATE TABLE pacman
    ( ICOM   VARCHAR(05),
      RCAD   VARCHAR(06),
      VIG    INTEGER,
      DPL    DATE
    );
     
    -- =======================
    -- Insertion dans 'PACMAN'
    -- =======================
     
    insert into pacman (icom, rcad, vig, dpl) values ('aaaaa', 'xxxxxx', NULL, '2016-09-01');
    insert into pacman (icom, rcad, vig, dpl) values ('bbbbb', 'xxxxxx', NULL, '2016-09-01');
    insert into pacman (icom, rcad, vig, dpl) values ('ccccc', 'yyyyyy', NULL, '2016-09-01');
    insert into pacman (icom, rcad, vig, dpl) values ('ddddd', 'yyyyyy', NULL, '2016-09-01');
     
    insert into pacman (icom, rcad, vig, dpl) values ('ddddd', 'yyyyyy', NULL, '2016-09-01');
    insert into pacman (icom, rcad, vig, dpl) values ('ccccc', 'yyyyyy', NULL, '2016-09-01');
    insert into pacman (icom, rcad, vig, dpl) values ('bbbbb', 'xxxxxx', NULL, '2016-09-01');
    insert into pacman (icom, rcad, vig, dpl) values ('aaaaa', 'xxxxxx', NULL, '2016-09-01');
     
    -- ==================
    -- Vidage de 'PACMAN'
    -- ==================
     
    select * from pacman;
     
    ICOM   RCAD            VIG         DPL
    ====== ====== ============ ===========
    aaaaa  xxxxxx       <null> 2016-09-01
    bbbbb  xxxxxx       <null> 2016-09-01
    ccccc  yyyyyy       <null> 2016-09-01
    ddddd  yyyyyy       <null> 2016-09-01
    ddddd  yyyyyy       <null> 2016-09-01
    ccccc  yyyyyy       <null> 2016-09-01
    bbbbb  xxxxxx       <null> 2016-09-01
    aaaaa  xxxxxx       <null> 2016-09-01
     
    commit;
     
    -- =============================
    -- Création de la table 'PLAYER'
    -- =============================
     
    CREATE TABLE player (
      ICOM   VARCHAR(05),
      RCAD   VARCHAR(06),
      DPL    DATE
    );
     
    -- =======================
    -- Insertion dans 'PLAYER'
    -- =======================
     
    insert into player (icom, rcad, dpl) values ('aaaaa', 'xxxxxx', NULL);
    insert into player (icom, rcad, dpl) values ('bbbbb', 'xxxxxx', '2016-09-13');
    insert into player (icom, rcad, dpl) values ('ddddd', 'yyyyyy', '2016-09-11');
     
    -- ==================
    -- Vidage de 'PLAYER'
    -- ==================
     
    select * from player;
     
    ICOM   RCAD           DPL
    ====== ====== ===========
    aaaaa  xxxxxx      <null>
    bbbbb  xxxxxx 2016-09-13
    ddddd  yyyyyy 2016-09-11
     
    commit;
     
    -- =================
    -- procédure stockée
    -- =================
     
    SET TERM $;
     
    create procedure maj
    as
      declare variable v_icom varchar(05);
      declare variable v_rcad varchar(06);
      declare variable v_dpl  date;
     
    begin
      for  select icom, rcad, dpl from player
      into :v_icom, :v_rcad, :v_dpl
      do   update pacman set dpl = iif(:v_dpl is null,dpl,:v_dpl), vig=1 where icom = :v_icom and rcad = :v_rcad;
    end$
     
    SET TERM ;$
     
    commit;
     
    execute procedure maj;
     
    -- ========
    -- Résultat
    -- ========
     
    select * from pacman;
     
    ICOM   RCAD            VIG         DPL
    ====== ====== ============ ===========
    aaaaa  xxxxxx            1 2016-09-01
    bbbbb  xxxxxx            1 2016-09-13
    ccccc  yyyyyy       <null> 2016-09-01
    ddddd  yyyyyy            1 2016-09-11
    ddddd  yyyyyy            1 2016-09-11
    ccccc  yyyyyy       <null> 2016-09-01
    bbbbb  xxxxxx            1 2016-09-13
    aaaaa  xxxxxx            1 2016-09-01
     
    exit;
     
    Appuyez sur une touche pour continuer...
    A titre indicatif, j'ai renseigné la date ('2016-09-01') dans la colonne dpl de la table pacman. Pourquoi ?
    Afin de voir si elle va être écrasée ou pas lors du test de la date à nulle de la table player.

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

  17. #17
    Membre confirmé Avatar de cantador
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2006
    Messages : 569
    Points : 484
    Points
    484
    Par défaut
    tu as raison à propos du vocabulaire parce que au bout d'un moment
    on ne sait plus de quoi on parle..

    Pour ma part, on évoque une jointure lorsque celle-ci est visualisée dans un QueryBuilder
    et de relation lorsque cette dernière est établie par codage.

    Pour les colonnes effectivement on retrouve ce vocabulaire dans la littérature Firebird
    mais pour moi, il s'agit bien de champ provenant d'une table.
    c'est la même chose de toute façon..

    Pour ce qui est de la procédure qui correspond bien désormais à ce que je veux faire (IF THEN ELSE)

    sur EMS dans le SQL EDITOR :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    create procedure maj
    as
      declare variable v_icom varchar(05);
      declare variable v_rcad varchar(06);
      declare variable v_dpl  date;
     
    begin
      for  select icom, rcad, dpl from player
      into :v_icom, :v_rcad, :v_dpl
      do   update pacman set dpl = iif(:v_dpl is null,dpl,:v_dpl), vig=1 where icom = :v_icom and rcad = :v_rcad;
    end$
    ce code crée bien la procédure sans erreur et son exécution également
    mais après avoir effectué le COMMIT, j'ai un message d'erreur :

    Nom : Error Message Firebird.jpg
Affichages : 389
Taille : 24,9 Ko

    puis transaction non terminée, obligé de rebooter le PC. etc..
    et pas de Maj de PACMAN.

    sur FlameRobin (syntaxe différente)

    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
     
     
    SET TERM ^ ;
    create procedure maj
    as
      declare variable v_icom varchar(05);
      declare variable v_rcad varchar(06);
      declare variable v_dpl  date;
     
    begin
      for  select icom, rcad, dpl from player
      into :v_icom, :v_rcad, :v_dpl
      do   update pacman set dpl = iif(:v_dpl is null,dpl,:v_dpl), vig=1 where icom = :v_icom and rcad = :v_rcad;
    END^
     
    SET TERM ; ^
    la procédure se crée bien sans erreur, mais son exécution tourne indéfiniment
    je suis obligé de shunter FlameRobin avec une transaction non terminée, obligé de rebooter le PC etc..
    et pas de Maj de PACMAN

    Pour info, je fais ce test sous seven 32 bits avec Firebird 2.5

    le test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    iif(:v_dpl is null,dpl,:v_dpl)
    me semble curieux,

    la première condition doit être vraie pour que la 2ème soit vraie, sinon c'est la troisième c'est bien ça ?

    or tu testes si v_dpl is null

    j'aurais mis is Not Nul

    j'ai testé avec cette variante, mais j'ai toujours le message d'erreur, du coup je ne peux pas connaître le résultat..

    ?

  18. #18
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 030
    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 030
    Points : 40 928
    Points
    40 928
    Billets dans le blog
    62
    Par défaut
    Vérifies ta base, il doit y avoir des transactions mal fermé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

  19. #19
    Membre confirmé Avatar de cantador
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2006
    Messages : 569
    Points : 484
    Points
    484
    Par défaut
    pour info, j'ai 88126 enregistrements de la table PACMAN qui sont en relation (v_icom et c_recad)
    avec la table PLAYER
    je précise que cette relation n'est pas codée dans la base..(il n'y a pas de Foreign Keys)

    @+

  20. #20
    Membre confirmé Avatar de cantador
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2006
    Messages : 569
    Points : 484
    Points
    484
    Par défaut
    @Artemus24

    ça sent une erreur dans ma base de données..
    il s'agit d'une base locale de travail, pas mal triturée

    @+

Discussions similaires

  1. [MySQL] lancement procédure stockée chaque jour à 20h
    Par Vetchostar dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 18/11/2008, 08h27
  2. [1.x] [AJAX] drop_receiving_element et mise à jour de deux zones distinctes
    Par Giovanny Temgoua dans le forum Symfony
    Réponses: 8
    Dernier message: 21/05/2008, 18h29
  3. [Procédure Stockée] mettre à jour plusieurs lignes
    Par PoichOU dans le forum Langage SQL
    Réponses: 15
    Dernier message: 16/05/2007, 16h18
  4. Mise à jour de deux bases de données
    Par antoine1504 dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 29/03/2007, 19h42
  5. Réponses: 1
    Dernier message: 27/04/2006, 18h22

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