其实我不太喜欢搞数据库,平常也就是用用select、insert。这次公司要把数据库从sqlserver迁到mysql,我也试着改了几个存储过程,在此总结。首先吐槽一句,sqlserver和
mysql差别还真大!
区别一:存储过程入参
USE [LearningReport_de]
GO
SET ANSI_NULLS ON
GO DELIMITER $$
SET QUOTED_IDENTIFIER ON
GO USE `LearningReport_de`$$
ALTER PROCEDURE [dbo].[wsGetLL1] DROP PROCEDURE IF EXISTS `wsGetLL1`$$
@Child_id bigint,
@Part_number nchar(17) CREATE PROCEDURE `wsGetLL1`(IN Child_id BIGINT(19), IN Part_number NCHAR(17)
BEGIN
AS
BEGIN END$$
END DELIMITER ;
这是存储过程的结构,sqlserver中全都是GO 什么的,这些在mysql都没有。但是需要注意的的是mysql的默认结束符是 “;”,所以要重新修改结束符。
存储过程可以传入参数,但是sqlserver和mysql的定义形式完全不一样。sqlserver中的入参在begin之前,而mysql的入参和C语言类似,函数名后面加个括号,而且用IN /
OUT 来标识传入和传出,在这个地方就可以看得出来,sqlserver和mysql定义变量的方法也不同,后面会讲到。
区别二:定义变量
DECLARE @Product_number bigint DECLARE Product_number BIGINT;
DECLARE @sSQL nvarchar(1000) DECLARE sSQL NVARCHAR(1000);
DECLARE @Country_index nchar(2) DECLARE Country_index NCHAR(2);
DECLARE @LL0_table nvarchar(50) DECLARE LL0_table NVARCHAR(50);
DECLARE @LL1_table nvarchar(50) DECLARE LL1_table NVARCHAR(50);
sqlserver中的变量都是用@开头的,以后使用也需要@,而mysql没有,我觉得这点sqlserver还是不错,以为后面很多地方变量和列名会混乱。除此之外,sqlserver不需要
标点,而mysql是典型的";"结尾。另外sqlserver中有bit类型,而mysql中没有,一般用bool 或者tinyint代替。
区别三:游标
sqlserver和mysql的定义游标是完全一样的,只不过在sqlserver中游标的声明可以在任何地方,而mysql中的游标声明只能在最前面。sqlserver在遍历游标时用了内置变量
@@FETCH_STATUS,而mysql需要自己定义,不管哪种,二重循环变量
DECLARE ProductCursor cursor for DECLARE ProductCursor CURSOR FOR
SELECT roduct_number FROM vuChildProductByCountry SELECT product_number FROM vuChildProductByCountry;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET fetch_status = 0;
OPEN ProductCursor
FETCH NEXT FROM ProductCursor into @Product_number SET fetch_status = 1;
WHILE @@FETCH_STATUS = 0 OPEN ProductCursor;
BEGIN
FETCH FROM ProductCursor INTO Product_number;
FETCH NEXT FROM ProductCursor into @Product_number REPEAT
END IF fetch_status THEN
CLOSE ProductCursor
DEALLOCATE ProductCursor END IF;
FETCH NEXT FROM ProductCursor INTO Product_number;
UNTIL NOT fetch_status END REPEAT;
CLOSE ProductCursor;
由此可见,mysql中使用游标时还需另外声明 DECLARE CONTINUE HANDLER FOR NOT FOUNT SET fetch_status=0,这句表明,当游标到末尾时fetch_status的值就是0,
所以在repeat遍历的时候用until not fetch_status,sqlserver最后还需要用 DEALLOCATE ProductCursor来关闭游标。
三、组装sql语句
sqlserver太简单了,直接+就可以了, 但mysql不然,只能每次用concat一点一点拼接。