浅谈 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
- 浅谈 sqlserver 和 mysql存储过程、函数的区别
- MySQL存储过程和函数的区别
- Mysql存储过程和函数的区别
- MySQL存储过程和函数的区别
- MySQL存储过程和函数的区别
- mysql 存储过程和函数的区别
- MySQL存储过程和函数的区别
- mysql 存储过程和函数的区别
- SqlServer Dev(1) - 存储过程和自定义函数的区别
- MySQL存储函数和存储过程的区别
- sqlserver存储过程和触发器的区别
- mysql中自定义函数和存储过程的几个区别
- MySQL函数和存储过程的区别以及代码示例
- MySQL存储过程和函数的区别与优缺点
- MySQL存储过程和函数的区别与优缺点
- Mysql 存储过程和函数区别
- Mysql 存储过程和函数区别
- Mysql 存储过程和函数区别
- Fence Repair
- fgets和fputs、fread和fwrite、fscanf和fprintf用法
- android的消息处理机制(图+源码分析)——Looper,Handler,Message
- 新手如何个人理财
- 每天一道算法题(5)——判断整数序列是否是二叉查找树后序遍历结果
- 浅谈 sqlserver 和 mysql存储过程、函数的区别
- Swift版本的图片轮播器框架
- SPOJ 694 Distinct Substrings
- ECShop - 数据库操作类
- 面试
- Android软件开发之盘点所有Dialog对话框大合集(一)
- 函数实现strcmp.
- Sqlserver SET NOCOUNT ON不返回受影响行数
- Android中Parcelable接口用法