Mysql procédure stockée ajout si besoin [Résolu]

Signaler
Messages postés
14792
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
17 mai 2021
-
Messages postés
14792
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
17 mai 2021
-
Bonsoir,

Pour mon bot de contrôle de vivacité des liens de mon site, je dois faire des liens entre différentes URL d'une même table (et pour limiter les accès à la BDD) je cherche à coder une procédure stockée qui doit faire :

Tables :
ListUrl : Liste des URL (Id, Url, +autres champs sans objets pour la question)
UrlLinked : Liste des liens (IdParent,IdChild)

Paramètres IdParent, URLEnfant
Recherche de l'ID de l'enfant à partir de l'URL
Si pas d'enfant trouvé, l'ajouter à la table ListUrl
Ajouter une entrée dans UrlLinked pour lier le parent et l'enfant.

Mon code actuel
DROP PROCEDURE IF EXISTS AddChild;
DELIMITER $$
CREATE PROCEDURE AddChild(IN pParentId BIGINT, IN pChildURL TEXT)
BEGIN
DECLARE lChildId INT;
SELECT MAX(Id) FROM ListUrl WHERE Url=pChildURL;
IF lChildId IS NULL THEN
 INSERT INTO ListUrl (Url,IdParent,LastSeen) VALUES(pChildURL ,pParentId,NOW());
 SET lChildId=LAST_INSERT_ID;
END IF;
INSERT INTO UrlLinked (IdParent,IdChild) VALUES(pParentId,lChildId);
END$$
DELIMITER ;


N'étant pas très familier avec les procédures stockées, je galère un peu.
Actuellement avec ce code, j'ai MySql qui a des soucis avec DELIMITER

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DELIMITER' at line 1

En mettant l'instruction
DELIMITER ;

J'ai pourtant, je pense, bien suivi les conseils de la page officielle
http://forums.mysql.com/read.php?98,358569

Même après avoir extrait une autre procédure stockée, je ne vois pas d'où vient l'erreur et je ne peux donc pas tester si mon code est bon.

Edit :
La procédure apparait quand même, quand je l’exécute, ça ajoute l'entrée (qui n'existe pas à la base), mais ça n'ajoute rien à la table UrlLinked, pas d'erreur affichées, je continue mes recherches.

J'interviens principalement en VB6 et VB.NET, avec un peu de C#, mais la modération m'amène souvent sur d'autre langages.
En VB.NET pensez à activer "Option Explicit" et "Option Strict"

1 réponse

Messages postés
14792
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
17 mai 2021
155
Je me répond à moi même, après quelques temps de recherches :

DROP PROCEDURE IF EXISTS `AddVisitPageDay`;

delimiter //

CREATE PROCEDURE AddVisitPageDay (IN pVisitDate DATE, IN pIdPage BIGINT, IN pNbVisit INT)
BEGIN
	IF ( SELECT EXISTS (
    SELECT 1
    FROM PageVisitePerDay
    WHERE VisitDate=pVisitDate AND IdPage=pIdPage
 ) ) THEN 
 		UPDATE PageVisitePerDay SET VisitCounter=VisitCounter+pNbVisit WHERE VisitDate=pVisitDate AND IdPage=pIdPage;
 	ELSE
 		INSERT INTO PageVisitePerDay(VisitDate, IdPage, VisitCounter) VALUES (pVisitDate,pIdPage,pNbVisit);
 	END IF;
END//

delimiter ;


Cela permet de :
Si la ligne VisitDate/IdPage n'existe pas, on l'ajoute.
Si la ligne existe, on lui ajoute le nouvelle valeur.

A adapter à votre besoin.
Messages postés
14792
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
17 mai 2021
155
Autre échantillon avec valeur de retour :

DROP FUNCTION IF EXISTS `AddSite`;

delimiter //

CREATE FUNCTION AddSite (pSiteName CHAR(64))
RETURNS BIGINT DETERMINISTIC
BEGIN
	DECLARE lId BIGINT;
	IF ( SELECT EXISTS (
    SELECT 1
    FROM Sites
    WHERE SiteName=pSiteName
 ) ) THEN 
 		SELECT SiteId INTO lId FROM Sites WHERE SiteName=pSiteName;
 	ELSE
 		INSERT INTO Sites(SiteName) VALUES (pSiteName);
 		SET lId = LAST_INSERT_ID();
 	END IF;
 	RETURN lId;
END//

delimiter ;


A appeller par :
SELECT AddSite('MonSite.TLD')