下面,我们来看一下mysql中的一些细节问题,比如alter(修改)和drop(删除),oracle/sql server /db2/ANSI comparison,style,bugs,featere requests,resources等。
首先看ALTER AND DROP
mysql> show procedure status where db=’db1′//
显示所有的存储过程,太多,这里就不列出来了,发现p20过程有一个说明,下面更改一下p20的comment说明,那么我们可以这样:
mysql> alter procedure p20 comment ‘modify comment’//
Query OK, 0 rows affected (0.00 sec)
mysql> show procedure status where name=’p20′//
+—–+——+———–+—————-+———————+———————+—————+—————-+
| Db | Name | Type | Definer | Modified | Created | Security_type | Comment |
+—–+——+———–+—————-+———————+———————+—————+—————-+
| db1 | p20 | PROCEDURE | root@localhost | 2010-06-29 17:02:14 | 2010-06-25 10:29:01 | DEFINER | modify comment |
+—–+——+———–+—————-+———————+———————+—————+—————-+
1 row in set (0.00 sec)
通过alter更改了p20以前的comment,现在p20的alter是“modify comment”了。
使用drop可以删除procedure,比如:
mysql> drop procedure p20//
Query OK, 0 rows affected (0.00 sec)
mysql> show procedure status where name=’p20′//
Empty set (0.00 sec)
过程p20已经删除了,所以没有显示了,呵呵
2、Oracle Comparison 与Oracle的比较
1、Oracle允许在打开后再声明。MySQL必须在开始的时候声明。
2、 Oracle允许”CURSOR cursorname IS”这样的声明。 MySQL必须使用”DECLARE cursorname CURSOR”声明。
3、Oracle不强制需要’()’。MySQL必须有’()’。
4、 Oracle允许在函数中访问表元素。MySQL不允许在函数中访问表元素。
5、Oracle支持”packages”。MySQL不支持”packages”。
6、这些是oracle和mysql的一些区别。
在数据迁移时,oracle和mysql也有写不同,比如:
在Oracle存储过程中
CREATE PROCEDURE … RETURN; …
在MySQL存储过程中
CREATE PROCEDURE () label_at_start: BEGIN … LEAVE label_at_start; END
上面是oracle和mysql存储过程的不同,可以看出oracle的return,在mysql中使用LEAVE label_at_start,对于label_at_start,是最初为存储过程设定的标记。在oracle中使用的a:=b,在mysql中则使用“set a=b”。
7、 Side-By-Side 平行比较
Oracle MySQL
CREATE PROCEDURE CREATE PROCEDURE
sp_name sp_name
AS BEGIN
variable1 INTEGER DECLARE variable1 INTEGER;
variable1 := 55 SET variable1 = 55;
END END
3、mysql与SQL Server的对比
3.1摘要:
SQL Server参数名字必须以‘@’开头。
MySQL参数名是常规标识符。
SQL Server可以同时进行多个声明,如:”DECLARE v1 [data type], v2 [data type]“;
MySQL只允许每次声明一个,如:”DECLARE v1 [data type]; DECLARE v2 [data type]“。
SQL Server存储过程体中没有BEGIN … END;
MySQL必须有BEGIN … END语句。
SQL Server不需要以’;'号结束语句;
MySQL必须使用’;'号作为语句结束标志,除了最后一条语句外。
SQL Server可以进行”SET NOCOUNT”设置和”IF @@ROWCOUNT”判断;
MySQL没有这些,但可以使用FOUND_ROWS()进行判断。
SQL Server中使用”WHILE … BEGIN”语句;
MySQL使用”WHILE … DO”语句。
SQL Server允许使用”SELECT”进行指派;
MySQL只允许SET进行指派。
SQL Server允许在函数中访问表;
MySQL不允许在函数中访问表。
Microsoft SQL Server的区别特别多,所以讲Microsoft或Sybase的程序转换成MySQL程序将会是个冗长的过程,而且区别都是在语法定义上的,所以转换需要更多特别的技巧。
3.2 Some migration tips … 一些迁移技巧
如果SQL Server中有名为@xxx的变量,你必须将其转换,因为@在MySQL中并不代表过程变量,而是全局变量,不要仅仅改成xxx,那样会使其含义不明确。因为在数据库的某个表中可能有一列的列名叫xxx,所以最好把@前缀改成自定义字符,如将@xxx改成var_xxx 。
3.3Side by Side 平行对比
SQL Server MySQL
CREATE PROCEDURE CREATE PROCEDURE
sp_procedure1 sp_procedure1
AS ()
DECLARE @x VARCHAR(100) BEGIN
EXECUTE sp_procedure2 @x DECLARE v__x VARCHAR(100);
DECLARE c CURSOR FOR CALL sp_procedure2(v__x);
DECLARE c CURSOR FOR SELECT * FROM t;
SELECT * FROM t END
END
4、mysql与DB2 的对比
DB2允许PATH(路径)语句;
MySQL不允许PATH(路径)语句。
DB2允许SIGNAL(信令)语句;
MySQL不允许SIGNAL(信令)语句。
DB2允许例程名的重载;
MySQL不允许对例程名的重载。
DB2有”label_x: … GOTO label_x”语法;
MySQL有非正式的”label label_x; … GOTO label_x”语法。
DB2允许函数访问表;
MySQL不允许函数访问表。
DB2存储过程基本和MySQL一致,唯一的不同是MySQL还没有引进DB2的一些语句,还有就是DB2允许重载,因此DB2可以有两个名字一样的例程,通过例程的参数或返回类型来决定执行哪个,所以DB2存储过程可以向下与MySQL的兼容。
4.2迁移技巧
MySQL缺少SIGNAL语句,我们会在其他地方讨论临时工作区的问题。而对DB2的GOTO语句,我们直接用MySQL的GOTO代替就可以了。PATH(确定DBMS寻找例程的数据库目录)问题只需要在例程名前加上前缀就可以避免了。关于函数访问表的问题,建议大家用OUT参数的存储过程来代替就行了。
4.3mysql与db2的平行对比
DB2 MySQL
CREATE PROCEDURE CREATE PROCEDURE
sp_name sp_name
(parameter1 INTEGER) (parameter1 INTEGER)
LANGUAGE SQL LANGUAGE SQL
BEGIN BEGIN
DECLARE v INTEGER; DECLARE v INTEGER;
IF parameter1 >=5 THEN IF parameter1 >=5 THEN
CALL p26(); CALL p26();
SET v = 2; SET v = 2;
END IF; END IF;
INSERT INTO t VALUES (v); INSERT INTO t VALUES (v);
END @ END //
5、mysql与SQL标准的比较
摘要:
Standard SQL requires: 标准SQL的要求,与DB2中的一样
MySQL的目标是支持以下两个标准SQL特性:
Feature P001 “Stored Modules” (特性 P001 “存储模式”)
Feature P002 “Computational completeness” (特性 P002 “计算完整性”)
DB2和MySQL相似的原因是两者都支持标准SQL中的存储过程。因此MySQL和DB2的区别就像mysql背离ANSI/ISO标准语法那样。但是mysql比Oracle或SQL Server更标准。