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

Messages postés
14319
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
11 décembre 2018
-
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"
Afficher la suite 

Votre réponse

1 réponse

Messages postés
14319
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
11 décembre 2018
0
Merci
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és
14319
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
11 décembre 2018
-
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')
Commenter la réponse de NHenry

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.