Bonjour à tous,
J'ai 5 bases de données distinctes, sauf que possédant une table avec le même format, et je voudrais récupérer les lignes de la table commune des 5 bases de données dans la même requête.
Bonjour à tous,
J'ai 5 bases de données distinctes, sauf que possédant une table avec le même format, et je voudrais récupérer les lignes de la table commune des 5 bases de données dans la même requête.
Bonjour,
Quelques fois je me demande si vous faites des efforts avant de poser vos questions, en tout cas pas trop quant aux détails !
Votre post précédent traitait presque du même sujet ou, à tout le moins contient le même principe : l'utilisation de EXECUTE STATEMENT et de ON EXTERNAL, je vous avais même fourni un lien sur la documentation. Une seule chose différe vous devez utiliser des SELECT au lieu de UPDATE il vous faut simplement lire le petit chapitre Any number of data rows returned de la documentation
donc dans une procédure cela se ferait ainsi
vous noterez que je n'ai même pas eu besoin d'indiquer les username et password, s'ils ne sont pas indiqués ce sont les username et password de la base de données contenant la procédure qui sont utilisés. (et oui, ça aussi c'est écrit dans la documentation)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 FOR SELECT unchamp FROM TableCommune INTO :champ do suspend; FOR EXECUTE STATEMENT 'SELECT unchamp FROM TABLECOMMUNE' ON EXTERNAL 'base1' INTO :champ DO SUSPEND; FOR EXECUTE STATEMENT 'SELECT unchamp FROM TABLECOMMUNE' ON EXTERNAL 'base2' INTO :champ DO SUSPEND; FOR EXECUTE STATEMENT 'SELECT unchamp FROM TABLECOMMUNE' ON EXTERNAL 'base3' INTO :champ DO SUSPEND; ....
Bonjour,
Le principe je le comprend, mais la mise en oeuvre là j'y rrive pas. Pr contre dans votre proposition que représente "table commune"?,parce que moi je veut récupérer le résultat juste pour consultation.
Cela correspond à votre
vous connaissez le principe "Garbage In Garbage Out" ? Vous auriez indiqué un nom de table et ses colonnes vous ariez eu quelque chose de plus explicite
Code : Sélectionner tout - Visualiser dans une fenêtre à part une table avec le même format
Bonjour,
Mon but est de récupérer le résultat en mémoire pour une simple consultation, et non pas pour le mettre dans une table
Nulle part, je n'ai écrit qu'il y avait d'autres tables ou même suggéré l'utilisation d'autres tables que celles impliquéesnon pas pour le mettre dans une table
Qu'est-ce que vous ne comprenez pas dans le fait que :
1- vous devez passer par une procédure
2- que si vous ne donnez pas la structure de votre table vous n'aurez pas d'autre code de ma part que celui fourni.
3- que vous devez poser des questions précises (description de tables, nom/alias des bases) pour avoir des réponses précises
voila, la structure de la table
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 CREATE TABLE BOR ( MOI Integer NOT NULL, ORD Integer NOT NULL, COD Varchar(10) CHARACTER SET ISO8859_1, DES Varchar(255) CHARACTER SET ISO8859_1, BRU Numeric(14,2), EXE Numeric(14,2), IMP Numeric(14,2), TAU Numeric(14,2), NET Numeric(14,2), BRUA Numeric(14,2), TAUA Numeric(14,2), IMPA Numeric(14,2), DESA Varchar(150) CHARACTER SET ISO8859_1, PRIMARY KEY (MOI,ORD) );
Je constate quand même que vous ne faites pas beaucoup d'efforts !
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 SET TERM !; CREATE PROCEDURE BORTOUT RETURNS ( MOI Integer NOT NULL, ORD Integer NOT NULL, COD Varchar(10) CHARACTER SET ISO8859_1, DES Varchar(255) CHARACTER SET ISO8859_1, BRU Numeric(14,2), EXE Numeric(14,2), IMP Numeric(14,2), TAU Numeric(14,2), NET Numeric(14,2), BRUA Numeric(14,2), TAUA Numeric(14,2), IMPA Numeric(14,2), DESA Varchar(150) CHARACTER SET ISO8859_1 ) AS BEGIN FOR SELECT * FROM BOR INTO :MOI,:ORD,:COD,:DES,:BRU,:EXE,:IMP,:TAU,:NET,:BRUA,:TAUA,:IMPA,:DESA DO SUSPEND; FOR EXECUTE STATEMENT 'SELECT * FROM BOR' ON EXTERNAL 'base1' INTO :MOI,:ORD,:COD,:DES,:BRU,:EXE,:IMP,:TAU,:NET,:BRUA,:TAUA,:IMPA,:DESA DO SUSPEND; -- etc pour les autres bases END! SET TERM ;!
Bonjour,
merci, pour ta réponse , je vai faire un test et je vous tiens au courant.
Bonjour,
Votre code marche bien merci,j'ai dû seulement modifier on intégrant les colonnes parce qu' il signe une erreur sur les colonnesj'ai encore une question, dans le cas ou le nombre de base de données externes à joindre est variable, comment les intégrer, j'ai pensé les ajouter comme parmêtre de la 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 SET TERM !; CREATE PROCEDURE BORTOUT RETURNS ( MOI Integer NOT NULL, ORD Integer NOT NULL, COD Varchar(10) CHARACTER SET ISO8859_1, DES Varchar(255) CHARACTER SET ISO8859_1, BRU Numeric(14,2), EXE Numeric(14,2), IMP Numeric(14,2), TAU Numeric(14,2), NET Numeric(14,2), BRUA Numeric(14,2), TAUA Numeric(14,2), IMPA Numeric(14,2), DESA Varchar(150) CHARACTER SET ISO8859_1 ) AS BEGIN FOR SELECT MOI,ORD,COD,DES,BRU,EXE,IMP,TAU,NET,BRUA,TAUA,IMPA,DESA FROM BOR INTO :MOI,:ORD,:COD,:DES,:BRU,:EXE,:IMP,:TAU,:NET,:BRUA,:TAUA,:IMPA,:DESA DO SUSPEND; FOR EXECUTE STATEMENT 'SELECT MOI,ORD,COD,DES,BRU,EXE,IMP,TAU,NET,BRUA,TAUA,IMPA,DESA FROM BOR' ON EXTERNAL 'base1' INTO :MOI,:ORD,:COD,:DES,:BRU,:EXE,:IMP,:TAU,:NET,:BRUA,:TAUA,:IMPA,:DESA DO SUSPEND; -- etc pour les autres bases END! SET TERM ;!
mais comment faire pour passer tout le tableau dans la procédure.
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 !; CREATE PROCEDURE BORTOUT (table[],nbrrtable) RETURNS ( MOI Integer NOT NULL, ORD Integer NOT NULL, COD Varchar(10) CHARACTER SET ISO8859_1, DES Varchar(255) CHARACTER SET ISO8859_1, BRU Numeric(14,2), EXE Numeric(14,2), IMP Numeric(14,2), TAU Numeric(14,2), NET Numeric(14,2), BRUA Numeric(14,2), TAUA Numeric(14,2), IMPA Numeric(14,2), DESA Varchar(150) CHARACTER SET ISO8859_1 ) AS BEGIN FOR SELECT MOI,ORD,COD,DES,BRU,EXE,IMP,TAU,NET,BRUA,TAUA,IMPA,DESA FROM BOR INTO :MOI,:ORD,:COD,:DES,:BRU,:EXE,:IMP,:TAU,:NET,:BRUA,:TAUA,:IMPA,:DESA DO SUSPEND; FOR EXECUTE STATEMENT 'SELECT MOI,ORD,COD,DES,BRU,EXE,IMP,TAU,NET,BRUA,TAUA,IMPA,DESA FROM BOR' ON EXTERNAL 'base1' INTO :MOI,:ORD,:COD,:DES,:BRU,:EXE,:IMP,:TAU,:NET,:BRUA,:TAUA,:IMPA,:DESA DO SUSPEND; -- etc pour les autres bases END! SET TERM ;!
Bonjour,
Je ne peux passer à côté de cette blague, un code ne marche pas car il n'a ni jambes ni pattes au mieux il fonctionne
Je le savais pertinement. J'ai toujours écrit qu'il fallait éviter la syntaxe SELECT * FROM, il fallait bien que je ne vous mâche pas tout le travail.
je m'y attendais.
à mon avis vous ne vous êtes pas trop foulé puisque vous n'avez même pas su déclarer un tableau
Bien que Firebird ait un type de données de tableau, sa prise en charge est rudimentaire et l'utilisation de tableaux n'est généralement pas recommandée. Je ne suis même pas sûr qu'il soit possible de faire ce genre de chose toutefois vous pouvez toujours vous inspiré de ceci.
AMHA Il faut oublier, mais je serait curieux de voir une utilisation de ce type.
Alternative facile, utiliser un varchar comme paramètre, qui contiendra les divers noms ou alias de bases de données séparées par un caractère (la virgule par exemple)
en ce cas une boucle et les fonctions POSITION et SUBSTRING seront vos alliées. Je vous laisse travailler dessus faut pas exagéré quand même !
Alternative rusée, l'utilisation d'une GTT (table temporaire globale) qui permettrait de fournir les noms ou alias de bases mais aussi au besoin utilisateur, mot de passe, role. Bref toutes les informations nécessaires à la partie ON EXTERNAL.
Création de la GTT à ne faire qu'une seule fois dans la base contenant la procédure BORTOUT
Une fois ceci accompli la procedure BORTOUT est à modifier ainsi
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 CREATE GLOBAL TEMPORARY TABLE MESBASES ( Base VARCHAR(255) NOT NULL, -- peut être agrandie, peut contenir toute forme de chaine de connexion valide Server</port>:aliasname,C:\database\myData.fdb; etc ... Utilisateur VARCHAR(10), MDP VARCHAR(7), ROLE VARCHAR(10) ) ON COMMIT PRESERVE ROWS; -- en ce cas attention à gérer la suppression des lignes entre transactions
Utilisation pour un serveur, toutes les BDD ayant le même USER/PASSWORD
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 AS DECLARE VARIABLE B VARCHAR(255); -- ou plus DECLARE VARIABLE U VARCHAR(10); DECLARE VARIABLE P VARCHAR(7); BEGIN FOR SELECT MOI,ORD,COD,DES,BRU,EXE,IMP,TAU,NET,BRUA,TAUA,IMPA,DESA FROM BOR INTO :MOI,:ORD,:COD,:DES,:BRU,:EXE,:IMP,:TAU,:NET,:BRUA,:TAUA,:IMPA,:DESA DO SUSPEND; FOR SELECT BASE,Utilisateur,MDP FROM MESBASES INTO :B,:U,:P DO BEGIN FOR EXECUTE STATEMENT 'SELECT MOI,ORD,COD,DES,BRU,EXE,IMP,TAU,NET,BRUA,TAUA,IMPA,DESA FROM BOR' ON EXTERNAL :B -- ajouter USER :U PASSWORD :P au besoin INTO :MOI,:ORD,:COD,:DES,:BRU,:EXE,:IMP,:TAU,:NET,:BRUA,:TAUA,:IMPA,:DESA DO SUSPEND; END DELETE FROM MESBASES; -- précaution END!
N.B. une gestion des transactions (voir SET TRANSACTION, IN AUTONOMUS TRANSACTION) permettrait d'utiliser ON COMMIT DELETE ROWS; et éviter ce DELETE FROM MESBASES; inélégant
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 INSERT INTO MESBASE(base) VALUES ('base1'); INSERT INTO MESBASE(base) VALUES ('base2'); INSERT INTO MESBASE(base) VALUES ('base3'); SELECT * FROM BORTOUT;
j'ai modifier comme ceci, mais j'ai aucun résultat
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 ET TERM !; CREATE PROCEDURE BORTOUT (tables varchar(500),cheminbase varchar(500),NBR Smallint) RETURNS ( MOI Integer NOT NULL, ORD Integer NOT NULL, COD Varchar(10) CHARACTER SET ISO8859_1, DES Varchar(255) CHARACTER SET ISO8859_1, BRU Numeric(14,2), EXE Numeric(14,2), IMP Numeric(14,2), TAU Numeric(14,2), NET Numeric(14,2), BRUA Numeric(14,2), TAUA Numeric(14,2), IMPA Numeric(14,2), DESA Varchar(150) CHARACTER SET ISO8859_1 ) AS declare variable i smallint; declare variable j smallint; declare variable tab Varchar(8); BEGIN i=1;j=1; FOR SELECT * FROM BOR INTO :MOI,:ORD,:COD,:DES,:BRU,:EXE,:IMP,:TAU,:NET,:BRUA,:TAUA,:IMPA,:DESA DO SUSPEND; while (i<nbr) do begin tab=substring(tables from :j for 8); FOR EXECUTE STATEMENT 'SELECT * FROM BOR' ON EXTERNAL cheminbase||tab INTO :MOI,:ORD,:COD,:DES,:BRU,:EXE,:IMP,:TAU,:NET,:BRUA,:TAUA,:IMPA,:DESA DO SUSPEND; i=i+1;j=j+8; suspend; end
Bonjour,
Je constate que vous avez choisi l'alternative facile, en encore plus simple (nom de bases de longueur fixe, indication du nombre)
Il manque des : et un suspend en trop, de plus j'ai l'impression que Tables est un mot réservé
reste à savoir également quelle valeurs vous avez mis comme paramètres. Avez vous écrit une petite procedure comme debug pour vérifier que vous avez bien traiter les paramètres ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 while (i<nbr) do begin tab=substring(tables from :j for 8); FOR EXECUTE STATEMENT 'SELECT * FROM BOR' ON EXTERNAL :cheminbase||:tab INTO :MOI,:ORD,:COD,:DES,:BRU,:EXE,:IMP,:TAU,:NET,:BRUA,:TAUA,:IMPA,:DESA DO SUSPEND; i=i+1;j=j+8;suspend;end
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager