Итак, я, наконец, решил научиться использовать хранимые процедуры, и хотя они у меня действительно работают, я не уверен, правильно ли я делаю - иначе. лучший способ . Итак, вот что у меня есть.
Три процедуры: TryAddTag, CheckTagExists и AddTag.
TryAddTag - это процедура, которая является моим посредником между другим кодом (например, PHP и т. Д.) И двумя другими процедурами. , поэтому вызывается именно этот.
TryAddTag
DELIMITER //
CREATE PROCEDURE TryAddTag(
IN tagName VARCHAR(255)
)
BEGIN
-- Check if tag already exists
CALL CheckTagExists(tagName, @doesTagExist);
-- If it does not exist, add it
IF @doesTagExist = FALSE THEN
CALL AddTag(tagName);
END IF;
END //
DELIMITER ;
AddTag
DELIMITER //
CREATE PROCEDURE AddTag(
IN tagName VARCHAR(255)
)
BEGIN
INSERT INTO
tags
VALUES(
NULL,
tagName
);
END //
DELIMITER ;
CheckTagExists
DELIMITER //
CREATE PROCEDURE CheckTagExists(
IN
tagName VARCHAR(255),
OUT
doesTagExist BOOL
)
BEGIN
-- Check if tag exists
SELECT
EXISTS(
SELECT
*
FROM
tags
WHERE
tags.NAME = tagName
)
INTO
doesTagExist;
END //
DELIMITER ;
Мои проблемы связаны с этим и с использованием @doesTagExist.
-- Check if tag already exists
CALL CheckTagExists(tagName, @doesTagExist);
Правильно ли использовать одну из этих переменных? И / или как я могу использовать переменную DECLARE'd для сохранения результата CheckTagExists в TryAddTag? Я ожидал чего-то вроде
...
DECLARE doesTagExist BOOL;
SET doesTagExist = CheckTagExist('str');
...
или чего-то в этом роде ...