日历

2018年十二月
« 11月    
 12
3456789
10111213141516
17181920212223
24252627282930
31  

最近评论

    linux企业应用

    mysql第十一部分 MYSQL与ORACLE SQLSERVER DB2的区别

    下面,我们来看一下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更标准。

    评论已关闭。