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

Bases de données Delphi Discussion :

[D2010][Interbase 9] Récupérer les données renvoyées par une procedure stockée


Sujet :

Bases de données Delphi

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Âge : 76
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 25
    Points : 21
    Points
    21
    Par défaut [D2010][Interbase 9] Récupérer les données renvoyées par une procedure stockée
    Bonjour à tous,

    J'ai une table IDENT qui contient les champs IDENT_NUM, IDENT_NOM, etc

    J'ai créé une procédure stockée qui s'appelle CHERCHEIDENT et qui doit renvoyer le nom, le prénom, la date de naissance et le sexe correspondant au numéro unique Num et à un champ Genre données toutes les deux passées en paramètres.

    Code sql : 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
    ALTER PROCEDURE "CHERCHEIDENT" 
    (
      "NUM" INTEGER,
      "GENRE" VARCHAR(1)
    )
    RETURNS
    (
      "NOM" VARCHAR(20),
      "PRENOM" VARCHAR(20),
      "DDN" DATE,
      "SEXE" VARCHAR(1)
    )
    AS
      BEGIN
           SELECT IDENT_NOM, IDENT_PRENOM, IDENT_DDN, IDENT_SEXE
           FROM IDENT
           WHERE IDENT_NUM = :Num AND IDENT_GENRE = :Genre
           INTO Nom, Prenom, Ddn, Sexe;
           EXIT;
      END;

    Cette procédure fonctionne avec la console IB.
    Je l'appelle avec le code suivant:

    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
           With  SQLQuery1.Params do
           begin
             Clear;
             CreateParam(ftInteger,'Num',ptInput);
             CreateParam(ftString,'Genre',ptInput);
             CreateParam(ftString,'Nom',ptOutput);
             CreateParam(ftString,'Prenom',ptOutput);
             CreateParam(ftDate,'Ddn',ptOutput);
             CreatePararam(ftString,'Sexe',ptOutput);
             ParamByname('Num').AsInteger := 24;
             ParamByname('GENRE').AsString := 'P';
           end;
           Add('EXECUTE PROCEDURE CHERCHEIDENT');
           EnvoieSql(ListeChaine);// sous-routine qui ne fait qu'envoyer la chaine transmise.
        End;
    j'obtiens le message d'erreur suivant (copie de mon fichier log):

    Début TIdentite.Lire 04/03/2010 20:35:14:984

    Début de EnvoieSql avec le message : 04/03/2010 20:35:14:984
    EXECUTE PROCEDURE CHERCHEIDENT

    ********** ERREUR TDBXError *** parameter mismatch for procedure CHERCHEIDENT 04/03/2010 20:35:20:869
    Si je passe les paramètres dans le SELECT, j'ai le message:

    Début TIdentite.Lire 04/03/2010 19:17:8:272

    Début de EnvoieSql avec le message : 04/03/2010 19:17:8:273
    SELECT Nom, Prenom, Ddn, Sexe
    FROM CHERCHEIDENT(24, 'P');

    ********** ERREUR TDBXError *** unassigned code 04/03/2010 19:17:16:305
    j'ai essayé de différentes manières et je ne trouve pas la solution. cela fait une semaine que je m'arrache les cheveux

    Cela vient-il de la procédure stockée ou de mon Select ?
    Je précise que j'expédie mon SELECT par la méthode OPEN du SQLQuery

    Si quelqu'un avait la bonté d'âme de me donner son avis...

  2. #2
    Inscrit
    Inscrit en
    Juin 2007
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 103
    Points : 77
    Points
    77
    Par défaut
    Bonjour,
    je ponse qu'il suffit de faire un requette sql en utilisant le composant Ibquery :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     select *
    from CHERCHEIDENT(:N, :P,:D,:S)
    et quand tu clique sur le boutton tu ajoute le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
      Ibquery1.close ;
      Ibquery1.parametresbyname('N').asstring := Monparam1.asstring ;
      Ibquery1.parametresbyname('P').asstring := Monparam2.asstring ;
      Ibquery1.parametresbyname('D').asDate := Monparam3.asDate ;
      Ibquery1.parametresbyname('S').asstring := Monparam4.asstring ;
      Ibquery1.open
    reste a modifier le code selon ton besoin.
    Bonne chance.

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 029
    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 029
    Points : 40 927
    Points
    40 927
    Billets dans le blog
    62
    Par défaut
    Il semble manquer un SUSPEND dans la procedure , de plus si plusieurs enregistrements peuvent correspondre il faudrait faire un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     FOR SELECT ......  DO SUSPEND;
    enfin je présume que celle-ci a été simplifiée , sinon je ne vois pas bien l'utilité comparé a une Query 'classique'

    une petite erreur de MonPc puisqu'il a indiqué les paramètres de sorties au lieu de ceux d'entrées mais le principe est là

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     select * from CHERCHEIDENT(:NUM, :GENRE)
    après c'est simple
    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 à l'essai
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Âge : 76
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 25
    Points : 21
    Points
    21
    Par défaut
    Merci pour vos réponses

    1/ c'est effectivement un code épuré que je vous ai envoyé pour ne pas surcharger le forum.
    2/ j'ai déjà essayé la solution proposée pr MonPc, mais cela ne fonctionne pas non plus.
    3/ je précise que si je pratique Delphi depuis D1, je suis novice en SQL...
    4/ enfin, si j'utilise SQLQuery, c'est parceque je n'y suis pas parvenu avec SQLStoredProc.
    5/ Il me semble avoir lu dans la doc de IB9 à mois que ce ne soit dans le Tutoriel sur SQL du forum que dans une procédure stockée il valait mieux mettre Exit que Suspend quand on ne voulait pas avoir tous les enregistrements en retour, mais seulement la première ligne.

    Ce que je ne comprend pas :
    1/ quand et où utiliser les ':' dans les variables ?
    Si dans la procédure stockée, j'ai dois je appeler par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CHERCHEIDENT Num, Genre
    et recueillir ou dois-je appeler par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CHERCHEIDENT :Num,:Genre
    et récupérer par ?

    2/ pourquoi, après avoir créé mes paramètres parl'instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    chaine := SQLQuery1.paramByName('Nom').AsString;
    me renvoie une erreur comme quoi 'Nom' n'est pas un paramètre.
    Si j'essaie d'y acceder par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SQLQuery1.Params[2].value;
    j'ai une erreur comme quoi 2 n'est pas un index valide puisque l'index maxi est 0, ce qui semble indiquer que mes paramètres ont été éffacés?

    Et encore merci pour la rapidité

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

Discussions similaires

  1. Récupérer les données envoyées par une tablette graphique
    Par greg08 dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 02/06/2010, 06h04
  2. Réponses: 17
    Dernier message: 16/03/2009, 09h21
  3. Réponses: 7
    Dernier message: 09/03/2009, 20h12
  4. Réponses: 5
    Dernier message: 26/12/2007, 12h51
  5. Réponses: 2
    Dernier message: 08/10/2006, 11h44

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