Создание / Использование хранимой процедуры с миграцией Laravel - PullRequest
0 голосов
/ 26 сентября 2018

Это немного коротко!

Я построил хранимую процедуру, которая прекрасно работает.Однако, когда я помещаю его в миграцию Laravel (eloquent), миграция создает хранимую процедуру, но при ее вызове выдает ошибку 1292 (усеченное неверное значение DOUBLE).Из рабочего места mysql я затем щелкаю правой кнопкой мыши на хранимой процедуре, созданной миграцией, копирую инструкцию create, удаляю хранимую процедуру и перестраиваю ее из своего собственного оператора create .... И ..... ВСЕ РАБОТАЕТ ВЫГОДНО!

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

DELIMITER $$

CREATE PROCEDURE sp_cancelTasksOnApplicationCancel(IN loanAppId INT(20))

BEGIN

            SELECT loanAppId;

            #SET @taskids := 0;

            update tasks set task_status = 26, task_status_note = 'Application Cancelled or Denied' 

where loan_app_id = loanAppId AND task_status IN (22, 23, 24) AND ( SELECT @taskids := CONCAT_WS(',', id, @taskids) );        

#SELECT @taskids;

SET @cleanids = SUBSTRING(@taskids, 1, CHAR_LENGTH(@taskids) -1);

#SELECT @cleanids;

            SET @pos = 0;

            SET @len = 0;

            WHILE LOCATE(',', @cleanids, @pos+1) > 0 DO

                            SET @len = LOCATE(',', @cleanids,@pos+1) - @pos;

                            SET @id = SUBSTRING(@cleanids, @pos, @len);

                                            #select (@id);

                                            IF (@id <> 0) THEN

                                            insert into status_historys 

                                                            (loan_app_id, `type`, type_recid, type_keyfield,type_status_field, type_status_date_field, type_status_note_field, type_status_userid_field, `status`, status_date, status_note, status_userid, created_at, updated_at) 

            values(loanAppId, 'tasks', @id, 'id', 'task status', 'tasks status datetime', 'tasks status note', 'tasks status userid', 26, now(), 'Application Cancelled or Denied', 1, now(), now()); 

                                            END IF;

                            SET @pos = LOCATE(',', @taskids, @pos+@len) + 1;

            END WHILE;

END $$

DELIMITER ;
############## ОБНОВЛЕНИЕ

Проблема заключается в следующих двух строках.Даже из командной строки выдает предупреждение о неверном двойном значении.

SET @taskids := '0';

update tasks set task_status = 22, task_status_note = 'Just Testing' 
where loan_app_id = loanAppId AND task_status IN (22, 23, 24) AND ( SELECT 
@taskids := CONCAT_WS(',', cast(id as char), @taskids) );

1 Ответ

0 голосов
/ 26 сентября 2018

ОК. Основной проблемой было ключевое слово select в предложении update where.Я считаю, что он продолжал повторно объявлять пользовательскую переменную @taskids, и mysql выдавал предупреждения, если хранимая процедура была построена из рабочей среды, но не выполнялась, если хранимая процедура была построена путем миграции.

Таким образом, правильный код был

#snip#
#Note string '0' rather than 0
SET @taskids := '0';

#note casting of id and removing the select keyword before the first @taskids
update tasks set task_status = 22, task_status_note = 'Just Testing' 
where loan_app_id = loanAppId AND task_status IN (22, 23, 24) AND (  
@taskids := CONCAT_WS(',', cast(id as char), @taskids) );

#snip#
...