Problème sql

Fermé
LapindeTerraria - Modifié le 30 mars 2022 à 23:41
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 - 31 mars 2022 à 15:14
Bonjour,

J'essais de faire en sorte que l'on puisse soit verser de l'argent qu'aux épreuves qu'on sponsorise déjà, soit qu'on verse de l'argent pour toutes les épreuves.

Je cherche à ajouter la deuxième option car j'ai déjà fais la première. Et je manque de connaissances.

Voici la structure de la BDD:
CREATE TABLE sponsor
(
 idsponsor character(4) NOT NULL,
 idtypesponsor character(7) NOT NULL,
 CONSTRAINT pk_sponsor PRIMARY KEY (idsponsor),
 CONSTRAINT fk_sponsor_partenaire FOREIGN KEY (idsponsor) REFERENCES partenaire 
(idpartenaire) ,
CONSTRAINT fk_typesponsor FOREIGN KEY (idtypesponsor) REFERENCES typesponsor 
(idtypesponsor)
);
CREATE TABLE epreuve
(
 idepreuve character(3) NOT NULL,
 nom text,
 CONSTRAINT pk_epreuve PRIMARY KEY (idepreuve)
);
CREATE TABLE sponsoriser
(
 idepreuve character(3) NOT NULL,
 idsponsor character(4) NOT NULL,
 montant integer DEFAULT 0,
 CONSTRAINT pk_sponsoriser PRIMARY KEY (idepreuve,idsponsor),
 CONSTRAINT fk_sponsor FOREIGN KEY (idsponsor) REFERENCES sponsor (idsponsor),
 CONSTRAINT fk_sponsoriser_epreuve FOREIGN KEY (idepreuve) REFERENCES epreuve (idepreuve)
);



Et voici, mon code :

CREATE OR REPLACE FUNCTION distribsponsor(vidsponsor 
character(4), vmontant integer)
RETURNS VOID AS $$
DECLARE 
 vnbsponsor integer; -- nombre d'épreuves sponsorisées par ce sponsor
BEGIN
    -- nombre d'épreuves sponsorisées par ce sponsor
    select count(*) into vnbsponsor from sponsoriser 
    where idsponsor = vidsponsor;

    -- distribution du montant sur les épreuves déjà sponsorisées
    update sponsoriser set montant = montant + (vmontant/vnbsponsor) 
    where idsponsor = vidsponsor;
END ;
$$ LANGUAGE plpgsql;


EDIT: Ajout des balises de code
A voir également:

1 réponse

jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
30 mars 2022 à 23:42
Bonjour,

En lisant rapidement.. je dirais qu'il faut faire un INSERT au lieu d'un UPDATE
0
Albator2005
31 mars 2022 à 13:09
Faire ça ? au lieu de ça ?

    update sponsoriser set montant = montant + (vmontant/vnbsponsor)


    insert sponsoriser set montant = montant + (vmontant/vnbsponsor)



Enfaite le code du haut, c'est quel langage exactement ?
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650 > Albator2005
31 mars 2022 à 13:23
Tout dépend si tu veux créer une seconde procédure qui ferait l'ajout ou si tu veux pouvoir dans celle que tu nous montre faire l'ajout
et/ou mettre à jour ...
Si tu es dans le second cas, il va falloir faire une condition pour vérifier si la ligne existe déjà dans ta table et si oui tu pourras faire la mise à jour dans le cas contraire il faudra faire un ajout.
Le langage utilisé ici est le SQL...
Renseigne-toi (formes toi) sur la création et l'utilisation des procédures stockées...
0
Albator2005 > jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024
31 mars 2022 à 15:00
Je cherche à avoir une deuxième procédure
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650 > Albator2005
31 mars 2022 à 15:14
Donc si tu créés une seconde procédure, il te suffit d'utiliser pratiquement le même code que l'autre en remplaçant la requête d'UPDATE par une requête d'INSERT
0