Précédent   Forum des professionnels en informatique > Bases de données > Firebird > SQL
SQL Forum d'entraide sur le SQL pour Firebird
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 02/08/2011, 17h10   #1
Invité de passage
 
Inscription : janvier 2003
Messages : 11
Détails du profil
Informations forums :
Inscription : janvier 2003
Messages : 11
Points : 2
Points : 2
Par défaut Stocker le résultat d'une requête

bonjour,

j'ai une base de données Firebird v2.0 que j'utilise avec isql. Toutes les requetes sont stockées dans un fichier texte.
J'ai environ 150 requetes par fichie.
Le problème est que celà prend beaucoup de temps car mes requêtes sont basées sur une recherche de clé primaire à partir de différentes chaines de caractères. Cette opération étant répétée à chaque requete, j'aimerais savoir s'il existe une solution pour que je fasse une requete (ou autre) pour récupérer cette clé primaire et utiliser le résultat dans les requetes suivantes.
J'ai essayé avec une procédure stockée mais j'arrive pas à enregistrer le resultat dans une variable par exemple

Je vous remercie par avance pour vos réponses.
schub1015 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/08/2011, 12h01   #2
Membre éprouvé
 
Inscription : janvier 2009
Messages : 301
Détails du profil
Informations personnelles :
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Secteur : Finance

Informations forums :
Inscription : janvier 2009
Messages : 301
Points : 454
Points : 454
Bonjour,

Tu pourrais nous montrer le schéma de ton fichier texte et la procédure stockée que tu as écrite.

Ainsi, il sera possible de t'aider car ta présentation ne m'as permis de comprendre ce qu tu souhaites réaliser.

Bon courage
seabs est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/08/2011, 09h09   #3
Invité de passage
 
Inscription : janvier 2003
Messages : 11
Détails du profil
Informations forums :
Inscription : janvier 2003
Messages : 11
Points : 2
Points : 2
Alors voilà le bazar, donc dans le fichier, tu trouveras pleins de fois la requête :
Code :
SELECT TApp.id FROM TGenerateur JOIN TConteneur ON TConteneur.idGenerateur = TGenerateur.id JOIN TApp ON TApp.idConteneur = TConteneur.id WHERE TGenerateur.nomGenerateur = 'P4' AND TConteneur.idConteneur = 2 AND TApp.nom = '104X2 A');
Par exemple, elle est utilisée là :
Code :
INSERT INTO TEquipPack(nomPack,idApp) VALUES (NULL, (SELECT TApp.id FROM TGenerateur JOIN TConteneur ON TConteneur.idGenerateur = TGenerateur.id JOIN TApp ON TApp.idConteneur = TConteneur.id WHERE TGenerateur.nomGenerateur = 'P4' AND TConteneur.idConteneur = 2 AND TApp.nom = '104X2 A'));
Moi je voudrais stocké le résultat de la requete, par exemple faire (de facon imagée):
Code :
toto = SELECT TApp.id FROM TGenerateur JOIN TConteneur ON TConteneur.idGenerateur = TGenerateur.id JOIN TApp ON TApp.idConteneur = TConteneur.id WHERE TGenerateur.nomGenerateur = 'P4' AND TConteneur.idConteneur = 2 AND TApp.nom = '104X2 A');
Puis mettre où il y a besoin,
Code :
INSERT INTO TEquipPack(nomPack,idApp) VALUES (NULL, toto);
Voici la procédure stockée que j'ai faite :
set term ^^;

Code :
1
2
3
4
5
6
7
8
9
CREATE procedure get_id_prg (nomApp varchar(30), nomGenerateur varchar(30), idConteneur integer) returns (idprg integer)
AS
begin 
        FOR SELECT TPrg.id FROM TGenerateur JOIN TConteneur ON TConteneur.idGenerateur = TGenerateur.id JOIN TApp ON TApp.idConteneur = TConteneur.id WHERE (TGenerateur.nomGenerateur = :nomGenerateur AND TConteneur.idConteneur = :idConteneur AND TApp.nom = :nomApp) INTO :idPrg do
        begin
                suspend;
        end
end ^^
SET term ; ^^
Je rappelle que j'utilise isql pour exécuter mon fichier SQL.
J'espère que cela est plus clair...
schub1015 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/08/2011, 08h18   #4
Membre éprouvé
 
Inscription : janvier 2009
Messages : 301
Détails du profil
Informations personnelles :
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Secteur : Finance

Informations forums :
Inscription : janvier 2009
Messages : 301
Points : 454
Points : 454
Bonjour,

Je ne suis pas certain d'avoir tout compris, mais je vais essayer de d'aider.

A mon avis, la procédure stockée ne doit retourner qu'une seule valeur, elle ne doit pas comporter les instructions FOR et DO.

Je pense que ce schéma conviendrait mieux.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
SET TERM ^ ;
 
CREATE OR ALTER PROCEDURE get_id_prg (
    IDCONTENEUR INTEGER,
    NOMGENERATEUR VARCHAR(30),
    NOMAPP VARCHAR(30))
RETURNS (
    IDPRG INTEGER)
AS
begin
 SELECT TPrg.id
 FROM TGenerateur
   JOIN TConteneur ON TConteneur.idGenerateur = TGenerateur.id
   JOIN TApp ON TApp.idConteneur = TConteneur.id
 WHERE TGenerateur.nomGenerateur = :nomGenerateur AND TConteneur.idConteneur = :idConteneur AND TApp.nom = :nomApp 
 INTO :idPrg;
 SUSPEND;
end^
 
SET TERM ; ^
Mais il serait peut être possible d'écrire ta requête d'insertion en incluant directement tes paramètres. Exemple :

Code :
1
2
3
4
5
INSERT INTO TEquipPack (nomPack,idApp) 
  VALUES (NULL, (SELECT TApp.id FROM TGenerateur 
     JOIN TConteneur ON TConteneur.idGenerateur = TGenerateur.id 
    JOIN TApp ON TApp.idConteneur = TConteneur.id 
  WHERE TGenerateur.nomGenerateur = :pNomGen AND TConteneur.idConteneur = :pIdCont AND TApp.nom = :pNom));
Il y a peut être des contre-indications à cette démarche.

Pour aller plus loin, il faudrait que je comprenne complétement le schéma de l'application.

Pourquoi, tu utilises ISQL, il existe des outils plus performants et gratuits. IBExpert Free, Flamerobin, Database Workbench 4 Lite for Firebird, etc. Il me semble plus facile de faire des essais avec ces produits. Enfin, il s'agit d'une question d'habitudes.

Bon courage
seabs est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/08/2011, 08h56   #5
Invité de passage
 
Inscription : janvier 2003
Messages : 11
Détails du profil
Informations forums :
Inscription : janvier 2003
Messages : 11
Points : 2
Points : 2
Merci pour votre réponse.
Pour le moment, je pense que votre solution fonctionne mais comment je fais pour stocker le résultat de la procédure stockée afin qu'effectivement je puisse passer directement dans mes requêtes les différents paramètres ?
schub1015 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/08/2011, 09h16   #6
Membre éprouvé
 
Inscription : janvier 2009
Messages : 301
Détails du profil
Informations personnelles :
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Secteur : Finance

Informations forums :
Inscription : janvier 2009
Messages : 301
Points : 454
Points : 454
Bonjour,

J'ai bien compris votre question.

Je dois m'absenter, je regarde cet après-midi ou au plus tard demain pour vous répondre. Mais il n'y a pas aucune difficulté, je veux simplement faire quelques essais pour confirmation.

A bientôt
seabs est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/08/2011, 10h26   #7
Membre Expert
 
Avatar de Barbibulle
 
Frédéric
Inscription : octobre 2002
Messages : 1 722
Détails du profil
Informations personnelles :
Nom : Frédéric
Âge : 42

Informations forums :
Inscription : octobre 2002
Messages : 1 722
Points : 2 025
Points : 2 025
Bonjour,

Le choix d'ISQL est en effet étonnant, car c'est très 'Basic' comme utilisation.

Si je comprend bien le problème vous souhaitez optimiser vos appels de requêtes, l'idée que vous avez serait de 'mémoriser' le résultat d'une requête qui est appelées de nombreuse fois en tant que sous-requêtes dans votre fichier.

La procédure stockée ne "mémorise" pas le résultat. Elle permet simplement de grouper des requêtes. Mais à chaque appel de la procédure en question toutes les requêtes sont de nouveau exécutées.
L'utilisation d'une procédure de type sélection peut se faire comme une table.
Code :
1
2
 
SELECT IDPRG FROM get_id_prg(2, 'P4', '104X2 A')
Les procédures stockées (PS) sont compilées et donc optimisés, ainsi lors d'un appel à une PS, le SGBD s'économise une partie du travail d'analyse de la requête.
Mais les résultats des PS ne sont pas mémorisés et donc à chaque appel (même avec les même paramètres) celle ci est exécuté de nouveau.

Ainsi votre
Code :
1
2
 
INSERT INTO TEquipPack(nomPack,idApp) VALUES (NULL, (SELECT TApp.id FROM TGenerateur JOIN TConteneur ON TConteneur.idGenerateur = TGenerateur.id JOIN TApp ON TApp.idConteneur = TConteneur.id WHERE TGenerateur.nomGenerateur = 'P4' AND TConteneur.idConteneur = 2 AND TApp.nom = '104X2 A'));
sera similaire à
Code :
1
2
 
INSERT INTO TEquipPack(nomPack,idApp) VALUES (NULL, (SELECT IDPRG FROM get_id_prg(2, 'P4', '104X2 A'));

Par contre dans une PS vous pouvez avoir des variables locales.
Donc si vous avez la possibilité de mettre toutes vos requêtes dans une PS vous allez normalement avoir un gain de vitesse :

Par exemple :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
SET TERM ^ ;
 
CREATE OR ALTER PROCEDURE Prog_Fichier_1 (
    IDCONTENEUR INTEGER,
    NOMGENERATEUR VARCHAR(30),
    NOMAPP VARCHAR(30))
AS
declare variable IDPRG INTEGER;
begin
 SELECT TPrg.id
 FROM TGenerateur
   JOIN TConteneur ON TConteneur.idGenerateur = TGenerateur.id
   JOIN TApp ON TApp.idConteneur = TConteneur.id
 WHERE TGenerateur.nomGenerateur = :nomGenerateur AND TConteneur.idConteneur = :idConteneur AND TApp.nom = :nomApp 
 INTO :idPrg;
 
INSERT INTO TEquipPack(nomPack,idApp) VALUES (NULL, IdPrg);
 
.... etc ...
 
end^
 
SET TERM ; ^
Ainsi dans votre fichier ISQL vous n'avez plus qu'un appel à cette procédure.
Barbibulle est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 12h12.


 
 
 
 
Partenaires

Hébergement Web