Вопрос

За последние пару дней я пытался написать хранимую процедуру в MySQL, и у меня есть немного опасных, чтобы она работала. Надеюсь, кто -то здесь сможет внести мне вклад :)

Пример, который я публикую, для поставщика членства ASP.NET для создания нового пользователя. Я рассчитываю отправить электронную почту и пароль в БД и получить возврат int, чтобы убедиться, что userDeatils был записан в БД.

Я использую MySQL DB 5.1 (я думаю) и пишу SQL на веб -интерфейс.

Я получил 2 побочных вопроса, кто -нибудь тоже это объяснил :): 1) Я использую разделитель, но не знаю, что он делает. 2) Я не уверен, нужно ли мне делать другие вещи, а затем установить AutoCommit = 0, чтобы получить транзакции на работу, или мне даже нужно это сделать.

Я знаю, что я мог бы использовать оператор IF / else вместо транзакции, но хотел бы сделать это с одним, чтобы узнать, как оно работает. (Я рассчитываю использовать его много позже)

Код, который я не могу приступить к работе:

DELIMITER //

CREATE DEFINER=`websharp_dk`@`%` PROCEDURE `CreateUser`(
    IN _username VARCHAR(100),
    IN _Password VARCHAR(100))
    RETURNS INT

    BEGIN
    SET autocommit = 0;
    DECLARE return_value INT;

    BEGIN TRY
        START TRANSACTION
                INSERT INTO User 
                (Email
                ,Password
                ,Failed_Password_Count
                ,Creation_Date)
                VALUES
                (_username
                ,_Password
                ,0
                ,Datetime.Now())
            SET return_value = 1;
        COMMIT;
    END TRY

    BEGIN CATCH
        ROLLBACK
        SET return_value = 0;
    END CATCH

    BEGIN FINALLY
    RETURN return_value;
    END FINALLY 
    END//
DELIMITER ;

Изменить: сообщение об ошибке, которое я получаю,:

1064 - У вас есть ошибка в вашем синтаксисе SQL; Проверьте руководство, которое соответствует вашей версии MySQL Server для правильного синтаксиса для использования вблизи int begin set autocommit = 0; Объявить return_value int; 'В строке 4

Нет правильного решения

Другие советы

Чтобы получить поддержку транзакций, убедитесь, что вы используете механизм хранения InnoDB, а не Myisam по умолчанию.

Что касается самого этого кода, то мой первый вопрос был бы, почему вы завершаете этот единственный запрос в транзакции? Кроме того, какие ошибки вы видите?

Разделитель переосмысливает, какую последовательность символов вы используете для завершения оператора SQL. Вся процедура создания - это одно большое утверждение, и вам нужно сказать MySQL, где это заканчивается чем -то (обычно будет ';'). Но поскольку у вас есть куча других утверждений в «теле» (между началом и конец) оператора создания процедуры, которое все необходимо закончить, вам нужно переопределить разделитель, чтобы вы не заканчивали оператор «Создать процедуру» в первый ';'.

Без переопределения разделителя MySQL подумает, что утверждение процедуры создания выглядит так, а затем начнете новое утверждение:

CREATE DEFINER=`websharp_dk`@`%` PROCEDURE `CreateUser`(
    IN _username VARCHAR(100),
    IN _Password VARCHAR(100))
    RETURNS INT

    BEGIN
    SET autocommit = 0;

Используя разделитель; В конце сценария изменяет разделитель обратно на ';' и это не нужно, хотя это хорошая практика для этого.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top