2015-06-08 5 views
2

Я начал создавать хранимую процедуру с MySQL. И тогда я хотел бы сделать миграцию: вверх (MyBatis).Ошибка синтаксиса SQL. Создание хранимой процедуры

mvn migration:up -Dmigration.path=/path/to/repository 

Вот моя хранимая процедура

DROP PROCEDURE IF EXISTS add_tips; 


CREATE DEFINER=`root`@`localhost` PROCEDURE `add_tips`(gspId INTEGER, gameID INTEGER) 
BEGIN 

DECLARE @start_datetime = getdate(); 
DECLARE @execution_time_in_seconds int; 
DECLARE @LID int; 
INSERT INTO sp_logs(spName, startTime) VALUES(`add_tips`, @start_datetime); 
SET @LID = LAST_INSERT_ID(); 
... 
/*some code goes here*/ 
... 
@execution_time_in_seconds = datediff(SECOND,@start_datetime,getdate()) 
UPDATE sp_logs 
SET executionTime = @execution_time_in_seconds 
WHERE logId = @LID; 

END 

После этого миграция: команда до выполнена

Я получаю ошибку

Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: 
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 '@start_datetime = getdate(); 
[INFO] DECLARE @execution_time_in_seconds int; 
[INFO] DECLARE @LI' at line 4 
+0

У вас есть нечетные одинарные кавычки используются. Удалите их и используйте стандартную одиночную кавычку 'вместо ' – CathalMF

+0

. Нет ничего удивительного в том, что вы получаете синтаксическую ошибку. Ваша хранимая процедура написана с использованием синтаксиса SQL Sever во многих местах. –

ответ

2

Я решил проблему. Окончательный код выглядит следующим образом:

DROP PROCEDURE IF EXISTS add_tips; 


    CREATE DEFINER=`root`@`localhost` PROCEDURE `add_tips`(gspId INTEGER, gameID INTEGER) 
    BEGIN 

    DECLARE start_datetime DATETIME; 
    DECLARE execution_time TIME; 
    DECLARE lid INTEGER; 
    SET start_datetime = NOW(); 
    INSERT INTO sp_logs(spName,startTime) values('add_tips', start_datetime); 
    SET lid = LAST_INSERT_ID(); 
    ... 
    /*some code goes here*/ 
    ... 
SET execution_time = TIMEDIFF(NOW(), start_datetime); 
UPDATE sp_logs 
SET executionTime = execution_time 
WHERE logId = lid; 

    END; 

Проблема была END;

2

вы должны изменить 'разделитель'

DROP PROCEDURE IF EXISTS add_tips; 

delimiter // 


CREATE DEFINER=`root`@`localhost` PROCEDURE `add_tips`(gspId INTEGER, gameID INTEGER) 
BEGIN 

DECLARE @start_datetime = getdate(); 
DECLARE @execution_time_in_seconds int; 
DECLARE @LID int; 
INSERT INTO sp_logs(spName, startTime) VALUES(`add_tips`, @start_datetime); 
SET @LID = LAST_INSERT_ID(); 
... 
/*some code goes here*/ 
... 
@execution_time_in_seconds = datediff(SECOND,@start_datetime,getdate()) 
UPDATE sp_logs 
SET executionTime = @execution_time_in_seconds 
WHERE logId = @LID; 

END // 

delimiter ; 
+0

Я был добавлен DELIMITER //, DELIMITER; , Итак, теперь ERROR: Причина: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с разделителем // CREATE DEFINER = 'root' @' localhost' ПРОЦЕДУРА 'add_tips' (g 'в строке 1 – Dylan

Смежные вопросы