NHenry
Messages postés15083Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention19 septembre 2023
-
Modifié par NHenry le 24/12/2015 à 22:38
NHenry
Messages postés15083Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention19 septembre 2023
-
1 oct. 2016 à 14:33
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
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"
NHenry
Messages postés15083Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention19 septembre 2023159 1 oct. 2016 à 14:16
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.
NHenry
Messages postés15083Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention19 septembre 2023159 1 oct. 2016 à 14:33
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 ;
1 oct. 2016 à 14:33
A appeller par :
SELECT AddSite('MonSite.TLD')