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

SQL Firebird Discussion :

Procédures stockées


Sujet :

SQL Firebird

  1. #1
    Membre confirmé Avatar de rlgrand
    Profil pro
    Enseignant
    Inscrit en
    Avril 2004
    Messages
    431
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2004
    Messages : 431
    Points : 523
    Points
    523
    Par défaut Procédures stockées
    Bonjour,

    la procédure stockée suivante me donne des soucis.
    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
     
    SET TERM ^;
    CREATE PROCEDURE PS_POINT_TOTAL(NUMERO_PARTIE INTEGER,NUMERO_DONNE INTEGER )
    AS
    DECLARE VARIABLE NUM_LICENCE CHAR(10);
    DECLARE VARIABLE POINT_DONNE DECIMAL(2,1);
    DECLARE VARIABLE POINT_POIGNEE DECIMAL(2,1);
    DECLARE VARIABLE POINT_PETIT DECIMAL(2,1);
    DECLARE VARIABLE POINT_TOTAL DECIMAL(2,1);
    BEGIN
    FOR SELECT POINT_DONNE,NUMERO_LICENCE
        FROM PS_POINT_DONNE(:NUMERO_PARTIE,:NUMERO_DONNE)
        INTO :POINT_DONNE,:NUM_LICENCE
        DO
        BEGIN
          SELECT POINT_PETIT
          FROM PS_POINT_PETIT(:NUMERO_PARTIE,:NUMERO_DONNE)
          WHERE NUMERO_LICENCE=:NUM_LICENCE
          INTO :POINT_PETIT;
          SELECT POINT_POIGNEE
          FROM PS_POINT_POIGNEE(:NUMERO_PARTIE,:NUMERO_DONNE)
          WHERE NUMERO_LICENCE=:NUM_LICENCE
          INTO :POINT_POIGNEE;
          POINT_TOTAL=POINT_DONNE+POINT_PETIT+POINT_POIGNEE;
          INSERT INTO RESULTAT VALUES(:POINT_TOTAL,:NUMERO_PARTIE,:NUMERO_DONNE,:NUM_LICENCE);
        END
    END^
    SET TERM ;^
    Je la teste sur deux bases test identiques.
    Dans un cas ç marche ( insertion correcte ) et dans l'autre cas elle m'indique le message d'erreur suivant :
    "multiple rows in singleton select".
    C'est sans doute le For select qui pose problème, mais comme je n'ai pas envie de tout changer.
    Quelqu'un a-til une piste ?
    Cela m'arrangerait bien car sous delphi, je n'arrive pas justement à l'executer.

    Merci d'avance.
    Kenavo
    Avant de poster sur le forum , faites une recherche

  2. #2
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    Non l'erreur vient de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
          SELECT POINT_PETIT 
          FROM PS_POINT_PETIT(:NUMERO_PARTIE,:NUMERO_DONNE) 
          WHERE NUMERO_LICENCE=:NUM_LICENCE 
          INTO :POINT_PETIT;
    ou de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
          SELECT POINT_POIGNEE 
          FROM PS_POINT_POIGNEE(:NUMERO_PARTIE,:NUMERO_DONNE) 
          WHERE NUMERO_LICENCE=:NUM_LICENCE 
          INTO :POINT_POIGNEE;
    Ces deux select doivent impérativement ne retourner qu'un enregistrement. Ce qui n'est pas le cas (dans la base qui pose probleme).

    Donc soit vous modifiez vos select comme par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
          SELECT sum(POINT_PETIT) 
          FROM PS_POINT_PETIT(:NUMERO_PARTIE,:NUMERO_DONNE) 
          WHERE NUMERO_LICENCE=:NUM_LICENCE 
          INTO :POINT_PETIT;
    ou vous changez le critère de sélection :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
          SELECT POINT_PETIT 
          FROM PS_POINT_PETIT(:NUMERO_PARTIE,:NUMERO_DONNE) 
          WHERE NUMERO_LICENCE=:NUM_LICENCE 
        AND XXXXX = :QQQQ ...
          INTO :POINT_PETIT;
    Ou peut etre qu'un DISTINCT suffit...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
          SELECT DISTINCT POINT_PETIT 
          FROM PS_POINT_PETIT(:NUMERO_PARTIE,:NUMERO_DONNE) 
          WHERE NUMERO_LICENCE=:NUM_LICENCE 
          INTO :POINT_PETIT;

  3. #3
    Membre confirmé Avatar de rlgrand
    Profil pro
    Enseignant
    Inscrit en
    Avril 2004
    Messages
    431
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2004
    Messages : 431
    Points : 523
    Points
    523
    Par défaut distinct
    Bonsoir,
    merci pour le coup de pouce.
    La solution avec le select m'a permis de compiler la procédure.
    Avant de poster sur le forum , faites une recherche

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

Discussions similaires

  1. passage d'un nom de table dans une procédure stockée
    Par thierry V dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 26/07/2010, 16h48
  2. Procédure stocké:Insert et renvoie de la clé primair
    Par caramel dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 17/04/2003, 09h34
  3. [Pervasive SQL ] procédure stockée
    Par magellan dans le forum Autres SGBD
    Réponses: 2
    Dernier message: 25/10/2002, 13h17
  4. Explication procédure stockée
    Par underworld dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 09/09/2002, 10h51
  5. [Comparatif] Procédures stockées, triggers, etc.
    Par MCZz dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 28/08/2002, 12h27

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