SQL procédural : traiter les conditionnelles
Résolu/Ferméarscy Messages postés 173 Date d'inscription dimanche 26 janvier 2014 Statut Membre Dernière intervention 5 octobre 2023 - 16 oct. 2022 à 00:26
- SQL procédural : traiter les conditionnelles
- Sql server recovery - Télécharger - Gestion de données
- Logiciel sql - Télécharger - Bases de données
- Sql pix - Forum Python
- Dupliquer une table sql ✓ - Forum Programmation
- Sql commence par ✓ - Forum Webmastering
3 réponses
14 oct. 2022 à 18:11
bonjour,
Peut-être est-il nécessaire d'avoir un "end if" correspondant à chaque "if"?
Tu ne nous montres pas ce que tu as essayé et qui fonctionne. "amputé la fonction de la section", c'est très peu précis.
Bonsoir,
Merci pour la suggestion, malheureusement un tuto 'spécial nul' me dit que ce n'est pas le cas.
Je viens de résoudre ma problématique via ce même tuto à l'instant d'ailleurs.
En cause : attention, en SQL PSL c'est un 'ELSEIF'. Saloperie de syntaxe.
Voici le code fonctionnel en corrigé, avec la correction de bourdes sur la logique de mes conditionnelles _ format à graver dans du marbre :
#DROP FUNCTION IF EXISTS calc_age; DELIMITER // CREATE FUNCTION calc_age(ddn DATE) RETURNS INT BEGIN DECLARE AGE INT DEFAULT 0; DECLARE MONTHDIFF INT DEFAULT 0; DECLARE DAYSDIFF INT DEFAULT 0; SET AGE:=(SELECT YEAR(CURDATE()) - YEAR(ddn)); SET MONTHDIFF:=(MONTH(ddn) - SELECT MONTH(CURDATE()) ); SET DAYSDIFF:=(SELECT DAY(ddn) - DAY(CURDATE()) ); IF (SELECT MONTH(ddn) - MONTH(CURDATE()) ) > 0 THEN SET AGE:=(AGE-1); RETURN AGE; ELSEIF MONTHDIFF=0 AND DAYSDIFF>0 THEN SET AGE:=(AGE-1); RETURN AGE; ELSE RETURN AGE; END IF; END ; // DELIMITER ;
Merci pour ton temps!
15 oct. 2022 à 09:30
S'agit-il de PL/SQL, donc rien à voir avec MySQL?
Tu as maintenant un "end if" correspondant à chaque "if"!
Je pensais que tu voulais imbriquer des IF, ce qui est légal en PL/SQL.
15 oct. 2022 à 12:50
Il s'agit bien de PL/SQL aka SQL procédural oui,
Je viens de comprendre ton allusion à du IF qui n'aurait pas son END IF : le ELSE du post initial s'était perdu en matière d'indentation.
Par contre la dernière version de fonction postée pourrait être optimisée en enlevant le ELSE et tous les RETURN, puis en plaçant un RETURN AGE juste après le END IF.
Il me reste 2 points techniques sur les conventions :
[1] Faut-il forcément un DECLARE par variable? (on ne peut pas faire de DECLARE varA typeA, varB type B etc?)
[2] toute manipulation de variable doit-elle forcément être précédée d'un SET (après initialisation?)
--> sur le tuto que j'ai consulté j'ai trouvé des écritures que je n'ai pas réussi à appliquer (signalées comme erreurs)
15 oct. 2022 à 13:01
Tu trouveras ici des exemples d'utilisation de DECLARE: http://sql.bdpedia.fr/plsql.html
Il n'est pas toujours nécessaire d'utiliser SET.
15 oct. 2022 à 23:30
Et bien c'est assez perturbant, mais actuellement,
sur phpMyAdmin v5.1.3 avec MariaDB v10.5.12,
Je ne peux réaliser mes DECLARE en amont de mes BEGIN,
et mes changements de valeurs de variables semblent devoir être précédées d'un SET :-(
Ma structure-type de fonction doit donc répondre à ce schéma:
CREATE FUNCTION ...
BEGIN
DECLARE mes variables,
mes opérations, avec un SET devant toute variable qui serait actualisée
END ;
Contrairement à ce que j'ai pu lire à propos de ce qui est légal comme opération, où il était proposé un
CREATE FUNCTION...
DECLARE les variables (avec 1 seul déclare pour n variables //ça ne passe pas chez moi :-(
BEGIN
opérations
END ;
16 oct. 2022 à 00:15
MariaDB ne supporte qu'une partie de la syntaxe PL/SQL.
16 oct. 2022 à 00:26
Maria est une ingrate.
Effectivement, j'ai remarqué que certaines manipulations ne passaient pas (ex: concaténation via || parmi tout le reste déjà décrit...).
Merci pour ton temps!