浅谈 sqlserver 和 mysql存储过程、函数的区别

来源:互联网 发布:ubuntu ssh 远程登录 编辑:程序博客网 时间:2024/05/16 17:36

其实我不太喜欢搞数据库,平常也就是用用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一点一点拼接。




0 0