SQL procédural : traiter les conditionnelles
Résoluarscy Messages postés 173 Date d'inscription Statut Membre Dernière intervention -
- SQL procédural : traiter les conditionnelles
- Logiciel sql - Télécharger - Bases de données
- Requete sql pix - Forum PHP
- Additions et multiplication dans des requêtes SQL ✓ - Forum MySQL
- Ora-00933: la commande sql ne se termine pas correctement ✓ - Forum Oracle
- Sql query download - Télécharger - Gestion de données
3 réponses
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!
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)
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.
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 ;