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 :

Erreur dans 1 exec Block


Sujet :

SQL Firebird

  1. #1
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 901
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 901
    Points : 6 026
    Points
    6 026
    Par défaut Erreur dans 1 exec Block
    Bonjour,

    J'ai 1 classique besoin de transfert de données entre 2 bases, les tables source & cible se ressemblent, mais la normalisation est passée par là
    source:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE TABLE AFFECTATION (
       AFF_ANNEE INTEGER NOT NULL,
       ATE_REF VARCHAR(10) NOT NULL,
       OUV_NUMSS NUMSS NOT NULL
    );
    Cible:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE TABLE AFFECTATION (
       AFF_ANNEE INTEGER NOT NULL,
       OUV_CLE INTEGER NOT NULL,
       ATE_CLE INTEGER NOT NULL
    );
    Je tente ce code (largement inspiré d'échanges sur le forum en mode singe voit-singe fait):
    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
    AS
    DECLARE VARIABLE C1 int ;
    DECLARE VARIABLE C2 varchar(10);
    DECLARE VARIABLE C3 char(13);
    DECLARE VARIABLE C4 int ;
    DECLARE VARIABLE C5 int ;
    BEGIN
    FOR EXECUTE STATEMENT 'SELECT AFF_ANNEE,ATE_REF,OUV_NUMSS FROM AFFECTATION'
           ON EXTERNAL 'localhost/3050:C:\FB2.17\GESTCAT2-1.FDB'
          AS USER 'SYSDBA' PASSWORD 'masterkey'
          INTO :C1,:C2,:C3;
    DO
     select OUV_CLE from OUVRIER where OUV_NUMSS=:C3 INTO :C4
     select ATE_CLE FROM ATELIER WHERE ATE_REF_INTERNE=:C2 INTO :C5
     INSERT INTO AFFECTATION VALUES(:c1,:c4,:c5);
    END!
    SET TERM ;!
    et sous Flamerobin, ça tousse
    Error: *** IBPP::SQLException ***
    Context: Statement:repare(
    EXECUTE BLOCK
    AS
    DECLARE VARIABLE C1 int ;
    DECLARE VARIABLE C2 varchar(10);
    DECLARE VARIABLE C3 char(13);
    DECLARE VARIABLE C4 int ;
    DECLARE VARIABLE C5 int ;
    BEGIN
    FOR EXECUTE STATEMENT 'SELECT AFF_ANNEE,ATE_REF,OUV_NUMSS FROM AFFECTATION'
    ON EXTERNAL 'localhost/3050:C:\FB2.17\GESTCAT2-1.FDB'
    AS USER 'SYSDBA' PASSWORD 'masterkey'
    INTO :C1,:C2,:C3;
    DO
    select OUV_CLE from OUVRIER where OUV_NUMSS=:C3 INTO :C4
    select ATE_CLE FROM ATELIER WHERE ATE_REF_INTERNE=:C2 INTO :C5
    INSERT INTO AFFECTATION VALUES(:c1,:c4,:c5);
    END )
    Message: isc_dsql_prepare failed

    SQL Message : -104
    Invalid token

    Engine Code : 335544569
    Engine Message :
    Dynamic SQL Error
    SQL error code = -104
    Token unknown - line 11, column 8
    ON
    La ligne 11 étant le ON EXTERNAL ...

    Une idée? Est-ce lié à la version 2.1 utilisée?

    Merci de vos retours.
    "Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
    -----------------------
    Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
    Usus magister est optimus

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 036
    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 036
    Points : 40 941
    Points
    40 941
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    ON EXTERNAL a été ajouté avec la version 2.5 https://firebirdsql.org/refdocs/lang...at-on-external

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
           STMT= 'SELECT AFF_ANNEE,ATE_REF,OUV_NUMSS FROM AFFECTATION';
           FOR EXECUTE STATEMENT STMT
           ON EXTERNAL 'alias'
          INTO :C1,:C2,:C3;
    Je préfère nettement l'utilisation d'une variable pour la clause, des alias et, si les accès sont les mêmes, pas besoin de déclarer les user et password

    La solution, créer une table OLDAFFECTATION, insérer les données de la vieille base et utiliser un bon vieux FOR SELECT
    Le tout doit pouvoir se faire dans un bloc, même la suppression de OLDAFECTATION.
    les GLOBAL TEMPORARY TABLE existent déjà en FB 2.1 (Global Temporary Tables (GTTs) Added in: 2.1) donc en utilisant ce truc à la création de la table on se passe de la suppression

    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
     
    SET TERM !;
    EXECUTE BLOCK
    AS
    DECLARE VARIABLE C1 int ;
    DECLARE VARIABLE C2 varchar(10);
    DECLARE VARIABLE C3 char(13);
    DECLARE VARIABLE C4 int ;
    DECLARE VARIABLE C5 int ;
    BEGIN
    CREATE global temporary
    TABLE OLDAFFECTATION (
       AFF_ANNEE INTEGER NOT NULL,
       ATE_REF VARCHAR(10) NOT NULL,
       OUV_NUMSS NUMSS NOT NULL
    );
    -- INSERTs à récupérer dans la 'vieille base' merci flamerobin, changer AFFECTATION généré par OLDAFFECTATION 
    FOR SELECT AFF_ANNEE,ATE_REF,OUV_NUMSS FROM OLDAFFECTATION 
          INTO :C1,:C2,:C3;
    DO
     select OUV_CLE from OUVRIER where OUV_NUMSS=:C3 INTO :C4
     select ATE_CLE FROM ATELIER WHERE ATE_REF_INTERNE=:C2 INTO :C5
     INSERT INTO AFFECTATION VALUES(:c1,:c4,:c5);
    END!
    SET TERM ;!
    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

  3. #3
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 901
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 901
    Points : 6 026
    Points
    6 026
    Par défaut
    Bonjour Sergio,

    Merci pour ton retour rapide. Il faudra que je me décide à au moins passer en 2.5

    Bon, la séquence que tu as eu la gentillesse de fournir bloque sur le CREATE de la GTT:
    Token unknown - line 10, column 1
    CREATE
    et je n'ai rien vu d'anormal par rapport à la doc (2.1)

    Par ailleurs, les INSERTs produits par Flamerobin font ressortir AFF_ANNEE sous la forme alors que c'est de l'integer.
    Un "change all" (merci NotePad++) rectifie tout ça, mais c'est curieux.
    "Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
    -----------------------
    Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
    Usus magister est optimus

  4. #4
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 901
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 901
    Points : 6 026
    Points
    6 026
    Par défaut
    J'ai opté par la création en non GTT de 'OLDAFFECTATION' pour y insérer les lignes.

    Ensuite, encore qq soucis...
    Au premier essai, je n'avais qu'une ligne en fait, il manquait 1 BEGIN/END (le FOR SELECT devait boucler sur le 1er select OUV_CLE)
    Voici la version finale:
    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
    AS
    DECLARE VARIABLE C1 int ;
    DECLARE VARIABLE C2 varchar(10);
    DECLARE VARIABLE C3 char(13);
    DECLARE VARIABLE C4 int ;
    DECLARE VARIABLE C5 int ;
    BEGIN
    FOR SELECT AFF_ANNEE,ATE_REF,OUV_NUMSS FROM OLDAFFECTATION 
          INTO :C1,:C2,:C3
    DO
    BEGIN
     select OUV_CLE from OUVRIER where OUV_NUMSS=:C3 INTO :C4 ;
     select ATE_CLE FROM ATELIER WHERE ATE_REF_INTERNE=:C2 INTO :C5 ;
     INSERT INTO AFFECTATION VALUES(:c1,:c4,:c5);
    END
    END!
    SET TERM ;!
    "Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
    -----------------------
    Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
    Usus magister est optimus

  5. #5
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 036
    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 036
    Points : 40 941
    Points
    40 941
    Billets dans le blog
    62
    Par défaut
    désolé pour le manque du begin/end, le code proposé avait été écrit à la volée plus pour donner une idée que par souci d'exactitude.

    La table OLDAFFECTATION, tu l'as créé hors du bloc donc elle eut pu être en GTT en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ON COMMIT PRESERVE ROWS
    pour garder les INSERTs que tu as dû faire, eux aussi, à part, mais comme je présume que par la suite, elle est supprimée, cela importe peu.

    Par ailleurs, les INSERTs produits par Flamerobin font ressortir AFF_ANNEE sous la forme '2005'
    alors que c'est de l'integer.
    Cela n'importe pas, d'expérience, ça fonctionne quand même
    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

  6. #6
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 901
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 901
    Points : 6 026
    Points
    6 026
    Par défaut
    désolé pour le manque du begin/end, le code proposé avait été écrit à la volée plus pour donner une idée que par souci d'exactitude.
    Je n'ai pas de souci par rapport à ça. C'est bien l'esprit du forum que de donner des pistes , ne plus être Modo ne m'a pas fait glisser dans le "faites mes devoirs/mon boulot" .
    D'ailleurs, sans attendre un retour, j'ai réfléchi et contourné la difficulté...

    Ceci dit, par rapport à la GTT, peux-tu préciser l'endroit où doit se faire sa création ? Pour mémoire, dans la version que tu avais présentée, ça coinçait, c'est ce qui m'a conduit à une table persistante.

    Et pour le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ON COMMIT PRESERVE ROWS
    j'ai bien vu cette option dans la doc.
    Cependant je m'interroge sur le contexte d'emploi et du coup sur le caractère temporary de la table.
    "Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
    -----------------------
    Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
    Usus magister est optimus

  7. #7
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 036
    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 036
    Points : 40 941
    Points
    40 941
    Billets dans le blog
    62
    Par défaut
    Attention, le ON COMMIT PRESERVE ROWS permet de vider la table en fin de session, mais une GTT ne s'auto-supprime pas.

    [Edit] Quelques explications supplémentaires fournies d'abord en MP
    Par exemple si tu as une GTT "normale" (sous-entendu ON COMMIT DELETE ROWS)
    si pendant ta session flamerobin , tu écris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    INSERT INTO MAGTT(..) VALUES (..);
    INSERT INTO MAGTT(..) VALUES (..);
    INSERT INTO MAGTT(..) VALUES (..);
    COMMIT;
    SELECT * FROM MAGTT;
    Tu auras un résultat vide

    a contrario si tu as un GTT ON COMMIT PRESERVE ROWS ton résultat contiendra les 3 lignes

    Si maintenant, tu te déconnectes/reconnectes de la base alors un SELECT * FROM MAGTT; sera vide.

    Cependant, dans les deux cas, la structure de la GTT reste dans la structure de la BDD. Pratique pour l'utilisation de tables temporaires qu'au temps du BDE, on pouvait créer comme tables paradox
    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

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

Discussions similaires

  1. erreur dans l'ouverture de projet sdl (code blocks
    Par wassim taktak dans le forum Développement 2D, 3D et Jeux
    Réponses: 2
    Dernier message: 12/07/2021, 19h19
  2. [Résolu] Erreur : Undefined variable dans un exec INSERT INTO
    Par yellowduff dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 03/12/2018, 11h27
  3. [Lien]erreur dans mon programme python
    Par durnambule dans le forum Général Python
    Réponses: 11
    Dernier message: 29/01/2004, 14h59
  4. [Erreur dans la lib...]
    Par Gonath dans le forum OpenGL
    Réponses: 3
    Dernier message: 22/12/2003, 09h02
  5. Erreur dans l'utilisation de SWAP
    Par mire dans le forum Langage
    Réponses: 12
    Dernier message: 15/03/2003, 21h39

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