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 18/05/2005, 11h35   #1
Invité de passage
 
Inscription : mai 2003
Messages : 4
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 4
Points : 0
Points : 0
Par défaut Renvoyer un tableau depuis une procédure stockée

Voici mon problème:
J'ai réalisé une application client/serveur en delphi (avec donc plusieurs clients et un serveur de BD). Dans mon source delphi, j'appelle une procédure stockée qui devrait me retourner un tableau avec 3 colonnes.

Au départ, j'avais essayé d'utiliser une table temporaire.
Le problème c'est que lorsque mon client 1 n'utilise plus la procédure stockée, le temps qu'il aille lire le contenu de la table temporaire, un autre client 2 a pu exécuter la procédure stockée et modifier le contenu de la table temporaire...

J'en suis donc venu à essayer d'écrire mes valeurs plutôt dans un tableau que dans une table, puis de renvoyer le tableau au programme delphi.

Le problème, c'est que je n'arrive pas à trouver la syntaxe exacte pour le faire...

Quelqu'un a une idée?
Wayne99 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2005, 11h42   #2
Membre émérite
 
Avatar de Andry
 
Inscription : juillet 2002
Messages : 1 109
Détails du profil
Informations personnelles :
Localisation : Madagascar

Informations forums :
Inscription : juillet 2002
Messages : 1 109
Points : 949
Points : 949
Envoyer un message via MSN à Andry
Je vois pas trop ou elle est le problème.
En faites, chaque fois que tu fais appel à ton procedure, elle te renvoi les données que tu veux que tu peux recupérer via un IbQuery ou une IbStoredProc.
A toi de traiter après ces données.

Sinon, donne plus d'infos

A+
__________________
On progresse .....
Andry est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2005, 12h08   #3
Invité de passage
 
Inscription : mai 2003
Messages : 4
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 4
Points : 0
Points : 0
Oui, mais j'ai pas envie d'appeler 1000 fois ma procédure pour qu'elle me renvoie à chaque fois 3 valeurs. J'ai pas envie de surcharger mon réseau.

Je veux que ça soit la procédure stockée qui fasse les 1000 traitements et qui me renvoit en une seule fois un tableau avec les 1000 enregistrements...

Je suis clair là?
Wayne99 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2005, 13h07   #4
Membre émérite
 
Avatar de Andry
 
Inscription : juillet 2002
Messages : 1 109
Détails du profil
Informations personnelles :
Localisation : Madagascar

Informations forums :
Inscription : juillet 2002
Messages : 1 109
Points : 949
Points : 949
Envoyer un message via MSN à Andry
Je commence à comprendre.
Si tu peux poster du code et nous explique ce que tu veux faire via la procedure stocké, ça nous sera d'une grande aide.

A+
__________________
On progresse .....
Andry est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2005, 13h35   #5
Invité de passage
 
Inscription : mai 2003
Messages : 4
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 4
Points : 0
Points : 0
Voila comment je fait aujourd'hui:

set term ^ ;

create procedure proc_tab
(
jour varchar(8)
)
as
declare variable NB_ATTENTE integer;
declare variable NB_TRAITE integer;
declare variable i integer;


begin
i=0;

/* je vide le contenu de la table temporaire */
delete from TAB;


while (i < 1000) do
begin
select count(*) from ol_article o where o.date_rdv = :jour and
o.cpt = :i into :nb_attente;

select count(*) from ol_article o where o.ol_status='51' and
o.date_rdv=:jour and o.cpt= :i into :nb_traite;

/* je remplis le contenue de la table temporaire */
insert into TAB (CPT, NB_ATTENTE, NB_TRAITE) VALUES
(:i, :nb_attente, :nb_traite);

i=i+1;

end
end ^

set term ; ^


Et je voudrai remplacer mon insert par l'ajout de mes données dans un tableau et de renvoyer le contenu de mon tableau quand ma procédure se termine (faire un returns (tab) ou qqch comme ça).

Voila
Wayne99 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2005, 13h37   #6
Invité de passage
 
Inscription : mai 2003
Messages : 4
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 4
Points : 0
Points : 0
C'est:
jour varchar(8) à la place du smiley!
Wayne99 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2005, 14h04   #7
Membre émérite
 
Avatar de Andry
 
Inscription : juillet 2002
Messages : 1 109
Détails du profil
Informations personnelles :
Localisation : Madagascar

Informations forums :
Inscription : juillet 2002
Messages : 1 109
Points : 949
Points : 949
Envoyer un message via MSN à Andry
Déjà j'opterais pour une procedure de ce genre :
Code :
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
 
CREATE PROCEDURE PROC_TAB (
    JOUR VARCHAR(8))
RETURNS (
    NB_ATTENTE INTEGER,
    NB_TRAITE INTEGER,
    CPT INTEGER)
AS
DECLARE VARIABLE I INTEGER; 
BEGIN 
   I=0; 
   WHILE (I < 1000) DO 
   BEGIN 
      SELECT 
           COUNT(*) FROM OL_ARTICLE O 
      WHERE 
          (O.DATE_RDV = :JOUR) AND 
          (O.CPT = :I)
      INTO :NB_ATTENTE; 
 
      SELECT 
           COUNT(*) FROM OL_ARTICLE O 
      WHERE 
          (O.OL_STATUS = '51') AND 
          (O.DATE_RDV = :JOUR) AND 
          (O.CPT = :I)
      INTO :NB_TRAITE; 
      CPT = I;
  I=I+1; 
END
Je pencherais pour ce code, a toi de voir.
Il suffit d'utiliser un IBquery au niveau de Delphi pour recuperer tes 1000 lignes via la requete
Code :
1
2
 
  SELECT NB_ATTENTE, NB_TRAITE, CPT FROM PROC_TAB:JOUR
Tu initialise le paramètre JOUR et le tour est joué

A+
__________________
On progresse .....
Andry 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 11h11.


 
 
 
 
Partenaires

Hébergement Web