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

Firebird Discussion :

Exécuter un gros bloc d'ordres avec "Execute block"


Sujet :

Firebird

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur Delphi
    Inscrit en
    Avril 2023
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Delphi

    Informations forums :
    Inscription : Avril 2023
    Messages : 212
    Points : 68
    Points
    68
    Par défaut Exécuter un gros bloc d'ordres avec "Execute block"
    Core mouai
    Bonjour à tous.tes et surtout à Sergio

    J'aimerai exécuter un bloc de "update" sur plusieurs milliers de lignes.
    Ma première idée était de les copier dans TEdit, séparé par un ";" et de les exécuter un par un dans une boucle Delphi.
    Mais on m'a parlé du "Execute Block" qui pourrait accélérer la procédure.

    Les réponses que je n'ai pas trouvées sont :
    Sera ce vraiment plus rapide ?
    et, surtout, y a t-il une limite du nombre d'ordres insérable dans un "Execute Block".

    Merci d'avance.

  2. #2
    Membre du Club
    Homme Profil pro
    Développeur Delphi
    Inscrit en
    Avril 2023
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Delphi

    Informations forums :
    Inscription : Avril 2023
    Messages : 212
    Points : 68
    Points
    68
    Par défaut
    J'ai essayé avec 213 lignes de UPDATE, il me répond :
    Too many Contexts of Relation/Procedure/Views. Maximum allowed is 255
    What the f... does it mean ?

  3. #3
    Rédacteur/Modérateur

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

    Alors, il y a confusion EXECUTE BLOCK c'est ok pour Flamerobin (en commençant par un SET TERM !; d'abord ) pas pour Delphi.
    Pour Delphi tu veux sans doute plutôt parler de FDScript
    comme je peux le faire sur cet écran où les diverses commandes sont générées à partir d'un fichier CSV dans un Tmemo
    Nom : Capture.PNG
Affichages : 69
Taille : 103,3 Ko
    et une instruction de ce genre
    Code Pascal : Sélectionner tout - Visualiser dans une fenêtre à part
     FDScript1.ExecuteScript(TexteScript.Lines);

    sauf que, je suis en train de travailler dessus pour que l'utilisateur puisse suivre les commandes qui s'effectuent une à une genre
    Code Pascal : 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
    var S : String;
        l : TCaretPosition;
    begin
    try
     l.line:=0;
     l.Pos:=1;
     for S in TexteScript.Lines do
       begin
        TexteScript.BeginUpdate;
        TexteScript.Model.SelectText(l,length(S));  // ne fonctionne pas ?
        Inc(L.line);
        TexteScript.EndUpdate;
        Application.ProcessMessages; // ?? pas sûr 
        Datas.ConnexionUS.ExecSQL(S,true);
       end;
    except
      // message
    end;
    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

  4. #4
    Membre du Club
    Homme Profil pro
    Développeur Delphi
    Inscrit en
    Avril 2023
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Delphi

    Informations forums :
    Inscription : Avril 2023
    Messages : 212
    Points : 68
    Points
    68
    Par défaut
    Bonjour Sergio,
    Avant de lire ton msg :

    J'ai essayé de voir la limite du nombre de caractères maximum.
    J'ai trouvé, au plus près, 11340, et sûrement quelques uns.
    Au-delà, FlameRobin pête.

  5. #5
    Membre du Club
    Homme Profil pro
    Développeur Delphi
    Inscrit en
    Avril 2023
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Delphi

    Informations forums :
    Inscription : Avril 2023
    Messages : 212
    Points : 68
    Points
    68
    Par défaut
    Non, je parlais bien dans FlameRobin. Donc avec SET TERME...
    Mais je lance la requête depuis une appli Delphi.

  6. #6
    Membre du Club
    Homme Profil pro
    Développeur Delphi
    Inscrit en
    Avril 2023
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Delphi

    Informations forums :
    Inscription : Avril 2023
    Messages : 212
    Points : 68
    Points
    68
    Par défaut
    J'ai déjà fait une boucle pour lancer l'exécution de chaque ligne requête une à une, mais c'est trop long.
    D'où le recours à EXECUTE BLOCK pour exécuter les requêtes bloc par bloc.
    Mais au-delà d'un certain nombre de lignes et donc, d'environ 11340 caractère, ça pète.

  7. #7
    Membre du Club
    Homme Profil pro
    Développeur Delphi
    Inscrit en
    Avril 2023
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Delphi

    Informations forums :
    Inscription : Avril 2023
    Messages : 212
    Points : 68
    Points
    68
    Par défaut
    Je pense que je vais donc faire un compteur pour insérer des lignes de requête dans un tString quelconque sans dépasser 11340 caractères.
    (sauf ton conseil éclairé )

  8. #8
    Membre du Club
    Homme Profil pro
    Développeur Delphi
    Inscrit en
    Avril 2023
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Delphi

    Informations forums :
    Inscription : Avril 2023
    Messages : 212
    Points : 68
    Points
    68
    Par défaut
    Tiens, mon FDQuery ne veux pas de "TERM"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        Qry.SQL.Text := 'SET TERM !; EXECUTE BLOCK AS BEGIN ' + SQLTxt + ' END! SET TERM ; !'
                        ;
        Qry.SQL.SaveToFile('D:\SQL.txt');
    Quand je lance le SQL directement dans FlameRobin, ça marche.

    Vous voyez où est l'erreur, vous ?

  9. #9
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 038
    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 038
    Points : 40 943
    Points
    40 943
    Billets dans le blog
    62
    Par défaut
    Parce que ce doit être un FDScript pas un FDQuery et du coup, cela ne sert à rein d'utiliser un EXECUTE BLOCK totalement inutile
    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

  10. #10
    Membre du Club
    Homme Profil pro
    Développeur Delphi
    Inscrit en
    Avril 2023
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Delphi

    Informations forums :
    Inscription : Avril 2023
    Messages : 212
    Points : 68
    Points
    68
    Par défaut
    Mais pourquoi ce déchainement de haine !
    Pourquoi y peut pas juste transmettre l'ordre au SGBD qui sait quoi faire, lui

    Bon, merci Sergio, je vais essayer avec ton exemple

  11. #11
    Membre du Club
    Homme Profil pro
    Développeur Delphi
    Inscrit en
    Avril 2023
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Delphi

    Informations forums :
    Inscription : Avril 2023
    Messages : 212
    Points : 68
    Points
    68
    Par défaut
    Oui, mais je suis assailli par un horrible doute :
    Le script va t-il exécuter les ordres SQL 1 par 1 ou en bloc à la façon d'un "execute block" ?

    J'ai l'impression que oui parce qu'il envoie un message de Lock conflicts on no wait transaction...

  12. #12
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 038
    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 038
    Points : 40 943
    Points
    40 943
    Billets dans le blog
    62
    Par défaut
    Il est clairement spécifié dans la doc de FDScript quelques petits trucs à bien lire

    Lorsqu'un script contient des commandes ou des blocs de langage de programmation de base de données, d'autres considérations doivent être prises en compte :
    SGBD Commandes SQL Description
    Firebird

    CREATE FUNCTION
    EXECUTE BLOCK <bloc de code>

    Doit se terminer par '/', ou un séparateur différent de ';' doit être défini.

    Par exemple, avec Firebird, utilisez le code suivant :

    SET CMDSEP #;
    EXECUTE BLOCK ... #
    SET CMDSEP ;#
    INSERT INTO Brands VALUES (3, 'Mercedes');
    ISQL de Firebird fonctionne lorsque le mode Validation automatique est désactivé. Par défaut, le mode Validation automatique pour TFDScript/TFDConnection est activé. Pour améliorer la compatibilité, définissez FDConnection.TxOptions.AutoCommit sur False avant l'exécution du script. Ou exécutez la commande de script SET AUTOCOMMIT OFF.
    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
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 038
    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 038
    Points : 40 943
    Points
    40 943
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par DOliv Voir le message
    Bon, merci Sergio, je vais essayer avec ton exemple
    Mon second code n'est pas bon, pour que l'utilisateur voie ce qui se passe j'ai fini par utiliser (merci FMX) un Layout qui bloque la saisie
    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
    procedure TFormAjustStocks.BtnApplyClick(Sender: TObject);
    var S : String;
    //    l : TCaretPosition;
    begin
    LayoutSQL.Visible:=True;
    try
    try
    // l.line:=0;
    // l.Pos:=1;
     for S in TexteScript.Lines do
       begin
          Ligne.Text:=(l.Line+1).ToString;
          Commande.Text:=S;
     
    // tentative de mise en évidence du texte dans le mémo (ratée)
    //   TexteScript.BeginUpdate;
    //      TexteScript.Model.SelectText(l,length(S));
    //      Inc(L.line);
    //    TexteScript.EndUpdate;
        Application.ProcessMessages; // pas terrible mais efficace
     
        Datas.ConnexionUS.ExecSQL(S,true);
       end;
    // FDScript1.ExecuteScript(TexteScript.Lines);
     
    except
     on e:Exception do
        Datas.MessageService.MessageDialogSync('Erreur dans le script'+Slinebreak+E.Message,
                                                TMsgDlgType.mtError,
                                                [TMsgDlgBtn.mbOk],
                                                 TMsgDlgBtn.mbOk,
                                                0);
    end;
    finally
     LayoutSQL.Visible:=False;
    end;
    J'ai pu remarquer que c'était rapide (plus que via Flamerobin)

    D'un autre côté, il n'y avait que 262 commandes
    Si je suis passé par un Tmemo au lieu de mettre les commandes directement dans le fdScript c'est pour pouvoir encore modifier "à la main" le texte avant exécution
    Côté transaction, c'est de l'autocommit, dans le contexte du programme il n'est pas nécessaire d'englober les commandes, sinon plutôt qu'un execSQL direct je serai certainement passé par un fdQuery ou un FDCommand (découverte récente de ce composant)
    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

  14. #14
    Membre du Club
    Homme Profil pro
    Développeur Delphi
    Inscrit en
    Avril 2023
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Delphi

    Informations forums :
    Inscription : Avril 2023
    Messages : 212
    Points : 68
    Points
    68
    Par défaut
    Merci, Sergio.
    J'avais bien compris que ton code était en cours de chantier...

    Citation Envoyé par SergioMaster Voir le message
    Il est clairement spécifié dans la doc de FDScript quelques petits trucs à bien lire
    P.... ça ne s'invente pas On sait que ce qu'on cherche est sûrement noté quelque part, mais, soit on sait où chercher, soit on lit tout.
    Du coup, rien ne vaut l'expérience, parce que pour ce qui est de tout lire...aujourd'hui

    Merci encore
    Je vais avancer...

Discussions similaires

  1. [18c] Baseline avec deux plans d'exécutions pour un ordre avec le hint INDEX
    Par Ikebukuro dans le forum Administration
    Réponses: 6
    Dernier message: 13/10/2019, 10h27
  2. pb avec quote...php + mysql
    Par nicdes dans le forum SQL Procédural
    Réponses: 7
    Dernier message: 10/12/2005, 01h25
  3. Réponses: 9
    Dernier message: 25/10/2005, 14h23
  4. Réponses: 6
    Dernier message: 22/09/2005, 16h59
  5. Gros bug SQL Server avec caractère "²"
    Par Oluha dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 26/05/2005, 14h31

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