在阅读旧问题后,我尝试在迁移文件中使用DB :: unprepared()。但它只给我“遇到非数字值”错误,数据库中没有任何变化。但是,当我通过添加分隔符直接输入sql语句到phpmyadmin时,它的工作原理。请告诉我我缺少的东西。
DB::unprepared('
CREATE FUNCTION getNextCustomSeq
(
sSeqName VARCHAR(50),
sSeqGroup VARCHAR(10)
) RETURNS VARCHAR(20)
BEGIN
DECLARE nLast_val INT;
SET nLast_val = (SELECT seq_val
FROM _sequence
WHERE seq_name = sSeqName
AND seq_group = sSeqGroup);
IF nLast_val IS NULL THEN
SET nLast_val = 1;
INSERT INTO _sequence (seq_name,seq_group,seq_val)
VALUES (sSeqName,sSeqGroup,nLast_Val);
ELSE
SET nLast_val = nLast_val + 1;
UPDATE _sequence SET seq_val = nLast_val
WHERE seq_name = sSeqName AND seq_group = sSeqGroup;
END IF;
SET @ret = (SELECT concat(sSeqGroup,'-',lpad(nLast_val,6,0)));
RETURN @ret;
END//
');
哦,大声笑,这是一个错字。你忘了逃避这条线:
SET @ret = (SELECT concat(sSeqGroup,'-',lpad(nLast_val,6,0)));
它应该是:
SET @ret = (SELECT concat(sSeqGroup,\'-\',lpad(nLast_val,6,0)));
更新:
DB::unprepared('
CREATE FUNCTION getNextCustomSeq
(
sSeqName VARCHAR(50),
sSeqGroup VARCHAR(10)
) RETURNS VARCHAR(20)
BEGIN
DECLARE nLast_val INT;
SET nLast_val = (SELECT seq_val
FROM _sequence
WHERE seq_name = sSeqName
AND seq_group = sSeqGroup);
IF nLast_val IS NULL THEN
SET nLast_val = 1;
INSERT INTO _sequence (seq_name,seq_group,seq_val)
VALUES (sSeqName,sSeqGroup,nLast_Val);
ELSE
SET nLast_val = nLast_val + 1;
UPDATE _sequence SET seq_val = nLast_val
WHERE seq_name = sSeqName AND seq_group = sSeqGroup;
END IF;
SET @ret = (SELECT concat(sSeqGroup,\'-\',lpad(nLast_val,6,0)));
RETURN @ret;
END//
');
这里发生的事情是你没有逃脱引号,PHP认为你正在做'long chunk of text' - 'long chunk of text'
,当然这会引发错误A non-numeric value encountered
。此警告告诉您正在尝试对一个或多个非数字字符串进行数学表达式:http://php.net/manual/en/migration71.other-changes.php