为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:8.0
【操作系统】:windows
【CPU】:
【问题描述】*:
我有一个mysql 的存储过程,想迁移到dm,请问这个存储过程如何转换过来呢?
CREATE DEFINER=`root`@`%` PROCEDURE `generate_codeNo`(in CODENAMEPre varchar(25), in num int, out newCODENO varchar(25),in TABLE_NAME varchar(25),in sufnum int)
BEGIN
DECLARE currentDate varCHAR (15) ;-- 当前日期,有可能包含时分秒
DECLARE maxNo INT DEFAULT 0 ; -- 离现在最近的满足条件的订单编号的流水号最后5位,如:SH2013011000002的maxNo=2
DECLARE oldCODENO VARCHAR (25) DEFAULT '' ;-- 离现在最近的满足条件的订单编号
if num = 0 then -- 根据年月日生成订单编号
SELECT "" INTO currentDate ;-- 订单编号形式:前缀+流水号,如:SH00002
elseif num = 4 then -- 根据年月日生成订单编号
SELECT DATE_FORMAT(NOW(), '%Y') INTO currentDate ;-- 订单编号形式:前缀+年+流水号,如:SH201300002
elseif num = 6 then -- 根据年月日生成订单编号
SELECT DATE_FORMAT(NOW(), '%Y%m') INTO currentDate ;-- 订单编号形式:前缀+年月+流水号,如:SH20130100002
elseif num = 8 then -- 根据年月日生成订单编号
SELECT DATE_FORMAT(NOW(), '%Y%m%d') INTO currentDate ;-- 订单编号形式:前缀+年月日+流水号,如:SH2013011000002
elseif num = 14 then -- 根据年月日时分秒生成订单编号
SELECT DATE_FORMAT(NOW(), '%Y%m%d%H%i%s') INTO currentDate ; -- 订单编号形式:前缀+年月日时分秒+流水号,如:SH2013011010050700001,个人不推荐使用这种方法生成流水号
else -- 根据年月日时分生成订单编号
SELECT DATE_FORMAT(NOW(), '%Y%m%d%H%i') INTO currentDate ;-- 订单形式:前缀+年月日时分+流水号,如:SH20130110100900005
end if ;
SELECT IFNULL(CODENO, '') INTO oldCODENO
FROM smartform_orders
WHERE SUBSTRING(CODENO, length(CODENAMEPre)+1, num) = currentDate
AND SUBSTRING(CODENO, 1, length(CODENAMEPre)) = CODENAMEPre
and length(CODENO) = num+sufnum+ length(CODENAMEPre)
ORDER BY ID DESC LIMIT 1 ; -- 有多条时只显示离现在最近的一条
IF oldCODENO != '' THEN
SET maxNo = CONVERT(SUBSTRING(oldCODENO, -sufnum), DECIMAL) ;-- SUBSTRING(oldCODENO, -5):订单编号如果不为‘‘截取订单的最后5位
END IF ;
SELECT
CONCAT(CODENAMEPre, currentDate, LPAD((maxNo + 1), sufnum, '0')) INTO newCODENO ; -- LPAD((maxNo + 1), 5, '0'):如果不足5位,将用0填充左边
INSERT INTO smartform_orders (CODENO, TABLENAME) VALUES (newCODENO, TABLE_NAME) ; -- 向订单表中插入数据
SELECT
newCODENO ;
END
试试我这边修改了,一些语法




1.输入输出参数定义不一样,如下图:
2.过程定义变量,如下图
3.convert函数写法,如下下图
4.插入语句加上commit,如下图
CREATE PROCEDURE generate_codeNo(CODENAMEPre in varchar(25), num in int,
newCODENO out varchar(25), TABLE_NAME in varchar(25),sufnum in int)
as
currentDate varCHAR (15) ;-- 当前日期,有可能包含时分秒
maxNo INT DEFAULT 0 ; -- 离现在最近的满足条件的订单编号的流水号最后5位,如:SH2013011000002的maxNo=2
oldCODENO VARCHAR (25) DEFAULT '' ;-- 离现在最近的满足条件的订单编号
BEGIN
if num = 0 then -- 根据年月日生成订单编号
SELECT '' INTO currentDate ;-- 订单编号形式:前缀+流水号,如:SH00002
elseif num = 4 then -- 根据年月日生成订单编号
SELECT DATE_FORMAT(NOW(), '%Y') INTO currentDate ;-- 订单编号形式:前缀+年+流水号,如:SH201300002
elseif num = 6 then -- 根据年月日生成订单编号
SELECT DATE_FORMAT(NOW(), '%Y%m') INTO currentDate ;-- 订单编号形式:前缀+年月+流水号,如:SH20130100002
elseif num = 8 then -- 根据年月日生成订单编号
SELECT DATE_FORMAT(NOW(), '%Y%m%d') INTO currentDate ;-- 订单编号形式:前缀+年月日+流水号,如:SH2013011000002
elseif num = 14 then -- 根据年月日时分秒生成订单编号
SELECT DATE_FORMAT(NOW(), '%Y%m%d%H%i%s') INTO currentDate ; -- 订单编号形式:前缀+年月日时分秒+流水号,如:SH2013011010050700001,个人不推荐使用这种方法生成流水号
else -- 根据年月日时分生成订单编号
SELECT DATE_FORMAT(NOW(), '%Y%m%d%H%i') INTO currentDate ;-- 订单形式:前缀+年月日时分+流水号,如:SH20130110100900005
end if ;
SELECT IFNULL(CODENO, '') INTO oldCODENO
FROM SMARTFORM_ORDERS
WHERE SUBSTRING(CODENO, length(CODENAMEPre)+1, num) = currentDate
AND SUBSTRING(CODENO, 1, length(CODENAMEPre)) = CODENAMEPre
and length(CODENO) = num+sufnum+ length(CODENAMEPre)
ORDER BY ID DESC LIMIT 1 ;
IF oldCODENO != '' THEN
SET maxNo = CONVERT(DECIMAL,SUBSTRING(oldCODENO,-sufnum));
END IF ;
SELECT
CONCAT(CODENAMEPre, currentDate, LPAD((maxNo + 1), sufnum, '0')) INTO newCODENO ; -- LPAD((maxNo + 1), 5, '0'):如果不足5位,将用0填充左边
INSERT INTO SMARTFORM_ORDERS (CODENO, TABLENAME) VALUES (newCODENO, TABLE_NAME) ;
COMMIT; -- 向订单表中插入数据
SELECT
newCODENO ;
END