体验MariaDB 10.3中的Oracle语法支持

MariaDB 10.3发布已经有一段时间了,最近刚刚RC。里面提到了SQL_MODE新增了ORACLE选项,可以支持部分的PL/SQL语法,算是一个比较“新鲜”的更新,所以打算安装体验一下。

体验一下SQL_MODE=”ORACLE”

简单体验一下,我们在Google上找到Oracle 9i文档中PL/SQL示例Sample 1. FOR Loop

Oracle中的示例文档中代码:

-- available online in file 'sample1' DECLARE x NUMBER := 100; BEGIN FOR i IN 1..10 LOOP IF MOD(i,2) = 0 THEN -- i is even INSERT INTO temp VALUES (i, x, 'i is even'); ELSE INSERT INTO temp VALUES (i, x, 'i is odd'); END IF; x := x + 100; END LOOP; COMMIT; END;

首先,我们看看如果是这样一段代码,要在MySQL中运行,应该看起来是怎样的。下面是我修改的在MySQL5.7中运行的代码:

CREATE PROCEDURE dowhile() BEGIN DECLARE x INT DEFAULT 100; DECLARE i INT DEFAULT 1; WHILE i <= 10 DO IF MOD(i,2) = 0 THEN -- i is even INSERT INTO temp VALUES (i, x, 'i is even'); ELSE INSERT INTO temp VALUES (i, x, 'i is odd'); END IF; COMMIT; SET x=x+100; SET i=i+1; END WHILE; END;

以上两种,主要的不同包括:

  • MySQL代码必须在一个存储过程中执行,所以这里创建了dowhile
  • DECLARE语法不一样,Oracle DECLARE在BEGIN之前,MySQL则在BEGIN里面
  • MySQL不支持FOR… IN… LOOP的语法,这里改用WHILE来实现;MySQL也不支持”1..10″这种写法
  • 数据类型不同,Oracle中是NUMBER,MySQL是INT
  • 变量赋值不同,Oracle使用了“:=”,MySQL是 “SET .. = …”
  • 我们先看看,前一段Oracle的代码,在MariaDB里面是否能够不做修改的运行:

    这个简单的示例可以正常运行:

    Snip20180312_7

    升级MariaDB 10.1到10.3

    因为之前安装10.1版本,所以这次需要升级到最新的10.3。系统是Centos 7.4使用的yum管理,下面是大致的升级步骤。

    先把yum仓库切换成10.3的仓库:

    /etc/yum.repos.d/MariaDB.repo [mariadb] name = MariaDB baseurl = http://yum.mariadb.org/10.3/centos7-amd64 gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB gpgcheck=1

    删除yum缓存信息:

    yum clean metadata

    删除原来的安装的MariaDB软件

    rpm -e MariaDB-server rpm -e MariaDB-shared MariaDB-client MariaDB-common

    安装新版本的MariaDB:

    yum install mariadb-server yum install MariaDB-shared

    启动并登录MariaDB:

    sudo systemctl start mariadb systemctl status mariadb.service

    Snip20180308_66

    最后

    目前还没有量化评估MariaDB对PL/SQL的支持情况,但是,应该算是向Oracle放了一个“冷枪”。当然,对Oracle来说,这早就不是第一个支持Oracle语法的数据库了,并没什么大不了的。个人感觉,对于MariaDB来说,最重要应该还是拿下当前官方MySQL所占的份额,这才是最大的挑战。

    Leave a Reply

    Your email address will not be published. Required fields are marked *